33#ifndef MADNESS_MRA_DISPLACEMENTS_H__INCLUDED
34#define MADNESS_MRA_DISPLACEMENTS_H__INCLUDED
64 template <std::
size_t NDIM>
67 inline static std::vector< Key<NDIM> >
disp = {};
107 for (std::size_t i=0; i<
NDIM; ++i)
num *= (2*
bmax + 1);
115 else if (
NDIM == 2) {
120 else if (
NDIM == 3) {
126 else if (
NDIM == 4) {
133 else if (
NDIM == 5) {
142 else if (
NDIM == 6) {
165 std::vector<Translation>
bp(4*
bmax+1);
166 std::vector<Translation>
bnp(2*
bmax+1);
171 if ((lx < 0) && (lx+twon >
bmax))
bp[
ip++] = lx + twon;
172 if ((lx > 0) && (lx-twon <-
bmax))
bp[
ip++] = lx - twon;
185 for(
size_t i=0; i!=
NDIM; ++i) {
190 for (std::size_t i=0; i<
NDIM; ++i) {
223 if constexpr (
NDIM <= 3) {
246 "Displacements<" + std::to_string(
NDIM) +
247 ">::get_disp(level, kernel_lattice_sum_axes): kernel_lattice_sum_axes is set for some axes that were not periodic in the FunctionDefault's boundary conditions active at the time when Displacements were initialized; invoke Displacements<NDIM>::reset_periodic_axes(kernel_lattice_sum_axes) to rebuild the periodic displacements";
283 for (
Level n = 0; n < nmax; ++n)
294 for (
size_t n = 0; n < 64; ++n) {
302 template <std::
size_t N, std::
size_t M>
304 std::array<std::size_t,
N -
M> result;
305 if constexpr (
N !=
M) {
310 for (std::size_t i = 0; i <
N; ++i) {
331 template<std::
size_t NDIM>
345 using Box = std::array<std::pair<Translation, Translation>,
NDIM>;
373 mutable std::optional<Displacement>
disp;
432 for (
size_t i =
NDIM; i > 0; --i) {
452 std::optional<Displacement>
nulldisp;
489 for (
size_t i = 0; i <
NDIM; ++i) {
560 std::optional<Displacement>
nulldisp;
610 for (
size_t d = 0;
d !=
NDIM; ++
d) {
660 if (
a.done &&
b.done)
return true;
661 if (
a.done ||
b.done)
return false;
662 return a.fixed_dim ==
b.fixed_dim &&
702 for (
size_t d=0;
d!=
NDIM; ++
d) {
706 r = (n == 0) ? (r+1)/2 : (r *
Translation(1) << (n-1));
718 for (
size_t d=0;
d!=
NDIM; ++
d) {
783 template <
size_t NDIM>
800 const std::array<KernelRange, NDIM>& range,
807 for (
size_t i = 0; i <
NDIM; i++) {
808 if (is_lattice_summed[i]) {
838 const auto twon = (
static_cast<Translation>(1) << level);
841 const auto map_to_range_twon = [&,
mask = ((~(
static_cast<std::uint64_t
>(0)) << (64-level)) >> (64-level))](std::int64_t x) -> std::int64_t {
853 for(
size_t d=0;
d!=
NDIM; ++
d) {
868 for(
size_t d=0;
d!=
NDIM; ++
d) {
869 const auto disp_d = (*displacement)[
d];
888 auto t = (*displacement).translation();
Iterator class for lazy generation of surface points.
Definition displacements.h:367
std::optional< Displacement > disp
Memoized displacement from parent->center_ to point, computed by displacement(), reset by advance()
Definition displacements.h:373
Iterator(const BoxSurfaceDisplacementRange *p, Type type)
Constructs an iterator.
Definition displacements.h:602
Type
Definition displacements.h:369
@ End
Definition displacements.h:369
@ Begin
Definition displacements.h:369
size_t fixed_dim
Current fixed dimension (i.e. faces perpendicular to this axis are being iterated over)
Definition displacements.h:374
const std::optional< Displacement > & displacement() const
Definition displacements.h:581
friend bool operator!=(const Iterator &a, const Iterator &b)
Inequality comparison operator.
Definition displacements.h:672
bool done
Flag indicating iteration completion.
Definition displacements.h:383
pointer operator->() const
Arrow operator for member access.
Definition displacements.h:632
Box unprocessed_bounds
Definition displacements.h:375
Iterator operator++(int)
Post-increment operator.
Definition displacements.h:647
std::ptrdiff_t difference_type
Definition displacements.h:592
std::input_iterator_tag iterator_category
Definition displacements.h:590
const BoxSurfaceDisplacementRange * parent
Pointer to parent surface.
Definition displacements.h:371
bool next_surface_layer()
Definition displacements.h:387
reference operator*() const
Dereferences the iterator.
Definition displacements.h:626
void reset_along_dim(size_t dim)
Definition displacements.h:515
void advance_till_valid()
Perform advance, repeating if you are at a filtered point.
Definition displacements.h:495
Point point
Current point / box. This is always free to leave the simulation cell.
Definition displacements.h:372
friend bool operator==(const Iterator &a, const Iterator &b)
Equality comparison operator.
Definition displacements.h:659
Iterator & operator++()
Pre-increment operator.
Definition displacements.h:638
void advance()
Advances the iterator to the next surface point.
Definition displacements.h:420
Definition displacements.h:332
Displacement probing_displacement_
displacement to a nearby point on the surface; it may not be able to pass the filter,...
Definition displacements.h:359
std::function< bool(Level, const PointPattern &, std::optional< Displacement > &)> Validator
Definition displacements.h:340
Key< NDIM > Point
Definition displacements.h:334
const Key< NDIM > & center() const
Definition displacements.h:751
std::array< std::optional< Translation >, NDIM > SurfaceThickness
Definition displacements.h:344
const std::array< std::optional< int64_t >, NDIM > & box_radius() const
Definition displacements.h:756
const array_of_bools< NDIM > & is_lattice_summed() const
Definition displacements.h:766
Periodicity is_lattice_summed_
which dimensions are lattice summed?
Definition displacements.h:355
Validator validator_
optional validator function
Definition displacements.h:356
SurfaceThickness surface_thickness_
surface thickness in each dimension, measured in boxes. Real-space surface size is thus n-dependent.
Definition displacements.h:352
std::array< std::optional< Translation >, NDIM > BoxRadius
Definition displacements.h:343
const std::array< std::optional< int64_t >, NDIM > & surface_thickness() const
Definition displacements.h:761
BoxSurfaceDisplacementRange(const Key< NDIM > ¢er, const std::array< std::optional< std::int64_t >, NDIM > &box_radius, const std::array< std::optional< std::int64_t >, NDIM > &surface_thickness, const array_of_bools< NDIM > &is_lattice_summed, Validator validator={})
Constructs a box with different radii and thicknesses for each dimension.
Definition displacements.h:691
Hollowness hollowness_
does box contain non-surface points along each dimension?
Definition displacements.h:354
auto begin() const
Returns an iterator to the beginning of the surface points.
Definition displacements.h:730
Box box_
box bounds in each dimension.
Definition displacements.h:353
const Displacement & probing_displacement() const
Definition displacements.h:771
Point center_
Center point of the box.
Definition displacements.h:349
Key< NDIM > Displacement
Definition displacements.h:336
std::array< bool, NDIM > Hollowness
Definition displacements.h:346
auto end() const
Returns an iterator to the end of the surface points.
Definition displacements.h:736
std::array< std::pair< Translation, Translation >, NDIM > Box
Definition displacements.h:345
BoxRadius box_radius_
halved size of the box in each dimension, in half-SimulationCells.
Definition displacements.h:350
Definition displacements.h:784
std::function< double(const Displacement &)> DistanceSquaredFunc
Definition displacements.h:790
DistanceSquaredFunc default_distance_squared_
Definition displacements.h:924
std::array< ExtraDomainPolicy, NDIM > domain_policies_
Definition displacements.h:922
double max_distsq_reached_
Definition displacements.h:925
bool operator()(const Level level, const PointPattern &dest, std::optional< Displacement > &displacement) const
Apply filter to a displacement ending up at a point or a group of points (point pattern)
Definition displacements.h:832
std::array< KernelRange, NDIM > range_
Definition displacements.h:923
BoxSurfaceDisplacementValidator(const array_of_bools< NDIM > &is_infinite_domain, const array_of_bools< NDIM > &is_lattice_summed, const std::array< KernelRange, NDIM > &range, DistanceSquaredFunc default_distance_squared, double max_distsq_reached)
Definition displacements.h:797
Holds displacements for applying operators to avoid replicating for all operators.
Definition displacements.h:65
static std::array< std::vector< Key< NDIM > >, 64 > disp_periodic
displacements to be used with lattice-summed kernels
Definition displacements.h:69
static bool cmp_keys(const Key< NDIM > &a, const Key< NDIM > &b)
Definition displacements.h:88
const std::vector< Key< NDIM > > & get_disp()
return the standard displacements appropriate for operators w/o lattice summation
Definition displacements.h:260
const std::vector< Key< NDIM > > & get_disp(Level n, const array_of_bools< NDIM > &kernel_lattice_sum_axes)
Definition displacements.h:236
static std::vector< Key< NDIM > > disp
standard displacements to be used with standard kernels (range-unrestricted, no lattice sum)
Definition displacements.h:67
static Tensor< double > widths
cell width, used to order displacements from least to most real space distance
Definition displacements.h:70
static void reset_periodic_axes(const array_of_bools< NDIM > &new_periodic_axes)
rebuilds periodic displacements so that they are optimal for the given set of periodic axes
Definition displacements.h:274
static void make_disp(int bmax)
Definition displacements.h:102
static void make_disp_periodic(int bmax, Level n)
Definition displacements.h:158
static int bmax_default()
Definition displacements.h:73
static bool cmp_keys_periodic(const Key< NDIM > &a, const Key< NDIM > &b)
Definition displacements.h:95
static array_of_bools< NDIM > periodic_axes
along which axes lattice summation is performed?
Definition displacements.h:68
static void set_width(const Tensor< double > &width)
Definition displacements.h:289
Displacements()
Definition displacements.h:213
FunctionDefaults holds default paramaters as static class members.
Definition funcdefaults.h:100
Key is the index for a node of the 2^NDIM-tree.
Definition key.h:70
Level level() const
Definition key.h:169
const Vector< Translation, NDIM > & translation() const
Definition key.h:174
Key neighbor(const Key< NDIM > &disp) const
given a displacement, generate a neighbor key; ignore boundary conditions and disp's level
Definition key.h:384
A tensor is a multidimensional array.
Definition tensor.h:318
float_scalar_type normf() const
Returns the Frobenius norm of the tensor.
Definition tensor.h:1727
A simple, fixed dimension vector.
Definition vector.h:64
syntactic sugar for std::array<bool, N>
Definition array_of_bools.h:19
bool any() const
Definition array_of_bools.h:38
char * p(char *buf, const char *name, int k, int initial_level, double thresh, int order)
Definition derivatives.cc:72
real_function_3d mask
Definition dirac-hatom.cc:27
Provides FunctionDefaults and utilities for coordinate transformation.
#define MADNESS_PRAGMA_CLANG(x)
Definition madness_config.h:200
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
#define MADNESS_ASSERT(condition)
Assert a condition that should be free of side-effects since in release builds this might be a no-op.
Definition madness_exception.h:134
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
ExtraDomainPolicy
Definition displacements.h:52
int64_t Translation
Definition key.h:58
Key< NDIM > displacement(const Key< NDIM > &source, const Key< NDIM > &target)
given a source and a target, return the displacement in translation
Definition key.h:533
int Level
Definition key.h:59
static double pop(std::vector< double > &v)
Definition SCF.cc:115
constexpr std::array< std::size_t, N-M > iota_array(std::array< std::size_t, M > values_to_skip_sorted)
Definition displacements.h:303
std::string type(const PairType &n)
Definition PNOParameters.h:18
static XNonlinearSolver< std::vector< Function< T, NDIM > >, T, vector_function_allocator< T, NDIM > > nonlinear_vector_solver(World &world, const long nvec)
Definition nonlinsol.h:371
static long abs(long a)
Definition tensor.h:219
static const double b
Definition nonlinschro.cc:119
static const double d
Definition nonlinschro.cc:121
static const double a
Definition nonlinschro.cc:118
Defines and implements most of Tensor.
void e()
Definition test_sig.cc:75
#define N
Definition testconv.cc:37
constexpr std::size_t NDIM
Definition testgconv.cc:54