7 #ifndef MESH_WITH_DATA_PACKAGES_2D_HPP 8 #define MESH_WITH_DATA_PACKAGES_2D_HPP 16 template <
int PKG_SIZE,
int ADDRS_SIZE>
17 template <
class DataType>
21 Vecu grid_idx = CellIndexFromPosition(position);
22 Vecd grid_pos = GridPositionFromIndex(grid_idx);
23 Vecd alpha = (position - grid_pos) / grid_spacing_;
24 Vecd beta = Vec2d(1.0) - alpha;
26 DataType bilinear = *pkg_data_addrs[grid_idx[0]][grid_idx[1]] * beta[0] * beta[1] +
27 *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1]] * alpha[0] * beta[1] +
28 *pkg_data_addrs[grid_idx[0]][grid_idx[1] + 1] * beta[0] * alpha[1] +
29 *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1] + 1] * alpha[0] * alpha[1];
34 template <
int PKG_SIZE,
int ADDRS_SIZE>
35 template <
typename InDataType,
typename OutDataType>
38 PackageDataAddress<OutDataType> out_pkg_data_addrs, Real dt)
40 for (
int i = 1; i != PKG_SIZE + 1; ++i)
41 for (
int j = 1; j != PKG_SIZE + 1; ++j)
43 Real dphidx = (*in_pkg_data_addrs[i + 1][j] - *in_pkg_data_addrs[i - 1][j]);
44 Real dphidy = (*in_pkg_data_addrs[i][j + 1] - *in_pkg_data_addrs[i][j - 1]);
45 *out_pkg_data_addrs[i][j] = 0.5 * Vecd(dphidx, dphidy) / grid_spacing_;
49 template <
int PKG_SIZE,
int ADDRS_SIZE>
50 template <
typename InDataType,
typename OutDataType>
53 PackageDataAddress<OutDataType> out_pkg_data_addrs, Real dt)
55 for (
int i = 1; i != PKG_SIZE + 1; ++i)
56 for (
int j = 1; j != PKG_SIZE + 1; ++j)
58 Real dphidx = (*in_pkg_data_addrs[i + 1][j] - *in_pkg_data_addrs[i - 1][j]);
59 Real dphidy = (*in_pkg_data_addrs[i][j + 1] - *in_pkg_data_addrs[i][j - 1]);
60 Vecd normal = Vecd(dphidx, dphidy);
61 *out_pkg_data_addrs[i][j] = normal / (normal.norm() + TinyReal);
65 template <
int PKG_SIZE,
int ADDRS_SIZE>
66 template <
typename DataType>
72 for (
size_t l = 0; l != std::get<type_index>(all_pkg_data).size(); ++l)
74 PackageData<DataType> &pkg_data = *std::get<type_index>(all_pkg_data)[l];
75 PackageDataAddress<DataType> &pkg_data_addrs = *std::get<type_index>(all_pkg_data_addrs)[l];
76 for (
int i = 0; i != ADDRS_SIZE; ++i)
77 for (
int j = 0; j != ADDRS_SIZE; ++j)
79 pkg_data_addrs[i][j] = &pkg_data[0][0];
84 template <
int PKG_SIZE,
int ADDRS_SIZE>
85 template <
typename DataType>
90 for (
int i = 0; i != 2; ++i)
91 for (
int j = 0; j != 2; ++j)
93 int x_index = addrs_index[0] + i * corner_direction[0];
94 int y_index = addrs_index[1] + j * corner_direction[1];
95 average += *pkg_data_addrs[x_index][y_index];
97 return average * 0.25;
100 template <
int PKG_SIZE,
int ADDRS_SIZE>
101 template <
typename DataType>
104 const Vecu &addrs_index,
106 const Vecu &data_index)
109 for (
size_t l = 0; l != std::get<type_index>(all_pkg_data).size(); ++l)
111 PackageData<DataType> &pkg_data = *std::get<type_index>(all_pkg_data)[l];
112 PackageDataAddress<DataType> &pkg_data_addrs = *std::get<type_index>(all_pkg_data_addrs)[l];
113 pkg_data_addrs[addrs_index[0]][addrs_index[1]] = &pkg_data[data_index[0]][data_index[1]];
116 template <
class MeshFieldType,
class Gr
idDataPackageType>
117 template <
typename DataType,
typename PackageDataType, PackageDataType Gr
idDataPackageType::*MemPtr>
122 Vecu local_data_index(0);
123 for (
int n = 0; n != 2; n++)
125 size_t cell_index_in_this_direction = global_grid_index[n] / pkg_size_;
126 pkg_index_[n] = cell_index_in_this_direction;
127 local_data_index[n] = global_grid_index[n] - cell_index_in_this_direction * pkg_size_;
129 PackageDataType &data = data_pkg_addrs_[pkg_index_[0]][pkg_index_[1]]->*MemPtr;
130 return data[local_data_index[0]][local_data_index[1]];
133 template <
class MeshFieldType,
class Gr
idDataPackageType>
137 int i = (int)cell_index[0];
138 int j = (int)cell_index[1];
140 GridDataPackageType *data_pkg = data_pkg_addrs_[i][j];
141 if (data_pkg->is_inner_pkg_)
143 for (
int l = 0; l != pkg_addrs_size_; ++l)
144 for (
int m = 0; m != pkg_addrs_size_; ++m)
146 std::pair<int, int> x_pair = CellShiftAndDataIndex(l);
147 std::pair<int, int> y_pair = CellShiftAndDataIndex(m);
148 data_pkg->assignAllPackageDataAddress(
150 data_pkg_addrs_[i + x_pair.first][j + y_pair.first],
151 Vecu(x_pair.second, y_pair.second));
156 template <
class MeshFieldType,
class Gr
idDataPackageType>
159 Allocate2dArray(data_pkg_addrs_, number_of_cells_);
162 template <
class MeshFieldType,
class Gr
idDataPackageType>
165 Delete2dArray(data_pkg_addrs_, number_of_cells_);
168 template <
class MeshFieldType,
class Gr
idDataPackageType>
172 data_pkg_addrs_[cell_index[0]][cell_index[1]] = data_pkg;
175 template <
class MeshFieldType,
class Gr
idDataPackageType>
176 GridDataPackageType *MeshWithGridDataPackages<MeshFieldType, GridDataPackageType>::
177 DataPackageFromCellIndex(
const Vecu &cell_index)
179 return data_pkg_addrs_[cell_index[0]][cell_index[1]];
182 template <
class MeshFieldType,
class Gr
idDataPackageType>
183 template <
class DataType,
typename PackageDataAddressType, PackageDataAddressType Gr
idDataPackageType::*MemPtr>
186 Vecu grid_index = CellIndexFromPosition(position);
187 size_t i = grid_index[0];
188 size_t j = grid_index[1];
190 GridDataPackageType *data_pkg = data_pkg_addrs_[i][j];
191 PackageDataAddressType &pkg_data_addrs = data_pkg->*MemPtr;
192 return data_pkg->is_inner_pkg_ ? data_pkg->GridDataPackageType::template probeDataPackage<DataType>(pkg_data_addrs, position)
193 : *pkg_data_addrs[0][0];
198 #endif // MESH_WITH_DATA_PACKAGES_2D_HPP void allocateMeshDataMatrix()
Definition: mesh_with_data_packages.hpp:157
void computeNormalizedGradient(PackageDataAddress< InDataType > &in_pkg_data_addrs, PackageDataAddress< OutDataType > out_pkg_data_addrs, Real dt=0.0)
Definition: mesh_with_data_packages.hpp:52
Definition: base_data_type.h:43
DataType probeMesh(const Vecd &position)
Definition: mesh_with_data_packages.hpp:184
This class is designed to save memory and increase computational efficiency on mesh. //TODO: the connection between successive meshes in refined mesh should enhanced.
DataType CornerAverage(PackageDataAddress< DataType > &pkg_data_addrs, Veci addrs_index, Veci corner_direction)
Definition: mesh_with_data_packages.hpp:87
DataType DataValueFromGlobalIndex(const Vecu &global_grid_index)
Definition: mesh_with_data_packages.hpp:119
DataType probeDataPackage(PackageDataAddress< DataType > &pkg_data_addrs, const Vecd &position)
Definition: mesh_with_data_packages.hpp:19
void computeGradient(PackageDataAddress< InDataType > &in_pkg_data_addrs, PackageDataAddress< OutDataType > out_pkg_data_addrs, Real dt=0.0)
Definition: mesh_with_data_packages.hpp:37
Abstract class for mesh with data packages.
Definition: mesh_with_data_packages.h:236
Definition: base_data_type.h:320
Abstract base class for a data package whose data are defined on the grids of a small mesh patch...
Definition: mesh_with_data_packages.h:133
void deleteMeshDataMatrix()
Definition: mesh_with_data_packages.hpp:163
Definition: solid_body_supplementary.cpp:9