33#ifndef MADNESS_MRA_DISPLACEMENTS_H__INCLUDED
34#define MADNESS_MRA_DISPLACEMENTS_H__INCLUDED
79 template <std::
size_t NDIM>
82 inline static std::vector< Key<NDIM> >
disp = {};
108 std::size_t
mask = 0;
109 for (std::size_t
d = 0;
d <
NDIM; ++
d)
if (axes[
d])
mask |= std::size_t(1) <<
d;
119 if (
NDIM == 1) bmax = 7;
120 else if (
NDIM == 2) bmax = 5;
121 else if (
NDIM == 3) bmax = 4;
122 else if (
NDIM == 4) bmax = 3;
123 else if (
NDIM == 5) bmax = 3;
124 else if (
NDIM == 6) bmax = 3;
153 std::array<int, NDIM>
b;
156 for (std::size_t
d = 0;
d !=
NDIM; ++
d) wmax = std::max(wmax,
widths(
long(
d)));
157 for (std::size_t
d = 0;
d !=
NDIM; ++
d) {
159 const double ratio = (
w <= 0 || wmax <= 0) ? 1.0 : wmax /
w;
162 "Displacements::bmax_axes: cell aspect ratio too large, the displacement reach would overflow");
164 b[
d] = int(std::ceil(b0 * ratio - 1
e-12));
195 return key.translation() < other.
key.translation();
200 std::vector<DispEntry> entries;
201 entries.reserve(
d.size());
202 for (
const auto&
k :
d) {
203 entries.push_back({
k,
k.real_distsq(
w),
k.distsq()});
205 std::sort(entries.begin(), entries.end());
206 for (std::size_t i = 0; i <
d.size(); ++i) {
207 d[i] = entries[i].key;
212 std::vector<DispEntry> entries;
213 entries.reserve(
d.size());
214 for (
const auto&
k :
d) {
215 entries.push_back({
k,
k.real_distsq_bc(paxes,
w),
k.distsq_bc(paxes)});
217 std::sort(entries.begin(), entries.end());
218 for (std::size_t i = 0; i <
d.size(); ++i) {
219 d[i] = entries[i].key;
228 std::vector<DispEntry> entries;
229 entries.reserve(
d.size());
230 for (
const auto&
k :
d) {
231 entries.push_back({
k,
k.real_distsq_images(paxes,
w),
k.distsq_images(paxes),
k.real_distsq_images_centers(paxes,
w)});
233 std::sort(entries.begin(), entries.end());
234 for (std::size_t i = 0; i <
d.size(); ++i) {
235 d[i] = entries[i].key;
239 static void make_disp(
const std::array<int, NDIM>& bmax) {
241 for (std::size_t i = 0; i !=
NDIM; ++i) lim[i] = 2*bmax[i] + 1;
245 for (std::size_t i = 0; i !=
NDIM; ++i)
d[i] =
Translation(index[i]) - bmax[i];
259 std::array<std::vector<Translation>,
NDIM> b1d;
260 for (std::size_t i = 0; i !=
NDIM; ++i) {
262 if (bmax > (twon-1)) bmax = twon-1;
264 b1d[i].push_back(lx);
265 if (periodic_axes[i]) {
266 if ((lx < 0) && (lx+twon > bmax)) b1d[i].push_back(lx + twon);
267 if ((lx > 0) && (lx-twon <-bmax)) b1d[i].push_back(lx - twon);
275 std::vector< Key<NDIM> >& disp_periodic = lists.
by_distance[n];
276 disp_periodic = std::vector< Key<NDIM> >();
278 for(
size_t i=0; i!=
NDIM; ++i) lim[i] = b1d[i].size();
281 for (std::size_t i=0; i<
NDIM; ++i)
d[i] = b1d[i][index[i]];
300 if (
auto p = slot.load(std::memory_order_acquire))
return *
p;
302 if (
auto p = slot.load(std::memory_order_acquire))
return *
p;
303 MADNESS_CHECK_THROW(
NDIM <= 3,
"Displacements: lattice-summed displacements are supported for NDIM <= 3 only");
305 auto lists = std::make_unique<PeriodicLists>(axes);
310 slot.store(
p, std::memory_order_release);
341 if constexpr (
NDIM <= 3) {
343 if (bc_axes.any())
periodic(bc_axes);
357 if (kernel_lattice_sum_axes.
any()) {
378 if (!lists.
images_built.load(std::memory_order_acquire)) {
380 if (!lists.
images_built.load(std::memory_order_acquire)) {
382 lists.
images_built.store(
true, std::memory_order_release);
423 bool changed =
false;
424 for (std::size_t i = 0; !changed && i !=
NDIM; ++i) changed =
widths(i) != width(i);
425 if (!changed)
return;
441 if (lists->images_built.load(std::memory_order_acquire))
449 template <std::
size_t N, std::
size_t M>
450 constexpr std::enable_if_t<N>=M, std::array<std::size_t,
N-M>>
iota_array(std::array<std::size_t, M> values_to_skip_sorted) {
451 std::array<std::size_t,
N - M> result;
452 if constexpr (
N != M) {
453 std::size_t nadded = 0;
454 auto value_to_skip_it = values_to_skip_sorted.begin();
455 assert(*value_to_skip_it <
N);
456 auto value_to_skip = *value_to_skip_it;
457 for (std::size_t i = 0; i <
N; ++i) {
458 if (i < value_to_skip) {
459 result[nadded++] = i;
460 }
else if (value_to_skip_it != values_to_skip_sorted.end()) {
462 if (value_to_skip_it != values_to_skip_sorted.end()) {
463 value_to_skip = *value_to_skip_it;
482 template <std::
size_t NDIM>
491 template <
size_t NDIM>
507 std::optional<Reach>
reach = {}
512 for (
size_t i = 0; i <
NDIM; i++) {
515 }
else if (is_infinite_domain[i]) {
521 MADNESS_CHECK_THROW(
reach_->cell_width[i] > 0,
"BoxSurfaceDisplacementValidator: cell widths in StandardDisplacementsReach must be positive");
553 const auto twon = (
static_cast<Translation>(1) << level);
556 const auto map_to_range_twon = [&,
mask = level == 0 ? std::uint64_t(0) : ((~(
static_cast<std::uint64_t
>(0)) << (64-level)) >> (64-level))](std::int64_t x) -> std::int64_t {
557 const std::int64_t x_mapped = x &
mask;
562 const auto out_of_domain = [&](
const Translation& t) ->
bool {
563 return t < 0 || t >= twon;
567 const bool dest_is_in_domain = [&]() {
568 for(
size_t d=0;
d!=
NDIM; ++
d) {
574 if (dest_is_in_domain) {
582 bool among_standard_displacements =
true;
583 for(
size_t d=0;
d!=
NDIM; ++
d) {
584 const auto disp_d = (*displacement)[
d];
594 auto disp_d_eff_abs =
std::abs(disp_d);
597 const std::int64_t disp_d_eff = map_to_range_twon(disp_d);
598 disp_d_eff_abs = std::min(disp_d_eff,
std::abs(disp_d_eff-twon));
602 if (dest[
d].has_value()) {
604 const auto dest_d_in_cell = map_to_range_twon(dest_d);
608 auto t = (*displacement).translation();
609 t[
d] += (dest_d_in_cell - dest_d);
614 if (disp_d_eff_abs > bmax_standard) {
615 among_standard_displacements =
false;
620 if (among_standard_displacements) {
645 template<std::
size_t NDIM>
656 using Box = std::array<std::pair<Translation, Translation>,
NDIM>;
684 mutable std::optional<Displacement>
disp;
735 auto increment_along_dim = [
this](
size_t dim) {
744 for (
size_t i =
NDIM; i > 0; --i) {
745 const size_t cur_dim = i - 1;
749 increment_along_dim(cur_dim);
758 const auto filtered_out = [&,
this]() {
760 const auto& validator = this->parent->
validator_;
764 std::optional<Displacement> nulldisp;
765 result = !(*validator)(
point.level(), point_pattern, nulldisp);
781 bool has_layer =
true;
782 for (
size_t i = 0; i <
NDIM; ++i) {
831 const auto filtered_out = [&]() ->
bool {
836 while (!
done && filtered_out()) {
846 const auto is_fixed_dim = dim ==
fixed_dim;
865 l_dim_min = std::max(
parent->
box_[dim].second -
877 const auto filtered_out = [&,
this]() {
879 const auto& validator = this->parent->
validator_;
883 std::optional<Displacement> nulldisp;
884 result = !(*validator)(
point.level(), point_pattern, nulldisp);
889 if (filtered_out()) {
890 bool have_another_surface_layer;
895 return have_another_surface_layer;
979 if (
a.done &&
b.done)
return true;
980 if (
a.done ||
b.done)
return false;
981 return a.fixed_dim ==
b.fixed_dim &&
1017 std::optional<Validator> validator = {})
1021 for (
size_t d=0;
d!=
NDIM; ++
d)
1023 "BoxSurfaceDisplacementRange: validator and range disagree on which axes are lattice summed");
1026 bool has_finite_dimensions =
false;
1027 const auto n =
center_.level();
1029 for (
size_t d=0;
d!=
NDIM; ++
d) {
1033 r = (n == 0) ? (r+1)/2 : (r *
Translation(1) << (n-1));
1036 has_finite_dimensions =
true;
1042 for (
size_t d=0;
d!=
NDIM; ++
d) {
1045 for (
size_t d=0;
d!=
NDIM; ++
d) {
1055 : std::pair{
box_[
d].first - t,
box_[
d].second + t};
1171 const auto face_origin_is_center = [
this](
size_t d) {
1178 const auto n =
center_.level();
1181 r = (n == 0) ? (r+1)/2 : (r *
Translation(1) << (n-1));
1183 probing_displacement_vec[face_dimension] = r -
surface_thickness_[face_dimension].value_or(0);
1189 auto& l = probing_displacement_vec[face_dimension];
1190 l = ((l % period) + period) % period;
1191 if (l > period / 2) l -= period;
1196 if (!face_origin_is_center(face_dimension) || n == 0 ||
NDIM == 1)
1218 const auto offset_along = [&](
size_t d) ->
Translation {
1219 const double width = reach.cell_width[
d];
1221 return std::min(std::min(nboxes,
Translation(bmax[
d])) + 1, half_cell);
1224 const auto offset_distance = [&](
size_t d) ->
double {
1225 return reach.cell_width[
d] * (offset_along(
d) - 1);
1231 const auto offset_sort_key = [&](
size_t d) {
1234 size_t offset_dimension =
NDIM;
1235 for (
size_t d=0;
d !=
NDIM; ++
d) {
1236 if (
d == face_dimension)
continue;
1237 if (offset_dimension ==
NDIM || offset_sort_key(
d) < offset_sort_key(offset_dimension))
1238 offset_dimension =
d;
1242 const auto d = offset_dimension;
1247 probing_displacement_vec[
d] =
offset;
1252 const auto sign = right_distance >= left_distance ? +1 : -1;
1253 probing_displacement_vec[
d] = sign *
offset;
double w(double t, double eps)
Definition DKops.h:22
long ndim() const
Returns the number of dimensions in the tensor.
Definition basetensor.h:144
long size() const
Returns the number of elements in the tensor.
Definition basetensor.h:138
Iterator class for lazy generation of surface points.
Definition displacements.h:678
std::optional< Displacement > disp
Memoized displacement from parent->center_ to point, computed by displacement(), reset by advance()
Definition displacements.h:684
Iterator(const BoxSurfaceDisplacementRange *p, Type type)
Constructs an iterator.
Definition displacements.h:926
Type
Definition displacements.h:680
@ End
Definition displacements.h:680
@ Begin
Definition displacements.h:680
size_t fixed_dim
Current fixed dimension (i.e. faces perpendicular to this axis are being iterated over)
Definition displacements.h:685
const std::optional< Displacement > & displacement() const
Definition displacements.h:905
friend bool operator!=(const Iterator &a, const Iterator &b)
Inequality comparison operator.
Definition displacements.h:991
bool done
Flag indicating iteration completion.
Definition displacements.h:694
const Point * pointer
Definition displacements.h:917
pointer operator->() const
Arrow operator for member access.
Definition displacements.h:951
Box unprocessed_bounds
Definition displacements.h:686
Iterator operator++(int)
Post-increment operator.
Definition displacements.h:966
void next_face()
Definition displacements.h:790
std::ptrdiff_t difference_type
Definition displacements.h:916
bool positioned
whether the iterator is positioned on a point that has been (or is about to be) yielded; false until ...
Definition displacements.h:695
std::input_iterator_tag iterator_category
Definition displacements.h:914
const BoxSurfaceDisplacementRange * parent
Pointer to parent surface.
Definition displacements.h:682
bool next_surface_layer()
Definition displacements.h:699
reference operator*() const
Dereferences the iterator.
Definition displacements.h:945
Point value_type
Definition displacements.h:915
void advance_till_valid()
Leave the current point (if positioned on one) and advance to the next point that passes the filter.
Definition displacements.h:826
bool start_face()
Definition displacements.h:780
bool exclude_face(size_t dim)
Definition displacements.h:804
Point point
Current point / box. This is always free to leave the simulation cell.
Definition displacements.h:683
void select_face(size_t from)
Definition displacements.h:818
friend bool operator==(const Iterator &a, const Iterator &b)
Equality comparison operator.
Definition displacements.h:978
Iterator & operator++()
Pre-increment operator.
Definition displacements.h:957
const Point & reference
Definition displacements.h:918
bool reset_along_dim(size_t dim)
Definition displacements.h:845
void advance()
Advances the iterator to the next surface point.
Definition displacements.h:732
Definition displacements.h:646
Box initial_bounds_
bounds of the boxes to be iterated over, before any face is processed: the box plus its surface thick...
Definition displacements.h:665
const Displacement & probing_displacement(size_t face_dimension) const
Definition displacements.h:1112
Key< NDIM > Point
Definition displacements.h:648
const Key< NDIM > & center() const
Definition displacements.h:1091
std::array< std::optional< Translation >, NDIM > SurfaceThickness
Definition displacements.h:655
const std::array< std::optional< int64_t >, NDIM > & box_radius() const
Definition displacements.h:1096
const array_of_bools< NDIM > & is_lattice_summed() const
Definition displacements.h:1106
Periodicity is_lattice_summed_
which dimensions are lattice summed?
Definition displacements.h:667
std::array< bool, NDIM > skip_face_
faces excluded from iteration (see skip_face())
Definition displacements.h:670
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, std::optional< Validator > validator={})
Constructs a box with different radii and thicknesses for each dimension.
Definition displacements.h:1013
void skip_face(size_t face_dimension)
Definition displacements.h:1132
SurfaceThickness surface_thickness_
surface thickness in each dimension, measured in boxes. Real-space surface size is thus n-dependent.
Definition displacements.h:663
std::array< std::optional< Translation >, NDIM > BoxRadius
Definition displacements.h:654
Displacement compute_probing_displacement(const size_t face_dimension) const
Definition displacements.h:1145
const std::array< std::optional< int64_t >, NDIM > & surface_thickness() const
Definition displacements.h:1101
std::array< std::optional< Displacement >, NDIM > probing_displacements_
for each finite-radius dimension, a displacement to a nearby point on the faces normal to it (the pai...
Definition displacements.h:669
Hollowness hollowness_
does box contain non-surface points along each dimension?
Definition displacements.h:666
auto begin() const
Returns an iterator to the beginning of the surface points.
Definition displacements.h:1070
Box box_
box bounds in each dimension.
Definition displacements.h:664
Point center_
Center point of the box.
Definition displacements.h:660
std::optional< Validator > validator_
optional filter; also the source of the reach of the standard displacements, which the probing displa...
Definition displacements.h:668
Key< NDIM > Displacement
Definition displacements.h:650
std::array< bool, NDIM > Hollowness
Definition displacements.h:657
BoxSurfaceDisplacementValidator< NDIM > Validator
Definition displacements.h:651
bool face_skipped(size_t face_dimension) const
Definition displacements.h:1140
auto end() const
Returns an iterator to the end of the surface points.
Definition displacements.h:1076
const std::array< std::optional< Displacement >, NDIM > & probing_displacements() const
Definition displacements.h:1121
Vector< std::optional< Translation >, NDIM > PointPattern
Definition displacements.h:649
std::array< std::pair< Translation, Translation >, NDIM > Box
Definition displacements.h:656
BoxRadius box_radius_
halved size of the box in each dimension, in half-SimulationCells.
Definition displacements.h:661
Definition displacements.h:492
array_of_bools< NDIM > is_lattice_summed_
Definition displacements.h:639
std::optional< Reach > reach_
Definition displacements.h:640
Vector< std::optional< Translation >, NDIM > PointPattern
Definition displacements.h:495
Key< NDIM > Displacement
Definition displacements.h:496
std::array< ExtraDomainPolicy, NDIM > domain_policies_
Definition displacements.h:638
Key< NDIM > Point
Definition displacements.h:494
const std::optional< Reach > & reach() const
Definition displacements.h:531
Tensor< double > cell_width_
reach_->cell_width as a Tensor, for Key::real_distsq_bc
Definition displacements.h:641
BoxSurfaceDisplacementValidator(const array_of_bools< NDIM > &is_infinite_domain, const array_of_bools< NDIM > &is_lattice_summed, std::optional< Reach > reach={})
Definition displacements.h:504
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:547
StandardDisplacementsReach< NDIM > Reach
Definition displacements.h:498
const array_of_bools< NDIM > & is_lattice_summed() const
Definition displacements.h:528
Holds displacements for applying operators to avoid replicating for all operators.
Definition displacements.h:80
static PeriodicLists & periodic(const array_of_bools< NDIM > &axes)
the lists for kernels lattice-summed along axes, built on the first request
Definition displacements.h:294
static std::array< std::atomic< PeriodicLists * >,(std::size_t(1)<< NDIM)> periodic_lists
Definition displacements.h:102
const std::vector< Key< NDIM > > & get_disp()
return the standard displacements appropriate for operators w/o lattice summation
Definition displacements.h:391
const std::vector< Key< NDIM > > & get_disp(Level n, const array_of_bools< NDIM > &kernel_lattice_sum_axes)
Definition displacements.h:352
static std::vector< Key< NDIM > > disp
standard displacements to be used with standard kernels (range-unrestricted, no lattice sum)
Definition displacements.h:82
const std::vector< Key< NDIM > > & get_disp_images(Level n, const array_of_bools< NDIM > &kernel_lattice_sum_axes)
Definition displacements.h:371
static Tensor< double > widths
cell width, used to order displacements from least to most real space distance
Definition displacements.h:83
static std::array< int, NDIM > bmax_current()
the per-axis reach (in boxes) of the standard displacement lists, see bmax_axes()
Definition displacements.h:173
static void reset_periodic_axes(const array_of_bools< NDIM > &periodic_axes)
builds the displacements for kernels lattice-summed along periodic_axes if they do not exist yet
Definition displacements.h:405
static std::vector< std::unique_ptr< PeriodicLists > > periodic_lists_owner
owns what periodic_lists points to
Definition displacements.h:103
static constexpr Level nlevels
levels for which lists are built
Definition displacements.h:105
static void make_disp_periodic(const std::array< int, NDIM > &bmax_in, Level n, PeriodicLists &lists)
fills lists.by_distance[n] for lists.axes
Definition displacements.h:252
static std::array< int, NDIM > bmax_used
the per-axis reach the current lists were built with (see bmax_axes)
Definition displacements.h:84
static std::array< int, NDIM > bmax_axes()
The bound on |l_d| for the displacements l that do_apply visits at level n, per axis.
Definition displacements.h:150
static int bmax_default()
Definition displacements.h:114
static void sort_displacements_images(std::vector< Key< NDIM > > &d, const array_of_bools< NDIM > &paxes, const Tensor< double > &w)
Definition displacements.h:227
static void make_disp(const std::array< int, NDIM > &bmax)
Definition displacements.h:239
static Mutex periodic_lists_mutex
serializes building the lists and set_width()
Definition displacements.h:104
static void set_width(const Tensor< double > &width)
Definition displacements.h:415
static void sort_displacements(std::vector< Key< NDIM > > &d, const Tensor< double > &w)
Definition displacements.h:199
Displacements()
Definition displacements.h:330
static std::size_t axes_mask(const array_of_bools< NDIM > &axes)
Definition displacements.h:107
static void make_disp_images(PeriodicLists &lists)
fills lists.by_image_distance (requires the lock)
Definition displacements.h:317
static void sort_displacements_periodic(std::vector< Key< NDIM > > &d, const array_of_bools< NDIM > &paxes, const Tensor< double > &w)
Definition displacements.h:211
static const BoundaryConditions< NDIM > & get_bc()
Returns the default boundary conditions.
Definition funcdefaults.h:315
Key is the index for a node of the 2^NDIM-tree.
Definition key.h:71
Mutex using pthread mutex operations.
Definition worldmutex.h:150
Mutex that is applied/released at start/end of a scope.
Definition worldmutex.h:258
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_CHECK(condition)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:182
#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
#define MADNESS_CHECK_THROW(condition, msg)
Check a condition — even in a release build the condition is always evaluated so it can have side eff...
Definition madness_exception.h:207
Namespace for all elements and tools of MADNESS.
Definition DFConvergence.h:9
ExtraDomainPolicy
Definition displacements.h:67
int64_t Translation
Definition key.h:59
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:609
int Level
Definition key.h:60
static double pop(std::vector< double > &v)
Definition SCF.cc:118
constexpr std::array< std::size_t, N-M > iota_array(std::array< std::size_t, M > values_to_skip_sorted)
Definition displacements.h:450
std::string type(const PairType &n)
Definition PNOParameters.h:18
bool same_displacement_shell(double a, double b)
Definition displacements.h:62
Function< T, NDIM > copy(const Function< T, NDIM > &f, const std::shared_ptr< WorldDCPmapInterface< Key< NDIM > > > &pmap, bool fence=true)
Create a new copy of the function with different distribution and optional fence.
Definition mra.h:2229
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
static const long k
Definition rk.cc:44
Definition displacements.h:185
double real_distsq
Definition displacements.h:187
Key< NDIM > key
Definition displacements.h:186
bool operator<(const DispEntry &other) const
Definition displacements.h:191
uint64_t distsq
Definition displacements.h:188
double center_distsq
Definition displacements.h:189
the displacements for kernels lattice-summed along one set of axes, per level, in the two orders cons...
Definition displacements.h:87
std::array< std::vector< Key< NDIM > >, 64 > by_distance
ordered by Key::real_distsq_bc, for kernels that decay away from the source
Definition displacements.h:89
std::atomic< bool > images_built
by_image_distance is filled on first request (get_disp_images)
Definition displacements.h:91
std::array< std::vector< Key< NDIM > >, 64 > by_image_distance
ordered by Key::real_distsq_images, for rest-of-crystal kernels (OperatorInfo::images_only)
Definition displacements.h:90
array_of_bools< NDIM > axes
the lattice-summed axes
Definition displacements.h:88
PeriodicLists(const array_of_bools< NDIM > &a)
Definition displacements.h:92
Definition displacements.h:483
std::array< double, NDIM > cell_width
real-space width of the simulation cell along each axis, as used to compute max_distsq
Definition displacements.h:485
double max_distsq
max real distance squared reached by the standard displacements (see Key::real_distsq_bc)
Definition displacements.h:484
Defines and implements most of Tensor.
void e()
Definition test_sig.cc:75
#define N
Definition testconv.cc:37
const double offset
Definition testfuns.cc:143
constexpr std::size_t NDIM
Definition testgconv.cc:54