Statistiques
| Révision :

root / src / Read_geom.f90 @ 4

Historique | Voir | Annoter | Télécharger (9,87 ko)

1 1 equemene
SUBROUTINE Read_Geom(input)
2 1 equemene
3 1 equemene
  Use Path_module
4 1 equemene
  Use Io_module
5 1 equemene
6 1 equemene
  IMPLICIT NONE
7 1 equemene
8 1 equemene
9 1 equemene
  CHARACTER(32), INTENT(IN) :: input
10 1 equemene
  CHARACTER(132) :: LineTmp,Line
11 1 equemene
12 1 equemene
  INTEGER(KINT), ALLOCATABLE :: NbAtType(:) !na
13 1 equemene
  INTEGER(KINT) :: NbType, NbTypeUser
14 1 equemene
  INTEGER(KINT) :: I, J, Iat,NAtP,Idx,JStart
15 1 equemene
  INTEGER(KINT) :: IGeom
16 1 equemene
  REAL(KREAL) :: Xt,Yt,Zt
17 1 equemene
  LOGICAL :: Debug, TChk
18 1 equemene
  CHARACTER(4), ALLOCATABLE :: FFFt(:,:) ! 3,Na
19 1 equemene
  LOGICAL, ALLOCATABLE :: FFFl(:,:) ! 3,Na
20 1 equemene
21 1 equemene
!!! for VASP inputs
22 1 equemene
! latx_loc used to check that the lattice parameters are the same for all geometries
23 1 equemene
  REAL(KREAL) :: lata_loc(3), latb_loc(3), latc_loc(3)
24 1 equemene
! VaspPar_loc is the local value of the vasp parametre
25 1 equemene
  REAL(KREAL) :: VaspPar_loc
26 1 equemene
! Vdir_loc is used to convert the read geometry to Cartesian.
27 1 equemene
! V_direct is set by the first geometry.
28 1 equemene
  CHARACTER(LCHARS) :: Vdir_loc
29 1 equemene
30 1 equemene
31 1 equemene
  INTERFACE
32 1 equemene
     function valid(string) result (isValid)
33 1 equemene
       CHARACTER(*), intent(in) :: string
34 1 equemene
       logical                  :: isValid
35 1 equemene
     END function VALID
36 1 equemene
  END INTERFACE
37 1 equemene
38 1 equemene
  debug=valid('Read_geom')
39 1 equemene
 if (debug) Call Header("Entering Read_Geom")
40 1 equemene
  if (debug) WRITE(*,*) "Input:",Trim(Input)
41 4 pfleura2
  if (debug) WRITE(*,*) "NgeomI:",NGeomI
42 1 equemene
43 1 equemene
  SELECT CASE(Input)
44 1 equemene
  CASE ('XYZ','CART')
45 1 equemene
     DO I=1,NGeomI
46 1 equemene
        IF (DEBUG) WRITE(*,*) "Reading Geom :",I
47 1 equemene
        READ(IOIN,*) NAtp
48 1 equemene
        if (NAtp.NE.Nat) THEN
49 1 equemene
           IF (I==1) THEN
50 1 equemene
              WRITE(IOOUT,*) 'WARNING Number of atoms not consistent between NAMELIST &path and First geom'
51 1 equemene
              WRITE(IOOUT,*) "Using:",Natp
52 1 equemene
              DEALLOCATE(XyzGeomI, AtName)
53 1 equemene
              Nat=Natp
54 1 equemene
              ALLOCATE(XyzGeomI(NGeomI,3,Nat), AtName(NAt))
55 1 equemene
           ELSE
56 1 equemene
              WRITE(IOOUT,*) 'Number of atoms not consistent between geometries. STOP'
57 1 equemene
              STOP
58 1 equemene
           END IF
59 1 equemene
        END IF
60 1 equemene
        READ(IOIN,'(A)') Line
61 1 equemene
        DO J=1,NAt
62 1 equemene
           READ(IOIN,*) AtName(J),XyzGeomI(I,1:3,J)
63 1 equemene
        END DO
64 1 equemene
        If (Debug) THEN
65 1 equemene
           WRITE(*,*) "Geom ",I
66 1 equemene
           DO J=1,NAt
