root / src / PrintGeomVasp.f90 @ 2
Historique | Voir | Annoter | Télécharger (2,88 ko)
1 |
SUBROUTINE PrintGeomVasp(Title,geom,LatrLoc,FrozAt,IoUnit) |
---|---|
2 |
|
3 |
! this subroutine prints a cartesian geometry in the VASP POSCAR format |
4 |
|
5 |
Use Path_module |
6 |
Use Io_module |
7 |
|
8 |
IMPLICIT NONE |
9 |
|
10 |
CHARACTER(*), INTENT(IN) :: TITLE |
11 |
REAL(KREAL),INTENT(IN) :: LatrLoc(3,3),Geom(3*Nat) |
12 |
LOGICAL, INTENT(IN) :: FrozAt(Nat) |
13 |
INTEGER(KINT), INTENT(IN) :: IoUnit |
14 |
|
15 |
INTEGER(KINT) :: IGeom, Idx, Iat, I,J |
16 |
REAL(KREAL), ALLOCATABLE :: GeomTmpC2(:,:),GeomTmpC(:,:) |
17 |
REAL(KREAL) :: MRot(3,3) |
18 |
|
19 |
REAL(KREAL) :: X,Y,Z |
20 |
|
21 |
LOGICAL :: Debug |
22 |
|
23 |
INTERFACE |
24 |
function valid(string) result (isValid) |
25 |
CHARACTER(*), intent(in) :: string |
26 |
logical :: isValid |
27 |
END function VALID |
28 |
END INTERFACE |
29 |
|
30 |
debug=valid('printgeomvasp') |
31 |
if (debug) WRITE(*,*) '================ Entering PrintGeomVasp ====================' |
32 |
|
33 |
ALLOCATE(GeomTmpC2(Nat,3),GeomTmpC(3,Nat)) |
34 |
|
35 |
GeomTmpC=reshape(Geom,SHAPE=(/3,Nat/),ORDER=(/2,1/)) |
36 |
|
37 |
DO I=1,Nat |
38 |
Iat=Order(I) |
39 |
! if (debug) WRITE(*,*) "WriteVASP I,Order(I)",I,Iat |
40 |
GeomTmpC2(I,1:3)=GeomTmpC(1:3,Iat) |
41 |
END DO |
42 |
|
43 |
if (debug) THEN |
44 |
WRITe(*,*) Nat |
45 |
WRITe(*,*) "Original" |
46 |
DO I=1,Nat |
47 |
WRITE(*,'(1X,A4,3(1X,F12.6))') AtName(I), & |
48 |
x0_vasp(I),Y0_vasp(I),z0_vasp(I) |
49 |
END DO |
50 |
WRITE(*,*) Nat |
51 |
WRITe(*,*) "Before align" |
52 |
DO I=1,Nat |
53 |
WRITE(*,'(1X,A4,3(1X,F12.6))') AtName(I), & |
54 |
GeomTmpC2(I,1), GeomTmpC2(I,2), GeomTmpC2(I,3) |
55 |
END DO |
56 |
ENDIF |
57 |
|
58 |
|
59 |
IF ((COORD.EQ.'ZMAT').AND.(Nat.GE.4)) THEN |
60 |
Call AlignPartial(Nat,x0_vasp,y0_vasp,z0_vasp, & |
61 |
GeomTmpC2(1,1),GeomTmpC2(1,2),GeomTMPC2(1,3), & |
62 |
FrozAt,MRot) |
63 |
if (debug) THEN |
64 |
WRITE(*,*) NAt |
65 |
WRITe(*,*) "Aligned ?" |
66 |
DO I=1,Nat |
67 |
WRITE(*,'(1X,A4,3(1X,F12.6))') AtName(I), & |
68 |
GeomTmpC2(I,1), GeomTmpC2(I,2), GeomTmpC2(I,3) |
69 |
END DO |
70 |
ENDIF |
71 |
END IF |
72 |
|
73 |
! We print the corresponding file |
74 |
WRITE(IOUNIT,'(A)') Trim(Title) |
75 |
WRITE(IOUNIT,'(1X,F18.14)') Vasp_Param |
76 |
WRITE(IOUNIT,'(3(1X,F21.16))') Lat_a(1)/Vasp_param,Lat_a(2)/Vasp_param,Lat_a(3)/Vasp_param |
77 |
WRITE(IOUNIT,'(3(1X,F21.16))') Lat_b(1)/Vasp_param,Lat_b(2)/Vasp_param,Lat_b(3)/Vasp_param |
78 |
WRITE(IOUNIT,'(3(1X,F21.16))') Lat_c(1)/Vasp_param,Lat_c(2)/Vasp_param,Lat_c(3)/Vasp_param |
79 |
WRITE(IOUNIT,'(A)') TRIM(Vasp_Types) |
80 |
WRITE(IOUNIT,'(A)') TRIM(Vasp_comment) |
81 |
WRITE(IOUNIT,'(A)') TRIM(Vasp_direct) |
82 |
DO I=1,Nat |
83 |
X=0. |
84 |
Y=0. |
85 |
Z=0. |
86 |
DO J=1,3 |
87 |
X=X+GeomTmpC2(I,J)*LatrLoc(1,J) |
88 |
Y=Y+GeomTmpC2(I,J)*LatrLoc(2,J) |
89 |
Z=Z+GeomTmpC2(I,J)*LatrLoc(3,J) |
90 |
END DO |
91 |
WRITE(IOUNIT,'(3F20.16,1X,3A4)') X,Y,Z,FFF(1:3,I) |
92 |
END DO |
93 |
|
94 |
DeALLOCATE(GeomTmpC2) |
95 |
if (debug) WRITE(*,*) '================ PrintGeomVasp OVER ====================' |
96 |
|
97 |
END SUBROUTINE PrintGeomVasp |