Line data Source code
1 : !!****m* ABINIT/m_rec_tools
2 : !! NAME
3 : !! m_rec_tools
4 : !!
5 : !! FUNCTION
6 : !! This module provides some functions more or less generic used
7 : !! in the Recursion Mathod
8 : !!
9 : !! COPYRIGHT
10 : !! Copyright (C) 2002-2026 ABINIT group (MMancini)
11 : !! This file is distributed under the terms of the
12 : !! GNU General Public License, see ~abinit/COPYING
13 : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt.
15 : !!
16 : !! NOTES
17 : !!
18 : !! SOURCE
19 :
20 : #if defined HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 : #include "abi_common.h"
25 :
26 : module m_rec_tools
27 :
28 : use defs_basis
29 : use m_abicore
30 :
31 : use defs_rectypes, only : recparall_type
32 :
33 : private
34 :
35 : public :: &
36 : get_pt0_pt1, & !--To get pt0 pt1 from inf,sup
37 : reshape_pot, & !--To rescale the potential between 2 grids
38 : trottersum !--To calculate the trotter sum
39 :
40 : CONTAINS !===========================================================
41 : !!***
42 :
43 :
44 : !!****f* m_rec_tools/get_pt0_pt1
45 : !! NAME
46 : !! get_pt0_pt1
47 : !!
48 : !! FUNCTION
49 : !! utility function to get pt0 and pt1 for given inf and sup
50 : !!
51 : !! INPUTS
52 : !! ngfft(3) = fine grid (corresponds to dtset%ngfft(1:3))
53 : !! inf = inferior point in-line coordinate on the coarse grid
54 : !! sup = superior point in-line coordinate on the coarse grid
55 : !!
56 : !! OUTPUT
57 : !! recpar%pt0<type(vec_int)>=Intial point for this proc in x,y,z
58 : !! recpar%pt1<type(vec_int)>=Final point for this proc in x,y,z
59 : !! recpar%min_pt=inferior point in-line coordinate on the fine grid
60 : !! recpar%max_pt=superior point in-line coordinate on the dine grid
61 : !!
62 : !! SIDE EFFECTS
63 : !!
64 : !! SOURCE
65 6 : subroutine get_pt0_pt1(ngfft,gratio,inf,sup,recpar)
66 :
67 : !Arguments ------------------------------------
68 : integer,intent(in) :: gratio
69 : integer,intent(in) :: inf,sup
70 : type(recparall_type),intent(inout) :: recpar
71 : integer,intent(in) :: ngfft(3)
72 : !Local ---------------------------
73 : integer :: x,y,z,count
74 : integer :: boz,boy,pt
75 : ! *********************************************************************
76 6 : count = 0
77 45 : do z = 0,ngfft(3)-1,gratio
78 45 : boz = z*ngfft(2)
79 552 : do y = 0,ngfft(2)-1,gratio
80 513 : boy = (boz+y)*ngfft(1)
81 6621 : do x = 0,ngfft(1)-1,gratio
82 6075 : pt = boy+x
83 6075 : if(count >= inf) then
84 3483 : if(count == inf) then
85 6 : recpar%pt0%x = x; recpar%pt0%y = y; recpar%pt0%z = z
86 6 : recpar%min_pt = pt
87 : end if
88 3483 : recpar%pt1%x = x; recpar%pt1%y = y; recpar%pt1%z = z
89 3483 : recpar%max_pt = pt
90 : endif
91 6075 : count = count+1
92 6582 : if(count == sup ) return
93 : end do
94 : end do
95 : end do
96 : end subroutine get_pt0_pt1
97 : !!***
98 :
99 : !!****f* m_rec_tools/reshape_pot
100 : !! NAME
101 : !! reshape_pot
102 : !!
103 : !! FUNCTION
104 : !! Reshape array on
105 : !!
106 : !! INPUTS
107 : !! nfft=size of the big grid
108 : !! nfftrec=size of the cut grid
109 : !! trasl(3) center point
110 : !! ngfft(3) dimensions of the big grid
111 : !! ngfftrec(3) dimensions of the cut grid
112 : !! pot(0:nfft-1) 3d-array on the big grid
113 : !!
114 : !! OUTPUT
115 : !! potloc is a cut of pot around trasl
116 : !!
117 : !! SOURCE
118 :
119 189 : subroutine reshape_pot(trasl,nfft,nfftrec,ngfft,ngfftrec,pot,potloc)
120 :
121 : !Arguments ------------------------------------
122 : integer, intent(in) :: nfft,nfftrec
123 : integer, intent(in) :: trasl(3)
124 : integer, intent(in) :: ngfftrec(3),ngfft(3)
125 : real(dp), intent(in) :: pot(0:nfft-1)
126 : real(dp), intent(out):: potloc(0:nfftrec-1)
127 : !Local ----------------------------------------
128 : ! scalars
129 : integer :: zz,yy,xx,parz,pary
130 : integer :: modi,modj,modk
131 : !character(len=500) :: msg
132 : ! *********************************************************************
133 945 : do zz = 0,ngfftrec(3)-1
134 756 : modk = modulo(zz-trasl(3),ngfft(3))*ngfft(2)
135 756 : parz = ngfftrec(2)*zz
136 3969 : do yy = 0,ngfftrec(2)-1
137 3024 : modj = (modulo(yy-trasl(2),ngfft(2))+modk)*ngfft(1)
138 3024 : pary = ngfftrec(1)*(yy+parz)
139 15876 : do xx = 0,ngfftrec(1)-1
140 12096 : modi = modulo(xx-trasl(1),ngfft(1))+modj
141 15120 : potloc(xx+pary) = pot(modi)
142 : end do
143 : end do
144 : end do
145 :
146 189 : end subroutine reshape_pot
147 : !!***
148 :
149 : !!****f* m_rec_tools/trottersum
150 : !! NAME
151 : !! trottersum
152 : !!
153 : !! FUNCTION
154 : !! Calculate the contribution to the partial fraction decomposition
155 : !! due to a recursion step.
156 : !!
157 : !! INPUTS
158 : !! dim_trott=dimension of the partial fraction decomposition (PFD)
159 : !! pi_on_rtrotter=parameter pi/rtrotter
160 : !! an,bn2=recursion coefficients at irec
161 : !! exp1=numerical factor (see density_rec)
162 : !! coeef_mu=numerical factor
163 : !!
164 : !! OUTPUT
165 : !!
166 : !! SIZE EFFECTS
167 : !! D,N=denominator and numerator accumalator of PFD
168 : !! Dold,Nold=denominator and numerator of PFD (old values)
169 : !! facrec0=used to select irec=0
170 : !! error=estimated error of recursion at this step
171 : !! prod_b2=numerical factor
172 : !!
173 : !! SOURCE
174 :
175 1423443 : subroutine trottersum(dim_trott,error,&
176 : & prod_b2,pi_on_rtrotter,&
177 : & facrec0,coeef_mu,exp1,&
178 : & an,bn2,&
179 1423443 : & N,D,Nold,Dold)
180 :
181 : !Arguments ------------------------------------
182 : !scalars
183 : integer, intent(in) :: dim_trott
184 : real(dp), intent(in) :: an,bn2,exp1,pi_on_rtrotter
185 : real(dp), intent(inout) :: error,prod_b2
186 : complex(dp), intent(in) :: coeef_mu
187 : complex(dp), intent(inout) :: facrec0
188 : !arrays
189 : complex(dp),intent(inout) :: D(0:dim_trott),Dold(0:dim_trott)
190 : complex(dp),intent(inout) :: N(0:dim_trott),Nold(0:dim_trott)
191 : !Local ----------------------------------------
192 : ! scalars
193 : integer :: itrot
194 : real(dp) :: arg
195 : complex(dp) :: Dnew,Nnew,zj
196 : !character(len=500) :: msg
197 : ! *********************************************************************
198 :
199 1423443 : error = zero
200 1423443 : prod_b2 = prod_b2 * exp1 * bn2
201 :
202 29892303 : do itrot=0,dim_trott
203 28468860 : arg = pi_on_rtrotter*(real( itrot,dp) + half )
204 28468860 : zj = cmplx(cos(arg),sin(arg),dp)*coeef_mu
205 :
206 : Nnew = zj*facrec0 + &
207 : & (zj - cmplx(an ,zero,dp))*N(itrot) - &
208 28468860 : & cmplx(bn2 ,zero,dp)*Nold(itrot)
209 : Dnew = (zj - cmplx(an ,zero,dp))*D(itrot) - &
210 28468860 : & cmplx(bn2 ,zero,dp)*Dold(itrot)
211 28468860 : Nold(itrot) = N(itrot)
212 28468860 : Dold(itrot) = D(itrot)
213 28468860 : N(itrot) = Nnew
214 28468860 : D(itrot) = Dnew
215 :
216 : !--Error estimator
217 29892303 : error = error + abs(prod_b2/(D(itrot)*Dold(itrot)))
218 : end do
219 1423443 : facrec0 = czero
220 :
221 1423443 : end subroutine trottersum
222 : !!***
223 :
224 : end module m_rec_tools
225 : !!***
|