49 lines
1.9 KiB
C
49 lines
1.9 KiB
C
#include "scatsystem_dbg.h"
|
|
#include "translations_dbg.h"
|
|
#include "indexing.h"
|
|
|
|
|
|
// analogue of qpms_scatsyswk_scattered_field_basis_e()
|
|
qpms_errno_t qpms_scatsyswk_test_sswf_basis_e(
|
|
complex double *target, ///< Target array of size (2 * sswk->ssw->ss->c->lMax + 1) * sswk->ssw->ss->p_count
|
|
const qpms_scatsys_at_omega_k_t *sswk,
|
|
qpms_bessel_t btyp, ///< Bessel function kind to use (only QPMS_HANKEL_PLUS is currently supponted).
|
|
cart3_t where, ///< A point \f$ \vect r \f$, at which the basis is evaluated.
|
|
qpms_ewald_part parts
|
|
) {
|
|
QPMS_UNTESTED;
|
|
if (btyp != QPMS_HANKEL_PLUS)
|
|
QPMS_NOT_IMPLEMENTED("Only scattered field with first kind Hankel functions currently implemented.");
|
|
const qpms_scatsys_t *ss = sswk->ssw->ss;
|
|
if (ss->lattice_dimension != 2)
|
|
QPMS_NOT_IMPLEMENTED("Only 2D-periodic lattices implemented");
|
|
//ccart3_t res = {0,0,0};
|
|
//ccart3_t res_kc = {0,0,0}; // kahan sum compensation
|
|
|
|
const size_t particle_nelem = qpms_lMax2nelem_sc(2*ss->c->lMax + 1);
|
|
|
|
|
|
for (qpms_ss_pi_t pi = 0; pi < ss->p_count; ++pi) {
|
|
const cart3_t particle_pos = ss->p[pi].pos;
|
|
|
|
const cart3_t origin_cart = {0, 0, 0};
|
|
|
|
QPMS_ASSERT(sswk->k[2] == 0); // At least not implemented now
|
|
QPMS_ASSERT(ss->per.lattice_basis[0].z == 0);
|
|
QPMS_ASSERT(ss->per.lattice_basis[1].z == 0);
|
|
|
|
// Same choices as in qpms_ss_ppair_W32xy; TODO make it more dynamic
|
|
const double maxR = sqrt(ss->per.unitcell_volume) * 64;
|
|
const double maxK = 2048 * 2 * M_PI / maxR;
|
|
|
|
QPMS_ENSURE_SUCCESS(qpms_trans_calculator_test_sswf_e32(ss->c,
|
|
target + pi * particle_nelem, NULL,
|
|
sswk->eta, sswk->ssw->wavenumber,
|
|
cart3xy2cart2(ss->per.lattice_basis[0]), cart3xy2cart2(ss->per.lattice_basis[1]),
|
|
cart2_from_double_array(sswk->k), cart3_substract(where, particle_pos) /*CHECKSIGN*/,
|
|
maxR, maxK, parts));
|
|
}
|
|
|
|
return QPMS_SUCCESS;
|
|
}
|