Statistiques
| Révision :

root / src / egrad_vasp.f90 @ 2

Historique | Voir | Annoter | Télécharger (4,11 ko)

1 1 equemene
subroutine egrad_vasp(e,geomcart,gradcart)
2 1 equemene
3 1 equemene
  ! This routines calculates the energy and the gradient of
4 1 equemene
  ! a molecule, using VASP
5 1 equemene
6 1 equemene
7 1 equemene
  use Path_module, only : Nat, renum,Order,OrderInv,AtName, Coord, dzdc, &
8 1 equemene
       indzmat,Nom,Atome, massat, unit,Nfroz,Frozen,ProgExe,Latr,FrozAtoms
9 1 equemene
  use Io_module
10 1 equemene
11 1 equemene
  !
12 1 equemene
  IMPLICIT NONE
13 1 equemene
14 1 equemene
  ! Energy (calculated if F300K=.F., else estimated)
15 1 equemene
  REAL(KREAL), INTENT (OUT) :: e
16 1 equemene
  ! Nb degree of freedom
17 1 equemene
  REAL(KREAL), INTENT (IN) :: geomcart(Nat,3)
18 1 equemene
  ! Gradient calculated at Geom geometry
19 1 equemene
  REAL(KREAL), INTENT (OUT) :: gradcart(3*NAt)
20 1 equemene
21 1 equemene
  ! ======================================================================
22 1 equemene
23 1 equemene
  character(LCHARS) :: LINE
24 1 equemene
25 1 equemene
  REAL(KREAL) :: d, a_val, Pi
26 1 equemene
27 1 equemene
  INTEGER(KINT) :: iat, jat, kat, i, j, n3at, Nfr
28 1 equemene
  REAL(KREAL) :: RTmp1, RTmp2, RTmp3
29 1 equemene
30 1 equemene
  !
31 1 equemene
  CHARACTER(132), PARAMETER :: FileIn='POSCAR', FileOut='OUTCAR'
32 1 equemene
33 1 equemene
  CHARACTER(VLCHARS), SAVE :: RunCommand
34 1 equemene
  INTEGER(kint) :: NbLists,LastIt,Nat4,NStep, Firstit
35 1 equemene
36 1 equemene
  INTEGER(KINT) :: IGeom, Idx
37 1 equemene
!  REAL(KREAL), ALLOCATABLE :: GeomTmpC(:), GeomTmp(:)
38 1 equemene
  REAL(KREAL) :: MRot(3,3), Rmsd
39 1 equemene
40 1 equemene
  REAL(KREAL) :: X,Y,Z
41 1 equemene
  LOGICAL :: Debug
42 1 equemene
43 1 equemene
  INTERFACE
44 1 equemene
     function valid(string) result (isValid)
45 1 equemene
       CHARACTER(*), intent(in) :: string
46 1 equemene
       logical                  :: isValid
47 1 equemene
     END function VALID
48 1 equemene
  END INTERFACE
49 1 equemene
50 1 equemene
  Pi=dacos(-1.0d0)
51 1 equemene
  debug=valid('EGRAD')
52 1 equemene
  if (debug) Call header('Entering Egrad_VASP')
53 1 equemene
54 1 equemene
  n3at=3*nat
55 1 equemene
56 1 equemene
!  ALLOCATE(GeomTmpC(n3at))
57 1 equemene
58 1 equemene
59 1 equemene
  gradcart=0.
60 1 equemene
  E=0.
61 1 equemene
  RunCommand=Trim(ProgExe)
62 1 equemene
63 1 equemene
  IF (DEBUG) WRITE(*,*)'RunCommand:',TRIM(RunCommand)
64 1 equemene
65 1 equemene
  ! we create the input file
66 1 equemene
67 1 equemene
!   write(*,*) "Coucou 2"
68 1 equemene
69 1 equemene
  OPEN(IOTMP,File=FileIn)
70 1 equemene
71 1 equemene
  ! we convert the coordinates into Cartesian coordinates
72 1 equemene
!     GeomTmpC=Reshape(GeomCart,SHAPE=(/3*Nat/))
73 1 equemene
74 1 equemene
   Call PrintGeomVasp(Vasp_Title,geomcart,Latr,FrozAtoms,IoTmp)
75 1 equemene
76 1 equemene
  CLOSE(IOTMP)
77 1 equemene
78 1 equemene
79 1 equemene
  IF (debug) THEN
80 1 equemene
     WRITE(*,*) 'DBG EGRAD ' //  Trim(FileIn),' COORD=',TRIM(COORD)
