Statistiques
| Révision :

root / src / egrad_ext.f90 @ 1

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

1 1 pfleura2
 subroutine egrad_ext(e,geomcart,gradcart)
2 1 pfleura2
3 1 pfleura2
  ! This routines calculates the energy and the gradient of
4 1 pfleura2
  ! a molecule, using an external code
5 1 pfleura2
6 1 pfleura2
7 1 pfleura2
  use Path_module, only : Nat, renum,Order,OrderInv,AtName, Coord, dzdc, indzmat,Nom,Atome, massat, unit,ProgExe
8 1 pfleura2
  use Io_module
9 1 pfleura2
10 1 pfleura2
  !
11 1 pfleura2
  IMPLICIT NONE
12 1 pfleura2
13 1 pfleura2
  ! Energy (calculated if F300K=.F., else estimated)
14 1 pfleura2
  REAL(KREAL), INTENT (OUT) :: e
15 1 pfleura2
  ! Nb degree of freedom
16 1 pfleura2
  ! Geometry at which gradient is calculated (cf FActual also)
17 1 pfleura2
  REAL(KREAL), INTENT (IN) :: geomcart(Nat,3)
18 1 pfleura2
  ! Gradient calculated at Geom geometry
19 1 pfleura2
  REAL(KREAL), INTENT (OUT) :: gradcart(3*Nat)
20 1 pfleura2
21 1 pfleura2
  ! ======================================================================
22 1 pfleura2
23 1 pfleura2
  character(LCHARS) :: LINE
24 1 pfleura2
25 1 pfleura2
  logical           :: debug
26 1 pfleura2
  LOGICAL :: fexist, FSim
27 1 pfleura2
  LOGICAL, SAVE :: first=.true.
28 1 pfleura2
  LOGICAL, ALLOCATABLE :: Done(:)
29 1 pfleura2
30 1 pfleura2
  REAL(KREAL), SAVE :: Eold=1.e6
31 1 pfleura2
  REAL(KREAL) :: d, a_val, Pi
32 1 pfleura2
33 1 pfleura2
  REAL(KREAL) :: coef,x
34 1 pfleura2
  INTEGER(KINT) :: iat, jat, kat, i, j, n3at, absidg, absidg2
35 1 pfleura2
  INTEGER(KINT) :: kTmp, Istart,ITmp1,ITmp2, Idx
36 1 pfleura2
  INTEGER(KINT), PARAMETER :: IOLOG=12, IOCOM=11
37 1 pfleura2
38 1 pfleura2
  !
39 1 pfleura2
  CHARACTER(132) :: FileIn,FileOut
40 1 pfleura2
41 1 pfleura2
  CHARACTER(LCHARS) :: ListName, TitleTmp, CH32SVAR1
42 1 pfleura2
  CHARACTER(VLCHARS), SAVE :: RstrtCopy, RunCommand
43 1 pfleura2
  LOGICAL, SAVE :: FCopyRstrt=.False., FOrderChecked=.False.
44 1 pfleura2
  LOGICAL   :: FRdyn,FStopNucl, FTmp, Tchk,Tchk1
45 1 pfleura2
  INTEGER(kint) :: NbLists,LastIt,Nat4,NStep, Firstit
46 1 pfleura2
  INTEGER(KINT) :: NStepAd,NStepTmp
47 1 pfleura2
  INTEGER(KINT) :: IShowTmp
48 1 pfleura2
  REAL(KREAL)   :: FricPsiMin,FricPsiT, FricNuclTmp
49 1 pfleura2
50 1 pfleura2
51 1 pfleura2
  INTEGER(KINT), PARAMETER :: NbExtName=4
52 1 pfleura2
53 1 pfleura2
  INTEGER(KINT) :: ICouc
54 1 pfleura2
55 1 pfleura2
  INTEGER(KINT) :: ILine
56 1 pfleura2
  INTEGER(KINT) :: NPulses, PulseLen, NStepWarm,NStepAv,NStepEq,NStepTot
57 1 pfleura2
  REAL(KREAL) :: TempWarm,Mean,Slope,Dev,RTmp1,RTmp2
58 1 pfleura2
59 1 pfleura2
  ! ======================================================================
60 1 pfleura2
61 1 pfleura2
  LOGICAL, EXTERNAL :: valid
62 1 pfleura2
63 1 pfleura2
  ! ======================================================================
64 1 pfleura2
65 1 pfleura2
66 1 pfleura2
  Pi=dacos(-1.0d0)
67 1 pfleura2
  n3at=3*nat
68 1 pfleura2
69 1 pfleura2
  debug=valid('EGRAD')
70 1 pfleura2
  if (debug) WRITE(*,*) '================ Entering Egrad_ext ===================='
71 1 pfleura2
72 1 pfleura2
  RunCommand=Trim(Adjustl(ProgExe))
73 1 pfleura2
  FileIn=Trim(CalcName) // Trim(ISuffix)
74 1 pfleura2
  FileOut=Trim(CalcName) // Trim(OSuffix)
75 1 pfleura2
76 1 pfleura2
  IF (DEBUG) WRITE(*,*)'RunCommand:',TRIM(RunCommand)
77 1 pfleura2
78 1 pfleura2
  ! we create the input file
79 1 pfleura2
80 1 pfleura2
  OPEN(IOTMP,File=FileIn)
81 1 pfleura2
82 1 pfleura2
  WRITE(IOTMP,'(1X,I10)') NAt
83 1 pfleura2
  WRITE(IOTMP,'(1X,A)') Coord
84 1 pfleura2
85 1 pfleura2
     DO I=1,Nat
86 1 pfleura2
        If (renum) THEN
87 1 pfleura2
           Iat=Order(I)
88 1 pfleura2
           WRITE(IOTMP,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(I)),GeomCart(Iat,:)
89 1 pfleura2
        ELSE
90 1 pfleura2
           Iat=OrderInv(I)
91 1 pfleura2
           WRITE(IOTMP,'(1X,A10,3(1X,F15.8),A)') Trim(AtName(Iat)),GeomCart(I,:)
92 1 pfleura2
        END IF
93 1 pfleura2
     END DO
94 1 pfleura2
95 1 pfleura2
  call system(RunCommand)
96 1 pfleura2
97 1 pfleura2
  if (debug) WRITE(*,*) 'DBG EGRAD, back from calculation'
98 1 pfleura2
99 1 pfleura2
  OPEN(IOTMP,FILE=FileOut, STATUS='old')
100 1 pfleura2
  ! We first search for the forces
101 1 pfleura2
  READ(IOTMP,*) e
102 1 pfleura2
  DO I=1,Nat
103 1 pfleura2
     Iat=I
104 1 pfleura2
     IF (renum) Iat=Order(I)
105 1 pfleura2
     READ(IOTMP,*)  GradCart(3*Iat-2:3*Iat)
106 1 pfleura2
  END DO
107 1 pfleura2
108 1 pfleura2
  CLOSE(IOTMP)
109 1 pfleura2
110 1 pfleura2
111 1 pfleura2
  if (debug) WRITE(*,*) '================  Egrad_ext Over ===================='
112 1 pfleura2
113 1 pfleura2
  RETURN
114 1 pfleura2
115 1 pfleura2
999 CONTINUE
116 1 pfleura2
  if (.NOT.Ftmp) WRITE(*,*) 'We should not be here !!!!'
117 1 pfleura2
  STOP
118 1 pfleura2
  ! ======================================================================
119 1 pfleura2
end subroutine egrad_ext