Statistiques
| Révision :

root / src / egrad_turbomole.f90 @ 1

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

1 1 equemene
subroutine egrad_turbomole(e,geomcart,gradcart)
2 1 equemene
3 1 equemene
  ! This routines calculates the energy and the gradient of
4 1 equemene
  ! a molecule, using TurboMole
5 1 equemene
6 1 equemene
  use Path_module, only : Nat, AtName, unit,ProgExe,renum,order,OrderInv
7 1 equemene
  use Io_module
8 1 equemene
9 1 equemene
  IMPLICIT NONE
10 1 equemene
11 1 equemene
  ! Energy (calculated if F300K=.F., else estimated)
12 1 equemene
  REAL(KREAL), INTENT (OUT) :: e
13 1 equemene
  ! Nb degree of freedom
14 1 equemene
  REAL(KREAL), INTENT (IN) :: geomcart(Nat,3)
15 1 equemene
  ! Gradient calculated at Geom geometry
16 1 equemene
  REAL(KREAL), INTENT (OUT) :: gradcart(3*NAt)
17 1 equemene
18 1 equemene
  ! ======================================================================
19 1 equemene
20 1 equemene
  character(LCHARS) :: LINE
21 1 equemene
22 1 equemene
  logical           :: debug
23 1 equemene
24 1 equemene
  REAL(KREAL), ALLOCATABLE :: GradTmp(:)
25 1 equemene
26 1 equemene
  REAL(KREAL) :: d, a_val, Pi
27 1 equemene
28 1 equemene
  REAL(KREAL) :: coef,x
29 1 equemene
  INTEGER(KINT) :: iat, jat, kat, i, j, k,n3at
30 1 equemene
  INTEGER(KINT) :: ITmp1,ITmp2, Idx
31 1 equemene
  INTEGER(KINT), PARAMETER :: IOLOG=12, IOCOM=11
32 1 equemene
33 1 equemene
  CHARACTER(132) :: FileIn, FileOut, FileChk
34 1 equemene
35 1 equemene
  CHARACTER(3) :: SepIn=' ', SepOut=' '
36 1 equemene
  CHARACTER(VLCHARS), SAVE ::  RunCommand
37 1 equemene
38 1 equemene
  ! ======================================================================
39 1 equemene
40 1 equemene
  INTERFACE
41 1 equemene
     function valid(string) result (isValid)
42 1 equemene
       CHARACTER(*), intent(in) :: string
43 1 equemene
       logical                  :: isValid
44 1 equemene
     END function VALID
45 1 equemene
  END INTERFACE
46 1 equemene
47 1 equemene
  ! ======================================================================
48 1 equemene
49 1 equemene
  Pi=dacos(-1.0d0)
50 1 equemene
  n3at=3*nat
51 1 equemene
52 1 equemene
  debug=valid('EGRAD')
53 1 equemene
  if (debug) WRITE(*,*) '================ Entering Egrad_TurboMole ===================='
54 1 equemene
55 1 equemene
56 1 equemene
  gradcart=0.
57 1 equemene
  E=0.
58 1 equemene
59 1 equemene
  FileIn="coord"
60 1 equemene
  FileOut="gradient"
61 1 equemene
62 1 equemene
  RunCommand=Trim(ProgExe)
63 1 equemene
64 1 equemene
  IF (DEBUG) WRITE(*,*)'RunCommand:',TRIM(RunCommand)
65 1 equemene
66 1 equemene
  ! we create the input file
67 1 equemene
68 1 equemene
  OPEN(IOTMP,File=FileIn)
69 1 equemene
  WRITE(IOTMP,'(1X,A)') '$coord'
70 1 equemene
  DO I=1,Nat
71 1 equemene
     If (renum) THEN
72 1 equemene
        Iat=Order(I)
73 1 equemene
        WRITE(IOTMP,'(1X,3(1X,F15.8),A5)') GeomCart(Iat,:)*Unit,Trim(AtName(Iat))
