27 #ifndef CDPL_MATH_REGULARSPATIALGRID_HPP
28 #define CDPL_MATH_REGULARSPATIALGRID_HPP
30 #include <type_traits>
47 template <
typename MatrixType>
51 static void init(MatrixType& mtx)
57 static bool invert(
const MatrixType& mtx,
M& inv_mtx)
62 template <
typename V,
typename R>
81 template <typename T, typename C = typename TypeTraits<T>::RealType,
typename GD =
Grid<T>,
typename XF =
CMatrix<C, 4, 4> >
93 typedef typename std::conditional<std::is_const<GD>::value,
94 typename GD::ConstReference,
105 xStep(xs), yStep(ys), zStep(zs)
113 data(data), xStep(xs), yStep(ys), zStep(zs)
121 xStep(
s), yStep(
s), zStep(
s)
129 data(data), xStep(
s), yStep(
s), zStep(
s)
137 data(usg.data), xStep(usg.xStep), yStep(usg.yStep), zStep(usg.zStep),
138 xform(usg.xform), invXform(usg.invXform) {}
141 data(std::move(usg.data)), xStep(usg.xStep), yStep(usg.yStep), zStep(usg.zStep),
142 xform(usg.xform), invXform(usg.invXform) {}
158 return data(i, j, k);
163 return data(i, j, k);
168 return data.getSize();
173 return data.getSize1();
178 return data.getSize2();
183 return data.getSize3();
188 return data.getMaxSize();
193 return data.getMaxSize1();
198 return data.getMaxSize2();
203 return data.getMaxSize3();
238 return ((data.getSize1() <= 1 ?
SizeType(0) : (data.getSize1() - 1)) * xStep);
243 return ((data.getSize2() <= 1 ?
SizeType(0) : (data.getSize2() - 1)) * yStep);
248 return ((data.getSize3() <= 1 ?
SizeType(0) : (data.getSize3() - 1)) * zStep);
251 template <
typename V>
262 template <
typename V>
273 coords[0] = world_coords(0);
274 coords[1] = world_coords(1);
275 coords[2] = world_coords(2);
278 template <
typename V>
286 template <
typename V1,
typename V2>
291 transformToLocalCoordinates(world_coords, tmp_local_coords);
293 local_coords[0] = tmp_local_coords[0];
294 local_coords[1] = tmp_local_coords[1];
295 local_coords[2] = tmp_local_coords[2];
298 template <
typename V>
303 transformToLocalCoordinates(pos, local_coords);
308 template <
typename V>
332 template <
typename V1,
typename V2>
337 transformToLocalCoordinates(pos, local_coords);
342 template <
typename V1,
typename V2>
349 indices[0] =
SSizeType(std::floor(x / xStep));
350 indices[1] =
SSizeType(std::floor(y / yStep));
351 indices[2] =
SSizeType(std::floor(z / zStep));
356 return data.isEmpty();
374 template <
typename T1>
378 #ifdef CDPL_MATH_CHECKS_DISABLE
389 invXform = usg.invXform;
398 data = std::move(usg.data);
400 invXform = usg.invXform;
407 template <
typename E>
414 template <
typename E>
421 template <
typename E>
428 template <
typename T1>
435 template <
typename T1>
442 template <
typename E>
449 template <
typename E>
456 template <
typename E>
466 xform.swap(usg.xform);
467 invXform.swap(usg.invXform);
468 std::swap(xStep, usg.xStep);
469 std::swap(yStep, usg.yStep);
470 std::swap(zStep, usg.zStep);
485 data.resize(
m, n, o, preserve, v);
489 template <
typename V1,
typename V2>
490 void transformToLocalCoordinates(
const V1& coords,
V2& local_coords)
const
494 world_coords(0) = coords[0];
495 world_coords(1) = coords[1];
496 world_coords(2) = coords[2];
510 template <
typename T,
typename C,
typename GD,
typename XF,
typename V>
515 typedef typename GridType::CoordinatesValueType CoordinatesValueType;
516 typedef typename GridType::SSizeType SSizeType;
517 typedef typename GridType::ValueType ValueType;
520 return CoordinatesValueType();
522 CoordinatesValueType loc_pos[3];
536 CoordinatesValueType xyz0[3];
540 SSizeType inds_p1[3];
542 inds_p1[0] = inds[0] + 1;
543 inds_p1[1] = inds[1] + 1;
544 inds_p1[2] = inds[2] + 1;
546 inds[0] = std::max(SSizeType(0), inds[0]);
547 inds[1] = std::max(SSizeType(0), inds[1]);
548 inds[2] = std::max(SSizeType(0), inds[2]);
550 inds[0] = std::min(SSizeType(grid.
getSize1() - 1), inds[0]);
551 inds[1] = std::min(SSizeType(grid.
getSize2() - 1), inds[1]);
552 inds[2] = std::min(SSizeType(grid.
getSize3() - 1), inds[2]);
554 inds_p1[0] = std::max(SSizeType(0), inds_p1[0]);
555 inds_p1[1] = std::max(SSizeType(0), inds_p1[1]);
556 inds_p1[2] = std::max(SSizeType(0), inds_p1[2]);
558 inds_p1[0] = std::min(SSizeType(grid.
getSize1() - 1), inds_p1[0]);
559 inds_p1[1] = std::min(SSizeType(grid.
getSize2() - 1), inds_p1[1]);
560 inds_p1[2] = std::min(SSizeType(grid.
getSize3() - 1), inds_p1[2]);
562 CoordinatesValueType xd = (loc_pos[0] - xyz0[0]) / grid.
getXStepSize();
563 CoordinatesValueType yd = (loc_pos[1] - xyz0[1]) / grid.
getYStepSize();
564 CoordinatesValueType zd = (loc_pos[2] - xyz0[2]) / grid.
getZStepSize();
566 ValueType c00 = grid(inds[0], inds[1], inds[2]) * (1 - xd) + grid(inds_p1[0], inds[1], inds[2]) * xd;
567 ValueType c01 = grid(inds[0], inds[1], inds_p1[2]) * (1 - xd) + grid(inds_p1[0], inds[1], inds_p1[2]) * xd;
568 ValueType c10 = grid(inds[0], inds_p1[1], inds[2]) * (1 - xd) + grid(inds_p1[0], inds_p1[1], inds[2]) * xd;
569 ValueType c11 = grid(inds[0], inds_p1[1], inds_p1[2]) * (1 - xd) + grid(inds_p1[0], inds_p1[1], inds_p1[2]) * xd;
571 ValueType c0 = c00 * (1 - yd) + c10 * yd;
572 ValueType c1 = c01 * (1 - yd) + c11 * yd;
574 ValueType c = c0 * (1 - zd) + c1 * zd;
Definition of exception classes.
#define CDPL_MATH_CHECK(expr, msg, e)
Definition: Check.hpp:36
Definition of various grid expression types and operations.
Definition of grid data types.
Definition of matrix data types.
Definition of type traits.
Definition of vector data types.
Thrown to indicate that some requested calculation has failed.
Definition: Base/Exceptions.hpp:230
Definition: Matrix.hpp:854
Definition: Matrix.hpp:1152
Definition: Vector.hpp:1053
Definition: Expression.hpp:120
Definition: Math/Grid.hpp:226
Definition: Matrix.hpp:1607
Definition: RegularSpatialGrid.hpp:83
GD::ConstReference ConstReference
Definition: RegularSpatialGrid.hpp:96
SizeType getMaxSize3() const
Definition: RegularSpatialGrid.hpp:201
bool containsPoint(const V &pos) const
Definition: RegularSpatialGrid.hpp:299
CoordinatesValueType getZStepSize() const
Definition: RegularSpatialGrid.hpp:216
XF CoordinatesTransformType
Definition: RegularSpatialGrid.hpp:91
RegularSpatialGrid & operator=(const RegularSpatialGrid &usg)
Definition: RegularSpatialGrid.hpp:385
SizeType getMaxSize2() const
Definition: RegularSpatialGrid.hpp:196
void setCoordinatesTransform(const T1 &xform)
Definition: RegularSpatialGrid.hpp:375
void setYStepSize(const CoordinatesValueType &ys)
Definition: RegularSpatialGrid.hpp:226
bool isEmpty() const
Definition: RegularSpatialGrid.hpp:354
RegularSpatialGrid(const RegularSpatialGrid &usg)
Definition: RegularSpatialGrid.hpp:136
void setZStepSize(const CoordinatesValueType &zs)
Definition: RegularSpatialGrid.hpp:231
RegularSpatialGrid & operator=(RegularSpatialGrid &&usg)
Definition: RegularSpatialGrid.hpp:396
std::enable_if< IsScalar< T >::value, RegularSpatialGrid >::type & operator*=(const T1 &t)
Definition: RegularSpatialGrid.hpp:429
RegularSpatialGrid(const GridDataType &data, const CoordinatesValueType &xs, const CoordinatesValueType &ys, const CoordinatesValueType &zs)
Definition: RegularSpatialGrid.hpp:112
T ValueType
Definition: RegularSpatialGrid.hpp:88
std::conditional< std::is_const< GD >::value, typename GD::ConstReference, typename GD::Reference >::type Reference
Definition: RegularSpatialGrid.hpp:95
RegularSpatialGrid(const CoordinatesValueType &xs, const CoordinatesValueType &ys, const CoordinatesValueType &zs)
Definition: RegularSpatialGrid.hpp:104
const SelfType ConstClosureType
Definition: RegularSpatialGrid.hpp:101
CoordinatesTransformType::MatrixTemporaryType InvCoordinatesTransformType
Definition: RegularSpatialGrid.hpp:92
ConstReference operator()(SizeType i, SizeType j, SizeType k) const
Definition: RegularSpatialGrid.hpp:161
RegularSpatialGrid & minusAssign(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:457
std::shared_ptr< SelfType > SharedPointer
Definition: RegularSpatialGrid.hpp:102
std::enable_if< IsScalar< T >::value, RegularSpatialGrid >::type & operator/=(const T1 &t)
Definition: RegularSpatialGrid.hpp:436
CoordinatesValueType getYExtent() const
Definition: RegularSpatialGrid.hpp:241
GD::DifferenceType DifferenceType
Definition: RegularSpatialGrid.hpp:99
void clear(const ValueType &v=ValueType())
Definition: RegularSpatialGrid.hpp:478
SizeType getSize() const
Definition: RegularSpatialGrid.hpp:166
std::ptrdiff_t SSizeType
Definition: RegularSpatialGrid.hpp:98
SizeType getMaxSize1() const
Definition: RegularSpatialGrid.hpp:191
void setXStepSize(const CoordinatesValueType &xs)
Definition: RegularSpatialGrid.hpp:221
RegularSpatialGrid(const CoordinatesValueType &s)
Definition: RegularSpatialGrid.hpp:120
RegularSpatialGrid & operator+=(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:415
friend void swap(RegularSpatialGrid &usg1, RegularSpatialGrid &usg2)
Definition: RegularSpatialGrid.hpp:473
GD::SizeType SizeType
Definition: RegularSpatialGrid.hpp:97
SizeType getSize3() const
Definition: RegularSpatialGrid.hpp:181
SizeType getSize1() const
Definition: RegularSpatialGrid.hpp:171
Reference operator()(SizeType i, SizeType j, SizeType k)
Definition: RegularSpatialGrid.hpp:156
CoordinatesValueType getXStepSize() const
Definition: RegularSpatialGrid.hpp:206
RegularSpatialGrid & operator-=(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:422
RegularSpatialGrid(RegularSpatialGrid &&usg)
Definition: RegularSpatialGrid.hpp:140
const CoordinatesTransformType & getCoordinatesTransform() const
Definition: RegularSpatialGrid.hpp:369
SizeType getSize2() const
Definition: RegularSpatialGrid.hpp:176
CoordinatesValueType getYStepSize() const
Definition: RegularSpatialGrid.hpp:211
CoordinatesValueType getXExtent() const
Definition: RegularSpatialGrid.hpp:236
void getLocalCoordinates(SSizeType i, SSizeType j, SSizeType k, V &coords) const
Definition: RegularSpatialGrid.hpp:279
void getContainingCell(const V1 &pos, V2 &indices) const
Definition: RegularSpatialGrid.hpp:333
SelfType ClosureType
Definition: RegularSpatialGrid.hpp:100
RegularSpatialGrid & assign(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:443
GD GridDataType
Definition: RegularSpatialGrid.hpp:90
ConstReference operator()(SizeType i) const
Definition: RegularSpatialGrid.hpp:151
RegularSpatialGrid & operator=(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:408
RegularSpatialGrid & plusAssign(const GridExpression< E > &e)
Definition: RegularSpatialGrid.hpp:450
const GridDataType & getData() const
Definition: RegularSpatialGrid.hpp:359
RegularSpatialGrid(const GridDataType &data, const CoordinatesValueType &s)
Definition: RegularSpatialGrid.hpp:128
void resize(SizeType m, SizeType n, SizeType o, bool preserve=true, const ValueType &v=ValueType())
Definition: RegularSpatialGrid.hpp:483
bool containsLocalPoint(const V &pos) const
Definition: RegularSpatialGrid.hpp:309
C CoordinatesValueType
Definition: RegularSpatialGrid.hpp:89
CoordinatesValueType getZExtent() const
Definition: RegularSpatialGrid.hpp:246
void getCoordinates(SizeType i, V &coords) const
Definition: RegularSpatialGrid.hpp:252
GridDataType & getData()
Definition: RegularSpatialGrid.hpp:364
void getLocalContainingCell(const V1 &pos, V2 &indices) const
Definition: RegularSpatialGrid.hpp:343
void getCoordinates(SSizeType i, SSizeType j, SSizeType k, V &coords) const
Definition: RegularSpatialGrid.hpp:263
Reference operator()(SizeType i)
Definition: RegularSpatialGrid.hpp:146
SizeType getMaxSize() const
Definition: RegularSpatialGrid.hpp:186
virtual ~RegularSpatialGrid()
Definition: RegularSpatialGrid.hpp:144
void getLocalCoordinates(const V1 &world_coords, V2 &local_coords) const
Definition: RegularSpatialGrid.hpp:287
void swap(RegularSpatialGrid &usg)
Definition: RegularSpatialGrid.hpp:463
constexpr unsigned int R
Specifies that the atom has R configuration.
Definition: AtomConfiguration.hpp:58
constexpr unsigned int M
A generic type that covers any element that is a metal.
Definition: AtomType.hpp:657
constexpr unsigned int V
Specifies Vanadium.
Definition: AtomType.hpp:177
constexpr unsigned int T
Specifies Hydrogen (Tritium).
Definition: AtomType.hpp:67
constexpr unsigned int C
Specifies Carbon.
Definition: AtomType.hpp:92
constexpr unsigned int r
Specifies that the stereocenter has r configuration.
Definition: CIPDescriptor.hpp:76
constexpr unsigned int s
Specifies that the stereocenter has s configuration.
Definition: CIPDescriptor.hpp:81
constexpr unsigned int m
Specifies that the stereocenter has m configuration.
Definition: CIPDescriptor.hpp:116
RegularSpatialGrid< double > DRegularSpatialGrid
An unbounded dense regular grid in 3D space holding floating point values of type double.
Definition: RegularSpatialGrid.hpp:587
Matrix1VectorBinaryTraits< E1, E2, MatrixVectorProduct< E1, E2 > >::ResultType prod(const MatrixExpression< E1 > &e1, const VectorExpression< E2 > &e2)
Definition: MatrixExpression.hpp:831
RegularSpatialGrid< float > FRegularSpatialGrid
An unbounded dense regular grid in 3D space holding floating point values of type float.
Definition: RegularSpatialGrid.hpp:582
bool invert(const MatrixExpression< E > &e, MatrixContainer< C > &c)
Definition: Matrix.hpp:1766
T interpolateTrilinear(const RegularSpatialGrid< T, C, GD, XF > &grid, const V &pos, bool local_pos)
Definition: RegularSpatialGrid.hpp:511
void transform(VectorArray< CVector< T, Dim > > &va, const CMatrix< T1, Dim, Dim > &xform)
Transforms each -dimensional vector in the array with the -dimensional square matrix xform.
Definition: VectorArrayFunctions.hpp:51
The namespace of the Chemical Data Processing Library.