31 #include "../base/base_uses.f90"
39 PUBLIC :: pw_r1d_rs_type, pw_r1d_rs_p_type
40 PUBLIC :: pw_r3d_rs_type, pw_r3d_rs_p_type
41 PUBLIC :: pw_c1d_rs_type, pw_c1d_rs_p_type
42 PUBLIC :: pw_c3d_rs_type, pw_c3d_rs_p_type
43 PUBLIC :: pw_r1d_gs_type, pw_r1d_gs_p_type
44 PUBLIC :: pw_r3d_gs_type, pw_r3d_gs_p_type
45 PUBLIC :: pw_c1d_gs_type, pw_c1d_gs_p_type
46 PUBLIC :: pw_c3d_gs_type, pw_c3d_gs_p_type
50 REAL(KIND=
dp),
DIMENSION(:),
CONTIGUOUS,
POINTER :: array => null()
51 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
53 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_r1d_rs
54 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_r1d_rs
55 END TYPE pw_r1d_rs_type
59 TYPE(pw_r1d_rs_type),
POINTER :: pw => null()
60 END TYPE pw_r1d_rs_p_type
63 REAL(KIND=
dp),
DIMENSION(:, :, :),
CONTIGUOUS,
POINTER :: array => null()
64 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
66 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_r3d_rs
67 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_r3d_rs
68 END TYPE pw_r3d_rs_type
72 TYPE(pw_r3d_rs_type),
POINTER :: pw => null()
73 END TYPE pw_r3d_rs_p_type
76 COMPLEX(KIND=dp),
DIMENSION(:),
CONTIGUOUS,
POINTER :: array => null()
77 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
79 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_c1d_rs
80 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_c1d_rs
81 END TYPE pw_c1d_rs_type
85 TYPE(pw_c1d_rs_type),
POINTER :: pw => null()
86 END TYPE pw_c1d_rs_p_type
89 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
CONTIGUOUS,
POINTER :: array => null()
90 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
92 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_c3d_rs
93 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_c3d_rs
94 END TYPE pw_c3d_rs_type
98 TYPE(pw_c3d_rs_type),
POINTER :: pw => null()
99 END TYPE pw_c3d_rs_p_type
102 REAL(KIND=
dp),
DIMENSION(:),
CONTIGUOUS,
POINTER :: array => null()
103 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
105 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_r1d_gs
106 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_r1d_gs
107 END TYPE pw_r1d_gs_type
110 TYPE pw_r1d_gs_p_type
111 TYPE(pw_r1d_gs_type),
POINTER :: pw => null()
112 END TYPE pw_r1d_gs_p_type
115 REAL(KIND=
dp),
DIMENSION(:, :, :),
CONTIGUOUS,
POINTER :: array => null()
116 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
118 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_r3d_gs
119 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_r3d_gs
120 END TYPE pw_r3d_gs_type
123 TYPE pw_r3d_gs_p_type
124 TYPE(pw_r3d_gs_type),
POINTER :: pw => null()
125 END TYPE pw_r3d_gs_p_type
128 COMPLEX(KIND=dp),
DIMENSION(:),
CONTIGUOUS,
POINTER :: array => null()
129 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
131 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_c1d_gs
132 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_c1d_gs
133 END TYPE pw_c1d_gs_type
136 TYPE pw_c1d_gs_p_type
137 TYPE(pw_c1d_gs_type),
POINTER :: pw => null()
138 END TYPE pw_c1d_gs_p_type
141 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
CONTIGUOUS,
POINTER :: array => null()
142 TYPE(pw_grid_type),
POINTER :: pw_grid => null()
144 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: create => pw_create_c3d_gs
145 PROCEDURE,
PUBLIC, NON_OVERRIDABLE :: release => pw_release_c3d_gs
146 END TYPE pw_c3d_gs_type
149 TYPE pw_c3d_gs_p_type
150 TYPE(pw_c3d_gs_type),
POINTER :: pw => null()
151 END TYPE pw_c3d_gs_p_type
153 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_types'
154 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
166 SUBROUTINE pw_release_r1d_rs (pw)
167 CLASS(pw_r1d_rs_type),
INTENT(INOUT) :: pw
169 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
171 END SUBROUTINE pw_release_r1d_rs
182 SUBROUTINE pw_create_r1d_rs (pw, pw_grid, array_ptr)
183 CLASS(pw_r1d_rs_type),
INTENT(INOUT) :: pw
184 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
185 REAL(KIND=
dp),
DIMENSION(:),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
187 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_r1d'
191 CALL timeset(routinen, handle)
196 pw%pw_grid => pw_grid
199 IF (
PRESENT(array_ptr))
THEN
200 IF (
ASSOCIATED(array_ptr))
THEN
201 cpassert(
SIZE(array_ptr) == pw%pw_grid%ngpts_cut_local)
202 pw%array(1:pw%pw_grid%ngpts_cut_local) => array_ptr
205 IF (.NOT.
ASSOCIATED(pw%array))
ALLOCATE (pw%array(pw%pw_grid%ngpts_cut_local))
206 CALL timestop(handle)
207 END SUBROUTINE pw_create_r1d_rs
217 SUBROUTINE pw_release_r3d_rs (pw)
218 CLASS(pw_r3d_rs_type),
INTENT(INOUT) :: pw
220 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
222 END SUBROUTINE pw_release_r3d_rs
233 SUBROUTINE pw_create_r3d_rs (pw, pw_grid, array_ptr)
234 CLASS(pw_r3d_rs_type),
INTENT(INOUT) :: pw
235 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
236 REAL(KIND=
dp),
DIMENSION(:, :, :),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
238 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_r3d'
242 CALL timeset(routinen, handle)
247 pw%pw_grid => pw_grid
250 associate(bounds => pw%pw_grid%bounds_local)
251 IF (
PRESENT(array_ptr))
THEN
252 IF (
ASSOCIATED(array_ptr))
THEN
253 IF (all(bounds(1, :) <= bounds(2, :)))
THEN
254 cpassert(all(lbound(array_ptr) == bounds(1, :)))
255 cpassert(all(ubound(array_ptr) == bounds(2, :)))
257 pw%array => array_ptr
260 IF (.NOT.
ASSOCIATED(pw%array))
THEN
261 ALLOCATE (pw%array( &
262 bounds(1, 1):bounds(2, 1), &
263 bounds(1, 2):bounds(2, 2), &
264 bounds(1, 3):bounds(2, 3)))
267 CALL timestop(handle)
268 END SUBROUTINE pw_create_r3d_rs
278 SUBROUTINE pw_release_c1d_rs (pw)
279 CLASS(pw_c1d_rs_type),
INTENT(INOUT) :: pw
281 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
282 CALL pw_grid_release(pw%pw_grid)
283 END SUBROUTINE pw_release_c1d_rs
294 SUBROUTINE pw_create_c1d_rs (pw, pw_grid, array_ptr)
295 CLASS(pw_c1d_rs_type),
INTENT(INOUT) :: pw
296 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
297 COMPLEX(KIND=dp),
DIMENSION(:),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
299 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_c1d'
303 CALL timeset(routinen, handle)
308 pw%pw_grid => pw_grid
309 CALL pw_grid_retain(pw%pw_grid)
311 IF (
PRESENT(array_ptr))
THEN
312 IF (
ASSOCIATED(array_ptr))
THEN
313 cpassert(
SIZE(array_ptr) == pw%pw_grid%ngpts_cut_local)
314 pw%array(1:pw%pw_grid%ngpts_cut_local) => array_ptr
317 IF (.NOT.
ASSOCIATED(pw%array))
ALLOCATE (pw%array(pw%pw_grid%ngpts_cut_local))
318 CALL timestop(handle)
319 END SUBROUTINE pw_create_c1d_rs
329 SUBROUTINE pw_release_c3d_rs (pw)
330 CLASS(pw_c3d_rs_type),
INTENT(INOUT) :: pw
332 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
333 CALL pw_grid_release(pw%pw_grid)
334 END SUBROUTINE pw_release_c3d_rs
345 SUBROUTINE pw_create_c3d_rs (pw, pw_grid, array_ptr)
346 CLASS(pw_c3d_rs_type),
INTENT(INOUT) :: pw
347 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
348 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
350 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_c3d'
354 CALL timeset(routinen, handle)
359 pw%pw_grid => pw_grid
360 CALL pw_grid_retain(pw%pw_grid)
362 associate(bounds => pw%pw_grid%bounds_local)
363 IF (
PRESENT(array_ptr))
THEN
364 IF (
ASSOCIATED(array_ptr))
THEN
365 IF (all(bounds(1, :) <= bounds(2, :)))
THEN
366 cpassert(all(lbound(array_ptr) == bounds(1, :)))
367 cpassert(all(ubound(array_ptr) == bounds(2, :)))
369 pw%array => array_ptr
372 IF (.NOT.
ASSOCIATED(pw%array))
THEN
373 ALLOCATE (pw%array( &
374 bounds(1, 1):bounds(2, 1), &
375 bounds(1, 2):bounds(2, 2), &
376 bounds(1, 3):bounds(2, 3)))
379 CALL timestop(handle)
380 END SUBROUTINE pw_create_c3d_rs
390 SUBROUTINE pw_release_r1d_gs (pw)
391 CLASS(pw_r1d_gs_type),
INTENT(INOUT) :: pw
393 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
394 CALL pw_grid_release(pw%pw_grid)
395 END SUBROUTINE pw_release_r1d_gs
406 SUBROUTINE pw_create_r1d_gs (pw, pw_grid, array_ptr)
407 CLASS(pw_r1d_gs_type),
INTENT(INOUT) :: pw
408 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
409 REAL(KIND=dp),
DIMENSION(:),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
411 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_r1d'
415 CALL timeset(routinen, handle)
420 pw%pw_grid => pw_grid
421 CALL pw_grid_retain(pw%pw_grid)
423 IF (
PRESENT(array_ptr))
THEN
424 IF (
ASSOCIATED(array_ptr))
THEN
425 cpassert(
SIZE(array_ptr) == pw%pw_grid%ngpts_cut_local)
426 pw%array(1:pw%pw_grid%ngpts_cut_local) => array_ptr
429 IF (.NOT.
ASSOCIATED(pw%array))
ALLOCATE (pw%array(pw%pw_grid%ngpts_cut_local))
430 CALL timestop(handle)
431 END SUBROUTINE pw_create_r1d_gs
441 SUBROUTINE pw_release_r3d_gs (pw)
442 CLASS(pw_r3d_gs_type),
INTENT(INOUT) :: pw
444 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
445 CALL pw_grid_release(pw%pw_grid)
446 END SUBROUTINE pw_release_r3d_gs
457 SUBROUTINE pw_create_r3d_gs (pw, pw_grid, array_ptr)
458 CLASS(pw_r3d_gs_type),
INTENT(INOUT) :: pw
459 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
460 REAL(KIND=dp),
DIMENSION(:, :, :),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
462 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_r3d'
466 CALL timeset(routinen, handle)
471 pw%pw_grid => pw_grid
472 CALL pw_grid_retain(pw%pw_grid)
474 associate(bounds => pw%pw_grid%bounds_local)
475 IF (
PRESENT(array_ptr))
THEN
476 IF (
ASSOCIATED(array_ptr))
THEN
477 IF (all(bounds(1, :) <= bounds(2, :)))
THEN
478 cpassert(all(lbound(array_ptr) == bounds(1, :)))
479 cpassert(all(ubound(array_ptr) == bounds(2, :)))
481 pw%array => array_ptr
484 IF (.NOT.
ASSOCIATED(pw%array))
THEN
485 ALLOCATE (pw%array( &
486 bounds(1, 1):bounds(2, 1), &
487 bounds(1, 2):bounds(2, 2), &
488 bounds(1, 3):bounds(2, 3)))
491 CALL timestop(handle)
492 END SUBROUTINE pw_create_r3d_gs
502 SUBROUTINE pw_release_c1d_gs (pw)
503 CLASS(pw_c1d_gs_type),
INTENT(INOUT) :: pw
505 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
506 CALL pw_grid_release(pw%pw_grid)
507 END SUBROUTINE pw_release_c1d_gs
518 SUBROUTINE pw_create_c1d_gs (pw, pw_grid, array_ptr)
519 CLASS(pw_c1d_gs_type),
INTENT(INOUT) :: pw
520 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
521 COMPLEX(KIND=dp),
DIMENSION(:),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
523 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_c1d'
527 CALL timeset(routinen, handle)
532 pw%pw_grid => pw_grid
533 CALL pw_grid_retain(pw%pw_grid)
535 IF (
PRESENT(array_ptr))
THEN
536 IF (
ASSOCIATED(array_ptr))
THEN
537 cpassert(
SIZE(array_ptr) == pw%pw_grid%ngpts_cut_local)
538 pw%array(1:pw%pw_grid%ngpts_cut_local) => array_ptr
541 IF (.NOT.
ASSOCIATED(pw%array))
ALLOCATE (pw%array(pw%pw_grid%ngpts_cut_local))
542 CALL timestop(handle)
543 END SUBROUTINE pw_create_c1d_gs
553 SUBROUTINE pw_release_c3d_gs (pw)
554 CLASS(pw_c3d_gs_type),
INTENT(INOUT) :: pw
556 IF (
ASSOCIATED(pw%array))
DEALLOCATE (pw%array)
557 CALL pw_grid_release(pw%pw_grid)
558 END SUBROUTINE pw_release_c3d_gs
569 SUBROUTINE pw_create_c3d_gs (pw, pw_grid, array_ptr)
570 CLASS(pw_c3d_gs_type),
INTENT(INOUT) :: pw
571 TYPE(pw_grid_type),
INTENT(IN),
POINTER :: pw_grid
572 COMPLEX(KIND=dp),
DIMENSION(:, :, :),
CONTIGUOUS,
INTENT(IN),
OPTIONAL,
POINTER :: array_ptr
574 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_create_c3d'
578 CALL timeset(routinen, handle)
583 pw%pw_grid => pw_grid
584 CALL pw_grid_retain(pw%pw_grid)
586 associate(bounds => pw%pw_grid%bounds_local)
587 IF (
PRESENT(array_ptr))
THEN
588 IF (
ASSOCIATED(array_ptr))
THEN
589 IF (all(bounds(1, :) <= bounds(2, :)))
THEN
590 cpassert(all(lbound(array_ptr) == bounds(1, :)))
591 cpassert(all(ubound(array_ptr) == bounds(2, :)))
593 pw%array => array_ptr
596 IF (.NOT.
ASSOCIATED(pw%array))
THEN
597 ALLOCATE (pw%array( &
598 bounds(1, 1):bounds(2, 1), &
599 bounds(1, 2):bounds(2, 2), &
600 bounds(1, 3):bounds(2, 3)))
603 CALL timestop(handle)
604 END SUBROUTINE pw_create_c3d_gs
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
This module defines the grid data type and some basic operations on it.
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
subroutine, public pw_grid_retain(pw_grid)
retains the given pw grid