MODULE mod_REGNS CONTAINS SUBROUTINE REGNS(AR,BR,EFAC,PNS,VNSPLL,ICST,IPAN,IRCUT,PZLM, + QZLM,PZEKDR,QZEKDR,EK,ADER,AMAT,BDER,BMAT,NSRA, + IRMIND,IRMD,IPAND,LMMAXATOM) USE mod_zgeinv1 USE mod_wfint, only: wfint, wfint0 USE mod_csout USE mod_csinwd use mod_types, only: t_inc IMPLICIT NONE c----------------------------------------------------------------------- c determines the regular non spherical wavefunctions , the c alpha matrix and the t - matrix in the n-th. born appro- c ximation ( n given by input parameter icst ) c c c using the wave functions pz and qz ( regular and irregular c solution ) of the spherically averaged potential , the c regular wavefunction pns is determined by c c pns(ir,lm1,lm2) = ar(ir,lm1,lm2)*pz(ir,l1) c + br(ir,lm1,lm2)*qz(ir,l1) c c the matrices ar and br are determined by integral equations c containing pns and only the non spherical contributions of c the potential , stored in vinspll . these integral equations c are solved iteratively with born approximation up to given n. c c the original way of writing the cr and dr matrices in the equa- c tions above caused numerical troubles . therefore here are used c rescaled ar and br matrices : c c ~ c ar(ir,lm1,lm2) = sqrt(e)**(l1-l2) c * ar(ir,lm1,lm2)*((2*l2-1)!!/(2*l1-1)!!) c c ~ c br(ir,lm1,lm2) = sqrt(e)**(-l1-l2) c * br(ir,lm1,lm2)/((2*l1-1)!!*(2*l2-1)!!) c c for lloyd's formular is only the determinant of the alpha - c matrix is needed which is identical with the determinant c of the rescaled ar - matrix at the innerst point . c c the non spherical t - matrix is the br matrix at r(irc) c c modified for the use of shape functions c c (see notes by b.drittler) c c b.drittler mar. 1989 c----------------------------------------------------------------------- c modified by R. Zeller Aug. 1994 c----------------------------------------------------------------------- c added Volterra equation by M. Ogura Jan. 2006 c FRED: true -> use fredholm equation c false -> volterra equation c----------------------------------------------------------------------- C .. Scalar Arguments .. DOUBLE COMPLEX EK INTEGER ICST,IPAN,IPAND,IRMD,IRMIND,LMMAXATOM,NSRA C .. C .. Array Arguments .. DOUBLE COMPLEX ADER(LMMAXATOM,LMMAXATOM,IRMIND:IRMD), + AMAT(LMMAXATOM,LMMAXATOM,IRMIND:IRMD), + AR(LMMAXATOM,LMMAXATOM), + BDER(LMMAXATOM,LMMAXATOM,IRMIND:IRMD), + BMAT(LMMAXATOM,LMMAXATOM,IRMIND:IRMD), + BR(LMMAXATOM,LMMAXATOM), + EFAC(:),PNS(LMMAXATOM,LMMAXATOM,IRMIND:IRMD,2), + PZEKDR(LMMAXATOM,IRMIND:IRMD,2), + PZLM(LMMAXATOM,IRMIND:IRMD,2), + QZEKDR(LMMAXATOM,IRMIND:IRMD,2), + QZLM(LMMAXATOM,IRMIND:IRMD,2) DOUBLE PRECISION VNSPLL(LMMAXATOM,LMMAXATOM,IRMIND:IRMD) INTEGER IRCUT(0:IPAND) C .. C .. Local Scalars .. DOUBLE COMPLEX EFAC1,EFAC2 DOUBLE PRECISION ERR INTEGER I,IR,IRC1,J,LM1,LM2,LM3 C .. C .. Local Arrays .. DOUBLE COMPLEX,ALLOCATABLE :: PNS0(:,:,:,:), PNS1(:,:,:) ! DOUBLE COMPLEX PNS0(LMMAXATOM,LMMAXATOM,IRMIND:IRMD,2), ! + PNS1(LMMAXATOM,LMMAXATOM,IRMIND:IRMD) INTEGER IPIV(LMMAXATOM) C .. C .. External Subroutines .. ! EXTERNAL CSINWD !,!CSOUT,WFINT,WFINT0 !,ZGEINV1 C .. C .. Parameters .. DOUBLE COMPLEX CONE,CZERO PARAMETER (CONE= (1.0D0,0.0D0), CZERO= (0.D0,0.D0)) C .. LOGICAL FRED DATA FRED/.false./ ALLOCATE( PNS0(LMMAXATOM,LMMAXATOM,IRMIND:IRMD,2), + PNS1(LMMAXATOM,LMMAXATOM,IRMIND:IRMD) ) C .. c write(*,*)ek IRC1 = IRCUT(IPAN) c DO 1 J = 1,NSRA c DO 2 IR = IRMIND,IRC1 c DO 3 LM1 = 1,LMMAXATOM c DO 4 LM2 = 1,LMMAXATOM c IF(LM1.EQ.LM2)THEN c PNS0(LM1,LM2,IR,J) = AMAT(LM1,LM2,IR)*PZLM(LM1,IR,J) c ELSE c PNS0(LM1,LM2,IR,J) = (0D0,0D0) c ENDIF c 4 CONTINUE c 3 CONTINUE c 2 CONTINUE c 1 CONTINUE IF(FRED)THEN DO 70 I = 0,ICST c---> set up integrands for i-th born approximation IF (I.EQ.0) THEN CALL WFINT0(ADER,BDER,PZLM,QZEKDR,PZEKDR,VNSPLL,NSRA,IRMIND, + IRMD,LMMAXATOM, irmind, irmd) ELSE CALL WFINT(PNS,ADER,BDER,QZEKDR,PZEKDR,VNSPLL,NSRA,IRMIND, + IRMD,LMMAXATOM, irmind, irmd) END IF c---> call integration subroutines CALL CSINWD(ADER,AMAT,LMMAXATOM**2,IRMIND,IRMD,IPAN,IRCUT) CALL CSOUT(BDER,BMAT,LMMAXATOM**2,IRMIND,IRMD,IPAN,IRCUT) DO 20 IR = IRMIND,IRC1 DO 10 LM2 = 1,LMMAXATOM AMAT(LM2,LM2,IR) = CONE + AMAT(LM2,LM2,IR) 10 CONTINUE 20 CONTINUE c---> calculate non sph. wft. in i-th born approximation DO 60 J = 1,NSRA DO 50 IR = IRMIND,IRC1 DO 40 LM1 = 1,LMMAXATOM DO 30 LM2 = 1,LMMAXATOM PNS(LM1,LM2,IR,J) = (AMAT(LM1,LM2,IR)*PZLM(LM1,IR,J)+ + BMAT(LM1,LM2,IR)*QZLM(LM1,IR,J)) 30 CONTINUE 40 CONTINUE 50 CONTINUE 60 CONTINUE c----------------------------------------------------------------------- c check convergence DO 260 J = 1,NSRA DO 260 IR = IRMIND,IRC1 DO 260 LM1 = 1,LMMAXATOM DO 260 LM2 = 1,LMMAXATOM 260 PNS0(LM1,LM2,IR,J) = PNS0(LM1,LM2,IR,J)-PNS(LM1,LM2,IR,J) ERR=0D0 DO 270 J=1,NSRA CALL CSOUT(PNS0(1,1,IRMIND,J),PNS1,LMMAXATOM**2,IRMIND,IRMD,IPAN, + IRCUT) DO 270 LM1=1,LMMAXATOM DO 270 LM2=1,LMMAXATOM 270 ERR=MAX(ERR,ABS(PNS1(LM1,LM2,IRC1))) if (t_inc%i_write>0) WRITE(1337,*) 'Born_Fred',I,ERR c IF(I.EQ.ICST.AND.ERR.GT.1D-3)WRITE(*,*)'NOT CONVERGENT',ERR DO 280 J = 1,NSRA DO 280 IR = IRMIND,IRC1 DO 280 LM1 = 1,LMMAXATOM DO 280 LM2 = 1,LMMAXATOM 280 PNS0(LM1,LM2,IR,J) = PNS(LM1,LM2,IR,J) c----------------------------------------------------------------------- 70 CONTINUE ELSE c----------------------------------------------------------------------- c Volterra equation DO 200 I = 0,ICST c---> set up integrands for i-th born approximation IF (I.EQ.0) THEN CALL WFINT0(ADER,BDER,PZLM,QZEKDR,PZEKDR,VNSPLL,NSRA,IRMIND, + IRMD,LMMAXATOM, irmind, irmd) ELSE CALL WFINT(PNS,ADER,BDER,QZEKDR,PZEKDR,VNSPLL,NSRA,IRMIND, + IRMD,LMMAXATOM, irmind, irmd) END IF c---> call integration subroutines CALL CSOUT(ADER,AMAT,LMMAXATOM**2,IRMIND,IRMD,IPAN,IRCUT) CALL CSOUT(BDER,BMAT,LMMAXATOM**2,IRMIND,IRMD,IPAN,IRCUT) DO 150 IR = IRMIND,IRC1 DO 140 LM2 = 1,LMMAXATOM DO 140 LM1 = 1,LMMAXATOM IF(LM1.EQ.LM2)THEN AMAT(LM1,LM2,IR) = CONE - AMAT(LM1,LM2,IR) ELSE AMAT(LM1,LM2,IR) = - AMAT(LM1,LM2,IR) ENDIF 140 CONTINUE 150 CONTINUE c---> calculate non sph. wft. in i-th born approximation DO 190 J = 1,NSRA DO 180 IR = IRMIND,IRC1 DO 170 LM2 = 1,LMMAXATOM DO 160 LM1 = 1,LMMAXATOM PNS(LM1,LM2,IR,J) = AMAT(LM1,LM2,IR)*PZLM(LM1,IR,J) + +BMAT(LM1,LM2,IR)*QZLM(LM1,IR,J) 160 CONTINUE 170 CONTINUE 180 CONTINUE 190 CONTINUE c----------------------------------------------------------------------- c check convergence DO 290 J = 1,NSRA DO 290 IR = IRMIND,IRC1 DO 290 LM2 = 1,LMMAXATOM DO 290 LM1 = 1,LMMAXATOM 290 PNS0(LM1,LM2,IR,J) = PNS0(LM1,LM2,IR,J)-PNS(LM1,LM2,IR,J) ERR=0D0 DO 300 J=1,NSRA CALL CSOUT(PNS0(1,1,IRMIND,J),PNS1,LMMAXATOM**2,IRMIND,IRMD,IPAN, + IRCUT) DO 300 LM2=1,LMMAXATOM DO 300 LM1=1,LMMAXATOM 300 ERR=MAX(ERR,ABS(PNS1(LM1,LM2,IRC1))) if (t_inc%i_write>0) WRITE(1337,*) 'Born',I,ERR c IF(I.EQ.ICST.AND.ERR.GT.1D-3)WRITE(*,*)'NOT CONVERGENT',ERR DO 310 J = 1,NSRA DO 310 IR = IRMIND,IRC1 DO 310 LM2 = 1,LMMAXATOM DO 310 LM1 = 1,LMMAXATOM 310 PNS0(LM1,LM2,IR,J) = PNS(LM1,LM2,IR,J) c----------------------------------------------------------------------- 200 CONTINUE CALL ZGEINV1(AMAT(:,:,IRC1),AR,BR,IPIV,LMMAXATOM) DO 210 IR=IRMIND,IRC1 DO 210 LM2=1,LMMAXATOM DO 210 LM1=1,LMMAXATOM ADER(LM1,LM2,IR)= CZERO 210 BDER(LM1,LM2,IR)= CZERO DO 220 IR=IRMIND,IRC1 DO 220 LM2=1,LMMAXATOM DO 220 LM3=1,LMMAXATOM DO 220 LM1=1,LMMAXATOM ADER(LM1,LM2,IR)=ADER(LM1,LM2,IR)+AMAT(LM1,LM3,IR)*AR(LM3,LM2) 220 BDER(LM1,LM2,IR)=BDER(LM1,LM2,IR)+BMAT(LM1,LM3,IR)*AR(LM3,LM2) DO 230 IR=IRMIND,IRC1 DO 230 LM2=1,LMMAXATOM DO 230 LM1=1,LMMAXATOM AMAT(LM1,LM2,IR)=ADER(LM1,LM2,IR) 230 BMAT(LM1,LM2,IR)=BDER(LM1,LM2,IR) DO 240 J = 1,NSRA DO 240 IR = IRMIND,IRC1 DO 240 LM2 = 1,LMMAXATOM DO 240 LM1 = 1,LMMAXATOM PNS(LM1,LM2,IR,J) = AMAT(LM1,LM2,IR)*PZLM(LM1,IR,J) + +BMAT(LM1,LM2,IR)*QZLM(LM1,IR,J) 240 CONTINUE c Volterra equation c----------------------------------------------------------------------- ENDIF DO 90 LM2 = 1,LMMAXATOM EFAC2 = EFAC(LM2) c---> store alpha and t - matrix DO 80 LM1 = 1,LMMAXATOM EFAC1 = EFAC(LM1) AR(LM1,LM2) = AMAT(LM1,LM2,IRMIND) c---> t-matrix BR(LM1,LM2) = BMAT(LM1,LM2,IRC1)*EFAC1*EFAC2/EK 80 CONTINUE 90 CONTINUE c---> rescale with efac DO 130 J = 1,NSRA DO 120 IR = IRMIND,IRC1 DO 110 LM2 = 1,LMMAXATOM EFAC2 = EFAC(LM2) DO 100 LM1 = 1,LMMAXATOM PNS(LM1,LM2,IR,J) = PNS(LM1,LM2,IR,J)*EFAC2 100 CONTINUE 110 CONTINUE 120 CONTINUE 130 CONTINUE c if(dreal(ek).gt.3.96d-2.and.dreal(ek).lt.3.97d-2)then c if(dimag(ek).gt.0.5018d0.and.dreal(ek).lt.0.5019d0)then c write(*,*)ek c do 250 lm1=5,7,2 c write(*,*)'l=',lm1 c do 250 ir=irmind,irc1 c 250 write(*,*)ir,dreal(pns(lm1,lm1,ir,1)),dimag(pns(lm1,lm1,ir,1)) c endif c endif END SUBROUTINE c ************************************************************************ END MODULE mod_REGNS