(git:1f285aa)
pw_copy_all.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \note
10 !> Copy of pw types using an optimal match strategy
11 !> \par History
12 !> JGH (06-May-2021) : pw_copy routine for complex match
13 !> \author JGH
14 ! **************************************************************************************************
16  USE kinds, ONLY: dp
17  USE message_passing, ONLY: mp_comm_type
18  USE pw_grid_types, ONLY: pw_grid_type
19  USE pw_types, ONLY: pw_c1d_gs_type
20 #include "../base/base_uses.f90"
21 
22  IMPLICIT NONE
23 
24  PRIVATE
25 
26  PUBLIC :: pw_copy_match
27 
28  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pw_copy_all'
29  LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
30 
31 ! **************************************************************************************************
32 
33 CONTAINS
34 
35 ! **************************************************************************************************
36 !> \brief copy a pw type variable
37 !> \param pw1 ...
38 !> \param pw2 ...
39 !> \author JGH
40 ! **************************************************************************************************
41  SUBROUTINE pw_copy_match(pw1, pw2)
42  TYPE(pw_c1d_gs_type), INTENT(IN) :: pw1
43  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: pw2
44 
45  COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cc
46  INTEGER :: group_size, ig1, ig2, ip, jg2, me, ng1, &
47  ng2, ngm, penow
48  INTEGER, ALLOCATABLE, DIMENSION(:) :: ngr
49  INTEGER, ALLOCATABLE, DIMENSION(:, :) :: g_hat
50  INTEGER, DIMENSION(3) :: k1, k2
51  TYPE(mp_comm_type) :: group
52  TYPE(pw_grid_type), POINTER :: pg1, pg2
53 
54  ng1 = SIZE(pw1%array)
55  ng2 = SIZE(pw2%array)
56 
57  pg1 => pw1%pw_grid
58  pg2 => pw2%pw_grid
59 
60  group = pg1%para%group
61  group_size = pg1%para%group_size
62  me = pg1%para%my_pos
63  ALLOCATE (ngr(group_size))
64  ngr = 0
65  ngr(me + 1) = pg1%ngpts_cut_local
66  CALL group%sum(ngr)
67  ngm = maxval(ngr)
68  ALLOCATE (cc(ngm))
69  cc(1:ng1) = pw1%array(1:ng1)
70  cc(ng1 + 1:ngm) = cmplx(0.0_dp, 0.0_dp, kind=dp)
71 
72  ALLOCATE (g_hat(3, ngm))
73  g_hat = 0
74  g_hat(1:3, 1:ng1) = pg1%g_hat(1:3, 1:ng1)
75 
76  DO ip = 1, group_size
77  penow = me - ip + 1
78  IF (penow < 0) penow = penow + group_size
79 
80  DO ig1 = 1, ngr(penow + 1)
81  k1(1:3) = g_hat(1:3, ig1)
82  jg2 = 0
83  DO ig2 = 1, ng2
84  k2(1:3) = pg2%g_hat(1:3, ig2)
85  IF (sum(abs(k1 - k2)) == 0) THEN
86  jg2 = ig2
87  EXIT
88  END IF
89  END DO
90  IF (jg2 /= 0) pw2%array(jg2) = cc(ig1)
91  END DO
92  IF (ip /= group_size) THEN
93  CALL group%shift(cc)
94  CALL group%shift(g_hat)
95  END IF
96 
97  END DO
98 
99  DEALLOCATE (ngr, cc, g_hat)
100 
101  END SUBROUTINE pw_copy_match
102 
103 END MODULE pw_copy_all
104 
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface to the message passing library MPI.
subroutine, public pw_copy_match(pw1, pw2)
copy a pw type variable
Definition: pw_copy_all.F:42