Révision 3

src/egrad_LEPS.f90 (revision 3)
1
  SUBROUTINE egrad_LEPS(nat,e,geom,grad) 
2
! This program computes the ernergy and gradien in cartesian coordinates
3
! for the cartesian geometry Geom
4

  
5
   IMPLICIT NONE
6
     integer, parameter :: KINT = kind(1)
7
     integer, parameter :: KREAL = kind(1.0d0)
8

  
9
! Number of atoms
10
       INTEGER(KINT), INTENT(IN) :: Nat
11
! Input geometry
12
       REAL(KREAL), INTENT(IN) :: Geom(Nat,3)
13
! output energy and gradient
14
       REAL(KREAL), INTENT(OUT) :: E,grad(Nat*3)
15

  
16

  
17
!     Bohr --> Angstr
18
      real(KREAL), parameter :: BOHR   = 0.52917726D+00
19
!
20
! Parameters to define the surface
21
      INTEGER(KINT), DIMENSION(6), PARAMETER :: IECOEF = (/-1,9,-45,45,-9,1/)
22
      INTEGER(KINT), DIMENSION(6), PARAMETER :: ISCOEF = (/-3,-2,-1,1,2,3/)
23
      REAL(KREAL), PARAMETER :: hh=0.001d0
24
      
25
! Variables
26
       INTEGER(KINT) :: i,j,iat,jat
27
       REAL(KREAL), ALLOCATABLE :: Xyztmp(:,:),GradTmp(:,:)
28
       REAL(KREAL) :: xp,yp
29

  
30
       CHARACTER(132) :: Line
31
       LOGICAL :: Debug
32
  
33
      real(KREAL), parameter :: zero = 0.0_KREAL,   one = 1.0_KREAL
34
      REAL(KREAL), external :: ELEPS_xyz
35

  
36

  
37
  INTERFACE
38
     function valid(string) result (isValid)
39
       CHARACTER(*), intent(in) :: string
40
       logical                  :: isValid
41
     END function VALID
42
     
43
  END INTERFACE
44

  
45
  debug=valid('egrad_leps')
46

  
47
 if (debug) WRITE(*,*) '================ Entering Egrad_leps ==================='
48
 if (debug) THEN
49
    WRITE(*,*) "Cartesian Geometry"
50
    DO I=1,Nat
51
       WRITE(*,'(1X,I5,3(1X,F12.6))') I,Geom(i,1:3)
52
    END DO
53
 END IF
54
      
55
      ALLOCATE(XyZTmp(Nat,3),GradTmp(Nat,3))
56

  
57
      e=ELEPS_xyz(nat,Geom)
58

  
59
! We now calculate the gradients using numerical derivatives
60
      Grad=0.d0
61
      GradTmp=0.d0
62
      do iat=1,3
63
         do jat=1,nat
64
            xyztmp=geom
65
            do i=1,6
66
               xyztmp(jat,iat)=geom(jat,iat)+ISCoef(i)*hh
67
               gradTmp(jat,iat)=gradTmp(jat,iat)+IECoef(i)*ELEPS_xyz(nat,xyztmp)
68
            end do
69
         end do
70
      end do
71
      gradTmp=gradTmp/(60.*hh)
72
      do iat=1,nat
73
       grad(3*iat-2:3*iat)=gradTmp(iat,1:3)
74
      end do
75

  
76
 if (debug) THEN
77
    WRITE(*,*) "Cartesian gradient "
78
    DO I=1,Nat
79
       WRITE(*,'(1X,I5,3(1X,F12.6))') I,Gradtmp(i,1:3)
80
    END DO
81
 END IF
82

  
83

  
84
      deallocate(xyztmp,gradTmp)
85

  
86

  
87
 if (debug) WRITE(*,*) '================ Exiting Egrad_leps ==================='
88

  
89
! ======================================================================
90
      end 
91

  
92

  
93

  
94
      function ELEPS_xyz(natoms,Xyz)
95

  
96
        use Path_module, only : order
