Statistiques
| Révision :

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