67 1 equemene
              WRITE(*,'(1X,A2,3(1X,F15.6))') AtName(J),XyzGeomI(I,1:3,J)
68 1 equemene
           END DO
69 1 equemene
        END IF
70 1 equemene
     END DO
71 1 equemene
  CASE ('TURBOMOLE')
72 1 equemene
     DO I=1,NGeomI
73 1 equemene
        IF (DEBUG) WRITE(*,*) "Reading Geom :",I
74 1 equemene
        JStart=1
75 1 equemene
! read the $coord line, or $user-defined, or $end
76 1 equemene
        Line='$ok'
77 1 equemene
        DO WHILE (Line(1:1).EQ."$")
78 1 equemene
           READ(IOIN,'(A)') Line
79 1 equemene
           Line=AdjustL(Line)
80 1 equemene
        END DO
81 1 equemene
        J=1
82 1 equemene
        READ(Line,*) XyzGeomI(I,1:3,J),AtName(J)
83 1 equemene
        DO J=2,NAt
84 1 equemene
           READ(IOIN,*) XyzGeomI(I,1:3,J),AtName(J)
85 1 equemene
        END DO
86 1 equemene
        XyzGeomI(I,:,:)= XyzGeomI(I,:,:)*a0
87 1 equemene
        If (Debug) THEN
88 1 equemene
           WRITE(*,*) "Geom ",I
89 1 equemene
           DO J=1,NAt
90 1 equemene
              WRITE(*,'(1X,A2,3(1X,F15.6))') AtName(J),XyzGeomI(I,1:3,J)
91 1 equemene
           END DO
92 1 equemene
        END IF
93 1 equemene
     END DO
94 1 equemene
  CASE ('VASP')
95 1 equemene
     ALLOCATE(FFF(3,nat),FFFl(3,Nat),FFFt(3,Nat))
96 1 equemene
     ! First geometry is a bit special for VASP as we have to set
97 1 equemene
     ! many things
98 1 equemene
     IGeom=1
99 1 equemene
     IF (DEBUG) WRITE(*,*) "Reading Geom :",IGeom
100 1 equemene
     READ(IOIN,'(A)') Vasp_Title
101 1 equemene
     READ(IOIN,*) Vasp_param
102 1 equemene
103 1 equemene
     READ(IOIN,*) Lat_a
104 1 equemene
     READ(IOIN,*) Lat_b
105 1 equemene
     READ(IOIN,*) Lat_c
106 1 equemene
107 1 equemene
     Lat_a=Lat_a*Vasp_param
108 1 equemene
     Lat_b=Lat_b*Vasp_param
109 1 equemene
     Lat_c=Lat_c*Vasp_param
110 1 equemene
111 1 equemene
     ALLOCATE(NbAtType(nat))
112 1 equemene
     READ(IOIN,'(A)') Vasp_types
113 1 equemene
     ! First, how many different types ?
114 1 equemene
     NbAtType=0
115 1 equemene
     READ(Vasp_types,*,END=999) NbAtType
116 1 equemene
999  CONTINUE
117 1 equemene
     NbType=0
118 1 equemene
     NatP=0
119 1 equemene
     DO WHILE (NbAtType(NbType+1).NE.0)
120 1 equemene
        NbType=NbType+1
121 1 equemene
        Natp=Natp+NbAtType(NbType)
122 1 equemene
     END DO
123 1 equemene
124 1 equemene
125 1 equemene
     if (NAtp.NE.Nat) THEN
126 1 equemene
        WRITE(IOOUT,*) 'WARNING Number of atoms not consistent between NAMELIST &path and First geom'
127 1 equemene
        WRITE(IOOUT,*) "Using:",Natp
128 1 equemene
        DEALLOCATE(XyzGeomI, AtName)
129 1 equemene
        Nat=Natp
130 1 equemene
        ALLOCATE(XyzGeomI(NGeomI,3,Nat), AtName(NAt))
131 1 equemene
     END if
132 1 equemene
133 1 equemene
     ! Do we know the atom types ?
134 1 equemene
     IF (AtTypes(1).EQ.'  ') THEN
135 1 equemene
        ! user has not provided atom types... we have to find them by ourselves
136 1 equemene
        ! by looking into the POTCAR file...
137 1 equemene
        INQUIRE(File="POTCAR", EXIST=Tchk)
