48 const std::vector<std::string> &tags) {
50 if (model->
d_x.size() == 0)
54 auto points = vtkSmartPointer<vtkPoints>::New();
57 for (
const auto &x : model->
d_x)
58 points->InsertNextPoint(x.d_x, x.d_y, x.d_z);
61 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
62 d_grid_p->SetPoints(points);
75 auto array = vtkSmartPointer<vtkDoubleArray>::New();
76 array->SetNumberOfComponents(3);
77 array->SetName(
"Displacement");
79 array->SetComponentName(0,
"x");
80 array->SetComponentName(1,
"y");
81 array->SetComponentName(2,
"z");
83 for (
const auto &ui : model->
d_u) {
87 array->InsertNextTuple(value);
91 d_grid_p->GetPointData()->AddArray(array);
97 auto array = vtkSmartPointer<vtkDoubleArray>::New();
98 array->SetNumberOfComponents(3);
99 array->SetName(
"Velocity");
101 array->SetComponentName(0,
"x");
102 array->SetComponentName(1,
"y");
103 array->SetComponentName(2,
"z");
105 for (
const auto &ui : model->
d_v) {
109 array->InsertNextTuple(value);
113 d_grid_p->GetPointData()->AddArray(array);
119 auto array = vtkSmartPointer<vtkDoubleArray>::New();
120 array->SetNumberOfComponents(3);
121 array->SetName(
"Force_Density");
123 array->SetComponentName(0,
"x");
124 array->SetComponentName(1,
"y");
125 array->SetComponentName(2,
"z");
127 for (
const auto &ui : model->
d_f) {
131 array->InsertNextTuple(value);
135 d_grid_p->GetPointData()->AddArray(array);
141 auto array = vtkSmartPointer<vtkDoubleArray>::New();
142 array->SetNumberOfComponents(3);
143 array->SetName(
"Force");
145 array->SetComponentName(0,
"x");
146 array->SetComponentName(1,
"y");
147 array->SetComponentName(2,
"z");
150 for (
const auto &ui : model->
d_f) {
151 const auto &voli = model->
d_vol[i_count];
152 value[0] = ui.d_x * voli;
153 value[1] = ui.d_y * voli;
154 value[2] = ui.d_z * voli;
155 array->InsertNextTuple(value);
161 d_grid_p->GetPointData()->AddArray(array);
167 auto array = vtkSmartPointer<vtkDoubleArray>::New();
168 array->SetNumberOfComponents(1);
169 array->SetName(
"Fixity");
171 for (
const auto &n : model->
d_fix) {
172 p_tag[0] = double(n);
173 array->InsertNextTuple(p_tag);
177 d_grid_p->GetPointData()->AddArray(array);
183 auto array = vtkSmartPointer<vtkDoubleArray>::New();
184 array->SetNumberOfComponents(1);
185 array->SetName(
"Particle_ID");
187 for (
size_t i = 0; i<model->
d_x.size(); i++) {
190 array->InsertNextTuple(p_tag);
194 d_grid_p->GetPointData()->AddArray(array);
200 auto array = vtkSmartPointer<vtkDoubleArray>::New();
201 array->SetNumberOfComponents(1);
202 array->SetName(
"Zone_ID");
204 for (
size_t i = 0; i<model->
d_x.size(); i++) {
207 array->InsertNextTuple(p_tag);
211 d_grid_p->GetPointData()->AddArray(array);
217 auto array = vtkSmartPointer<vtkDoubleArray>::New();
218 array->SetNumberOfComponents(1);
219 array->SetName(
"Force_Fixity");
222 p_tag[0] = double(n);
223 array->InsertNextTuple(p_tag);
227 d_grid_p->GetPointData()->AddArray(array);
233 auto array = vtkSmartPointer<vtkDoubleArray>::New();
234 array->SetNumberOfComponents(1);
235 array->SetName(
"Nodal_Volume");
237 for (
const auto &n : model->
d_vol) {
238 p_tag[0] = double(n);
239 array->InsertNextTuple(p_tag);
243 d_grid_p->GetPointData()->AddArray(array);
249 auto array = vtkSmartPointer<vtkDoubleArray>::New();
250 array->SetNumberOfComponents(1);
251 array->SetName(
"Damage_Z");
253 for (
const auto &n : model->
d_Z) {
254 p_tag[0] = double(n);
255 array->InsertNextTuple(p_tag);
259 d_grid_p->GetPointData()->AddArray(array);
266 auto array = vtkSmartPointer<vtkDoubleArray>::New();
267 array->SetNumberOfComponents(1);
268 array->SetName(
"Damage");
270 for (
const auto &n : model->
d_phi) {
271 p_tag[0] = double(n);
272 array->InsertNextTuple(p_tag);
276 d_grid_p->GetPointData()->AddArray(array);
283 auto array = vtkSmartPointer<vtkDoubleArray>::New();
284 array->SetNumberOfComponents(1);
285 array->SetName(
"Damage_Bond");
288 p_tag[0] = double(n);
289 array->InsertNextTuple(p_tag);
293 d_grid_p->GetPointData()->AddArray(array);
301 auto array = vtkSmartPointer<vtkDoubleArray>::New();
302 array->SetNumberOfComponents(1);
303 array->SetName(
"Theta");
305 for (
const auto &n : model->
d_thetaX) {
306 p_tag[0] = double(n);
307 array->InsertNextTuple(p_tag);
311 d_grid_p->GetPointData()->AddArray(array);
462 if (model->
d_x.empty())
468 appendMesh(model, tags);
472 std::unordered_set<size_t> node_set;
475 std::vector<size_t> gids;
477 std::vector<LocalElem> elems;
484 const auto &
mesh = p->getMeshP();
485 const size_t element_type =
mesh->getElementType();
486 for (
size_t e = 0; e <
mesh->getNumElements(); ++e) {
487 auto conn =
mesh->getElementConnectivity(e);
489 for (
size_t n = 1; n < conn.size(); ++n)
490 cell_owner = std::min(
493 if (
static_cast<int>(cell_owner) != mpi_rank)
496 le.type = element_type;
497 le.gids.reserve(conn.size());
498 for (
size_t n : conn) {
499 const size_t g = n + p->d_globStart;
500 le.gids.push_back(g);
503 elems.push_back(std::move(le));
515 for (
size_t i = 0; i < p->getNumNodes(); ++i)
516 node_set.insert(p->d_globStart + i);
517 const auto &
mesh = p->getMeshP();
518 const size_t element_type =
mesh->getElementType();
519 for (
size_t e = 0; e <
mesh->getNumElements(); ++e) {
520 auto conn =
mesh->getElementConnectivity(e);
522 le.type = element_type;
523 for (
size_t n : conn)
524 le.gids.push_back(n + p->d_globStart);
525 elems.push_back(std::move(le));
530 if (node_set.empty()) {
532 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
533 auto points = vtkSmartPointer<vtkPoints>::New();
534 d_grid_p->SetPoints(points);
538 std::vector<size_t> gids(node_set.begin(), node_set.end());
539 std::sort(gids.begin(), gids.end());
540 std::unordered_map<size_t, vtkIdType> g2l;
541 g2l.reserve(gids.size());
542 auto points = vtkSmartPointer<vtkPoints>::New();
543 for (
size_t i = 0; i < gids.size(); ++i) {
544 const auto &x = model->
d_x[gids[i]];
545 points->InsertNextPoint(x.d_x, x.d_y, x.d_z);
546 g2l[gids[i]] =
static_cast<vtkIdType
>(i);
549 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
550 d_grid_p->SetPoints(points);
551 appendPointArraysForNodes(d_grid_p, model, gids, tags);
556 size_t num_vertex = 0;
557 for (
const auto &le : elems)
558 num_vertex = std::max(num_vertex, le.gids.size());
560 auto cells = vtkSmartPointer<vtkCellArray>::New();
561 cells->AllocateEstimate(
static_cast<vtkIdType
>(elems.size()),
562 static_cast<vtkIdType
>(num_vertex));
563 auto cellTypeArray = vtkSmartPointer<vtkUnsignedCharArray>::New();
564 cellTypeArray->SetNumberOfValues(
static_cast<vtkIdType
>(elems.size()));
567 for (
size_t ei = 0; ei < elems.size(); ++ei) {
568 const auto &le = elems[ei];
569 for (
size_t n = 0; n < le.gids.size(); ++n)
570 ids[n] = g2l.at(le.gids[n]);
571 cells->InsertNextCell(
static_cast<int>(le.gids.size()), ids);
572 cellTypeArray->SetValue(
static_cast<vtkIdType
>(ei),
573 static_cast<unsigned char>(le.type));
575 d_grid_p->SetCells(cellTypeArray, cells);
599 const std::vector<size_t> *processed_nodes,
601 std::pair<size_t, size_t>> *processed_elems) {
603 if (processed_nodes->size() == 0)
607 auto points = vtkSmartPointer<vtkPoints>::New();
610 const size_t num_nodes = processed_nodes->size();
611 const size_t num_elems = processed_elems->size();
617 for (
const auto &i : *processed_nodes) {
618 const auto &x = model->
d_x[i];
619 points->InsertNextPoint(x.d_x, x.d_y, x.d_z);
623 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
624 d_grid_p->SetPoints(points);
627 const size_t vtk_element_type = 3;
628 const size_t num_vertex = 2;
630 auto cells = vtkSmartPointer<vtkCellArray>::New();
631 cells->AllocateEstimate(
static_cast<vtkIdType
>(num_elems),
static_cast<vtkIdType
>(num_vertex));
633 auto cellTypeArray = vtkSmartPointer<vtkUnsignedCharArray>::New();
634 cellTypeArray->SetNumberOfValues(
static_cast<vtkIdType
>(num_elems));
636 vtkIdType ids[num_vertex];
637 for (
size_t i = 0; i < num_elems; i++) {
639 ids[0] = (*processed_elems)[i].first;
640 ids[1] = (*processed_elems)[i].second;
642 cells->InsertNextCell(
static_cast<int>(num_vertex), ids);
643 cellTypeArray->SetValue(
static_cast<vtkIdType
>(i),
static_cast<unsigned char>(vtk_element_type));
646 d_grid_p->SetCells(cellTypeArray, cells);
650 auto array = vtkSmartPointer < vtkDoubleArray > ::New();
651 array->SetNumberOfComponents(3);
652 array->SetName(
"Normal");
653 array->SetComponentName(0,
"x");
654 array->SetComponentName(1,
"y");
655 array->SetComponentName(2,
"z");
658 for (
size_t i = 0; i < num_elems; i++) {
660 ids[0] = (*processed_elems)[i].first;
661 ids[1] = (*processed_elems)[i].second;
663 auto glob_id1 = (*processed_nodes)[ids[0]];
664 auto glob_id2 = (*processed_nodes)[ids[1]];
666 const auto &x1 = model->
d_x[glob_id1];
667 const auto &x2 = model->
d_x[glob_id2];
669 auto xd = (x1 - x2)/((x2 - x1).length());
674 array->InsertNextTuple(value);
677 d_grid_p->GetCellData()->AddArray(array);
686 std::cout <<
"VtkParticleWriter::appendStrainStress: Nothing to write.\n";
691 auto points = vtkSmartPointer<vtkPoints>::New();
695 points->InsertNextPoint(x.d_x, x.d_y, x.d_z);
698 d_grid_p = vtkSmartPointer<vtkUnstructuredGrid>::New();
699 d_grid_p->SetPoints(points);
702 double value[3] = {0., 0., 0.};
703 double value_s[6] = {0., 0., 0., 0., 0., 0.};
704 double p_tag[1] = {0.};
706 auto array_strain = vtkSmartPointer<vtkDoubleArray>::New();
707 array_strain->SetNumberOfComponents(6);
708 array_strain->SetName(
"Strain");
710 auto array_stress = vtkSmartPointer<vtkDoubleArray>::New();
711 array_stress->SetNumberOfComponents(6);
712 array_stress->SetName(
"Stress");
714 std::vector<std::string> coord_strings = {
"xx",
"yy",
"zz",
"yz",
"xz",
"xy"};
715 for (
size_t i =0; i<6; i++) {
716 array_strain->SetComponentName(i, coord_strings[i].c_str());
717 array_stress->SetComponentName(i, coord_strings[i].c_str());
720 for (
size_t i=0; i<model->
d_strain.size(); i++) {
723 array_strain->InsertNextTuple(value_s);
726 array_stress->InsertNextTuple(value_s);
731 d_grid_p->GetPointData()->AddArray(array_strain);
732 d_grid_p->GetPointData()->AddArray(array_stress);
std::map< std::string, size_t > d_groups
Map that provides different groups of this particle.
std::unique_ptr< material::Material > d_material_p
Pointer to peridynamic material object.
void appendContactData(const data::ModelData *model, const std::vector< size_t > *processed_nodes, const std::vector< std::pair< size_t, size_t > > *processed_elems)
Prepares contact data that is set of nodes in contact and line-element connecting two contacting node...
VtkParticleWriter(const std::string &filename, const std::string &compress_type="")
Constructor.
void appendNodes(const data::ModelData *model, const std::vector< std::string > &tags)
Writes the nodes to the file.
vtkSmartPointer< vtkXMLUnstructuredGridWriter > d_writer_p
XML unstructured grid writer.
void appendMesh(const data::ModelData *model, const std::vector< std::string > &tags)
Writes the nodes to the file.
void addTimeStep(const double ×tep)
Writes the time step to the file.
void appendMeshParallelPiece(const data::ModelData *model, const std::vector< std::string > &tags)
Write only this rank's mesh piece for parallel VTU output.
void appendPointArraysForNodes(vtkUnstructuredGrid *grid, const data::ModelData *model, const std::vector< size_t > &gids, const std::vector< std::string > &tags)
bool isLocallyOwned(const BaseParticle &p)
True if this rank updates / assembles forces for the particle. Walls are replicated on every rank....