97

  
98
   IMPLICIT NONE
99
     integer, parameter :: KINT = kind(1)
100
     integer, parameter :: KREAL = kind(1.0d0)
101

  
102

  
103
      INTEGER(KINT) ,INTENT(IN) :: natoms
104
      REAL(KREAL) ,INTENT(IN) :: Xyz(natoms,3)
105
      REAL(KREAL) :: ELEPS_xyz
106

  
107
      INTEGER(KINT) :: i
108
      REAL(KREAL) :: rAB, rBC, rAC
109

  
110
      REAL(KREAL), PARAMETER :: a=0.05, b=0.30, c=0.05
111
      REAL(KREAL), PARAMETER :: dAB=4.746, dBC=4.747, dAC=3.445
112
      REAL(KREAL), PARAMETER :: r0=0.742, alpha=1.942
113

  
114
      REAL(KREAL) :: Qbc,QAc,Qab,Jab,Jbc,Jac
115

  
116
      Real(KREAL), Parameter ::  autoA=0.52917715d0,autoeV=27.21183d0
117

  
118
      rAB=0.
119
      rAC=0.
120
      rBC=0.
121
      do i=1,3
122
         rBC=rBC+(xyz(Order(3),i)-xyz(order(2),i))**2
123
         rAB=rAB+(xyz(order(1),i)-xyz(order(2),i))**2
124
         rAC=rAC+(xyz(order(1),i)-xyz(order(3),i))**2
125
      end do
126
      rAB=sqrt(rAB)
127
      rBC=sqrt(rBC)
128
      rAC=sqrt(rAC)
129

  
130
! For consistency with previous articles : rAC is constrained to be 3.742
131
      rAC=3.742
132

  
133
      Qab = dab*(1.5*exp(-2*alpha*(rAB-r0))-exp(-alpha*(rAB-r0)))/(2+2*a)
134
      Qbc = dbc*(1.5*exp(-2*alpha*(rBC-r0))-exp(-alpha*(rBC-r0)))/(2+2*b)
135
      Qac = dac*(1.5*exp (-2*alpha*(rAC-r0))-exp(-alpha*(rAC-r0)))/(2+2*c)
136
      Jab = dab*(exp(-2*alpha*(rAB-r0))-6*exp(-alpha*(rAB-r0)))/(4+4*a)
137
      Jbc = dbc*(exp(-2*alpha*(rBC-r0))-6*exp(-alpha*(rBC-r0)))/(4+4*b)
138
      Jac = dac*(exp(-2*alpha*(rAC-r0))-6*exp(-alpha*(rAC-r0)))/(4+4*c)
139

  
140
! V(x,y) = Qab(x)+Qbc(y)+Qac(rac)-sqrt(Jab(x)**2+Jbc(y)**2+Jac(x)**2-Jab(x)*Jbc(y)-Jbc(y)*Jac(rac)-Jab(x)*Jac(rac))
141

  
142

  
143
      ELEPS_xyz=(Qab+Qbc+Qac-sqrt(Jab**2+Jbc**2+Jac**2-Jab*Jbc-Jbc*Jac-Jab*Jac))/autoeV
144

  
145
      return
146
    end function ELEPS_xyz
src/Makefile (revision 3)
5 5
# You might also have to edit the location of
6 6
# some libraries (like mkl for ifort)
7 7

  
8
Machine=arqg
8
Machine=gfortran
9 9

  
10 10
###########################################
11 11
#                                         #
......
13 13
#                                         #
14 14
###########################################
15 15
ifeq ($(Machine),ifort)
16
# Flags for Ifort
17
COMP=/opt/intel/fc/9.1.036/bin/ifort
18
F90=${COMP}  
19
LINK=${COMP} -Vaxlib   -L/usr/lib/  -L/opt/intel/mkl/8.1/lib/32/ -lguide -lpthread -lmkl_lapack -lmkl_ia32  -lmkl
16
# Flags for arq Ifort
17
COMP=ifort
18
#F90=${COMP}   -g -check bounds  -check format -check uninit  -traceback
19
F90=${COMP}   -g  -traceback
20
F77=${F90}
21
#F90=${COMP}  
22
LIBMATH=  -L/opt/intel/Compiler/11.1/064/mkl/lib/64  \
23
    -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential \
