Statistiques
| Révision :

root / src / Check_step.f90 @ 3

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