Statistiques
| Révision :

root / src / PrintGeom.f90

Historique | Voir | Annoter | Télécharger (6,83 ko)

1
! This subroutine prints a geometry
2
SUBROUTINE PrintGeom(Title,Nat,NCoord,Geom,Coord,IOOUT,Atome,Order,OrderInv,IndZmat)
3

    
4
!----------------------------------------------------------------------
5
!  Copyright 2003-2014 Ecole Normale Supérieure de Lyon, 
6
!  Centre National de la Recherche Scientifique,
7
!  Université Claude Bernard Lyon 1. All rights reserved.
8
!
9
!  This work is registered with the Agency for the Protection of Programs 
10
!  as IDDN.FR.001.100009.000.S.P.2014.000.30625
11
!
12
!  Authors: P. Fleurat-Lessard, P. Dayal
13
!  Contact: optnpath@gmail.com
14
!
15
! This file is part of "Opt'n Path".
16
!
17
!  "Opt'n Path" is free software: you can redistribute it and/or modify
18
!  it under the terms of the GNU Affero General Public License as
19
!  published by the Free Software Foundation, either version 3 of the License,
20
!  or (at your option) any later version.
21
!
22
!  "Opt'n Path" is distributed in the hope that it will be useful,
23
!  but WITHOUT ANY WARRANTY; without even the implied warranty of
24
!
25
!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
!  GNU Affero General Public License for more details.
27
!
28
!  You should have received a copy of the GNU Affero General Public License
29
!  along with "Opt'n Path". If not, see <http://www.gnu.org/licenses/>.
30
!
31
! Contact The Office of Technology Licensing, valorisation@ens-lyon.fr,
32
! for commercial licensing opportunities.
33
!----------------------------------------------------------------------
34

    
35
  use Path_module, only : Renum,Nom,NCart,Pi
36

    
37
  IMPLICIT NONE
38

    
39

    
40
  INTEGER, PARAMETER :: KINT=KIND(1)
41
  INTEGER, PARAMETER :: KREAL=KIND(1.D0)
42

    
43
  CHARACTER(*), INTENT(IN) :: Title
44
  INTEGER(KINT), INTENT(IN) :: Nat,NCoord,IoOut
45
  INTEGER(KINT), INTENT(IN) :: Atome(Nat),Order(Nat), OrderInv(Nat),IndZmat(Nat,5)
46
  CHARACTER(32), INTENT(IN) :: Coord
47
  REAL(KREAL), INTENT(IN) :: Geom(NCoord)
48

    
49
  INTEGER(KINT) :: Idx, Iat,I,IBeg
50
  CHARACTER(32) :: Name1, Name2, Name3,Name4
51
  LOGICAL :: Debug=.FALSE.
52

    
53
  SELECT CASE (COORD)
54
  CASE ("ZMAT") 
55
     
56
     WRITE(IOOUT,'(1X,A)') TRIM(AdjustL(Title))
57
     WRITE(Name1,'(A,I5)') Nom(Atome(OrderInv(indzmat(1,1)))),indzmat(1,1)
58
!     WRITE(*,*) "Name1:",Name1,"*"
59
     Call CleanString(Name1,' ')
60
!     WRITE(*,*) "Name1:",Name1,"*"
61
     WRITE(IOOUT,'(1X,A5,3(1X,A4,1X,F11.6))') Name1(1:5)
62
     WRITE(Name1,'(A,I5)') Nom(Atome(OrderInv(indzmat(2,1)))),indzmat(2,1)
63
     Call CleanString(Name1,' ')
64
     WRITE(Name2,'(A,I5)') Nom(Atome(OrderInv(indzmat(2,2)))),indzmat(2,2)
65
     Call CleanString(Name2,' ')
66
     WRITE(IOOUT,'(1X,A5,3(1X,A4,1X,F11.6))') Name1(1:5), &
67
          Name2(1:5),Geom(1)
68
     WRITE(Name1,'(A,I5)') Nom(Atome(OrderInv(indzmat(3,1)))),indzmat(3,1)
69
     Call CleanString(Name1,' ')
70
     WRITE(Name2,'(A,I5)') Nom(Atome(OrderInv(indzmat(3,2)))),indzmat(3,2)
71
     Call CleanString(Name2,' ')
72
     WRITE(Name3,'(A,I5)') Nom(Atome(OrderInv(indzmat(3,3)))),indzmat(3,3)
73
     Call CleanString(Name3,' ')
74
     WRITE(IOOUT,'(1X,A5,3(1X,A4,1X,F11.6))') Name1, &
75
          Name2,Geom(2), &
76
          Name3,Geom(3)*180./Pi
77
     Idx=4
78
     DO Iat=4,Nat
79
     WRITE(Name1,'(A,I5)') Nom(Atome(OrderInv(indzmat(iat,1)))),indzmat(iat,1)
80
     Call CleanString(Name1,' ')
81
     WRITE(Name2,'(A,I5)') Nom(Atome(OrderInv(indzmat(iat,2)))),indzmat(iat,2)
82
     Call CleanString(Name2,' ')
83
     WRITE(Name3,'(A,I5)') Nom(Atome(OrderInv(indzmat(iat,3)))),indzmat(iat,3)
84
     Call CleanString(Name3,' ')
85
     WRITE(Name4,'(A,I5)') Nom(Atome(OrderInv(indzmat(iat,4)))),indzmat(iat,4)
