Added ms_cor.f file.
The file ms_cor.f was updated to be compatible with Python bindings.
This commit is contained in:
parent
b1f34aef6a
commit
998fdbee88
|
@ -0,0 +1,165 @@
|
|||
C
|
||||
C
|
||||
C======================================================================
|
||||
C
|
||||
SUBROUTINE MS_COR(JE,TAU)
|
||||
C
|
||||
C
|
||||
C This subroutine calculates the scattering path operator by
|
||||
C the correlation expansion method.
|
||||
C
|
||||
C The scattering path operator matrix of each small atom group
|
||||
C is obtained by using LU decomposition method.
|
||||
C
|
||||
C The running time of matrix inversion subroutine used in this program
|
||||
C scales with N^3, the memory occupied scales with N^2. We advise user to
|
||||
C use full MS method to get the scattering path operator, i.e. directly
|
||||
C with matrix inversion method if NGR is larger than 3. If NGR is less
|
||||
C than 4 (i.e <=3) this subroutine will gain time.
|
||||
C
|
||||
C This subroutine never gain memory comparing to the subrourine INV_MAT_MS
|
||||
C as I use three large matrices stored in common, each matrix is larger or
|
||||
C as large as the matrix used in INV_MAT_MS.
|
||||
C
|
||||
C As I don't find a good way to solve the group problem, where all the contribution
|
||||
C of group IGR<=NGR are collected and each small contribution has to be stored
|
||||
C for the further larger-atom-group contribution, it's better that users change the
|
||||
C parameter NGR_M which is set in included file 'spec.inc' to be NGR or NGR+1
|
||||
C where NGR is the cut-off.user insterested. this subrouitne works for NGR is less
|
||||
C than 6(<=5), if users want to calculate larger NGR, they should modify the code here
|
||||
C to make them workable, the code is marked by 'C' in each lines (about 300 lines
|
||||
C below here), users just release them until to the desired cut-off, the maximum is
|
||||
C 9, however, users can enlarge it if they want to. Warning ! NGR_M set in
|
||||
C included file should be larger than NGR and the figure listed below, don't forget
|
||||
C to compile the code after modification.
|
||||
C
|
||||
C Users can modify the code to make it less memory-occupied, however, no matter they
|
||||
C do, the memories that used are more than full MS method used, so the only advantage
|
||||
C that this code has is to gain time when NGR<=3, with command 'common' used here,
|
||||
C the code will run faster.
|
||||
C
|
||||
C H.-F. Zhao : 2007
|
||||
C
|
||||
C (Photoelectron case)
|
||||
C
|
||||
C Last modified : 31 Jan 2008
|
||||
C
|
||||
C
|
||||
C
|
||||
USE DIM_MOD
|
||||
USE COOR_MOD
|
||||
USE INIT_L_MOD
|
||||
USE TRANS_MOD
|
||||
USE APPROX_MOD
|
||||
USE CORREXP_MOD
|
||||
USE Q_ARRAY_MOD
|
||||
C
|
||||
COMPLEX*16 TAU1(LINMAX,LINFMAX,NATCLU_M),ONEC,ZEROC
|
||||
C
|
||||
INTEGER NLM(NGR_M),ITYP(NGR_M),IGS(NGR_M)
|
||||
C
|
||||
COMPLEX TAU(LINMAX,LINFMAX,NATCLU_M),TLJ
|
||||
C
|
||||
C
|
||||
ONEC=(1.D0,0.D0)
|
||||
ZEROC=(0.D0,0.D0)
|
||||
C
|
||||
LM0=LMAX(1,JE)
|
||||
LM0=MIN(LM0,LF2)
|
||||
NRHS=(LM0+1)*(LM0+1)
|
||||
C
|
||||
NGR_MAX=NGR_M
|
||||
NGR=NDIF
|
||||
C
|
||||
IF(NGR_M.GT.NATCLU) THEN
|
||||
WRITE(6,*) ' ---> NGR_M should be smaller than NATCLU'
|
||||
WRITE(6,*) ' ---> it is reduced to NATCLU=',NATCLU
|
||||
NGR_MAX=NATCLU
|
||||
ENDIF
|
||||
C
|
||||
IF(NGR.LT.1) THEN
|
||||
WRITE(6,*) ' ---> NGR < 1, no expansion is done'
|
||||
STOP
|
||||
ELSE
|
||||
IF(NGR.GT.NGR_MAX) THEN
|
||||
WRITE(6,*) ' ---> NGR is too large, reduce to NGR_M=',
|
||||
& NGR_MAX
|
||||
NGR=NGR_MAX
|
||||
ENDIF
|
||||
ENDIF
|
||||
C
|
||||
C Case NGR = 1
|
||||
C
|
||||
IF(NGR.EQ.1) THEN
|
||||
DO LJ=0,LM0
|
||||
ILJ=LJ*LJ+LJ+1
|
||||
TLJ=TL(LJ,1,1,JE)
|
||||
DO MJ=-LJ,LJ
|
||||
INDJ=ILJ+MJ
|
||||
TAU(INDJ,INDJ,1)=TLJ
|
||||
ENDDO
|
||||
ENDDO
|
||||
C
|
||||
GOTO 100
|
||||
ENDIF
|
||||
C
|
||||
C NGR >=2 case
|
||||
C
|
||||
C
|
||||
DO INDJ=1,NRHS
|
||||
TAU1(INDJ,INDJ,1)=DBLE(Q(1))*ONEC
|
||||
ENDDO
|
||||
C
|
||||
C Constructs the group matrix and inverses it
|
||||
C
|
||||
IGR=1
|
||||
LMJ=LMAX(1,JE)
|
||||
NLM(IGR)=LMJ
|
||||
INDJM=(LMJ+1)*(LMJ+1)
|
||||
ITYP(IGR)=1
|
||||
IGS(IGR)=1
|
||||
C
|
||||
DO I=1,INDJM
|
||||
DO J=1,INDJM
|
||||
IF (J.EQ.I) THEN
|
||||
A(J,I)=ONEC
|
||||
ELSE
|
||||
A(J,I)=ZEROC
|
||||
ENDIF
|
||||
ENDDO
|
||||
ENDDO
|
||||
C
|
||||
IGR=IGR+1
|
||||
CALL COREXP_SAVM(JE,IGR,NGR,NLM,ITYP,IGS,TAU1)
|
||||
IGR=IGR-1
|
||||
C
|
||||
C TAU=TAU*tj
|
||||
C
|
||||
DO KTYP=1,N_PROT
|
||||
NBTYPK=NATYP(KTYP)
|
||||
LMK=LMAX(KTYP,JE)
|
||||
INDKM=(LMK+1)*(LMK+1)
|
||||
DO KNUM=1,NBTYPK
|
||||
KATL=NCORR(KNUM,KTYP)
|
||||
C
|
||||
DO LJ=0,LM0
|
||||
ILJ=LJ*LJ+LJ+1
|
||||
TLJ=TL(LJ,1,1,JE)
|
||||
DO MJ=-LJ,LJ
|
||||
INDJ=ILJ+MJ
|
||||
C
|
||||
DO INDK=1,INDKM
|
||||
TAU(INDK,INDJ,KATL)=CMPLX(TAU1(INDK,INDJ,KATL))*TLJ
|
||||
ENDDO
|
||||
C
|
||||
ENDDO
|
||||
ENDDO
|
||||
C
|
||||
ENDDO
|
||||
ENDDO
|
||||
C
|
||||
100 CONTINUE
|
||||
C
|
||||
RETURN
|
||||
C
|
||||
END
|
Loading…
Reference in New Issue