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 |