2
! Copyright (C) 1996-2016 The SIESTA group
2
! Copyright (C) 1996-2016 The SIESTA group
3
3
! This file is distributed under the terms of the
4
4
! GNU General Public License: see COPYING in the top directory
5
5
! or http://www.gnu.org/copyleft/gpl.txt .
46
46
C----------------------------------------------------------
47
47
C INTERNAL VARIABLES
50
. NX, NY, NZ, NX1, NY1, IA1, IA2
49
INTEGER :: NX, NY, NZ, NX1, NY1, IA1, IA2
53
. DECAY, GX, GY, Z, VOLCEL, EAU, V0AU
51
REAL(DP) :: DECAY, GX, GY, Z, VOLCEL, EAU, V0AU
56
54
. STEPZ, A1(3), A2(3), A3(3), VOL, VEC1(3), VEC2(3)
59
. EXPSI(0:NPX-1,0:NPY-1)
61
LOGICAL, SAVE :: FIRST
67
! . dfftw_plan_dft_2d, dfftw_execute, dfftw_destroy_plan
56
COMPLEX(DP) :: EXPSI(0:NPX-1,0:NPY-1)
58
LOGICAL, SAVE :: FIRST = .true.
72
62
C CHANGE UNITS OF ENERGY TO A.U.
75
65
V0AU = V0 / 27.21162908D0
77
67
C CHECK THAT STATE IS BOUND (E BELOW VACUUM LEVEL)
78
IF (EAU .LT. V0AU) THEN
68
IF (EAU .GE. V0AU) THEN
69
write(6,*) 'wf NOT considered:'
70
write(6,*) ' ENERGY EIGENVALUE ABOVE VACUUM LEVEL'
80
74
C INITIALIZE VARIABLES ............
84
76
! the only problem is the decay
85
77
! which is calculated now by an ABS
86
78
! so in principle this can be commented out
81
!! .... but what is the physical meaning of a decay *towards* the surface?? (AG)
88
83
! IF (ZMIN .LT. ZREF) THEN
89
84
! WRITE(6,*) 'error: the reference plane can not be above'
90
85
! WRITE(6,*) ' the simulation area'
102
98
VOL = VOLCEL(UCELL)
105
!! A1=(/UCELL(1,1), UCELL(1,2), UCELL(1,3)/)
106
!! A2=(/UCELL(2,1), UCELL(2,2), UCELL(2,3)/)
107
!! A3=(/UCELL(3,1), UCELL(3,2), UCELL(3,3)/)
114
103
CALL RECIPROCAL(A1,A2,A3,VOL,VEC1,VEC2)
125
C WRITE(7,'(4f20.10)') UCELL(1,1)*NX/NPX,
126
C . UCELL(2,2)*NY/NPY,
127
C . DREAL(CW(NX,NY)*DCONJG(CW(NX,NY)))
133
109
C DO DIRECT FOURIER TRANSFORM TO GET SPATIAL FREQUENCIES OF WF AT
134
110
C REFERENCE PLANE ........
139
115
call fftw_execute_dft (plan,cw,cw)
140
116
call fftw_destroy_plan(plan)
144
118
C LOOP OVER SIMULATION HEIGHTS ........
145
119
plan = fftw_plan_dft_2d (NPY,NPX,EXPSI,EXPSI,FFTW_BACKWARD,
148
123
Z = ZMIN + (NZ-1)*STEPZ
125
! NOTE: No "inward propagation...", despite what Nicolas says above
126
! Points with Z < ZREF are computed from un-propagated wfs
150
129
C LOOP OVER POINTS IN XY PLANE ...
153
C INDEX CHOSEN TO CENTER G's
132
C INDEX CHOSEN TO CENTER G's
133
! Ambiguous arithmetic here and below (precedence?)
154
134
IA2 = MOD (NY1,NPY/2)-NY1/(NPY/2)*(NPY/2)
160
140
GY = IA1*VEC1(2) + IA2*VEC2(2)
162
142
C CALCULATE EXPONENT OF DECAY
163
DECAY = DSQRT( 2.0D0*(V0AU-EAU) +
143
DECAY = SQRT( 2.0D0*(V0AU-EAU) +
164
144
. (GX+K(1))**2 + (GY+K(2))**2)
166
146
C EXTEND WAVE FUNCTION TO CURRENT HEIGHT
167
EXPSI(NX1,NY1) = CW(NX1,NY1) * DEXP(-DECAY*ABS(Z-ZREF)) /
147
EXPSI(NX1,NY1) = CW(NX1,NY1) * EXP(-DECAY*ABS(Z-ZREF)) /
173
152
C DO BACK FOURIER TRANSFORM TO GET REAL SPACE WF AT
174
153
C REFERENCE PLANE .....
176
155
call fftw_execute_dft (plan,expsi,expsi)
180
157
CWE(:,:,NZ-1) = EXPSI(:,:)
183
C ........ END LOOP Z
184
161
call fftw_destroy_plan(plan)
189
C WRITE(7,'(3f20.10)') UCELL(1,1)*NX/NPX,
190
C . UCELL(2,2)*NY/NPY,
191
C . DREAL(CW(NX,NY)*DCONJG(CW(NX,NY)))
200
C WRITE(8,'(3f20.10)') UCELL(1,1)*NX/NPX,
201
C . UCELL(2,2)*NY/NPY,
202
C . DREAL(CWE(NX,NY,NPZ-1)*DCONJG(CWE(NX,NY,NPZ-1)))
210
write(6,*) 'wf NOT considered:'
211
write(6,*) ' ENERGY EIGENVALUE ABOVE VACUUM LEVEL'
217
167
SUBROUTINE reciprocal(a1,a2,a3,vol,vec1,vec2)
220
real(dp) pv(3),a1(3),a2(3),a3(3)
221
real(dp) vec1(3),vec2(3), PI_D
170
real*8 pv(3),a1(3),a2(3),a3(3)
171
real*8 vec1(3),vec2(3), PI_D
223
173
parameter (PI_D = 3.141592653589793238462643383279502884197d0)
230
180
END SUBROUTINE reciprocal
232
182
SUBROUTINE pro(v1,v2,pv)
234
real(dp), intent(in) :: v1(3),v2(3)
235
real(dp), intent(out) :: pv(3)
237
187
pv(1)=v1(2)*v2(3)-v1(3)*v2(2)
238
188
pv(2)=v1(3)*v2(1)-v1(1)*v2(3)