Statistiques
| Révision :

root / src / egrad_ext.f90 @ 4

Historique | Voir | Annoter | Télécharger (3,14 ko)

1
 subroutine egrad_ext(e,geomcart,gradcart)
2

    
3
  ! This routines calculates the energy and the gradient of 
4
  ! a molecule, using an external code
5

    
6

    
7
  use Path_module, only : Nat, renum,Order,OrderInv,AtName, Coord, dzdc, indzmat,Nom,Atome, massat, unit,ProgExe
8
  use Io_module
9

    
10
  !
11
  IMPLICIT NONE
12

    
13
  ! Energy (calculated if F300K=.F., else estimated)
14
  REAL(KREAL), INTENT (OUT) :: e
15
  ! Nb degree of freedom
16
  ! Geometry at which gradient is calculated (cf FActual also)
17
  REAL(KREAL), INTENT (IN) :: geomcart(Nat,3)
18
  ! Gradient calculated at Geom geometry
19
  REAL(KREAL), INTENT (OUT) :: gradcart(3*Nat)
20

    
21
  ! ======================================================================
22

    
23
  character(LCHARS) :: LINE
24

    
25
  logical           :: debug
26
  LOGICAL :: fexist, FSim
27
  LOGICAL, SAVE :: first=.true.
28
  LOGICAL, ALLOCATABLE :: Done(:)
29

    
30
  REAL(KREAL), SAVE :: Eold=1.e6
31
  REAL(KREAL) :: d, a_val, Pi
32

    
33
  REAL(KREAL) :: coef,x
34
  INTEGER(KINT) :: iat, jat, kat, i, j, n3at, absidg, absidg2
35
  INTEGER(KINT) :: kTmp, Istart,ITmp1,ITmp2, Idx
36
  INTEGER(KINT), PARAMETER :: IOLOG=12, IOCOM=11
37

    
38
  !
39
  CHARACTER(132) :: FileIn,FileOut
40

    
41
  CHARACTER(LCHARS) :: ListName, TitleTmp, CH32SVAR1
42
  CHARACTER(VLCHARS), SAVE :: RstrtCopy, RunCommand
43
  LOGICAL, SAVE :: FCopyRstrt=.False., FOrderChecked=.False.
44
  LOGICAL   :: FRdyn,FStopNucl, FTmp, Tchk,Tchk1
45
  INTEGER(kint) :: NbLists,LastIt,Nat4,NStep, Firstit
46
  INTEGER(KINT) :: NStepAd,NStepTmp
47
  INTEGER(KINT) :: IShowTmp
48
  REAL(KREAL)   :: FricPsiMin,FricPsiT, FricNuclTmp
49

    
50

    
51
  INTEGER(KINT), PARAMETER :: NbExtName=4
52

    
53
  INTEGER(KINT) :: ICouc
54

    
55
  INTEGER(KINT) :: ILine
56
  INTEGER(KINT) :: NPulses, PulseLen, NStepWarm,NStepAv,NStepEq,NStepTot
57
  REAL(KREAL) :: TempWarm,Mean,Slope,Dev,RTmp1,RTmp2
58

    
59
  ! ======================================================================
60

    
61
  LOGICAL, EXTERNAL :: valid
62

    
63
  ! ======================================================================
64

    
65

    
66
  Pi=dacos(-1.0d0)
67
  n3at=3*nat
68

    
69
  debug=valid('EGRAD')
70
  if (debug) WRITE(*,*) '================ Entering Egrad_ext ===================='
71

    
72
  RunCommand=Trim(Adjustl(ProgExe))
73
  FileIn=Trim(CalcName) // Trim(ISuffix)
74
  FileOut=Trim(CalcName) // Trim(OSuffix)
75

    
76
  IF (DEBUG) WRITE(*,*)'RunCommand:',TRIM(RunCommand)
77

    
78
  ! we create the input file
79

    
80
  OPEN(IOTMP,File=FileIn)
81

    
82
  WRITE(IOTMP,'(1X,I10)') NAt
83
  WRITE(IOTMP,'(1X,A)') Coord
84

    
85
     DO I=1,Nat
86
        If (renum) THEN
87
           Iat=Order(I)
88
           WRITE(IOTMP,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(I)),GeomCart(Iat,:)
89
        ELSE
90
           Iat=OrderInv(I)
91
           WRITE(IOTMP,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomCart(I,:)
92
        END IF
93
     END DO
94

    
95
  call system(RunCommand)
96

    
97
  if (debug) WRITE(*,*) 'DBG EGRAD, back from calculation'
98

    
99
  OPEN(IOTMP,FILE=FileOut, STATUS='old')
100
  ! We first search for the forces
101
  READ(IOTMP,*) e
102
  DO I=1,Nat
103
     Iat=I
104
     IF (renum) Iat=Order(I)
105
     READ(IOTMP,*)  GradCart(3*Iat-2:3*Iat)
106
  END DO
107

    
108
  CLOSE(IOTMP)
109

    
110

    
111
  if (debug) WRITE(*,*) '================  Egrad_ext Over ===================='
112

    
113
  RETURN
114

    
115
999 CONTINUE
116
  if (.NOT.Ftmp) WRITE(*,*) 'We should not be here !!!!'
117
  STOP
118
  ! ======================================================================
119
end subroutine egrad_ext