C^^^^^^^^^^^^^^^^LOCAL ZZZ,EKK^^^^^^^^^^^^^^^^^^^^^^^ 5/1, 2009 SUBROUTINE MSD(IREC8,IREC9,IMD,ICAR,ISTR,ZVCOU) C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ IMPLICIT REAL(A-H,O-Y) IMPLICIT COMPLEX(Z) INCLUDE 'PACVPP' DIMENSION ZDEVC(KNG1,KEG),EMAS(KEG),ZVCOU(KNG) C-----ARRAYS FOR MFFT-------------------------------------------- DIMENSION ZEV3C(IFX2-1,IFY2,IFZ2),ZV3D(IFX2-1,IFY2,IFZ2) DIMENSION XL(KNG1),YL1(KNG1),YL2(KNG1),YL3(KNG1) C DIMENSION ZV11D(KFFT),ZC11D(KFFT) DIMENSION IWL(8*IFX2+28),IWM(8*IFY2+28),IWN(8*IFZ2+28) & ,IWORK(2*IFX2) DIMENSION ZZZ(KNG1,KEG,KNV3),EKK(KEG,KNV3) C EQUIVALENCE (ZAJ,ZZZ),(EKO,EKK) C & ,(SNL,SSS),(ZFBB,ZFC),(OCCUP,OCCUU),(RAK,RAA) C DIMENSION SSS(KNG1,KNV3,KTYP,10),OCCUU(KEG,KNV3) CCCCC!$OMP THREADPRIVATE( /WORK8/ ,/RECIP/,/NONLC/, /XY123/ ) CCCCC!$OMP THREADPRIVATE( /ZAJEKO/, /WORK4/, /PSSNL/, /WORK8/, CCCCC!$OMP& /RECIP/, /NONLC/ ) C!$OMP THREADPRIVATE( /ZAJEKO/, /WORK4/, /PSSNL/ ) C================================================================ C EQUIVALENCE (ZV1D(1),ZV3D(1,1,1)),(ZC1D(1),ZEV3C(1,1,1)) C EQUIVALENCE (ZC11D(1),ZEV3C(1,1,1)) C==== ATTN KX1 OR KX11 ========================================== KFT1 = IFX2 KFT2 = IFY2 KFT3 = IFZ2 KSUM=KFT1*KFT2*KFT3 KVOL=(KFT1-1)*KFT2*KFT3 IF (ITER.EQ.2) WRITE (6,*) 'DTIME = ',DTIM C---------- MASS OF ELECTRON ----- DO 4 I=1,KG ZCHGO(I) = ZCHG(I) ZCHG(I) = DCMPLX(0.0D0,0.0D0) 4 CONTINUE C FOR STRESS (CALL KBINT & FORZFB 1992 1/7) IF(ISTR.EQ.1) THEN WRITE (6,*) 'KBINT ITER>IMD IN MSD' C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CALL KBINT C^^^^^ STRESS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CALL FORZFB C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ END IF C //////////////////////////////////// C // CALCULATE THE VERLET ALGORITHM // C //////////////////////////////////// ZVP(1) = ZVXC(1) + ZPSCC(1) DO 2001 I=2,KG ZVCOU(I)= PAI4*ZCHGO(I)*RGG(I) ZVP(I) = ZVXC(I) + ZPSCC(I) + ZVCOU(I) 2001 CONTINUE C*****---- SET UP C3FFT (FAST FOURIER TRANSFORMATION) ----- C CALL C3FFT(ZEV3C,KFT1,KFT1-1,KFT2,KFT3,IWL,IWM,IWN C & ,0,0,1,IWORK,IERR) C CALL C3FFT_DXML(ZEV3C,KFT1,KFT1-1,KFT2,KFT3,0) C DO 234 I=1,KSUM C ZV1D(I)=DCMPLX(0.0D0,0.0D0) C 234 CONTINUE DO 7731 KK=1,KFT3 DO 7732 JJ=1,KFT2 DO 7733 II=1,KFT1-1 ZV3D(II,JJ,KK)=DCMPLX(0.0D0,0.0D0) 7733 CONTINUE 7732 CONTINUE 7731 CONTINUE DO 233 I=1,KG LF1=IGF1(I) LF2=IGF2(I) LF3=IGF3(I) ZV3D(LF1,LF2,LF3) = ZVP(I) 233 CONTINUE CALL TIME(ITIME1,' ',1) C*****---- INVERSE FAST FOURIER TRANSFORMATION ----- CALL C3FFT_MKL2(ZV3D,KFT1,KFT1-1,KFT2,KFT3,1,IERR) C CALL C3FFT(ZV3D ,KFT1,KFT1-1,KFT2,KFT3,IWL,IWM,IWN C & ,0,1,1,IWORK,IERR2) C CALL C3FFT_DXML(ZV3D,KFT1,KFT1-1,KFT2,KFT3,1) C C DO 3501 NNN = 1,KV3 C DO 3502 IBAN = NBD1,NBD2 C EKK(IBAN,NNN) = EKO(IBAN,NNN) C DO 3503 I= 1,IBA(NNN) C ZZZ(I,IBAN,NNN) = ZAJ(I,IBAN,NNN) C 3503 CONTINUE C 3502 CONTINUE C 3501 CONTINUE C C-----K-POINT LOOP--------------------------------------------- C C OEPNMP 4/9, 2009 FOR SGI-SUPERCOMPUTER C C X,Y1,Y2,Y3, (MSD) !$OMP PARALLEL DEFAULT(NONE) !$OMP& FIRSTPRIVATE( KFT1,KFT2,KFT3,KSUM,KVOL, ZV3D, DTIM ) C!$OMP& COPYIN( ZAJ, EKO, ZFBB, SNL, CWL ) CC!$OMP& /ZAJEKO/, /RECIP/, /NONLC/, /WORK8/ ) !$OMP& PRIVATE(NNN,IBAN,VKIN,AKX,AKY,AKZ,I,J,K,L,M, !$OMP& IIBA,ITY,CD,CS,CP,LNUM,TMPP,ZEV3C, !$OMP& I1,L1,L2,L3,ierr1,IA,ZTMP, !$OMP& ierr,ZPGG,WDI,ZROF,ZDEVC,EMAS,ESHI,ZNRM, !$OMP& XL,YL1,YL2,YL3, !$OMP& DENOM,JBAN,EE,ZTV,IV ) !$OMP& SHARED( KV3,NBD1,NBD2, !$OMP& VX,VY,VZ,ZI,IBA,IGF1,IGF2,IGF3, !$OMP& UNIVOL,WS,WP,WD,IATOM, !$OMP& KFTYPE, ZFM2,NBASE, ZZZ,EKK, ZAJ,EKO,ZFBB,SNL,CWL, !$OMP& GX,GY,GZ,NLSPD, !$OMP& ZVP ) !$OMP DO DO 100 NNN=1,KV3 AKX = VX(NNN) AKY = VY(NNN) AKZ = VZ(NNN) IIBA = IBA(NNN) C WRITE (6,*) 'CHECK POINT 1 IN MSD -- OPENMP, NNN = ',NNN DO 3 IBAN=NBD1,NBD2 EMAS(IBAN)=0.0D0 EKK(IBAN,NNN) = EKO(IBAN,NNN) DO 3503 I= 1,KNG1 ZZZ(I,IBAN,NNN) = ZAJ(I,IBAN,NNN) 3503 CONTINUE 3 CONTINUE DO 2011 J=1,KNG1 XL(J)=0.0D0 YL1(J)=0.0D0 YL2(J)=0.0D0 YL3(J)=0.0D0 2011 CONTINUE C C C WRITE (6,*) 'CHECK POINT 2 IN MSD -- OPENMP' DO 2002 J=1,IIBA C WRITE (6,*) 'CHECK POINT 22 IN MSD -- OPENMP',J,IIBA XL(J) = 0.0D0 VKIN = & ( (AKX+GX(NBASE(J,NNN)))**2 & + (AKY+GY(NBASE(J,NNN)))**2 & + (AKZ+GZ(NBASE(J,NNN)))**2 )/2.D0 YL3(J) = VKIN + DREAL(ZVP(1)) C & Y3(J),ZVP(1) 2002 CONTINUE C WRITE (6,*) 'CHECK POINT 3 IN MSD -- OPENMP' DO 7000 ITY=1,KTYP CS=1.0D0/(WS(ITY)*UNIVOL) CP=1.0D0/(WP(ITY)*UNIVOL) CWL(1)=CS CWL(2)=CP CWL(3)=CP CWL(4)=CP IF (NLSPD(ITY).EQ.1) THEN LNUM = 4 ELSE LNUM = 9 CD=1.0D0/(WD(ITY)*UNIVOL) CWL(5)=CD CWL(6)=CD CWL(7)=CD CWL(8)=CD CWL(9)=CD END IF C DO 7111 L=1,LNUM DO 7010 I=1,IIBA TMPP = CWL(L)*SNL(I,NNN,ITY,L)**2 YL3(I) = YL3(I) + TMPP*DFLOAT(IATOM(ITY)) XL(I) = XL(I) + TMPP*DFLOAT(IATOM(ITY)) 7010 CONTINUE 7111 CONTINUE 7000 CONTINUE C WRITE (6,*) 'CHECK POINT 4 IN MSD -- OPENMP' C-----BAND LOOP---------------------------------------------- DO 200 IBAN=NBD1,NBD2 C WRITE (6,*) 'CHECK POINT 5 IN MSD -- OPENMP, IBAND = ',IBAN C DO 3231 I=1,KSUM C ZC11D(I)=CMPLX(0.0D0,0.0D0) C 3231 CONTINUE DO 7131 KK=1,KFT3 DO 7132 JJ=1,KFT2 DO 7133 II=1,KFT1-1 ZEV3C(II,JJ,KK)=DCMPLX(0.0D0,0.0D0) 7133 CONTINUE 7132 CONTINUE 7131 CONTINUE C WRITE (6,*) 'CHECK POINT 6 IN MSD -- OPENMP, IBAND = ',IBAN DO 3232 I=1,IIBA I1=NBASE(I,NNN) L1=IGF1(I1) L2=IGF2(I1) L3=IGF3(I1) ZEV3C(L1,L2,L3) = ZZZ(I,IBAN,NNN) 3232 CONTINUE C WRITE (6,*) 'CHECK POINT 7 IN MSD -- OPENMP, IBAND = ',IBAN C*****---- INVERSE FAST FOURIER TRANSFORMATION ----- C C CALL C3FFT_MKL(ZRB,KFT1,KFT1-1,KFT2,KFT3,IFFT,IERR) C CALL C3FFT_MKL2(ZEV3C,KFT1,KFT1-1,KFT2,KFT3,1,IERR1) C WRITE (6,*) 'CHECK POINT 9 IN MSD -- OPENMP, IBAND = ',IBAN C DO 71 I=1,KNG1 DO 71 I=1,IIBA YL1(I) = - DREAL(ZZZ(I,IBAN,NNN)*XL(I)) YL2(I) = - DIMAG(ZZZ(I,IBAN,NNN)*XL(I)) 71 CONTINUE C WRITE (6,*) 'CHECK POINT A IN MSD -- OPENMP, IBAND = ',IBAN DO 401 IA=1,KATM C IF (NLSPD(KFTYPE(IA)).EQ.1) THEN LNUM = 4 ELSE LNUM = 9 END IF C DO 411 L =1,LNUM DO 400 I =1,IIBA ZTMP = SNL(I,NNN,KFTYPE(IA),L) & * ZFBB(IBAN,NNN,IA,L) YL1(I) = YL1(I) + DREAL(ZTMP*ZFM2(NBASE(I,NNN),IA)) YL2(I) = YL2(I) + DIMAG(ZTMP*ZFM2(NBASE(I,NNN),IA)) 400 CONTINUE 411 CONTINUE 401 CONTINUE C DO 240 I=1,KSUM C ZC11D(I)=ZV11D(I)*ZC11D(I) C 240 CONTINUE DO 7231 KK=1,KFT3 DO 7232 JJ=1,KFT2 DO 7233 II=1,KFT1-1 ZEV3C(II,JJ,KK)=ZV3D(II,JJ,KK)*ZEV3C(II,JJ,KK) 7233 CONTINUE 7232 CONTINUE 7231 CONTINUE C*****---- FAST FOURIER TRANSFORMATION ----- C C CALL C3FFT_MKL(ZRB,KFT1,KFT1-1,KFT2,KFT3,IFFT,IERR) C CALL C3FFT_MKL2(ZEV3C,KFT1,KFT1-1,KFT2,KFT3,-1,IERR) DENOM=1.0D0/DBLE(KVOL) DO 30 I=1,IIBA I1=NBASE(I,NNN) L1=IGF1(I1) L2=IGF2(I1) L3=IGF3(I1) ZPGG=ZEV3C(L1,L2,L3)*DENOM WDI =(YL3(I)-EKK(IBAN,NNN)) ZROF =(ZPGG+YL1(I)+ZI*YL2(I)-ZVP(1)*ZZZ(I,IBAN,NNN)) ZDEVC(I,IBAN)=-(WDI*ZZZ(I,IBAN,NNN)+ZROF) EMAS(IBAN)=EMAS(IBAN)+DCONJG(ZZZ(I,IBAN,NNN))*ZDEVC(I,IBAN) ESHI=DEXP(-WDI*DTIM) ZZZ(I,IBAN,NNN)=ZZZ(I,IBAN,NNN)*ESHI+(ESHI-1.0D0)*ZROF/WDI 30 CONTINUE C------------------------------------------------------------------- 200 CONTINUE C WRITE (6,*) 'CHECK POINT B IN MSD -- OPENMP END 200-LOOP' C >>>>> AFTER C(T+DT)=C(T)+DC(T) <<<<< C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C GRAM-SCHMIDT ORTHOGONALIZATION C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ DO 1000 IBAN=NBD1,NBD2-1 ZNRM=DCMPLX(0.0D0,0.0D0) DO 1010 I=1,IIBA ZNRM=ZNRM+DCONJG(ZZZ(I,IBAN,NNN))*ZZZ(I,IBAN,NNN) 1010 CONTINUE DENOM=1.0D0/DSQRT(DREAL(ZNRM)) DO 1020 I=1,IIBA ZZZ(I,IBAN,NNN)=ZZZ(I,IBAN,NNN)*DENOM 1020 CONTINUE DO 1030 JBAN=IBAN+1,NBD2 ZNRM=DCMPLX(0.0D0,0.0D0) DO 1040 I=1,IIBA ZNRM=ZNRM+DCONJG(ZZZ(I,IBAN,NNN))*ZZZ(I,JBAN,NNN) 1040 CONTINUE DO 1050 I=1,IIBA ZZZ(I,JBAN,NNN)=ZZZ(I,JBAN,NNN)-ZNRM*ZZZ(I,IBAN,NNN) 1050 CONTINUE 1030 CONTINUE 1000 CONTINUE ZNRM=DCMPLX(0.0D0,0.0D0) DO 1100 I=1,IIBA ZNRM=ZNRM+DCONJG(ZZZ(I,NBD2,NNN))*ZZZ(I,NBD2,NNN) 1100 CONTINUE DENOM=1.0D0/DSQRT(DREAL(ZNRM)) DO 1110 I=1,IIBA ZZZ(I,NBD2,NNN)=ZZZ(I,NBD2,NNN)*DENOM 1110 CONTINUE C^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C CHECK C************************************************************** C IF (ITER.GT.40) THEN C DO 700 IBAN=NBD1,NBD2 C DO 720 JBAN=NBD1,IBAN C ZNORM=DCMPLX(0.0D0,0.0D0) C DO 7001 I=1,IIBA C ZNORM=ZNORM+DCONJG(ZAJ(I,IBAN,NNN))*ZAJ(I,JBAN,NNN) C7001 CONTINUE C RNOR=DSQRT(CDABS(ZNORM)) C IF (IBAN.EQ.JBAN) THEN C IF(DABS(1.0D0-RNOR).GT.1.0D-7) THEN C WRITE(6,*) 'NRM.NE.1.0 I= ',IBAN,'NRM=',RNOR C END IF C ELSE C IF(RNOR.GT.1.0D-7) THEN C WRITE(6,*) 'NRM.NE.0.0 I J= ',IBAN,JBAN C & ,'NRM= ',RNOR C END IF C IFLAG=1 C END IF C 720 CONTINUE C 700 CONTINUE C END IF C****************************************************************** C WRITE (6,*) 'CHECK POINT C IN MSD -- OPENMP END GRAM=SCHMIDT' DO 261 IBAN=NBD1,NBD2 DO 260 I=1,IIBA EKK(IBAN,NNN)=EKK(IBAN,NNN) & -2.0D0*DCONJG(ZZZ(I,IBAN,NNN))*ZDEVC(I,IBAN) 260 CONTINUE EKK(IBAN,NNN)=EKK(IBAN,NNN)+EMAS(IBAN) 261 CONTINUE DO 262 IBAN=NBD1,NBD2-1 DO 262 JBAN=IBAN+1,NBD2 IF(EKK(JBAN,NNN).LT.EKK(IBAN,NNN)) THEN EE =EKK(IBAN,NNN) EKK(IBAN,NNN)=EKK(JBAN,NNN) EKK(JBAN,NNN)=EE DO 270 IV=1,IIBA ZTV = ZZZ(IV,IBAN,NNN) ZZZ(IV,IBAN,NNN) = ZZZ(IV,JBAN,NNN) ZZZ(IV,JBAN,NNN) = ZTV 270 CONTINUE END IF 262 CONTINUE C WRITE (6,*) 'CHECK POINT D IN MSD -- OPENMP BOTTOM OF 100-LOOP' 100 CONTINUE !$OMP END DO !$OMP END PARALLEL C DO 3511 NNN = 1,KV3 DO 3512 IBAN = NBD1,NBD2 EKO(IBAN,NNN) = EKK(IBAN,NNN) DO 3513 I= 1,KNG1 ZAJ(I,IBAN,NNN) = ZZZ(I,IBAN,NNN) 3513 CONTINUE 3512 CONTINUE 3511 CONTINUE C RETURN END C---*----1----*----2----*----3----*----4----*----5----*----6----*----7 C Program COMPLEX_3D_DOUBLE_EX1 C---*----1----*----2----*----3----*----4----*----5----*----6----*----7 SUBROUTINE C3FFT_MKL2(ZRB,KFT1,KFT1_1,KFT2,KFT3,IFFT,IERR) Use MKL_DFTI INCLUDE 'PACVPP' integer II, JJ, KK integer IFFT, IERR, KFT1,KFT2,KFT3,KFT1_1, INDX complex(8) :: X_IN ((IFX2-1)*IFY2*IFZ2) complex(8) :: ZRB(IFX2-1,IFY2,IFZ2) type(DFTI_DESCRIPTOR), POINTER :: Desc_Handle integer status real(8) Scale integer lengths(3) IERR = 0 DO 111 KK=1,KFT3 DO 112 JJ=1,KFT2 DO 113 II=1,KFT1-1 INDX=(KFT1-1)*KFT2*(KK-1)+(KFT1-1)*(JJ-1)+II X_IN(INDX)=ZRB(II,JJ,KK) 113 CONTINUE 112 CONTINUE 111 CONTINUE ! ! Put transform parameters ! lengths(1) = KFT1_1 lengths(2) = KFT2 lengths(3) = KFT3 ! ! Create Dfti descriptor ! Status = DftiCreateDescriptor( Desc_Handle, & DFTI_DOUBLE, DFTI_COMPLEX, 3, lengths) C IF (IFFT .EQ. -1) THEN C Status = DftiCommitDescriptor( Desc_Handle ) ! ! Compute Forward transform ! Status = DftiComputeForward( Desc_Handle, X_IN) C ELSE IF (IFFT .EQ. 1) THEN ! ! Set Scale number for Backward transform ! Scale = 1.0 Status = DftiSetValue(Desc_Handle, DFTI_BACKWARD_SCALE, Scale) ! ! Commit Dfti descriptor ! Status = DftiCommitDescriptor( Desc_Handle ) ! ! Compute Backward transform ! Status = DftiComputeBackward( Desc_Handle, X_IN) C END IF C DO 211 KK=1,KFT3 DO 212 JJ=1,KFT2 DO 213 II=1,KFT1-1 INDX=(KFT1-1)*KFT2*(KK-1)+(KFT1-1)*(JJ-1)+II ZRB(II,JJ,KK)=X_IN(INDX) 213 CONTINUE 212 CONTINUE 211 CONTINUE C Status = DftiFreeDescriptor(Desc_Handle) C end