138 1 equemene
        IF (.NOT.Tchk) THEN
139 1 equemene
           WRITE(*,*) "ERROR! No AtTypes provided, and POTCAR file not found"
140 1 equemene
           STOP
141 1 equemene
        END IF
142 1 equemene
        OPEN(IOTMP,File="POTCAR")
143 1 equemene
        DO I=1,NbType
144 1 equemene
           Line='Empty'
145 1 equemene
           DO WHILE (Line(1:5).NE.'TITEL')
146 1 equemene
              READ(IOTMP,'(A)') Line
147 1 equemene
              Line=AdjustL(Line)
148 1 equemene
           END DO
149 1 equemene
           Line=adjustl(Line(9:))
150 1 equemene
           Idx=index(Line," ")
151 1 equemene
           Line=adjustl(Line(Idx+1:))
152 1 equemene
           AtTypes(I)=Line(1:2)
153 1 equemene
        END DO
154 1 equemene
        if (debug) WRITE(*,'(A,100(1X,A2))') "ReadG:VASP AtTypes",AtTypes(1:NbType)
155 1 equemene
        CLOSE(IOTMP)
156 1 equemene
157 1 equemene
     ELSE  !AtTypes(1).EQ.'  '
158 1 equemene
        ! user has provided atom types
159 1 equemene
        NbTypeUser=0
160 1 equemene
        DO WHILE (AtTypes(NbTypeUser+1).NE.'  ')
161 1 equemene
           NbTypeUser=NbTypeUser+1
162 1 equemene
        END DO
163 1 equemene
        IF (NbType.NE.NbTypeUser) THEN
164 1 equemene
           WRITE(*,*) "ERROR Read_Geom : NbType in POSCAR do not match AtTypes"
165 1 equemene
           STOP
166 1 equemene
        END IF
167 1 equemene
     END IF
168 1 equemene
169 1 equemene
     IAt=1
170 1 equemene
     DO I=1,NbType
171 1 equemene
        DO J=1,NbAtType(I)
172 1 equemene
           AtName(Iat)=AtTypes(I)
173 1 equemene
           Iat=Iat+1
174 1 equemene
        END DO
175 1 equemene
     END DO
176 1 equemene
     DEALLOCATE(NbAtType)
177 1 equemene
178 1 equemene
     NbTypes=NbType
179 1 equemene
180 1 equemene
     READ(IOIN,'(A)') Vasp_comment
181 1 equemene
     READ(IOIN,'(A)') Vasp_direct
182 1 equemene
183 1 equemene
     V_direct=adjustl(Vasp_direct)
184 1 equemene
     Call upcase(V_direct)
185 1 equemene
186 1 equemene
     if (debug) WRITE(*,*) "V_direct=",Trim(V_Direct)
187 1 equemene
188 1 equemene
     DO I=1,Nat
189 1 equemene
        READ(IOIN,*) XyzGeomI(IGeom,1:3,I),FFF(1:3,I)
190 1 equemene
           DO J=1,3
191 1 equemene
              FFF(J,I)=AdjustL(FFF(J,I))
192 4 pfleura2
              FFFl(j,i)=(FFF(j,i)(1:1).EQ.'T').OR.(FFF(j,i)(1:1).EQ.'t')
193 1 equemene
           END DO
194 1 equemene
195 1 equemene
     END DO
196 1 equemene
     IF (V_direct(1:6).EQ.'DIRECT') THEN
197 1 equemene
        DO I=1,Nat
198 1 equemene
           Xt=XyzGeomI(IGeom,1,I)
199 1 equemene
           Yt=XyzGeomI(IGeom,2,I)
200 1 equemene
           Zt=XyzGeomI(IGeom,3,I)
201 1 equemene
           XyzGeomI(IGeom,1,I)=Xt*lat_a(1)+Yt*lat_b(1)+Zt*lat_c(1)
202 1 equemene
           XyzGeomI(IGeom,2,I)=Xt*lat_a(2)+Yt*lat_b(2)+Zt*lat_c(2)
203 1 equemene
           XyzGeomI(IGeom,3,I)=Xt*lat_a(3)+Yt*lat_b(3)+Zt*lat_c(3)
204 1 equemene
        END DO
205 1 equemene
206 1 equemene
     END IF
