265 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
266 p_vectors->SetName(dataName.c_str());
267 p_vectors->SetNumberOfComponents(3);
268 for (
unsigned i=0; i<dataPayload.size(); i++)
270 for (
unsigned j=0; j<SPACE_DIM; j++)
272 p_vectors->InsertNextValue(dataPayload[i][j]);
275 for (
unsigned j=SPACE_DIM; j<3; j++)
277 p_vectors->InsertNextValue(0.0);
281 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
282 p_cell_data->AddArray(p_vectors);
289 assert(SPACE_DIM != 1);
291 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
292 p_vectors->SetName(dataName.c_str());
293 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
294 for (
unsigned i=0; i<dataPayload.size(); i++)
298 p_vectors->InsertNextValue(dataPayload[i](0));
299 p_vectors->InsertNextValue(dataPayload[i](1));
300 p_vectors->InsertNextValue(dataPayload[i](1));
301 p_vectors->InsertNextValue(dataPayload[i](2));
303 else if (SPACE_DIM == 3)
305 p_vectors->InsertNextValue(dataPayload[i](0));
306 p_vectors->InsertNextValue(dataPayload[i](1));
307 p_vectors->InsertNextValue(dataPayload[i](2));
308 p_vectors->InsertNextValue(dataPayload[i](1));
309 p_vectors->InsertNextValue(dataPayload[i](3));
310 p_vectors->InsertNextValue(dataPayload[i](4));
311 p_vectors->InsertNextValue(dataPayload[i](2));
312 p_vectors->InsertNextValue(dataPayload[i](4));
313 p_vectors->InsertNextValue(dataPayload[i](5));
317 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
318 p_cell_data->AddArray(p_vectors);
325 assert(SPACE_DIM != 1);
327 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
328 p_vectors->SetName(dataName.c_str());
329 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
330 for (
unsigned i=0; i<dataPayload.size(); i++)
334 p_vectors->InsertNextValue(dataPayload[i](0,0));
335 p_vectors->InsertNextValue(dataPayload[i](0,1));
336 p_vectors->InsertNextValue(dataPayload[i](1,0));
337 p_vectors->InsertNextValue(dataPayload[i](1,1));
339 else if (SPACE_DIM == 3)
341 p_vectors->InsertNextValue(dataPayload[i](0,0));
342 p_vectors->InsertNextValue(dataPayload[i](0,1));
343 p_vectors->InsertNextValue(dataPayload[i](0,2));
344 p_vectors->InsertNextValue(dataPayload[i](1,0));
345 p_vectors->InsertNextValue(dataPayload[i](1,1));
346 p_vectors->InsertNextValue(dataPayload[i](1,2));
347 p_vectors->InsertNextValue(dataPayload[i](2,0));
348 p_vectors->InsertNextValue(dataPayload[i](2,1));
349 p_vectors->InsertNextValue(dataPayload[i](2,2));
353 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
354 p_cell_data->AddArray(p_vectors);
362 vtkDoubleArray* p_scalars = vtkDoubleArray::New();
363 p_scalars->SetName(dataName.c_str());
365 if (mWriteParallelFiles && this->mpDistributedMesh !=
nullptr)
372 assert( dataPayload.size() == this->mpDistributedMesh->GetNumLocalNodes() );
373 dataPayload.resize( this->mpDistributedMesh->GetNumLocalNodes() + this->mpDistributedMesh->GetNumHaloNodes() );
382 unsigned number_of_nodes_to_send = mNodesToSendPerProcess[send_to].size();
383 unsigned number_of_nodes_to_receive = mNodesToReceivePerProcess[receive_from].size();
385 boost::scoped_array<double> send_data(
new double[number_of_nodes_to_send]);
386 boost::scoped_array<double> receive_data(
new double[number_of_nodes_to_receive]);
388 for (
unsigned node = 0; node < number_of_nodes_to_send; node++)
390 unsigned global_node_index = mNodesToSendPerProcess[send_to][node];
391 unsigned local_node_index = global_node_index
392 - this->mpDistributedMesh->GetDistributedVectorFactory()->GetLow();
393 send_data[node] = dataPayload[local_node_index];
399 ret = MPI_Sendrecv(send_data.get(), number_of_nodes_to_send,
402 receive_data.get(), number_of_nodes_to_receive,
405 PETSC_COMM_WORLD, &status);
407 assert ( ret == MPI_SUCCESS );
411 for (
unsigned node = 0; node < number_of_nodes_to_receive; node++ )
413 unsigned global_node_index = mNodesToReceivePerProcess[receive_from][node];
414 unsigned halo_index = mGlobalToNodeIndexMap[global_node_index];
415 assert( halo_index >= this->mpDistributedMesh->GetNumLocalNodes() );
416 dataPayload[halo_index] = receive_data[node];
422 for (
unsigned i=0; i<dataPayload.size(); i++)
424 p_scalars->InsertNextValue(dataPayload[i]);
427 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
428 p_point_data->AddArray(p_scalars);
436 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
437 p_vectors->SetName(dataName.c_str());
439 if (mWriteParallelFiles)
446 assert( dataPayload.size() == this->mpDistributedMesh->GetNumLocalNodes() );
447 dataPayload.resize( this->mpDistributedMesh->GetNumLocalNodes() + this->mpDistributedMesh->GetNumHaloNodes() );
455 unsigned number_of_nodes_to_send = mNodesToSendPerProcess[send_to].size();
456 unsigned number_of_nodes_to_receive = mNodesToReceivePerProcess[receive_from].size();
458 boost::scoped_array<double> send_data(
new double[number_of_nodes_to_send * SPACE_DIM]);
459 boost::scoped_array<double> receive_data(
new double[number_of_nodes_to_receive * SPACE_DIM]);
461 for (
unsigned node = 0; node < number_of_nodes_to_send; node++)
463 unsigned global_node_index = mNodesToSendPerProcess[send_to][node];
464 unsigned local_node_index = global_node_index
465 - this->mpDistributedMesh->GetDistributedVectorFactory()->GetLow();
466 for (
unsigned j=0; j<SPACE_DIM; j++)
468 send_data[ node*SPACE_DIM + j ] = dataPayload[local_node_index][j];
474 ret = MPI_Sendrecv(send_data.get(), number_of_nodes_to_send * SPACE_DIM,
477 receive_data.get(), number_of_nodes_to_receive * SPACE_DIM,
480 PETSC_COMM_WORLD, &status);
482 assert ( ret == MPI_SUCCESS );
485 for (
unsigned node = 0; node < number_of_nodes_to_receive; node++ )
487 unsigned global_node_index = mNodesToReceivePerProcess[receive_from][node];
488 unsigned halo_index = mGlobalToNodeIndexMap[global_node_index];
489 assert( halo_index >= this->mpDistributedMesh->GetNumLocalNodes() );
490 for (
unsigned j=0; j<SPACE_DIM; j++)
492 dataPayload[halo_index][j] = receive_data[ node*SPACE_DIM + j ];
498 p_vectors->SetNumberOfComponents(3);
499 for (
unsigned i=0; i<dataPayload.size(); i++)
501 for (
unsigned j=0; j<SPACE_DIM; j++)
503 p_vectors->InsertNextValue(dataPayload[i][j]);
506 for (
unsigned j=SPACE_DIM; j<3; j++)
508 p_vectors->InsertNextValue(0.0);
512 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
513 p_point_data->AddArray(p_vectors);
520 assert(SPACE_DIM != 1);
522 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
523 p_vectors->SetName(dataName.c_str());
524 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
525 for (
unsigned i=0; i<dataPayload.size(); i++)
529 p_vectors->InsertNextValue(dataPayload[i](0,0));
530 p_vectors->InsertNextValue(dataPayload[i](0,1));
531 p_vectors->InsertNextValue(dataPayload[i](1,0));
532 p_vectors->InsertNextValue(dataPayload[i](1,1));
534 else if (SPACE_DIM == 3)
536 p_vectors->InsertNextValue(dataPayload[i](0,0));
537 p_vectors->InsertNextValue(dataPayload[i](0,1));
538 p_vectors->InsertNextValue(dataPayload[i](0,2));
539 p_vectors->InsertNextValue(dataPayload[i](1,0));
540 p_vectors->InsertNextValue(dataPayload[i](1,1));
541 p_vectors->InsertNextValue(dataPayload[i](1,2));
542 p_vectors->InsertNextValue(dataPayload[i](2,0));
543 p_vectors->InsertNextValue(dataPayload[i](2,1));
544 p_vectors->InsertNextValue(dataPayload[i](2,2));
548 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
549 p_point_data->AddArray(p_vectors);
606 bool keepOriginalElementIndexing)
612 if (
PetscTools::IsSequential() || !mWriteParallelFiles || (this->mpDistributedMesh ==
nullptr && mpNodesOnlyMesh ==
nullptr))
619 vtkPoints* p_pts = vtkPoints::New(VTK_DOUBLE);
620 p_pts->GetData()->SetName(
"Vertex positions");
627 c_vector<double, SPACE_DIM> current_item = node_iter->rGetLocation();
630 p_pts->InsertNextPoint(current_item[0], current_item[1], current_item[2]);
632 else if (SPACE_DIM == 2)
634 p_pts->InsertNextPoint(current_item[0], current_item[1], 0.0);
638 p_pts->InsertNextPoint(current_item[0], 0.0, 0.0);
643 if (this->mpDistributedMesh)
646 halo_iter != this->mpDistributedMesh->GetHaloNodeIteratorEnd();
649 c_vector<double, SPACE_DIM> current_item = (*halo_iter)->rGetLocation();
652 p_pts->InsertNextPoint(current_item[0], current_item[1], current_item[2]);
654 else if (SPACE_DIM == 2)
656 p_pts->InsertNextPoint(current_item[0], current_item[1], 0.0);
660 p_pts->InsertNextPoint(current_item[0], 0.0, 0.0);
665 mpVtkUnstructedMesh->SetPoints(p_pts);
673 vtkCell* p_cell=
nullptr;
675 if (ELEMENT_DIM == 3)
677 p_cell = vtkTetra::New();
679 else if (ELEMENT_DIM == 2)
681 p_cell = vtkTriangle::New();
685 p_cell = vtkLine::New();
687 vtkIdList* p_cell_id_list = p_cell->GetPointIds();
688 for (
unsigned j = 0; j < ELEMENT_DIM+1; ++j)
690 unsigned global_node_index = elem_iter->GetNodeGlobalIndex(j);
691 p_cell_id_list->SetId(j, mGlobalToNodeIndexMap[global_node_index]);
693 mpVtkUnstructedMesh->InsertNextCell(p_cell->GetCellType(), p_cell_id_list);
697 if (this->mpMixedMesh )
703 elem_iter != this->mpMixedMesh->GetCableElementIteratorEnd();
706 radii.push_back((*elem_iter)->GetAttribute());
707 vtkCell* p_cell=vtkLine::New();
708 vtkIdList* p_cell_id_list = p_cell->GetPointIds();
709 for (
unsigned j = 0; j < 2; ++j)
711 unsigned global_node_index = (*elem_iter)->GetNodeGlobalIndex(j);
712 p_cell_id_list->SetId(j, mGlobalToNodeIndexMap[global_node_index]);
714 mpVtkUnstructedMesh->InsertNextCell(p_cell->GetCellType(), p_cell_id_list);
717 AddCellData(
"Cable radius", radii);
724 assert(mpVtkUnstructedMesh->CheckAttributes() == 0);
725 vtkXMLPUnstructuredGridWriter* p_writer = vtkXMLPUnstructuredGridWriter::New();
727 p_writer->SetDataModeToBinary();
735 p_writer->SetInputData(mpVtkUnstructedMesh);
736 std::string pvtk_file_name = this->mpOutputFileHandler->GetOutputDirectoryFullPath() + this->mBaseName+
".pvtu";
737 p_writer->SetFileName(pvtk_file_name.c_str());
744 std::stringstream filepath;
746 AddProvenance(filepath.str());
750 AddProvenance(this->mBaseName+
".pvtu");