29 #ifndef BASE_PARTICLES_HPP 30 #define BASE_PARTICLES_HPP 38 template <
typename VariableType>
41 const std::string &variable_name,
VariableType initial_value)
45 if (all_variable_maps_[type_index].find(variable_name) == all_variable_maps_[type_index].end())
48 std::get<type_index>(all_particle_data_).push_back(&variable_addrs);
49 all_variable_maps_[type_index].insert(make_pair(variable_name, std::get<type_index>(all_particle_data_).size() - 1));
53 std::cout <<
"\n Error: the variable '" << variable_name <<
"' has already been registered!" << std::endl;
54 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
59 template <
typename VariableType,
class InitializationFunction>
62 const std::string &variable_name,
const InitializationFunction &initialization)
69 variable_addrs[i] = initialization(i);
73 template <
typename VariableType>
78 if (all_variable_maps_[type_index].find(variable_name) != all_variable_maps_[type_index].end())
79 return std::get<type_index>(all_particle_data_)[all_variable_maps_[type_index][variable_name]];
81 std::cout <<
"\n Error: the variable '" << variable_name <<
"' is not registered!" << std::endl;
82 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
87 template <
typename VariableType>
93 if (all_variable_maps_[type_index].find(variable_name) != all_variable_maps_[type_index].end())
95 bool is_to_add =
true;
96 for (
size_t i = 0; i != variable_name_list[type_index].size(); ++i)
98 if (variable_name_list[type_index][i].first == variable_name)
103 size_t variable_index = all_variable_maps_[type_index][variable_name];
104 variable_name_list[type_index].push_back(make_pair(variable_name, variable_index));
109 std::cout <<
"\n Error: the variable '" << variable_name <<
"' to write is not particle data!" << std::endl;
110 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
115 template <
typename VariableType>
118 addVariableNameToList<VariableType>(variables_to_write_, variable_name);
121 template <
class DerivedVariableMethod>
125 derived_variables_.push_back(derived_data);
126 using DerivedVariableType =
typename DerivedVariableMethod::DerivedVariableType;
127 addVariableNameToList<DerivedVariableType>(variables_to_write_, derived_data->LocalDynamics().variable_name_);
130 template <
typename VariableType>
133 addVariableNameToList<VariableType>(variables_to_restart_, variable_name);
136 template <
typename VariableType>
139 addVariableNameToList<VariableType>(variables_to_reload_, variable_name);
142 template <
typename VariableType>
147 if (sortable_variable_maps_[type_index].find(variable_name) == sortable_variable_maps_[type_index].end())
149 if (all_variable_maps_[type_index].find(variable_name) != all_variable_maps_[type_index].end())
151 StdLargeVec<VariableType> *variable =
152 std::get<type_index>(all_particle_data_)[all_variable_maps_[type_index][variable_name]];
153 std::get<type_index>(sortable_data_).push_back(variable);
154 sortable_variable_maps_[type_index].insert(make_pair(variable_name, std::get<type_index>(sortable_data_).size() - 1));
158 std::cout <<
"\n Error: the variable '" << variable_name <<
"' for sorting is not registered!" << std::endl;
159 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
165 std::cout <<
"\n Warning: the variable '" << variable_name <<
"' is already a sortable variable!" << std::endl;
166 std::cout << __FILE__ <<
':' << __LINE__ << std::endl;
170 template <
typename VariableType>
176 for (
size_t i = 0; i != std::get<type_index>(particle_data).size(); ++i)
177 std::get<type_index>(particle_data)[i]->resize(new_size,
VariableType(0));
180 template <
typename VariableType>
181 void BaseParticles::addAParticleDataValue<VariableType>::
184 constexpr
int type_index = DataTypeIndex<VariableType>::value;
186 for (
size_t i = 0; i != std::get<type_index>(particle_data).size(); ++i)
187 std::get<type_index>(particle_data)[i]->push_back(
VariableType(0));
190 template <
typename VariableType>
191 void BaseParticles::copyAParticleDataValue<VariableType>::
192 operator()(
ParticleData &particle_data,
size_t this_index,
size_t another_index)
const 194 constexpr
int type_index = DataTypeIndex<VariableType>::value;
196 for (
size_t i = 0; i != std::get<type_index>(particle_data).size(); ++i)
197 (*std::get<type_index>(particle_data)[i])[this_index] =
198 (*std::get<type_index>(particle_data)[i])[another_index];
201 template <
typename StreamType>
204 size_t total_real_particles = total_real_particles_;
207 output_stream <<
" <Points>\n";
208 output_stream <<
" <DataArray Name=\"Position\" type=\"Float32\" NumberOfComponents=\"3\" Format=\"ascii\">\n";
209 output_stream <<
" ";
210 for (
size_t i = 0; i != total_real_particles; ++i)
212 Vec3d particle_position = upgradeToVector3D(
pos_[i]);
213 output_stream << particle_position[0] <<
" " << particle_position[1] <<
" " << particle_position[2] <<
" ";
215 output_stream << std::endl;
216 output_stream <<
" </DataArray>\n";
217 output_stream <<
" </Points>\n";
220 output_stream <<
" <PointData Vectors=\"vector\">\n";
223 output_stream <<
" <DataArray Name=\"SortedParticle_ID\" type=\"Int32\" Format=\"ascii\">\n";
224 output_stream <<
" ";
225 for (
size_t i = 0; i != total_real_particles; ++i)
227 output_stream << i <<
" ";
229 output_stream << std::endl;
230 output_stream <<
" </DataArray>\n";
233 output_stream <<
" <DataArray Name=\"UnsortedParticle_ID\" type=\"Int32\" Format=\"ascii\">\n";
234 output_stream <<
" ";
235 for (
size_t i = 0; i != total_real_particles; ++i)
239 output_stream << std::endl;
240 output_stream <<
" </DataArray>\n";
243 for (ParticleDynamics<void> *derived_variable : derived_variables_)
245 derived_variable->parallel_exec();
249 for (std::pair<std::string, size_t> &name_index : variables_to_write_[2])
251 std::string variable_name = name_index.first;
252 StdLargeVec<Matd> &variable = *(std::get<2>(all_particle_data_)[name_index.second]);
253 output_stream <<
" <DataArray Name=\"" << variable_name <<
"\" type=\"Float32\" NumberOfComponents=\"9\" Format=\"ascii\">\n";
254 output_stream <<
" ";
255 for (
size_t i = 0; i != total_real_particles; ++i)
257 Mat3d matrix_value = upgradeToMatrix3D(variable[i]);
258 for (
int k = 0; k != 3; ++k)
260 Vec3d col_vector = matrix_value.col(k);
261 output_stream << std::fixed << std::setprecision(9) << col_vector[0] <<
" " << col_vector[1] <<
" " << col_vector[2] <<
" ";
264 output_stream << std::endl;
265 output_stream <<
" </DataArray>\n";
269 for (std::pair<std::string, size_t> &name_index : variables_to_write_[1])
271 std::string variable_name = name_index.first;
272 StdLargeVec<Vecd> &variable = *(std::get<1>(all_particle_data_)[name_index.second]);
273 output_stream <<
" <DataArray Name=\"" << variable_name <<
"\" type=\"Float32\" NumberOfComponents=\"3\" Format=\"ascii\">\n";
274 output_stream <<
" ";
275 for (
size_t i = 0; i != total_real_particles; ++i)
277 Vec3d vector_value = upgradeToVector3D(variable[i]);
278 output_stream << std::fixed << std::setprecision(9) << vector_value[0] <<
" " << vector_value[1] <<
" " << vector_value[2] <<
" ";
280 output_stream << std::endl;
281 output_stream <<
" </DataArray>\n";
285 for (std::pair<std::string, size_t> &name_index : variables_to_write_[0])
287 std::string variable_name = name_index.first;
288 StdLargeVec<Real> &variable = *(std::get<0>(all_particle_data_)[name_index.second]);
289 output_stream <<
" <DataArray Name=\"" << variable_name <<
"\" type=\"Float32\" Format=\"ascii\">\n";
290 output_stream <<
" ";
291 for (
size_t i = 0; i != total_real_particles; ++i)
293 output_stream << std::fixed << std::setprecision(9) << variable[i] <<
" ";
295 output_stream << std::endl;
296 output_stream <<
" </DataArray>\n";
300 for (std::pair<std::string, size_t> &name_index : variables_to_write_[3])
302 std::string variable_name = name_index.first;
303 StdLargeVec<int> &variable = *(std::get<3>(all_particle_data_)[name_index.second]);
304 output_stream <<
" <DataArray Name=\"" << variable_name <<
"\" type=\"Int32\" Format=\"ascii\">\n";
305 output_stream <<
" ";
306 for (
size_t i = 0; i != total_real_particles; ++i)
308 output_stream << std::fixed << std::setprecision(9) << variable[i] <<
" ";
310 output_stream << std::endl;
311 output_stream <<
" </DataArray>\n";
315 template <
typename VariableType>
316 void WriteAParticleVariableToXml::
317 operator()(std::string &variable_name, StdLargeVec<VariableType> &variable)
const 319 SimTK::Xml::element_iterator ele_ite = xml_engine_.
root_element_.element_begin();
320 for (
size_t i = 0; i != total_real_particles_; ++i)
327 template <
typename VariableType>
328 void ReadAParticleVariableFromXml::
329 operator()(std::string &variable_name, StdLargeVec<VariableType> &variable)
const 331 SimTK::Xml::element_iterator ele_ite = xml_engine_.
root_element_.element_begin();
332 for (
size_t i = 0; i != total_real_particles_; ++i)
339 template <
typename VariableType>
340 BaseDerivedVariable<VariableType>::
341 BaseDerivedVariable(
const SPHBody &sph_body,
const std::string &variable_name)
342 : variable_name_(variable_name)
344 sph_body.base_particles_->registerVariable(derived_variable_, variable_name_);
348 #endif // BASE_PARTICLES_HPP
Definition: base_particles.h:216
void getRequiredAttributeValue(SimTK::Xml::element_iterator &ele_ite_, const std::string &attrib_name, T &value)
Definition: xml_engine.h:88
std::array< StdVec< std::pair< std::string, size_t > >, 4 > ParticleVariableList
Definition: sph_data_containers.h:63
GeneralDataAssemble< StdLargeVec > ParticleData
Definition: sph_data_containers.h:59
void registerSortableVariable(const std::string &variable_name)
Definition: base_particles.hpp:143
SimTK::Xml::Element root_element_
Definition: xml_engine.h:66
void addVariableToRestart(const std::string &variable_name)
Definition: base_particles.hpp:131
Definition: particle_dynamics_algorithms.h:247
void addVariableToReload(const std::string &variable_name)
Definition: base_particles.hpp:137
StdLargeVec< VariableType > * getVariableByName(const std::string &variable_name)
Definition: base_particles.hpp:74
void addVariableToWrite(const std::string &variable_name)
Definition: base_particles.hpp:116
void registerVariable(StdLargeVec< VariableType > &variable_addrs, const std::string &variable_name, VariableType initial_value=VariableType(0))
Definition: base_particles.hpp:40
void addDerivedVariableToWrite()
Definition: base_particles.hpp:122
void setAttributeToElement(const SimTK::Xml::element_iterator &ele_ite, const std::string &attrib_name, const T &value)
Definition: xml_engine.h:78
void addVariableNameToList(ParticleVariableList &variable_name_list, const std::string &variable_name)
Definition: base_particles.hpp:89
This is the base class of SPH particles. The basic data of the particles is saved in separated large ...
void writeParticlesToVtk(OutStreamType &output_stream)
This is the classes for algorithms particle dynamics. Generally, there are four types dynamics...
size_t real_particles_bound_
Definition: base_particles.h:109
Definition: base_data_type.h:320
StdLargeVec< size_t > unsorted_id_
Definition: base_particles.h:156
StdLargeVec< Vecd > pos_
Definition: base_particles.h:88
Definition: solid_body_supplementary.cpp:9