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