SPHinXsys  alpha version
mesh_with_data_packages.hpp
1 
7 #ifndef MESH_WITH_DATA_PACKAGES_2D_HPP
8 #define MESH_WITH_DATA_PACKAGES_2D_HPP
9 
11 
12 //=================================================================================================//
13 namespace SPH
14 {
15  //=================================================================================================//
16  template <int PKG_SIZE, int ADDRS_SIZE>
17  template <class DataType>
19  probeDataPackage(PackageDataAddress<DataType> &pkg_data_addrs, const Vecd &position)
20  {
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;
25 
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];
30 
31  return bilinear;
32  }
33  //=================================================================================================//
34  template <int PKG_SIZE, int ADDRS_SIZE>
35  template <typename InDataType, typename OutDataType>
37  computeGradient(PackageDataAddress<InDataType> &in_pkg_data_addrs,
38  PackageDataAddress<OutDataType> out_pkg_data_addrs, Real dt)
39  {
40  for (int i = 1; i != PKG_SIZE + 1; ++i)
41  for (int j = 1; j != PKG_SIZE + 1; ++j)
42  {
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_;
46  }
47  }
48  //=================================================================================================//
49  template <int PKG_SIZE, int ADDRS_SIZE>
50  template <typename InDataType, typename OutDataType>
52  computeNormalizedGradient(PackageDataAddress<InDataType> &in_pkg_data_addrs,
53  PackageDataAddress<OutDataType> out_pkg_data_addrs, Real dt)
54  {
55  for (int i = 1; i != PKG_SIZE + 1; ++i)
56  for (int j = 1; j != PKG_SIZE + 1; ++j)
57  {
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);
62  }
63  }
64  //=================================================================================================//
65  template <int PKG_SIZE, int ADDRS_SIZE>
66  template <typename DataType>
69  GeneralDataAssemble<PackageDataAddress> &all_pkg_data_addrs)
70  {
71  constexpr int type_index = DataTypeIndex<DataType>::value;
72  for (size_t l = 0; l != std::get<type_index>(all_pkg_data).size(); ++l)
73  {
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)
78  {
79  pkg_data_addrs[i][j] = &pkg_data[0][0];
80  }
81  }
82  }
83  //=================================================================================================//
84  template <int PKG_SIZE, int ADDRS_SIZE>
85  template <typename DataType>
87  CornerAverage(PackageDataAddress<DataType> &pkg_data_addrs, Veci addrs_index, Veci corner_direction)
88  {
89  DataType average(0);
90  for (int i = 0; i != 2; ++i)
91  for (int j = 0; j != 2; ++j)
92  {
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];
96  }
97  return average * 0.25;
98  }
99  //=================================================================================================//
100  template <int PKG_SIZE, int ADDRS_SIZE>
101  template <typename DataType>
104  const Vecu &addrs_index,
105  GeneralDataAssemble<PackageData> &all_pkg_data,
106  const Vecu &data_index)
107  {
108  constexpr int type_index = DataTypeIndex<DataType>::value;
109  for (size_t l = 0; l != std::get<type_index>(all_pkg_data).size(); ++l)
110  {
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]];
114  }
115  } //=================================================================================================//
116  template <class MeshFieldType, class GridDataPackageType>
117  template <typename DataType, typename PackageDataType, PackageDataType GridDataPackageType::*MemPtr>
119  DataValueFromGlobalIndex(const Vecu &global_grid_index)
120  {
121  Vecu pkg_index_(0);
122  Vecu local_data_index(0);
123  for (int n = 0; n != 2; n++)
124  {
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_;
128  }
129  PackageDataType &data = data_pkg_addrs_[pkg_index_[0]][pkg_index_[1]]->*MemPtr;
130  return data[local_data_index[0]][local_data_index[1]];
131  }
132  //=================================================================================================//
133  template <class MeshFieldType, class GridDataPackageType>
135  initializePackageAddressesInACell(const Vecu &cell_index)
136  {
137  int i = (int)cell_index[0];
138  int j = (int)cell_index[1];
139 
140  GridDataPackageType *data_pkg = data_pkg_addrs_[i][j];
141  if (data_pkg->is_inner_pkg_)
142  {
143  for (int l = 0; l != pkg_addrs_size_; ++l)
144  for (int m = 0; m != pkg_addrs_size_; ++m)
145  {
146  std::pair<int, int> x_pair = CellShiftAndDataIndex(l);
147  std::pair<int, int> y_pair = CellShiftAndDataIndex(m);
148  data_pkg->assignAllPackageDataAddress(
149  Vecu(l, m),
150  data_pkg_addrs_[i + x_pair.first][j + y_pair.first],
151  Vecu(x_pair.second, y_pair.second));
152  }
153  }
154  }
155  //=================================================================================================//
156  template <class MeshFieldType, class GridDataPackageType>
158  {
159  Allocate2dArray(data_pkg_addrs_, number_of_cells_);
160  }
161  //=================================================================================================//
162  template <class MeshFieldType, class GridDataPackageType>
164  {
165  Delete2dArray(data_pkg_addrs_, number_of_cells_);
166  }
167  //=================================================================================================//
168  template <class MeshFieldType, class GridDataPackageType>
170  assignDataPackageAddress(const Vecu &cell_index, GridDataPackageType *data_pkg)
171  {
172  data_pkg_addrs_[cell_index[0]][cell_index[1]] = data_pkg;
173  }
174  //=================================================================================================//
175  template <class MeshFieldType, class GridDataPackageType>
176  GridDataPackageType *MeshWithGridDataPackages<MeshFieldType, GridDataPackageType>::
177  DataPackageFromCellIndex(const Vecu &cell_index)
178  {
179  return data_pkg_addrs_[cell_index[0]][cell_index[1]];
180  }
181  //=================================================================================================//
182  template <class MeshFieldType, class GridDataPackageType>
183  template <class DataType, typename PackageDataAddressType, PackageDataAddressType GridDataPackageType::*MemPtr>
185  {
186  Vecu grid_index = CellIndexFromPosition(position);
187  size_t i = grid_index[0];
188  size_t j = grid_index[1];
189 
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];
194  }
195  //=================================================================================================//
196 }
197 //=================================================================================================//
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