86
     Call CleanString(Name4,' ')
87

    
88
        ! WRITE(IOOUT,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
89
        !      Nom(Atome(OrderInv(indzmat(iat,2)))),Geom(Idx), &
90
        !      Nom(Atome(OrderInv(indzmat(iat,3)))),Geom(Idx+1)*180./Pi, &
91
        !      Nom(Atome(OrderInv(indzmat(iat,4)))),Geom(Idx+2)*180./Pi
92
        WRITE(IOOUT,'(1X,A5,3(1X,A4,1X,F11.6))') Name1, &
93
             Name2,Geom(Idx), &
94
             Name3,Geom(Idx+1)*180./Pi, &
95
             Name4,Geom(Idx+2)*180./Pi
96
        Idx=Idx+3
97
     END DO
98

    
99

    
100
     if (debug) THEN
101
        WRITE(*,'(1X,A)') TRIM(AdjustL(Title))
102
        WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1))))
103
        WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(2,1)))), &
104
             Nom(Atome(OrderInv(indzmat(2,2)))),Geom(1)
105
        WRITE(*,'(1X,A5,3(1X,A4,1X,F14.6))') Nom(Atome(OrderInv(indzmat(3,1)))), &
106
             Nom(Atome(OrderInv(indzmat(3,2)))),Geom(2), &
107
             Nom(Atome(OrderInv(indzmat(3,3)))),Geom(3)*180./Pi
108
        Idx=4
109
        DO Iat=4,Nat
110
           WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
111
                Nom(Atome(OrderInv(indzmat(iat,2)))),Geom(Idx), &
112
                Nom(Atome(OrderInv(indzmat(iat,3)))),Geom(Idx+1)*180./Pi, &
113
                Nom(Atome(OrderInv(indzmat(iat,4)))),Geom(Idx+2)*180./Pi
114
           Idx=Idx+3
115
        END DO
116
     END IF
117
  CASE ("MIXED") 
118
     !     WRITE(*,'(1X,A,12(1X,F10.5))') "IntCoordTmp:",Geom(1:NCoord)
119
     WRITE(IOOUT,'(1X,A)') TRIM(AdjustL(Title))
120
     DO I=1,NCart
121
        WRITE(IOOUT,'(1X,A5,3(1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1)))) &
122
             ,Geom(3*I-2:3*I)
123
     END DO
124
     Idx=3*NCart+1
125
     SELECT CASE (NCart)
126
     CASE (1)
127
        I=2
128
        WRITE(IOOUT,'(1X,A5,3(I5,F11.6))') Nom(Atome(OrderInv(Indzmat(I,1)))), &
129
             IndZmat(I,2),Geom(Idx)
130
        Idx=Idx+1
131
        I=3
132
        WRITE(IOOUT,'(1X,A5,3(I5,F11.6))') Nom(Atome(OrderInv(Indzmat(I,1)))), &
133
             IndZmat(I,2),Geom(Idx),IndZmat(I,3),          &
134
             Geom(Idx+1)*180./Pi
135
        Idx=Idx+2
136
        Ibeg=4
137
     CASE (2)
138
        I=3
139
        WRITE(IOOUT,'(1X,A5,3(I5,F11.6))') Nom(Atome(OrderInv(Indzmat(I,1)))), &
140
             IndZmat(I,2),Geom(Idx),IndZmat(I,3),          &
141
             Geom(Idx+1)*180./Pi
142
        Idx=Idx+2
143
        Ibeg=4
144
     CASE DEFAULT
145
        IBeg=NCart+1
146
     END SELECT
147
     DO I=IBeg,Nat
148
        WRITE(IOOUT,'(1X,A5,3(I5,F11.6))') Nom(Atome(OrderInv(Indzmat(I,1)))), &
149
             IndZmat(I,2),Geom(Idx),IndZmat(I,3),          &
150
             Geom(Idx+1)*180./Pi, &
151
             IndZmat(I,4),Geom(Idx+2)*180./Pi
152
        Idx=Idx+3
153
     END DO
154
  CASE ('CART','HYBRID')
155
     WRITE(IOOUT,'(1X,I5)') Nat
156
     WRITE(IOOUT,'(1X,A)') TRIM(AdjustL(Title))
157
     DO I=1,Nat
158
        Iat=I
159
        If (renum) Iat=Order(I)
160
!!! CAUTION : PFL 29.AUG.2008 ->
161
        ! Old line:
162
        !        WRITE(IOOUT,'(1X,A5,3(1X,F11.6))') Nom(Atome(i)), Geom(3*Iat-2:3*Iat)
163
        ! uses implicitly that Geom is Geom(3,Nat) whereas it is in fact Geom(Nat,3) :-(
164
        WRITE(IOOUT,'(1X,A5,3(1X,F11.6))') Nom(Atome(i)), Geom(Iat), Geom(Iat+Nat), Geom(Iat+2*Nat)
165

    
166
     END DO
167
  CASE ('BAKER')
168
     !WRITE(IOOUT,*) "Baker coordinates are difficult to interpret. Therefore cartesian coordinates"
169
     !WRITE(IOOUT,*) "Should be printed"
170
     WRITE(*,*) "Baker coordinates are difficult to interpret. Therefore cartesian"
171
     WRITE(*,*) "coordinates are printed above."
172
  END SELECT
173

    
174
END SUBROUTINE PRINTGEOM