24
    -lmkl_core -Wl,--end-group 
25
LINK=${COMP} -lguide -lpthread   -L/usr/lib/ 
20 26
FreeF=-FR
21 27
endif
22 28

  
29

  
23 30
ifeq ($(Machine),g95)
24 31
# Flags for g95 
25
COMP=g95 -g  -save-temps -Wall -fbounds-check
32
COMP=g95 -g   -Wall -fbounds-check
26 33
#COMP=g95  -fbounds-check -g -ftrace=full -ftrace=frame  -save-temps
27 34
F90=${COMP}
28 35
F77=${COMP}
29
LINK=${COMP}   -L/usr/lib/ -llapack -lblas
36
LIBMATH= -llapack -lblas
37
LINK=${COMP}   -L/usr/lib/
30 38
FreeF=-ffree-form
31 39
endif
32 40

  
33 41
ifeq ($(Machine),gfortran)
34 42
# Flags for gfortran
35
COMP=gfortran  -fbounds-check -pedantic -std=gnu 
43
COMP=gfortran  -pedantic -std=gnu 
36 44
#COMP=g95  -fbounds-check -g -ftrace=full -ftrace=frame  -save-temps
37 45
F90=${COMP}
38 46
F77=${COMP}
39
LINK=${COMP} -L/usr/lib/  -llapack -lblas
47
LIBMATH= -llapack -lblas
48
LINK=${COMP}   -L/usr/lib/
40 49
FreeF=-ffree-form
41 50
endif
42 51

  
......
46 55
COMP=pgf90
47 56
FLAGS= -mp  -fast -Kieee -fastsse  -tpp7 -Mipa=fast
48 57
F90=$(COMP)  -c  $(FLAGS)
49
LINK=pgf90 $(FLAGS)  -L/usr/local/pgi/linux86/6.2/lib -llapack  -lblas -lpthread 
58
LIBMATH= -llapack -lblas
59
LINK=${COMP} $(FLAGS)  -L/usr/local/pgi/linux86/6.2/lib  -lpthread 
50 60
FreeF=-Mfree
51 61
endif
52 62

  
......
54 64
# Flags for PathScale
55 65
COMP=/softs/pathscale/bin/pathf90
56 66
F90=${COMP}
57
LINK=${COMP}   -L/usr/lib/ -llapack -lblas
67
LIBMATH= -llapack -lblas
68
LINK=${COMP}   -L/usr/lib/ 
58 69
FreeF=-FR
59 70
endif
60 71

  
......
62 73
# Flags for Xlf
63 74
COMP=xlf
64 75
F90=${COMP}
65
LINK=${COMP}   -L/usr/lib/ -llapack -lblas
76
LIBMATH= -llapack -lblas
77
LINK=${COMP}   -L/usr/lib/ 
66 78
FreeF=-qfree
67 79
endif
68 80

  
......
100 112
COMP=ifort
101 113
F90=${COMP}
102 114
F77=${COMP}
103
LINK=${COMP}  -lguide -lpthread
115
LIBMATH=  -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential \
116
           -lmkl_core -Wl,--end-group
117
LINK=${COMP}  -lguide -lpthread 
104 118
FreeF=-FR
105 119
endif
106 120

  
......
139 153
F90=${COMP}   -g -check all  -traceback
140 154
F77=${F90}
141 155
#F90=${COMP}  
142
LINK=${COMP} -lguide -lpthread   -L/usr/lib/ \
143
  -L/opt/intel/Compiler/11.1/064/mkl/lib/64  \
156
LIBMATH= -L/opt/intel/Compiler/11.1/064/mkl/lib/64  \
144 157
  -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential \
