3 #include <deal.II/numerics/data_out.h> 4 #include <deal.II/grid/tria.h> 10 namespace GridRefinement {
30 template <
int dim,
typename real>
35 out <<
"$MeshFormat" <<
'\n';
38 out <<
"4.1 0 8" <<
'\n';
41 out <<
"$EndMeshFormat" <<
'\n';
48 out <<
"$Nodes" <<
'\n';
50 const dealii::Triangulation<dim,dim> &tria = dof_handler.get_triangulation();
52 const std::vector<dealii::Point<dim>> &vertices = tria.get_vertices();
54 const std::vector<bool> &vertex_used = tria.get_used_vertices();
55 const unsigned int n_vertices = tria.n_used_vertices();
58 out << 1 <<
" " << n_vertices <<
" " << 1 <<
" " << vertices.size() <<
'\n';
61 out << dim <<
" " << 1 <<
" " << 0 <<
" " << n_vertices <<
'\n';
65 for(
unsigned int i = 0; i < vertices.size(); ++i){
66 if(!vertex_used[i])
continue;
68 unsigned int node_tag = i + 1;
69 out << node_tag <<
'\n';
73 for(
unsigned int i = 0; i < vertices.size(); ++i){
74 if(!vertex_used[i])
continue;
77 for(
unsigned int d = dim; d < 3; ++d)
84 out <<
"$EndNodes" <<
'\n';
88 out <<
"$Elements" <<
'\n';
94 unsigned int element_type;
111 out << 1 <<
" " << tria.n_active_cells() <<
" " << 1 <<
" " << tria.n_cells() <<
'\n';
114 out << dim <<
" " << 1 <<
" " << element_type <<
" " << tria.n_active_cells() <<
'\n';
117 for(
auto cell = tria.begin_active(); cell != dof_handler.end(); ++cell){
118 if(!cell->is_locally_owned())
continue;
120 unsigned int element_tag = cell->active_cell_index() + 1;
124 for(
unsigned int vertex = 0; vertex < dealii::GeometryInfo<dim>::vertices_per_cell; ++vertex){
125 unsigned int node_tag = cell->vertex_index(dealii::GeometryInfo<dim>::ucd_to_deal[vertex]) + 1;
126 out <<
" " << node_tag;
133 out <<
"$EndElements" <<
'\n';
136 for(
auto gmsh_data: data_vector)
137 gmsh_data->write_msh_data(dof_handler, out);
145 const dealii::DoFHandler<dim> &dof_handler,
149 switch(storage_type){
150 case StorageType::node:
151 out <<
"$NodeData" <<
'\n';
154 case StorageType::element:
155 out <<
"$ElementData" <<
'\n';
158 case StorageType::elementNode:
159 out <<
"$ElementNodeData" <<
'\n';
164 int num_string_tags = string_tags.size();
165 int num_real_tags = real_tags.size();
166 int num_integer_tags = integer_tags.size();
170 out << num_string_tags <<
'\n';
171 for(
auto string_tag: string_tags)
172 out <<
'"' << string_tag <<
'"' <<
'\n';
176 out << num_real_tags <<
'\n';
177 for(
auto real_tag: real_tags)
178 out << real_tag <<
'\n';
182 out << num_integer_tags <<
'\n';
183 for(
auto integer_tag: integer_tags)
184 out << integer_tag <<
'\n';
187 write_msh_data_internal(dof_handler, out);
190 switch(storage_type){
191 case StorageType::node:
192 out <<
"$EndNodeData" <<
'\n';
195 case StorageType::element:
196 out <<
"$EndElementData" <<
'\n';
199 case StorageType::elementNode:
200 out <<
"$EndElementNodeData" <<
'\n';
208 const dealii::DoFHandler<dim> &dof_handler)
210 switch(storage_type){
211 case StorageType::node:
212 return dof_handler.get_triangulation().n_used_vertices();
214 case StorageType::element:
215 case StorageType::elementNode:
216 return dof_handler.get_triangulation().n_active_cells();
226 std::string interpolation_scheme)
228 string_tags.push_back(name);
229 string_tags.push_back(interpolation_scheme);
237 string_tags.push_back(name);
245 real_tags.push_back(time);
251 unsigned int time_step,
252 unsigned int num_components,
253 unsigned int num_entries)
255 integer_tags.push_back(time_step);
256 integer_tags.push_back(num_components);
257 integer_tags.push_back(num_entries);
261 using Scalar = double;
262 using Vector = dealii::Tensor<1,PHILIP_DIM,double>;
263 using Matrix = dealii::Tensor<2,PHILIP_DIM,double>;
278 const dealii::DoFHandler<PHILIP_DIM> &dof_handler,
281 const unsigned int dim = PHILIP_DIM;
284 switch(storage_type){
285 case StorageType::node:{
287 const dealii::Triangulation<dim,dim> &tria = dof_handler.get_triangulation();
289 const std::vector<bool> &vertex_used = tria.get_used_vertices();
292 for(
unsigned int i = 0; i < vertex_used.size(); ++i){
293 if(!vertex_used[i])
continue;
295 Scalar node_data = data[i];
298 unsigned int node_tag = i + 1;
299 out << node_tag <<
" " << node_data <<
'\n';
304 }
case StorageType::element:{
306 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
307 if(!cell->is_locally_owned())
continue;
309 Scalar cell_data = data[cell->active_cell_index()];
312 unsigned int element_tag = cell->active_cell_index() + 1;
313 out << element_tag <<
" " << cell_data <<
'\n';
318 }
case StorageType::elementNode:{
320 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
321 if(!cell->is_locally_owned())
continue;
323 unsigned int element_tag = cell->active_cell_index() + 1;
324 out << element_tag <<
" " << dealii::GeometryInfo<dim>::vertices_per_cell;
327 for(
unsigned int vertex = 0; vertex < dealii::GeometryInfo<dim>::vertices_per_cell; ++vertex){
329 unsigned int node_index = cell->vertex_index(dealii::GeometryInfo<dim>::ucd_to_deal[vertex]);
331 Scalar node_data = data[node_index];
333 out <<
" " << node_data;
347 const dealii::DoFHandler<PHILIP_DIM> &dof_handler,
350 const unsigned int dim = PHILIP_DIM;
353 switch(storage_type){
354 case StorageType::node:{
356 const dealii::Triangulation<dim,dim> &tria = dof_handler.get_triangulation();
358 const std::vector<bool> &vertex_used = tria.get_used_vertices();
361 for(
unsigned int i = 0; i < vertex_used.size(); ++i){
362 if(!vertex_used[i])
continue;
364 Vector node_data = data[i];
366 unsigned int node_tag = i + 1;
370 for(
unsigned int i = 0; i < dim; ++i)
371 out <<
" " << node_data[i];
374 for(
unsigned int i = dim; i < 3; ++i)
382 }
case StorageType::element:{
384 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
385 if(!cell->is_locally_owned())
continue;
387 Vector cell_data = data[cell->active_cell_index()];
389 unsigned int element_tag = cell->active_cell_index() + 1;
393 for(
unsigned int i = 0; i < dim; ++i)
394 out <<
" " << cell_data[i];
397 for(
unsigned int i = dim; i < 3; ++i)
405 }
case StorageType::elementNode:{
407 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
408 if(!cell->is_locally_owned())
continue;
410 unsigned int element_tag = cell->active_cell_index() + 1;
411 out << element_tag <<
" " << dealii::GeometryInfo<dim>::vertices_per_cell;
414 for(
unsigned int vertex = 0; vertex < dealii::GeometryInfo<dim>::vertices_per_cell; ++vertex){
416 unsigned int node_index = cell->vertex_index(dealii::GeometryInfo<dim>::ucd_to_deal[vertex]);
418 Vector node_data = data[node_index];
421 for(
unsigned int i = 0; i < dim; ++i)
422 out <<
" " << node_data[i];
425 for(
unsigned int i = dim; i < 3; ++i)
441 const dealii::DoFHandler<PHILIP_DIM> &dof_handler,
444 const unsigned int dim = PHILIP_DIM;
447 switch(storage_type){
448 case StorageType::node:{
450 const dealii::Triangulation<dim,dim> &tria = dof_handler.get_triangulation();
452 const std::vector<bool> &vertex_used = tria.get_used_vertices();
455 for(
unsigned int i = 0; i < vertex_used.size(); ++i){
456 if(!vertex_used[i])
continue;
458 Matrix node_data = data[i];
460 unsigned int node_tag = i + 1;
463 for(
unsigned int i = 0; i < dim; ++i){
465 for(
unsigned int j = 0; j < dim; ++j)
466 out <<
" " << node_data[i][j];
469 for(
unsigned int j = dim; j < 3; ++j)
474 for(
unsigned int i = dim; i < 3; ++i)
475 for(
unsigned int j = 0; j < 3; ++j)
483 }
case StorageType::element:{
485 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
486 if(!cell->is_locally_owned())
continue;
488 Matrix cell_data = data[cell->active_cell_index()];
490 unsigned int element_tag = cell->active_cell_index() + 1;
493 for(
unsigned int i = 0; i < dim; ++i){
495 for(
unsigned int j = 0; j < dim; ++j)
496 out <<
" " << cell_data[i][j];
499 for(
unsigned int j = dim; j < 3; ++j)
504 for(
unsigned int i = dim; i < 3; ++i)
505 for(
unsigned int j = 0; j < 3; ++j)
513 }
case StorageType::elementNode:{
515 for(
auto cell = dof_handler.begin_active(); cell != dof_handler.end(); ++cell){
516 if(!cell->is_locally_owned())
continue;
518 unsigned int elementTag = cell->active_cell_index() + 1;
519 out << elementTag <<
" " << dealii::GeometryInfo<dim>::vertices_per_cell;
522 for(
unsigned int vertex = 0; vertex < dealii::GeometryInfo<dim>::vertices_per_cell; ++vertex){
524 unsigned int node_index = cell->vertex_index(dealii::GeometryInfo<dim>::ucd_to_deal[vertex]);
526 Matrix node_data = data[node_index];
528 for(
unsigned int i = 0; i < dim; ++i){
530 for(
unsigned int j = 0; j < dim; ++j)
531 out <<
" " << node_data[i][j];
534 for(
unsigned int j = dim; j < 3; ++j)
539 for(
unsigned int i = dim; i < 3; ++i)
540 for(
unsigned int j = 0; j < 3; ++j)
Output class for GMSH .msh v4.1 file format.
Data structure class for data fields of .msh files.
void set_integer_tags(unsigned int time_step, unsigned int num_components, unsigned int num_entries)
Sets the required integer tags for the data field.
Internal data handler class for .msh file data fields.
Files for the baseline physics.
void write_msh(std::ostream &out)
Output formatted .msh v4.1 file with mesh description and data field.
void write_msh_data_internal(const dealii::DoFHandler< dim > &dof_handler, std::ostream &out) override
Perform write of internal data field body at storage location.
unsigned int num_entries(const dealii::DoFHandler< dim > &dof_handler)
Gets the number of data entries associated with the mesh.
void set_real_tags(double time)
Sets real tag to the data field.
void set_string_tags(std::string name, std::string interpolation_scheme)
Sets the string tags for the data field.
void write_msh_data(const dealii::DoFHandler< dim > &dof_handler, std::ostream &out)
Perform writing of .msh file data section.