6subroutine mixbroyden(iscl,n,msd,alpha,w0,nu,mu,f,df,u,a,d)
10integer,
intent(in) :: iscl,n,msd
11real(8),
intent(in) :: alpha,w0
12real(8),
intent(inout) :: nu(n),mu(n,2)
13real(8),
intent(inout) :: f(n,2),df(n,msd)
14real(8),
intent(inout) :: u(n,msd),a(msd,msd)
15real(8),
intent(out) :: d
22real(8) c(msd),beta(msd,msd),gamma(msd),work(msd)
24real(8),
external :: ddot
27 write(*,
'("Error(mixbroyden): n < 1 : ",I8)') n
33 write(*,
'("Error(mixbroyden): msd < 2 : ",I8)') msd
56f(1:n,kc)=nu(1:n)-mu(1:n,kp)
59df(1:n,jc)=f(1:n,kc)-f(1:n,kp)
61if (t1 > 1.d-8) t1=1.d0/t1
62df(1:n,jc)=t1*df(1:n,jc)
63u(1:n,jc)=alpha*df(1:n,jc)+t1*(mu(1:n,kp)-mu(1:n,kc))
69 c(k)=ddot(n,df(1,k),1,f(1,kc),1)
74 a(k,jc)=ddot(n,df(1,k),1,df(1,jc),1)
80beta(1:msd,1:msd)=a(1:msd,1:msd)
82 beta(k,k)=beta(k,k)+w0**2
85call dgetrf(m,m,beta,msd,ipiv,info)
86if (info == 0)
call dgetri(m,beta,msd,ipiv,work,m,info)
89 write(*,
'("Error(mixbroyden): could not invert matrix")')
94 gamma(k)=sum(c(1:m)*beta(1:m,k))
96nu(1:n)=mu(1:n,kp)+alpha*f(1:n,kc)
99 nu(1:n)=nu(1:n)+t1*u(1:n,k)
subroutine mixbroyden(iscl, n, msd, alpha, w0, nu, mu, f, df, u, a, d)