Statistiques
| Révision :

root / src / Write_path.f90 @ 4

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

1
SUBROUTINE Write_path(Iopt)
2

    
3
  Use Path_module
4
  Use Io_module
5

    
6
  IMPLICIT NONE
7

    
8
  INTEGER(KINT), INTENT(IN) :: Iopt
9

    
10
  INTEGER(KINT) :: IGeom, Idx, Iat, I,J
11
  REAL(KREAL), ALLOCATABLE :: GeomTmpC(:), GeomTmp(:),GeomTmpC2(:,:)
12
  CHARACTER(SCHARS) :: Line
13
  CHARACTER(LCHARS) ::Title
14
  LOGICAL :: Debug
15

    
16
  INTERFACE
17
     function valid(string) result (isValid)
18
       CHARACTER(*), intent(in) :: string
19
       logical                  :: isValid
20
     END function VALID
21
  END INTERFACE
22

    
23
  debug=valid('write_path').OR.valid('writepath')
24
  if (debug) Call Header("Entering Write_PATH")
25

    
26

    
27
  ALLOCATE(GeomTmpC(3*Nat), GeomTmp(NCoord),GeomTmpC2(Nat,3))
28

    
29
  IF (IOpt.GE.0) THEN
30
     WRITE(Line,'(I5)') Iopt
31
  ELSE
32
     Line="Ini"
33
     Energies=0.
34
  END IF
35
  OPEN(IOTMP,File=Trim(PathName) // '.' // AdjustL(TRIM(Line)))
36
  IF ((COORD.EQ.'ZMAT').OR.(COORD.EQ.'MIXED').OR.(COORD.EQ.'BAKER')) &
37
       OPEN(IOCART,File=TRIM(PathName) // '_cart.' //  AdjustL(TRIM(Line)))
38

    
39
  DO IGeom=1,NGeomF
40
     WRITE(Title,"('Geometry ',I3,'/',I3,' for iteration ',I3,' E=',F13.6)") Igeom,NgeomF,Iopt,Energies(IGeom)
41
     SELECT CASE(Coord)
42
     CASE ('CART','HYBRID')
43
        ! XyzGeomF is 3,Nat... but Printgeom expects Nat,3... 
44
        ! this should really be rewritten !!!!
45
        GeomTmp=Reshape(reshape(XyzGeomF(IGeom,:,:),(/Nat,3/),ORDER=(/2,1/)),(/3*Nat/)) 
46
     CASE ('ZMAT','MIXED','BAKER')
47
        GeomTmp=IntCoordF(IGeom,:)
48
     CASE DEFAULT
49
        WRITE(*,*) "Coord=",TRIM(Coord)," not recognized in Write_path. L34.STOP"
50
        STOP
51
     END SELECT
52

    
53
     ! Nothing for the baker case.
54
     Call PrintGeom(Title,Nat,NCoord,GeomTmp,Coord,IoTmp,Atome,Order,OrderInv,IndZmat)
55

    
56
     IF (COORD.EQ.'ZMAT') THEN
57
        ! Writing the Cartesian coordinates
58
        WRITE(IOCART,'(1X,I5)') Nat
59
        WRITE(IOCART,'(1X,A)') Title
60
        ! we have to generate the cartesian coordinates from the internal coordinates
61
        Call Int2Cart(nat,indzmat,GeomTmp,GeomTmpC)
62
        GeomTmpC2=reshape(GeomTmpC,(/Nat,3/))
63
        DO I=1,Nat
64
           IF (renum) THEN
65
              Iat=Order(I)
66
              !             WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC(3*Iat-2:3*Iat)
67
              WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC2(Iat,1:3)
68
           ELSE
69
              Iat=OrderInv(I)
70
              !            WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC(3*I-2:3*I)
71
              WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC2(I,1:3)
72
           END IF
73
        END DO
74
     END IF ! matches IF (COORD.EQ.'ZMAT') THEN
75

    
76
     IF (COORD.EQ.'BAKER') THEN
77
        ! Writing the Cartesian coordinates
78
        WRITE(IOCART,'(1X,I5)') Nat
79
        WRITE(IOCART,'(1X,A)') Title
80
        ! we have to generate the cartesian coordinates from the internal coordinates
81
        ! we can also print the cartesiann coordinates directly from XyzGeomF??
82
        !Call ConvertBakerInternal_cart(InCoordF(IGeom-1,:),InCoordF(IGeom,:))
83
        ! XyzGeomF(NGeomF,3,Nat), GeomTmpC(3*Nat),GeomTmpC2(Nat,3)
84
        !GeomTmpC2=reshape(GeomTmpC,(/Nat,3/)). XyzGeomF is already updated in 
85
        ! EgradPath.f90
86
        DO I =1, 3
87
           GeomTmpC2(:,I)=XyzGeomF(IGeom,I,:)
88
        END DO
89
        DO I=1,Nat
90
           IF (renum) THEN
91
              Iat=Order(I)
92
              !             WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC(3*Iat-2:3*Iat)
93
              !Print *, GeomTmpC2(Iat,1:3)
94
              WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC2(Iat,1:3)
95
           ELSE
96
              Iat=OrderInv(I)
97
              !            WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC(3*I-2:3*I)
98
              WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC2(I,1:3)
99
           END IF
100
        END DO
101
     END IF ! matches IF (COORD.EQ.'BAKER') THEN
102

    
103
     IF (COORD.EQ.'MIXED') THEN
104
        ! Writing the Cartesian coordinates
105
        WRITE(IOCART,'(1X,I5)') Nat
106
        WRITE(IOCART,'(1X,A)') Title
107
        ! we have to generate the cartesian coordinates from the internal coordinates
108
        Call Mixed2Cart(nat,indzmat,geomtmp,GeomTmpC)
109
        GeomTmpC2=reshape(GeomTmpC,(/Nat,3/))
110
        DO I=1,Nat
111
           IF (renum) THEN
112
              Iat=Order(I)
113
              !             WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC(3*Iat-2:3*Iat)
114
              WRITE(IOCART,'(1X,A10,3(1X,F15.8))') Trim(AtName(I)),GeomTmpC2(Iat,1:3)
115
           ELSE
116
              Iat=OrderInv(I)
117
              !             WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC(3*I-2:3*I)
118
              WRITE(IOCART,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomTmpC2(I,1:3)
119
           END IF
120
        END DO
121
     END IF ! matches IF (COORD.EQ.'MIXED') THEN
122
  END DO ! matches DO IGeom=1,NGeomF
123
  CLOSE(IOTMP)
124
  IF ((COORD.EQ.'ZMAT').OR.(COORD.EQ.'MIXED').OR.(COORD.EQ.'BAKER')) CLOSE(IOCART)
125
  DEALLOCATE(GeomTmpC,GeomTmp)
126

    
127
  if (debug) Call Header('Exiting Write_PATH')
128
END SUBROUTINE Write_path