145
           -lmkl_core -Wl,--end-group -lpthread 
158
           -lmkl_core -Wl,--end-group
159
LINK=${COMP} -lguide -lpthread   -L/usr/lib/
146 160
FreeF=-FR
147 161
endif
148 162

  
......
152 166
F90=${COMP}  
153 167
F77=${F90}
154 168
#F90=${COMP}  
155
LINK=${COMP}  -L/usr/lib/   -llapack -lblas
169
F90=${COMP}
170
LIBMATH= -llapack -lblas
171
LINK=${COMP}  -L/usr/lib/  
156 172
FreeF=-ffree-form
157 173
endif
158 174

  
......
170 186
F90=${COMP}   -g -check all -traceback
171 187
F77=${F90}
172 188
#F90=${COMP}  
173
LINK=${COMP}    -L/softs/intel/v12.0.084/mkl/lib/intel64  \
174
  -L/softs/intel/v12.0.084/lib/intel64  -L/usr/lib \
189
LIBMATH=    -L/softs/intel/v12.0.084/mkl/lib/intel64  \
190
 -L/softs/intel/v12.0.084/lib/intel64  -L/usr/lib \
175 191
  -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential \
176 192
           -lmkl_core -Wl,--end-group
193
LINK=${COMP}
177 194
FreeF=-FR
178 195
endif
179 196

  
......
184 201
F90=${COMP}   -g -check all -traceback
185 202
F77=${F90}
186 203
#F90=${COMP}  
187
LINK=${COMP} -lguide -lpthread   -L/usr/lib/ \
188
  -L/softs/intel/v11.1.069/mkl/lib/em64t  \
204
LIBMATH=   -L/softs/intel/v11.1.069/mkl/lib/em64t  \
189 205
  -Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential \
190
           -lmkl_core -Wl,--end-group -lpthread
206
           -lmkl_core -Wl,--end-group 
207
LINK=${COMP} -lguide -lpthread   -L/usr/lib/
191 208
FreeF=-FR
192 209
endif
193 210

  
194

  
195
ifeq ($(Machine),duo)
196
# Flags for DUO Ifort
197
COMP=/opt/intel/fc/9.1.037/bin/ifort
198
#F90=${COMP}   -g -check all
199
F90=${COMP}  
200
LINK=${COMP} -Vaxlib   -L/usr/lib/  -L/opt/intel/mkl/8.1/lib/32/ -lguide -lpthread  -lmkl_lapack64 -lmkl
201
FreeF=-FR
202
endif
203

  
204
ifeq ($(Machine),commander)
205
# Flags for Commander Ifort
206
COMP=/opt/intel/fc/9.0/bin/ifort
207
#F90=${COMP}   -g -check all
208
F90=${COMP}
209
LINK=${COMP} -Vaxlib   -L/usr/lib/  -L/opt/intel/mkl/8.1/lib/32/ -lguide -lpthread -lmkl_lapack -lmkl_ia32  -lmkl
210
FreeF=-FR
211
endif
212

  
213
Version=1.0
214

  
215

  
216 211
###############################################################
217 212
#
218 213
# Help Makefile 
......
248 243
      egrad_vasp.f90 \
249 244
      egrad_turbomole.f90 \
250 245
      egrad_chamfre.f90 \
246
      egrad_LEPS.f90 \
251 247
      CalcHess.f90 \
252 248
      Hupdate_all.f90 \
253 249
      Hupdate_MS.f90 \
