root / src / egrad_vasp.f90 @ 1
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 |