81 1 equemene
     call system('cat ' // Trim(FileIn))
82 1 equemene
  END IF
83 1 equemene
84 1 equemene
  call system(RunCommand)
85 1 equemene
86 1 equemene
  if (debug) WRITE(*,*) 'DBG EGRAD_VASP, back from calculation'
87 1 equemene
!  if (debug) WRITE(*,*) "DBG EGRAD_VASP Order(I)",Order(1:Nat)
88 1 equemene
89 1 equemene
  ! Whatever the coordinate system, we read the cartesian gradient
90 1 equemene
  ! and we convert it to Zmat or other if needed
91 1 equemene
92 1 equemene
  OPEN(IOTMP,FILE=FileOut, STATUS='old')
93 1 equemene
  ! We first search for the forces
94 1 equemene
  READ(IOTMP,'(A)',END=999,ERR=999) LINE
95 1 equemene
! We search for the  last part of the OUTCAR file, after wavefunction is converged
96 1 equemene
  DO WHILE (INDEX(LINE,'EDIFF is reached')==0)
97 1 equemene
     READ(IOTMP,'(A)',END=999,ERR=999) LINE
98 1 equemene
  END DO
99 1 equemene
  READ(IOTMP,'(A)',END=999,ERR=999) LINE
100 1 equemene
  DO WHILE (INDEX(LINE,'TOTEN')==0)
101 1 equemene
     READ(IOTMP,'(A)',END=999,ERR=999) LINE
102 1 equemene
  END DO
103 1 equemene
  Line=Line(26:)
104 1 equemene
  READ(LINE,*) E
105 1 equemene
  if (debug) WRITE(*,'(1X,A,F20.6)') "DBG Egrad_VASP E=",E
106 1 equemene
107 1 equemene
! We search for the forces
108 1 equemene
  DO WHILE (INDEX(LINE,'TOTAL-FORCE')==0)
109 1 equemene
     READ(IOTMP,'(A)',END=999,ERR=999) LINE
110 1 equemene
  END DO
111 1 equemene
  READ(IOTMP,'(A)',END=999,ERR=999) LINE
112 1 equemene
  DO I=1,Nat
113 1 equemene
     Iat=I
114 1 equemene
     IF (renum) Iat=Order(I)
115 1 equemene
     READ(IOTMP,*,END=999,ERR=999)  Rtmp1,RTmp2,RTmp3,GradCart(3*Iat-2:3*Iat)
116 1 equemene
  END DO
117 1 equemene
118 1 equemene
119 1 equemene
  if (debug) THEN
120 1 equemene
     WRITE(*,*) "DBG EGRAD_VASP - GradCart=FORCES - original order"
121 1 equemene
     DO I=1,Nat
122 1 equemene
        Iat=Order(I)
123 1 equemene
        WRITE(*,'(1X,I5,3(1X,F20.6))') I,GradCart(3*Iat-2:3*Iat)
124 1 equemene
     END DO
125 1 equemene
     WRITE(*,*) "DBG EGRAD_VASP - GradCart=FORCES - internal order"
126 1 equemene
     DO I=1,Nat
127 1 equemene
        Iat=Order(I)
128 1 equemene
        WRITE(*,'(3(1X,I5),3(1X,F20.6))') I,Iat,OrderInv(I),GradCart(3*I-2:3*I)
129 1 equemene
     END DO
130 1 equemene
  END IF
131 1 equemene
132 1 equemene
  ! VASP gives the Forces in eV/Angstrom, so we convert it into the
133 1 equemene
  ! gradient in ua/Angstrom
134 1 equemene
    gradCart=-1.0d0*ev2Au*gradCart
135 1 equemene
136 1 equemene
  !  if (debug.AND.(COORD.EQ.'ZMAT')) THEN
137 1 equemene
  !     DO WHILE (INDEX(LINE,'Internal Coordinate Forces')==0)
138 1 equemene
  !        READ(IOTMP,'(A)') LINE
139 1 equemene
  !!        WRITE(*,*) 'Pas bon:' // TRIM(LINE)
140 1 equemene
  !     END DO
141 1 equemene
  !     WRITE(*,*) TRIM(LINE)
142 1 equemene
  !     DO I=1,Nat+2
143 1 equemene
  !        READ(IOTMP,'(A)') LINE
144 1 equemene
  !        WRITE(*,*) TRIM(LINE)
145 1 equemene
  !     END DO
146 1 equemene
  !  END IF
147 1 equemene
148 1 equemene
  CLOSE(IOTMP)
149 1 equemene
150 1 equemene
!  DeALLOCATE(GeomTmpC)
151 1 equemene
152 1 equemene
153 1 equemene
  if (debug) Call header('Egrad_VASP Over')
154 1 equemene
155 1 equemene
  RETURN
156 1 equemene
157 1 equemene
999 CONTINUE
158 1 equemene
  WRITE(*,*) 'We should not be here !!!!'
159 1 equemene
  STOP
160 1 equemene
  ! ======================================================================
161 1 equemene
end subroutine egrad_vasp
162 1 equemene
163 1 equemene
164 1 equemene