Statistiques
| Révision :

root / src / Check_step.f90 @ 4

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