15#include "../base/base_uses.f90"
37 INTEGER,
INTENT(in) :: itype, nd
38 INTEGER,
INTENT(out) :: nrange
39 REAL(kind=
dp),
DIMENSION(0:nd),
INTENT(out) :: a, x
41 INTEGER :: i, i_all, m, ni, nt
42 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: y
43 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cg, cgt, ch, cht
54 ALLOCATE (y(0:nd), stat=i_all)
56 cpabort(
"Scaling_function: problem of memory allocation")
67 CALL back_trans(nd, nt, x, y, m, ch, cg)
68 CALL dcopy(nt, y, 1, x, 1)
76 a(i) = 1._dp*i*ni/nd - (.5_dp*ni - 1._dp)
78 DEALLOCATE (ch, cg, cgt, cht)
89 SUBROUTINE wavelet_function(itype, nd, a, x)
92 INTEGER,
INTENT(in) :: itype, nd
93 REAL(kind=
dp),
DIMENSION(0:nd),
INTENT(out) :: a, x
95 INTEGER :: i, i_all, m, ni, nt
96 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: y
97 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cg, cgt, ch, cht
106 ALLOCATE (y(0:nd), stat=i_all)
108 cpabort(
"Wavelet_function: problem of memory allocation")
115 x(nt + nt/2 - 1) = 1._dp
119 CALL back_trans(nd, nt, x, y, m, ch, cg)
120 CALL dcopy(nd, y, 1, x, 1)
128 a(i) = 1._dp*i*ni/nd - (.5_dp*ni - .5_dp)
130 DEALLOCATE (ch, cg, cgt, cht)
133 END SUBROUTINE wavelet_function
145 INTEGER,
INTENT(in) :: itype, n_iter, n_range
146 REAL(kind=
dp),
INTENT(inout) :: kernel_scf(-n_range:n_range)
147 REAL(kind=
dp),
INTENT(out) :: kern_1_scf(-n_range:n_range)
150 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cg, cgt, ch, cht
155 CALL scf_recurs(n_iter, n_range, kernel_scf, kern_1_scf, m, ch)
156 DEALLOCATE (ch, cg, cgt, cht)
165 PURE SUBROUTINE zero(n, x)
166 INTEGER,
INTENT(in) :: n
167 REAL(kind=
dp),
INTENT(out) :: x(n)
190 SUBROUTINE for_trans(nd, nt, x, y, m, cgt, cht)
191 INTEGER,
INTENT(in) :: nd, nt
192 REAL(kind=
dp),
INTENT(in) :: x(0:nd - 1)
193 REAL(kind=
dp),
INTENT(out) :: y(0:nd - 1)
195 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cgt, cht
220 y(i) = y(i) + cht(j)*x(ind)
221 y(nt/2 + i) = y(nt/2 + i) + cgt(j)*x(ind)
226 END SUBROUTINE for_trans
238 SUBROUTINE back_trans(nd, nt, x, y, m, ch, cg)
244 INTEGER,
INTENT(in) :: nd, nt
245 REAL(kind=
dp),
INTENT(in) :: x(0:nd - 1)
246 REAL(kind=
dp),
INTENT(out) :: y(0:nd - 1)
248 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ch, cg
267 IF (ind >= nt/2)
THEN
274 y(2*i + 0) = y(2*i + 0) + ch(2*j - 0)*x(ind) + cg(2*j - 0)*x(ind + nt/2)
275 y(2*i + 1) = y(2*i + 1) + ch(2*j + 1)*x(ind) + cg(2*j + 1)*x(ind + nt/2)
280 END SUBROUTINE back_trans
290 SUBROUTINE ftest(m, ch, cg, cgt, cht)
292 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ch, cg, cgt, cht
294 CHARACTER(len=*),
PARAMETER :: fmt22 =
"(a,i3,i4,4(e17.10))"
297 REAL(kind=
dp) :: eps, t1, t2, t3, t4
310 IF (l - 2*i >= -m .AND. l - 2*i <= m .AND. &
311 l - 2*j >= -m .AND. l - 2*j <= m)
THEN
312 t1 = t1 + ch(l - 2*i)*cht(l - 2*j)
313 t2 = t2 + cg(l - 2*i)*cgt(l - 2*j)
314 t3 = t3 + ch(l - 2*i)*cgt(l - 2*j)
315 t4 = t4 + cht(l - 2*i)*cg(l - 2*j)
320 IF (abs(t1 - 1._dp) > eps .OR. abs(t2 - 1._dp) > eps .OR. &
321 abs(t3) > eps .OR. abs(t4) > eps)
THEN
322 WRITE (*, fmt22)
'Orthogonality ERROR', i, j, t1, t2, t3, t4
325 IF (abs(t1) > eps .OR. abs(t2) > eps .OR. &
326 abs(t3) > eps .OR. abs(t4) > eps)
THEN
327 WRITE (*, fmt22)
'Orthogonality ERROR', i, j, t1, t2, t3, t4
333 WRITE (*, *)
'FILTER TEST PASSED'
347 SUBROUTINE scf_recurs(n_iter, n_range, kernel_scf, kern_1_scf, m, ch)
348 INTEGER,
INTENT(in) :: n_iter, n_range
349 REAL(kind=
dp),
INTENT(inout) :: kernel_scf(-n_range:n_range)
350 REAL(kind=
dp),
INTENT(out) :: kern_1_scf(-n_range:n_range)
352 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ch
354 INTEGER :: i, i_iter, ind, j
355 REAL(kind=
dp) :: kern, kern_tot
359 loop_iter_scf:
DO i_iter = 1, n_iter
360 kern_1_scf(:) = kernel_scf(:)
361 kernel_scf(:) = 0._dp
362 loop_iter_i:
DO i = 0, n_range
366 IF (abs(ind) > n_range)
THEN
369 kern = kern_1_scf(ind)
371 kern_tot = kern_tot + ch(j)*kern
373 IF (kern_tot == 0._dp)
THEN
377 kernel_scf(i) = 0.5_dp*kern_tot
378 kernel_scf(-i) = kernel_scf(i)
382 END SUBROUTINE scf_recurs
Defines the basic variable types.
integer, parameter, public dp
Filters for interpolating scaling functions .
subroutine, public lazy_arrays(itype, m, ch, cg, cgt, cht)
...
Creates the wavelet kernel for the wavelet based poisson solver.
subroutine, public scf_recursion(itype, n_iter, n_range, kernel_scf, kern_1_scf)
Do iterations to go from p0gauss to pgauss order interpolating scaling function.
subroutine, public scaling_function(itype, nd, nrange, a, x)
Calculate the values of a scaling function in real uniform grid.