207 1 equemene
208 1 equemene
     ALLOCATE(X0_vasp(Nat),Y0_vasp(Nat),Z0_vasp(Nat))
209 1 equemene
     X0_vasp=XyzGeomI(IGeom,1,:)
210 1 equemene
     Y0_vasp=XyzGeomI(IGeom,2,:)
211 1 equemene
     Z0_vasp=XyzGeomI(IGeom,3,:)
212 1 equemene
213 1 equemene
     if (debug)  THEN
214 1 equemene
        WRITE(*,*) Nat
215 1 equemene
        WRITE(*,*) "Geom ",IGeom,"/",NGeomI
216 1 equemene
        DO I=1,Nat
217 1 equemene
           WRITE(*,'(1X,A2,3(1X,F15.6))') AtName(I),XyzGeomI(IGeom,1:3,I)
218 1 equemene
        END DO
219 1 equemene
     END IF
220 1 equemene
221 1 equemene
222 1 equemene
     DO IGeom=2,NGeomI
223 1 equemene
!!! PFL 16th March 2008 ->
224 1 equemene
! Users might want to use different conditions for different geometries
225 1 equemene
! i.e. to mix Cartesian and Direct :-p
226 1 equemene
! thus we check for each geom which condition is used.
227 1 equemene
!
228 1 equemene
229 1 equemene
! Title
230 1 equemene
        READ(IOIN,*) LineTmp
231 1 equemene
        !        if (debug) WRITE(*,*) "1 LineTmp:",Trim(LineTmp)
232 1 equemene
! Vasp_Param
233 1 equemene
        READ(IOIN,*) VaspPar_loc
234 1 equemene
        !        if (debug) WRITE(*,*) "2 LineTmp:",Trim(LineTmp)
235 1 equemene
! Lattice parameters
236 1 equemene
        READ(IOIN,*) Lata_loc
237 1 equemene
        !        if (debug) WRITE(*,*) "3 LineTmp:",Trim(LineTmp)
238 1 equemene
        READ(IOIN,*) latb_loc
239 1 equemene
        !        if (debug) WRITE(*,*) "4 LineTmp:",Trim(LineTmp)
240 1 equemene
        READ(IOIN,*) Latc_loc
241 1 equemene
        !        if (debug) WRITE(*,*) "5 LineTmp:",Trim(LineTmp)
242 1 equemene
! Attypes
243 1 equemene
        READ(IOIN,*) LineTmp
244 1 equemene
        !        if (debug) WRITE(*,*) "6 LineTmp:",Trim(LineTmp)
245 1 equemene
! Comment
246 1 equemene
        READ(IOIN,*) LineTmp,line
247 1 equemene
        !        if (debug) WRITE(*,*) "7 LineTmp:",Trim(LineTmp),Trim(Line)
248 1 equemene
! V_direct
249 1 equemene
        READ(IOIN,*) Vdir_loc
250 1 equemene
        Vdir_loc=adjustl(Vdir_loc)
251 1 equemene
        Call upcase(Vdir_loc)
252 1 equemene
        !        if (debug) WRITE(*,*) "8 LineTmp:",Trim(LineTmp)
253 1 equemene
254 1 equemene
        Lata_loc=Lata_loc*VaspPar_loc-Lat_a
255 1 equemene
        if (dot_product(lata_loc,Lata_loc).GE.1e-6) THEN
256 1 equemene
           WRITE(*,*) "Lattice parameter a is different between geometries 1 and ",IGeom
257 1 equemene
           WRITE(IOOUT,*) "Lattice parameter a is different between geometries 1 and ",IGeom
258 1 equemene
           STOP
259 1 equemene
        END IF
260 1 equemene
261 1 equemene
        Latb_loc=Latb_loc*VaspPar_loc-Lat_b
262 1 equemene
        if (dot_product(latb_loc,Latb_loc).GE.1e-6) THEN
263 1 equemene
           WRITE(*,*) "Lattice parameter b is different between geometries 1 and ",IGeom
264 1 equemene
           WRITE(IOOUT,*) "Lattice parameter b is different between geometries 1 and ",IGeom
265 1 equemene
           STOP
266 1 equemene
        END IF
