root / src / Check_step.f90 @ 2
Historique | Voir | Annoter | Télécharger (4,91 ko)
1 | 1 | equemene | ! This subroutine checks that the required step fulfills some conditions: |
---|---|---|---|
2 | 1 | equemene | ! v1.0 |
3 | 1 | equemene | ! Only valence angles are checked to remain in to 0:Pi range. |
4 | 1 | equemene | |
5 | 1 | equemene | SUBROUTINE Check_step(IGeom,Coord,Nat,NCoord,GeomOld,Step) |
6 | 1 | equemene | |
7 | 1 | equemene | Use Path_module, only : pi,ncart |
8 | 1 | equemene | |
9 | 1 | equemene | IMPLICIT NONE |
10 | 1 | equemene | |
11 | 1 | equemene | |
12 | 1 | equemene | INTEGER, PARAMETER :: KINT=KIND(1) |
13 | 1 | equemene | INTEGER, PARAMETER :: KREAL=KIND(1.D0) |
14 | 1 | equemene | |
15 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: Nat,NCoord,IGeom |
16 | 1 | equemene | CHARACTER(32), INTENT(IN) :: Coord |
17 | 1 | equemene | REAL(KREAL), INTENT(INOUT) :: Step(NCoord) |
18 | 1 | equemene | REAL(KREAL), INTENT(IN) :: GeomOld(NCoord) |
19 | 1 | equemene | |
20 | 1 | equemene | ! As this subroutine is here for debugging, debug=T ! |
21 | 1 | equemene | LOGICAL, PARAMETER :: debug=.TRUE. |
22 | 1 | equemene | LOGICAL :: Fini |
23 | 1 | equemene | |
24 | 1 | equemene | ! Variables |
25 | 1 | equemene | INTEGER(KINT) :: IBeg, Idx,Iat |
26 | 1 | equemene | REAL(KREAL) :: Fact |
27 | 1 | equemene | |
28 | 1 | equemene | ! Parameters |
29 | 1 | equemene | REAL(KREAL),PARAMETER :: eps=1e-8 |
30 | 1 | equemene | |
31 | 1 | equemene | INTERFACE |
32 | 1 | equemene | function valid(string) result (isValid) |
33 | 1 | equemene | CHARACTER(*), intent(in) :: string |
34 | 1 | equemene | logical :: isValid |
35 | 1 | equemene | END function VALID |
36 | 1 | equemene | END INTERFACE |
37 | 1 | equemene | |
38 | 1 | equemene | if (.NOT.Valid("CheckStep")) RETURN |
39 | 1 | equemene | |
40 | 1 | equemene | if (nat.LE.2) THEN |
41 | 1 | equemene | if (debug) WRITE(*,*) "Check-Step useless for 2 or less atoms !" |
42 | 1 | equemene | return |
43 | 1 | equemene | END IF |
44 | 1 | equemene | |
45 | 1 | equemene | if (debug) WRITE(*,*) "=========================== Entering Check_Step ====================" |
46 | 1 | equemene | |
47 | 1 | equemene | Fact=1.d0 |
48 | 1 | equemene | |
49 | 1 | equemene | SELECT CASE(COORD) |
50 | 1 | equemene | CASE ('ZMAT') |
51 | 1 | equemene | Idx=3 |
52 | 1 | equemene | IF (STEP(Idx).GT.Eps) THEN |
53 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
54 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
55 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
56 | 1 | equemene | END IF |
57 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
58 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
59 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
60 | 1 | equemene | END IF |
61 | 1 | equemene | END IF |
62 | 1 | equemene | If (Nat.GT.3) THEN |
63 | 1 | equemene | Idx=5 |
64 | 1 | equemene | IF (STEP(Idx).GE.Eps) THEN |
65 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
66 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
67 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
68 | 1 | equemene | END IF |
69 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
70 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
71 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
72 | 1 | equemene | END IF |
73 | 1 | equemene | END IF |
74 | 1 | equemene | DO Iat=5,Nat |
75 | 1 | equemene | Idx=Idx+3 |
76 | 1 | equemene | IF (STEP(Idx).GE.Eps) THEN |
77 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
78 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
79 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
80 | 1 | equemene | END IF |
81 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
82 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
83 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
84 | 1 | equemene | END IF |
85 | 1 | equemene | END IF |
86 | 1 | equemene | END DO |
87 | 1 | equemene | END IF |
88 | 1 | equemene | |
89 | 1 | equemene | CASE ('MIXED') |
90 | 1 | equemene | SELECT CASE (NCart) |
91 | 1 | equemene | CASE (1:2) |
92 | 1 | equemene | Idx=3 |
93 | 1 | equemene | IF (STEP(Idx).GE.Eps) THEN |
94 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
95 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
96 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
97 | 1 | equemene | END IF |
98 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
99 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
100 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
101 | 1 | equemene | END IF |
102 | 1 | equemene | END IF |
103 | 1 | equemene | IF (Nat.GT.3) THEN |
104 | 1 | equemene | Idx=5 |
105 | 1 | equemene | IF (STEP(Idx).GE.Eps) THEN |
106 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
107 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
108 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
109 | 1 | equemene | END IF |
110 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
111 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
112 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
113 | 1 | equemene | END IF |
114 | 1 | equemene | END IF |
115 | 1 | equemene | END IF |
116 | 1 | equemene | IBeg=5 |
117 | 1 | equemene | CASE (3:) |
118 | 1 | equemene | IBeg=NCart+1 |
119 | 1 | equemene | Idx=3*Ncart+2 |
120 | 1 | equemene | |
121 | 1 | equemene | END SELECT |
122 | 1 | equemene | DO Iat=5,Nat |
123 | 1 | equemene | IF (STEP(Idx).GE.Eps) THEN |
124 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).GE.Pi) THEN |
125 | 1 | equemene | Fact=min(Fact,0.999d0*(Pi-GeomOld(Idx))/Step(Idx)) |
126 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle >=180. Idx=",Idx |
127 | 1 | equemene | END IF |
128 | 1 | equemene | If (GeomOld(Idx)+Step(Idx).LE.0) THEN |
129 | 1 | equemene | Fact=min(Fact,abs(0.999d0*GeomOld(Idx)/Step(Idx))) |
130 | 1 | equemene | WRITE(*,*) "WARNING: Step reduced to prevent valence angle <=0. Idx=",Idx |
131 | 1 | equemene | END IF |
132 | 1 | equemene | END IF |
133 | 1 | equemene | Idx=Idx+3 |
134 | 1 | equemene | END DO |
135 | 1 | equemene | |
136 | 1 | equemene | CASE ('CART','HYBRID','BAKER') |
137 | 1 | equemene | if (debug) WRITE(*,*) "DBG Check_step: Check useless for COORD=",TRIM(COORD) |
138 | 1 | equemene | CASE DEFAULT |
139 | 1 | equemene | WRITE(*,*) "COORD=",TRIM(COORD)," Not recognized in Check_step" |
140 | 1 | equemene | STOP |
141 | 1 | equemene | END SELECT |
142 | 1 | equemene | |
143 | 1 | equemene | If (debug) WRITE(*,*) "Check_Step: Fact=",Fact |
144 | 1 | equemene | Step=Step*Fact |
145 | 1 | equemene | |
146 | 1 | equemene | if (debug) WRITE(*,*) "=========================== Exiting Check_Step ====================" |
147 | 1 | equemene | |
148 | 1 | equemene | END SUBROUTINE Check_step |