74 1 equemene
     ELSE
75 1 equemene
        Iat=OrderInv(I)
76 1 equemene
        WRITE(IOTMP,'(1X,3(1X,F15.8),A5)') GeomCart(I,:)*Unit,Trim(AtName(Iat))
77 1 equemene
     END IF
78 1 equemene
  END DO
79 1 equemene
  WRITE(IOTMP,'(1X,A)') '$user-defined bonds'
80 1 equemene
  WRITE(IOTMP,'(1X,A)') '$end'
81 1 equemene
  CLOSE(IOTMP)
82 1 equemene
83 1 equemene
  IF (debug) THEN
84 1 equemene
     WRITE(*,*) 'DBG EGRAD ' //  Trim(FileIn)
85 1 equemene
     call system('cat ' // Trim(FileIn))
86 1 equemene
  END IF
87 1 equemene
88 1 equemene
89 1 equemene
  call system(RunCommand)
90 1 equemene
91 1 equemene
  if (debug) WRITE(*,*) 'DBG EGRAD, back from calculation'
92 1 equemene
93 1 equemene
  ! Whatever the coordinate system, we read the cartesian gradient
94 1 equemene
  ! and we convert it to Zmat or other if needed
95 1 equemene
96 1 equemene
  OPEN(IOTMP,FILE=FileOut, STATUS='old')
97 1 equemene
! We check that gradient file is ok
98 1 equemene
  READ(IOTMP,'(A)') LINE
99 1 equemene
  Line=AdjustL(Line)
100 1 equemene
  if (Line(1:5).NE.'$grad') THEN
101 1 equemene
     WRITE(*,*) "Error with Turbomole, gradient file does not start with $grad"
102 1 equemene
     STOP
103 1 equemene
  END IF
104 1 equemene
105 1 equemene
! we read the energy
106 1 equemene
  READ(IOTMP,'(A)') LINE
107 1 equemene
! energy is after the second = sign:
108 1 equemene
!  cycle =      1    SCF energy =    -2889.2212497430   |dE/dxyz| =  0.064137
109 1 equemene
  Idx=Index(Line,'=')
110 1 equemene
  Line=Line(Idx+1:)
111 1 equemene
  Idx=Index(Line,'=')
112 1 equemene
  Line=Line(Idx+1:)
113 1 equemene
 READ(Line,*) E
114 1 equemene
115 1 equemene
! We skip the coordinates
116 1 equemene
 DO I=1,Nat
117 1 equemene
    READ(IOTMP,'(A)') LINE
118 1 equemene
 END DO
119 1 equemene
120 1 equemene
! We read the gradient
121 1 equemene
  DO I=1,Nat
122 1 equemene
     Iat=I
123 1 equemene
     IF (renum) Iat=Order(I)
124 1 equemene
     READ(IOTMP,*)  GradCart(3*Iat-2:3*Iat)
125 1 equemene
     if (debug) WRITE(*,*) "I,Iat,GradCart:",I,Iat,GradCart(3*Iat-2:3*Iat)
126 1 equemene
  END DO
127 1 equemene
128 1 equemene
! TurboMole gives the Forces in au/a0, so we convert it into the
129 1 equemene
! gradient in ua/Angstrom
130 1 equemene
  gradCart=gradCart*unit
131 1 equemene
132 1 equemene
  CLOSE(IOTMP)
133 1 equemene
134 1 equemene
  if (debug) WRITE(*,*) '================  Egrad_TurboMole Over ===================='
135 1 equemene
136 1 equemene
  RETURN
137 1 equemene
138 1 equemene
999 CONTINUE
139 1 equemene
  WRITE(*,*) 'We should not be here !!!!'
140 1 equemene
  STOP
141 1 equemene
  ! ======================================================================
142 1 equemene
end subroutine egrad_TurboMole