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