267 1 equemene
268 1 equemene
        Latc_loc=Latc_loc*VaspPar_loc-Lat_c
269 1 equemene
        if (dot_product(latc_loc,Latc_loc).GE.1e-6) THEN
270 1 equemene
           WRITE(*,*) "Lattice parameter c is different between geometries 1 and ",IGeom
271 1 equemene
           WRITE(IOOUT,*) "Lattice parameter c is different between geometries 1 and ",IGeom
272 1 equemene
           STOP
273 1 equemene
        END IF
274 1 equemene
275 1 equemene
        DO I=1,Nat
276 1 equemene
           READ(IOIN,*) XyzGeomI(IGeom,1:3,I),FFFt(1:3,I)
277 1 equemene
           DO J=1,3
278 1 equemene
! A frozen atom in any geom is considered frozen in all geom
279 1 equemene
              FFFt(j,I)=AdjustL(FFFt(j,i))
280 1 equemene
              FFFl(j,i)=FFFl(j,i).AND.(FFFt(j,i).EQ.'T')
281 1 equemene
           END DO
282 1 equemene
        END DO
283 1 equemene
284 1 equemene
        IF (Vdir_loc(1:6).EQ.'DIRECT') THEN
285 1 equemene
           DO I=1,Nat
286 1 equemene
              Xt=XyzGeomI(IGeom,1,I)
287 1 equemene
              Yt=XyzGeomI(IGeom,2,I)
288 1 equemene
              Zt=XyzGeomI(IGeom,3,I)
289 1 equemene
              XyzGeomI(IGeom,1,I)=Xt*lat_a(1)+Yt*lat_b(1)+Zt*lat_c(1)
290 1 equemene
              XyzGeomI(IGeom,2,I)=Xt*lat_a(2)+Yt*lat_b(2)+Zt*lat_c(2)
291 1 equemene
              XyzGeomI(IGeom,3,I)=Xt*lat_a(3)+Yt*lat_b(3)+Zt*lat_c(3)
292 1 equemene
           END DO
293 1 equemene
        END IF
294 1 equemene
295 1 equemene
        if (debug)  THEN
296 1 equemene
           WRITE(*,*) Nat
297 1 equemene
           WRITE(*,*) "Geom ",IGeom,"/",NGeomI
298 1 equemene
           DO I=1,Nat
299 1 equemene
              WRITE(*,'(1X,A2,3(1X,F15.6))') AtName(I),XyzGeomI(IGeom,1:3,I)
300 1 equemene
           END DO
301 1 equemene
        END IF
302 1 equemene
303 1 equemene
     END DO
304 1 equemene
305 1 equemene
! PFL 23 Nov 2008 ->
306 1 equemene
! This is done in Path.f90
307 1 equemene
! ! We put FFrozen in place
308 1 equemene
!   Idx=1
309 1 equemene
!   DO I=1,Nat
310 1 equemene
!      TChk=.FALSE.
311 1 equemene
!      DO J=1,3
312 1 equemene
!         TChk=Tchk.OR.(.NOT.FFFl(j,i))
313 1 equemene
!      END DO
314 1 equemene
!      IF (TChk) THEN
315 1 equemene
!         Frozen(Idx)=I
316 1 equemene
!         Idx=Idx+1
317 1 equemene
!      END IF
318 1 equemene
!   END DO
319 1 equemene
!   Frozen(Idx)=0
320 1 equemene
! We put FFF in place because FFFl is a logical flag
321 1 equemene
     DO I=1,Nat
322 1 equemene
        DO J=1,3
323 1 equemene
           if (FFFl(j,i)) FFF(j,i)="T"
324 1 equemene
        END DO
325 1 equemene
     END DO
326 1 equemene
327 1 equemene
!<- PFL 23 Nov 2008
328 1 equemene
329 1 equemene
 Deallocate(FFFl,FFFt)
330 1 equemene
331 1 equemene
  CASE Default
332 1 equemene
     WRITe(*,*) 'Input=',trim(Input),' UNKNOWN. Stop'
333 1 equemene
     STOP
334 1 equemene
335 1 equemene
  END SELECT
336 1 equemene
337 1 equemene
338 1 equemene
 if (debug) Call Header("Exiting Read_Geom")
339 1 equemene
340 1 equemene
END SUBROUTINE Read_Geom