......
341 337
SRCLAPACKU=$(wildcard ./lapack/util/*.f )
342 338
SRCBLAS=$(wildcard ./blas/*.f )
343 339

  
344
OBJLAPACK=$(SCRLAPACKD:.f=.o) \
345
        $(SCRLAPACKU:.f=.o)
340
OBJLAPACK=$(SRCLAPACKD:.f=.o) \
341
        $(SRCLAPACKU:.f=.o)
346 342

  
347 343
OBJBLAS=$(SRCBLAS:.f=.o)
348 344

  
......
355 351
	ln -s ${PWD}/../utils/xyz2path ../exe/.
356 352

  
357 353
path: ${MODo} ${OBJ} 
358
	${LINK} -o Path.exe ${OBJ} ${MODo} 
354
	${LINK} -o Path.exe ${OBJ} ${MODo} ${LIBMATH} 
359 355
	@echo ""
360 356
	@echo "Path.exe has been created."
361 357

  
......
389 385
	ar rcs ./blas/blas.a ${OBJBLAS}
390 386

  
391 387
clean:
392
	rm -f *~ "#"* *.s ${OBJ} ${MOD}  ${MODo} ${OBJLAPACK} ${OBJBLAS}  
388
	rm -f *~ "#"* *.s ${OBJ} *.mod  ${MODo} ${OBJLAPACK} ${OBJBLAS}  
393 389

  
394 390
veryclean: clean
395 391
	rm -f Path.exe ./lapack/lapack.a  ./blas/blas.a ../utils/xyz2scan ../utils/xyz2path
src/Path.f90 (revision 3)
590 590

  
591 591
  if (Prog.EQ.'TM') Prog="TURBOMOLE"
592 592
  if (Prog.EQ.'TEST2') Prog="CHAMFRE"
593
  if (Prog.EQ.'TEST3') Prog="LEPS"
593 594

  
594 595

  
595 596
  Select Case (Prog)
src/refsor.f90 (revision 3)
39 39

  
40 40
   use VarTypes
41 41

  
42
  interface
43

  
44
     Recursive Subroutine D_subsor (XDONT, IDEB1, IFIN1)
45

  
46
       use VarTypes 
47

  
48
       IMPLICIT NONE
49

  
50
       Real(KREAL), dimension (:), Intent (InOut) :: XDONT
51
       Integer(KINT), Intent (In) :: IDEB1, IFIN1
52

  
53
       Integer(KINT), Parameter :: NINS = 16 ! Max for insertion sort
54
       Integer(KINT) :: ICRS, IDEB, IDCR, IFIN, IMIL
55
       Real(KREAL) :: XPIV, XWRK
56
     end Subroutine D_subsor
57

  
58
     Subroutine D_inssor (XDONT)
59

  
60
       use VarTypes 
61
  
62
       IMPLICIT NONE
63
       Real(KREAL), dimension (:), Intent (InOut) :: XDONT
64
       
65
       Integer(KINT) :: ICRS, IDCR
66
       Real(KREAL) :: XWRK
67

  
68
     End Subroutine D_inssor
69

  
70
  end interface
71

  
42 72
      Real (KREAL), Dimension (:), Intent (InOut) :: XDONT
43 73
! __________________________________________________________
44 74
!
src/minv.f90 (revision 3)
4 4
      integer, parameter :: KINT = kind(1)
5 5
      integer, parameter :: KREAL = kind(1.0d0)
6 6

  
7
      INTEGER(KINT), INTENT(IN) :: N
7 8
      REAL(KREAL), INTENT(INOUT) :: A(N*N)
8
      INTEGER(KINT), INTENT(IN) :: N
9 9
      REAL(KREAL), INTENT(OUT) :: D
10 10

  
11 11
 
src/Space_all.f90 (revision 3)
14 14
!      INCLUDE 'SIZES'
15 15

  
16 16
 !MSET=mth iteration, MRESET=Maximum no. of iterations. 
17
      INTEGER(KINT) :: NCoord,MRESET,MSET(NGeomF),NGeomF,IGeom
17
      INTEGER(KINT) :: NCoord,MRESET,NGeomF,IGeom
18
      INTEGER(KINT) :: MSET(NGeomF)
18 19
 !Geom=geometry with NCoord coordinates. GRAD=gradients.
19 20
      REAL(KREAL) :: Geom(NCoord),GRAD(NCoord)
20 21
      REAL(KREAL) :: Heat

Formats disponibles : Unified diff