19 MODULE siesta_displacement
23 USE nscalingtools,
ONLY: startglobrow, endglobrow
24 USE timer_mod,
ONLY: time_update_upperv
44 SUBROUTINE update_upperv
47 USE quantities,
ONLY: gvsupsmncf => fsupsmncf, gvsupumnsf => fsupumnsf, &
48 gvsupvmnsf => fsupvmnsf, gvsupsmnsf => fsupsmnsf, &
49 gvsupumncf => fsupumncf, gvsupvmncf => fsupvmncf
62 CALL clear_field_perts
70 CALL initdisplacement(gvsupsmncf, gvsupumnsf, gvsupvmnsf,
f_cos)
72 CALL initdisplacement(gvsupsmnsf, gvsupumncf, gvsupvmncf,
f_sin
76 time_update_upperv = time_update_upperv + (toff - ton)
78 END SUBROUTINE update_upperv
90 SUBROUTINE initdisplacement(gvsupsmnf, gvsupumnf, gvsupvmnf, iparity)
92 USE quantities,
ONLY: jvsupsijf, jvsupuijf, jvsupvijf, mpol, ntor
97 USE utilities,
ONLY: set_bndy_fouier_m0, set_bndy_full_origin
102 REAL (dp),
DIMENSION(0:mpol,-ntor:ntor,ns),
INTENT(inout) :: gvsupsmnf
103 REAL (dp),
DIMENSION(0:mpol,-ntor:ntor,ns),
INTENT(inout) :: gvsupumnf
104 REAL (dp),
DIMENSION(0:mpol,-ntor:ntor,ns),
INTENT(inout) :: gvsupvmnf
105 INTEGER,
INTENT(in) :: iparity
115 nsmin = max(1, startglobrow - 1)
116 nsmax = min(endglobrow + 1, ns)
118 IF (iparity .eq.
f_cos)
THEN
128 CALL assert_eq(1, lbound(gvsupsmnf,3),
'LBOUND WRONG IN InitDisplacement'
130 'UBOUND WRONG IN InitDisplacement')
132 CALL set_bndy_fouier_m0(gvsupsmnf, gvsupumnf, gvsupvmnf, fours)
135 IF (nsmin .eq. 1)
THEN
138 CALL set_bndy_full_origin(gvsupsmnf, gvsupumnf, gvsupvmnf)
141 gvsupsmnf(
m1,:,1) = 0
144 gvsupumnf(
m1,:,1) = 0
147 gvsupvmnf(
m0,:,1) = 0
154 IF (nsmax .eq. ns)
THEN
155 gvsupsmnf(:,:,ns) = 0
157 gvsupumnf(:,:,ns) = 0
160 gvsupumnf(:,:,ns) = 0
161 gvsupvmnf(:,:,ns) = 0
167 jvsupsijf(:,:,nsmin:nsmax), fcomb, fours
169 jvsupuijf(:,:,nsmin:nsmax), fcomb, fouruv
171 jvsupvijf(:,:,nsmin:nsmax), fcomb, fouruv
185 SUBROUTINE scaledisplacement(xc_scratch, xc, colscale)
186 USE hessian,
ONLY: apply_colscale
192 REAL (dp),
DIMENSION(mblk_size,ns),
INTENT(out) :: xc_scratch
193 REAL (dp),
DIMENSION(mblk_size,ns),
INTENT(in) :: xc
194 REAL (dp),
DIMENSION(mblk_size,ns),
INTENT(in) :: colscale
201 nsmin = max(1, startglobrow - 1)
202 nsmax = min(endglobrow + 1, ns)
204 xc_scratch(:,nsmin:nsmax) = xc(:,nsmin:nsmax)
205 CALL apply_colscale(xc_scratch, colscale, nsmin, nsmax)