Hex  1.0
Hydrogen-electron collision solver
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
radial.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
2  * *
3  * / / / / __ \ \ / / *
4  * / /__ / / / _ \ \ \/ / *
5  * / ___ / | |/_/ / /\ \ *
6  * / / / / \_\ / / \ \ *
7  * *
8  * Jakub Benda (c) 2014 *
9  * Charles University in Prague *
10  * *
11 \* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12 
13 #ifndef HEX_MOMENTS
14 #define HEX_MOMENTS
15 
16 #include <cmath>
17 #include <vector>
18 
19 #include "arrays.h"
20 #include "bspline.h"
21 #include "complex.h"
22 #include "gauss.h"
23 #include "input.h"
24 #include "parallel.h"
25 #include "special.h"
26 #include "matrix.h"
27 
29 {
30  public:
31 
32  // constructor
33  weightEdgeDamp(Bspline const & bspline)
34  : bspline_(bspline) {}
35 
36  // weight function
37  double operator() (Complex z) const
38  {
39  double R0 = bspline_.R0();
40 
41  // this will suppress function value from R0+1 onwards
42  // which is useful for expanding (divergent) Ricatti-Bessel function
43  return (z.imag() == 0.) ? (1+tanh(R0 - 5 - z.real()))/2 : 0.;
44  }
45 
46  private:
47 
49  Bspline const & bspline_;
50 };
51 
53 {
54  public:
55 
56  // constructor
57  weightEndDamp(Bspline const & bspline)
58  : bspline_(bspline) {}
59 
60  // weight function
61  double operator() (Complex z) const
62  {
63  double Rmax = bspline_.Rmax();
64 
65  // whis will suppress function value at Rmax
66  // which is useful for expanding everywhere-nonzero hydrogenic function
67  return tanh(Rmax - z.real());
68  }
69 
70  private:
71 
73  Bspline const & bspline_;
74 };
75 
77 {
78  public:
79 
80  // constructor
82  : bspline_(bspline), g_(bspline), D_(bspline.Nspline()), S_(bspline.Nspline()),
83  Mm1_(bspline.Nspline()), Mm1_tr_(bspline.Nspline()), Mm2_(bspline.Nspline()) {}
84 
85  // public callable members
87  void setupTwoElectronIntegrals(Parallel const & par, CommandLine const & cmd, Array<bool> const & lambdas);
88 
96  Complex computeD_iknot(int i, int j, int iknot) const;
97 
104  Complex computeD(int i, int j, int maxknot = -1) const;
105 
116  Complex computeM_iknot(int a, int i, int j, int iknot, Complex R) const;
117 
126  Complex computeM(int a, int i, int j, int maxknot = 0) const;
127 
138  cArray computeMi(int a, int iknotmax = 0) const;
139 
140  rArray computeScale (int a, int iknotmax = 0) const;
141 
142  void M_integrand (int n, Complex *in, Complex *out, int i, int j, int a, int iknot, int iknotmax, double& logscale) const;
143 
167  Complex computeR (
168  int lambda,
169  int i, int j, int k, int l,
170  cArray const & Mtr_L,
171  cArray const & Mtr_mLm1
172  ) const;
173 
174  Complex computeRdiag (int L, int a, int b, int c, int d, int iknot, int iknotmax) const;
175  Complex computeRtri (int L, int k, int l, int m, int n, int iknot, int iknotmax) const;
176  void R_inner_integrand (int n, Complex* in, Complex* out, int i, int j, int L, int iknot, int iknotmax, Complex x) const;
177  void R_outer_integrand (int n, Complex* in, Complex* out, int i, int j, int k, int l, int L, int iknot, int iknotmax) const;
178 
179  void allSymmetries (
180  int i, int j, int k, int l,
181  Complex Rijkl_tr,
182  NumberArray<long> & R_tr_i,
183  NumberArray<long> & R_tr_j,
184  NumberArray<Complex> & R_tr_v
185  ) const;
186 
195  template <class Functor> cArray overlapP (int n, int l, Functor weightf) const
196  {
197  cArray res(bspline_.Nspline());
198 
199  // per interval
200  int points = 20;
201 
202  // evaluated B-spline and hydrogenic functions (auxiliary variables)
203  cArray evalB(points);
204  cArray evalP(points);
205 
206  // for all knots
207  for (int iknot = 0; iknot < bspline_.Nknot() - 1; iknot++)
208  {
209  // skip zero length intervals
210  if (bspline_.t(iknot) == bspline_.t(iknot+1))
211  continue;
212 
213  // which points are to be used here?
214  cArray xs = g_.p_points(points, bspline_.t(iknot), bspline_.t(iknot+1));
215  cArray ws = g_.p_weights(points, bspline_.t(iknot), bspline_.t(iknot+1));
216 
217  // evaluate the hydrogenic function
218  std::transform(
219  xs.begin(), xs.end(), evalP.begin(),
220  [ = ](Complex x) -> Complex {
221  gsl_sf_result R;
222  if (gsl_sf_hydrogenicR_e(n, l, 1., x.real(), &R) == GSL_EUNDRFLW)
223  return 0.;
224  else
225  return weightf(x) * x * R.val;
226  }
227  );
228 
229  // for all relevant B-splines
230  for (int ispline = std::max(iknot-bspline_.order(),0); ispline < bspline_.Nspline() and ispline <= iknot; ispline++)
231  {
232  // evaluate the B-spline
233  bspline_.B(ispline, iknot, points, xs.data(), evalB.data());
234 
235  // sum with weights
236  Complex sum = 0.;
237  for (int ipoint = 0; ipoint < points; ipoint++)
238  sum += ws[ipoint] * evalP[ipoint] * evalB[ipoint];
239 
240  // store the overlap
241  res[ispline] += sum;
242  }
243  }
244 
245  return res;
246  }
247 
260  template <class Functor> cArray overlapj (int maxell, const rArrayView vk, Functor weightf) const
261  {
262  // shorthands
263  int Nenergy = vk.size();
264  int Nspline = bspline_.Nspline();
265  int Nknot = bspline_.Nknot();
266  int order = bspline_.order();
267 
268  // reserve space for the output array
269  size_t size = Nspline * Nenergy * (maxell + 1);
270  cArray res(size);
271 
272  // per interval
273  int points = 20;
274 
275  // for all knots
276  # pragma omp parallel for
277  for (int iknot = 0; iknot < Nknot - 1; iknot++)
278  {
279  // skip zero length intervals
280  if (bspline_.t(iknot) == bspline_.t(iknot+1))
281  continue;
282 
283  // which points are to be used here?
284  cArray xs = g_.p_points(points, bspline_.t(iknot), bspline_.t(iknot+1));
285  cArray ws = g_.p_weights(points, bspline_.t(iknot), bspline_.t(iknot+1));
286 
287  // evaluate relevant B-splines on this knot
288  cArrays evalB(Nspline);
289  for (int ispline = std::max(iknot-order,0); ispline < Nspline and ispline <= iknot; ispline++)
290  {
291  evalB[ispline] = cArray(points);
292  bspline_.B(ispline, iknot, points, xs.data(), evalB[ispline].data());
293  }
294 
295  // for all linear momenta (= energies)
296  for (int ie = 0; ie < Nenergy; ie++)
297  {
298  // evaluate the Riccati-Bessel function for this knot and energy and for all angular momenta
299  cArrays evalj(points);
300  for (int ipoint = 0; ipoint < points; ipoint++)
301  evalj[ipoint] = weightf(xs[ipoint]) * ric_jv(maxell, vk[ie] * xs[ipoint]);
302 
303  // for all angular momenta
304  for (int l = 0; l <= maxell; l++)
305  {
306  // for all relevant B-splines
307  for (int ispline = std::max(iknot-order,0); ispline < Nspline and ispline <= iknot; ispline++)
308  {
309  // sum with weights
310  Complex sum = 0.;
311  for (int ipoint = 0; ipoint < points; ipoint++)
312  sum += ws[ipoint] * evalj[ipoint][l] * evalB[ispline][ipoint];
313 
314  // store the overlap; keep the shape Nmomenta × Nspline × (maxl+1)
315  res[(ie * (maxell + 1) + l) * Nspline + ispline] += sum;
316  }
317  }
318  }
319  }
320 
321  return res;
322  }
323 
324  Bspline const & bspline() const { return bspline_; }
325 
326  SymDiaMatrix const & D() const { return D_; }
327  SymDiaMatrix const & S() const { return S_; }
328  SymDiaMatrix const & Mm1() const { return Mm1_; }
329  SymDiaMatrix const & Mm1_tr() const { return Mm1_tr_; }
330  SymDiaMatrix const & Mm2() const { return Mm2_; }
331 
332  SymDiaMatrix const & R_tr_dia(unsigned i) const
333  {
334  assert(i < R_tr_dia_.size());
335  return R_tr_dia_[i];
336  }
337 
338  size_t maxlambda() const { return R_tr_dia_.size() - 1; }
339 
340  private:
341 
342  // B-spline environment
343  Bspline const & bspline_;
344 
345  // Gauss-Legendre integrator
346  GaussLegendre g_;
347 
348  //
349  // matrices
350  //
351 
352  SymDiaMatrix D_, S_, Mm1_, Mm1_tr_, Mm2_;
353  Array<SymDiaMatrix> R_tr_dia_;
354 };
355 
356 #endif
virtual T * data()
Data pointer.
Definition: arrays.h:757
SymDiaMatrix const & R_tr_dia(unsigned i) const
Definition: radial.h:332
Definition: radial.h:76
int Nknot() const
Number of knots.
Definition: bspline.h:192
cArray p_weights(int points, Complex x1, Complex x2) const
Get Gauss-Legendre quadrature weights in interval.
Definition: gauss.cpp:94
Definition: radial.h:28
Complex computeD_iknot(int i, int j, int iknot) const
Definition: radial.cpp:213
void R_inner_integrand(int n, Complex *in, Complex *out, int i, int j, int L, int iknot, int iknotmax, Complex x) const
Definition: slater.cpp:44
SymDiaMatrix const & Mm2() const
Definition: radial.h:330
NumberArray< Complex > cArray
Definition: arrays.h:1610
A comfortable number array class.
Definition: arrays.h:171
int order() const
B-spline order.
Definition: bspline.h:198
Complex const & t(int i) const
B-spline knot sequence.
Definition: bspline.h:186
B-spline environment.
Definition: bspline.h:35
Complex computeM(int a, int i, int j, int maxknot=0) const
Definition: radial.cpp:306
int size
Definition: misc.h:311
Gauss-Legendre quadrature.
Definition: gauss.h:33
SymDiaMatrix const & Mm1_tr() const
Definition: radial.h:329
Complex computeR(int lambda, int i, int j, int k, int l, cArray const &Mtr_L, cArray const &Mtr_mLm1) const
Definition: slater.cpp:124
weightEndDamp(Bspline const &bspline)
Definition: radial.h:57
void B(int i, int iknot, int n, const Complex *x, Complex *y) const
B-spline.
Definition: bspline.cpp:59
Command line parameters.
Definition: input.h:34
iterator end()
Definition: arrays.h:774
double operator()(Complex z) const
Definition: radial.h:61
cArray overlapj(int maxell, const rArrayView vk, Functor weightf) const
Compute j-overlaps.
Definition: radial.h:260
RadialIntegrals(Bspline const &bspline)
Definition: radial.h:81
Bspline const & bspline() const
Definition: radial.h:324
Definition: radial.h:52
void setupOneElectronIntegrals()
Definition: radial.cpp:326
int Nspline() const
Number of B-splines.
Definition: bspline.h:189
Complex computeM_iknot(int a, int i, int j, int iknot, Complex R) const
Definition: radial.cpp:267
cArray computeMi(int a, int iknotmax=0) const
Definition: radial.cpp:141
void allSymmetries(int i, int j, int k, int l, Complex Rijkl_tr, NumberArray< long > &R_tr_i, NumberArray< long > &R_tr_j, NumberArray< Complex > &R_tr_v) const
Definition: slater.cpp:187
size_t size() const
Length of the array (number of elements).
Definition: arrays.h:276
T sum(const ArrayView< T > v)
Sum elements in array.
Definition: arrays.h:1770
SymDiaMatrix const & Mm1() const
Definition: radial.h:328
iterator begin()
Definition: arrays.h:771
double operator()(Complex z) const
Definition: radial.h:37
size_t size() const
Return number of elements.
Definition: arrays.h:389
void M_integrand(int n, Complex *in, Complex *out, int i, int j, int a, int iknot, int iknotmax, double &logscale) const
Definition: radial.cpp:70
MPI info.
Definition: parallel.h:29
void setupTwoElectronIntegrals(Parallel const &par, CommandLine const &cmd, Array< bool > const &lambdas)
Definition: radial.cpp:359
double Rmax() const
End of complex grid (real, unrotated).
Definition: bspline.h:204
A comfortable data array class.
Definition: arrays.h:151
virtual T * data()
Data pointer.
Definition: arrays.h:433
Complex computeRdiag(int L, int a, int b, int c, int d, int iknot, int iknotmax) const
Definition: slater.cpp:105
cArray overlapP(int n, int l, Functor weightf) const
Definition: radial.h:195
double R0() const
End of real grid.
Definition: bspline.h:201
SymDiaMatrix const & S() const
Definition: radial.h:327
size_t maxlambda() const
Definition: radial.h:338
void R_outer_integrand(int n, Complex *in, Complex *out, int i, int j, int k, int l, int L, int iknot, int iknotmax) const
Definition: slater.cpp:59
cArray ric_jv(int lmax, Complex z)
Definition: special.cpp:107
weightEdgeDamp(Bspline const &bspline)
Definition: radial.h:33
SymDiaMatrix const & D() const
Definition: radial.h:326
Complex computeRtri(int L, int k, int l, int m, int n, int iknot, int iknotmax) const
Definition: slater.cpp:87
std::complex< double > Complex
Definition: complex.h:20
Symmetric diagonal matrix.
Definition: matrix.h:1547
T max(const ArrayView< T > a)
Maximal element of array.
Definition: arrays.h:1673
cArray p_points(int points, Complex x1, Complex x2) const
Get Gauss-Legendre quadrature points in interval.
Definition: gauss.cpp:73
Complex computeD(int i, int j, int maxknot=-1) const
Definition: radial.cpp:247
rArray computeScale(int a, int iknotmax=0) const
Definition: radial.cpp:40