270 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
271 p_vectors->SetName(dataName.c_str());
272 p_vectors->SetNumberOfComponents(3);
273 for (
unsigned i=0; i<dataPayload.size(); i++)
275 for (
unsigned j=0; j<SPACE_DIM; j++)
277 p_vectors->InsertNextValue(dataPayload[i][j]);
280 for (
unsigned j=SPACE_DIM; j<3; j++)
282 p_vectors->InsertNextValue(0.0);
286 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
287 p_cell_data->AddArray(p_vectors);
294 assert(SPACE_DIM != 1);
296 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
297 p_vectors->SetName(dataName.c_str());
298 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
299 for (
unsigned i=0; i<dataPayload.size(); i++)
303 p_vectors->InsertNextValue(dataPayload[i](0));
304 p_vectors->InsertNextValue(dataPayload[i](1));
305 p_vectors->InsertNextValue(dataPayload[i](1));
306 p_vectors->InsertNextValue(dataPayload[i](2));
308 else if (SPACE_DIM == 3)
310 p_vectors->InsertNextValue(dataPayload[i](0));
311 p_vectors->InsertNextValue(dataPayload[i](1));
312 p_vectors->InsertNextValue(dataPayload[i](2));
313 p_vectors->InsertNextValue(dataPayload[i](1));
314 p_vectors->InsertNextValue(dataPayload[i](3));
315 p_vectors->InsertNextValue(dataPayload[i](4));
316 p_vectors->InsertNextValue(dataPayload[i](2));
317 p_vectors->InsertNextValue(dataPayload[i](4));
318 p_vectors->InsertNextValue(dataPayload[i](5));
322 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
323 p_cell_data->AddArray(p_vectors);
330 assert(SPACE_DIM != 1);
332 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
333 p_vectors->SetName(dataName.c_str());
334 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
335 for (
unsigned i=0; i<dataPayload.size(); i++)
339 p_vectors->InsertNextValue(dataPayload[i](0,0));
340 p_vectors->InsertNextValue(dataPayload[i](0,1));
341 p_vectors->InsertNextValue(dataPayload[i](1,0));
342 p_vectors->InsertNextValue(dataPayload[i](1,1));
344 else if (SPACE_DIM == 3)
346 p_vectors->InsertNextValue(dataPayload[i](0,0));
347 p_vectors->InsertNextValue(dataPayload[i](0,1));
348 p_vectors->InsertNextValue(dataPayload[i](0,2));
349 p_vectors->InsertNextValue(dataPayload[i](1,0));
350 p_vectors->InsertNextValue(dataPayload[i](1,1));
351 p_vectors->InsertNextValue(dataPayload[i](1,2));
352 p_vectors->InsertNextValue(dataPayload[i](2,0));
353 p_vectors->InsertNextValue(dataPayload[i](2,1));
354 p_vectors->InsertNextValue(dataPayload[i](2,2));
358 vtkCellData* p_cell_data = mpVtkUnstructedMesh->GetCellData();
359 p_cell_data->AddArray(p_vectors);
367 vtkDoubleArray* p_scalars = vtkDoubleArray::New();
368 p_scalars->SetName(dataName.c_str());
370 if (mWriteParallelFiles && this->mpDistributedMesh !=
nullptr)
377 assert( dataPayload.size() == this->mpDistributedMesh->GetNumLocalNodes() );
378 dataPayload.resize( this->mpDistributedMesh->GetNumLocalNodes() + this->mpDistributedMesh->GetNumHaloNodes() );
387 unsigned number_of_nodes_to_send = mNodesToSendPerProcess[send_to].size();
388 unsigned number_of_nodes_to_receive = mNodesToReceivePerProcess[receive_from].size();
390 boost::scoped_array<double> send_data(
new double[number_of_nodes_to_send]);
391 boost::scoped_array<double> receive_data(
new double[number_of_nodes_to_receive]);
393 for (
unsigned node = 0; node < number_of_nodes_to_send; node++)
395 unsigned global_node_index = mNodesToSendPerProcess[send_to][node];
396 unsigned local_node_index = global_node_index
397 - this->mpDistributedMesh->GetDistributedVectorFactory()->GetLow();
398 send_data[node] = dataPayload[local_node_index];
404 ret = MPI_Sendrecv(send_data.get(), number_of_nodes_to_send,
407 receive_data.get(), number_of_nodes_to_receive,
410 PETSC_COMM_WORLD, &status);
412 assert ( ret == MPI_SUCCESS );
416 for (
unsigned node = 0; node < number_of_nodes_to_receive; node++ )
418 unsigned global_node_index = mNodesToReceivePerProcess[receive_from][node];
419 unsigned halo_index = mGlobalToNodeIndexMap[global_node_index];
420 assert( halo_index >= this->mpDistributedMesh->GetNumLocalNodes() );
421 dataPayload[halo_index] = receive_data[node];
427 for (
unsigned i=0; i<dataPayload.size(); i++)
429 p_scalars->InsertNextValue(dataPayload[i]);
432 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
433 p_point_data->AddArray(p_scalars);
441 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
442 p_vectors->SetName(dataName.c_str());
444 if (mWriteParallelFiles)
451 assert( dataPayload.size() == this->mpDistributedMesh->GetNumLocalNodes() );
452 dataPayload.resize( this->mpDistributedMesh->GetNumLocalNodes() + this->mpDistributedMesh->GetNumHaloNodes() );
460 unsigned number_of_nodes_to_send = mNodesToSendPerProcess[send_to].size();
461 unsigned number_of_nodes_to_receive = mNodesToReceivePerProcess[receive_from].size();
463 boost::scoped_array<double> send_data(
new double[number_of_nodes_to_send * SPACE_DIM]);
464 boost::scoped_array<double> receive_data(
new double[number_of_nodes_to_receive * SPACE_DIM]);
466 for (
unsigned node = 0; node < number_of_nodes_to_send; node++)
468 unsigned global_node_index = mNodesToSendPerProcess[send_to][node];
469 unsigned local_node_index = global_node_index
470 - this->mpDistributedMesh->GetDistributedVectorFactory()->GetLow();
471 for (
unsigned j=0; j<SPACE_DIM; j++)
473 send_data[ node*SPACE_DIM + j ] = dataPayload[local_node_index][j];
479 ret = MPI_Sendrecv(send_data.get(), number_of_nodes_to_send * SPACE_DIM,
482 receive_data.get(), number_of_nodes_to_receive * SPACE_DIM,
485 PETSC_COMM_WORLD, &status);
487 assert ( ret == MPI_SUCCESS );
490 for (
unsigned node = 0; node < number_of_nodes_to_receive; node++ )
492 unsigned global_node_index = mNodesToReceivePerProcess[receive_from][node];
493 unsigned halo_index = mGlobalToNodeIndexMap[global_node_index];
494 assert( halo_index >= this->mpDistributedMesh->GetNumLocalNodes() );
495 for (
unsigned j=0; j<SPACE_DIM; j++)
497 dataPayload[halo_index][j] = receive_data[ node*SPACE_DIM + j ];
503 p_vectors->SetNumberOfComponents(3);
504 for (
unsigned i=0; i<dataPayload.size(); i++)
506 for (
unsigned j=0; j<SPACE_DIM; j++)
508 p_vectors->InsertNextValue(dataPayload[i][j]);
511 for (
unsigned j=SPACE_DIM; j<3; j++)
513 p_vectors->InsertNextValue(0.0);
517 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
518 p_point_data->AddArray(p_vectors);
525 assert(SPACE_DIM != 1);
527 vtkDoubleArray* p_vectors = vtkDoubleArray::New();
528 p_vectors->SetName(dataName.c_str());
529 p_vectors->SetNumberOfComponents(SPACE_DIM*SPACE_DIM);
530 for (
unsigned i=0; i<dataPayload.size(); i++)
534 p_vectors->InsertNextValue(dataPayload[i](0,0));
535 p_vectors->InsertNextValue(dataPayload[i](0,1));
536 p_vectors->InsertNextValue(dataPayload[i](1,0));
537 p_vectors->InsertNextValue(dataPayload[i](1,1));
539 else if (SPACE_DIM == 3)
541 p_vectors->InsertNextValue(dataPayload[i](0,0));
542 p_vectors->InsertNextValue(dataPayload[i](0,1));
543 p_vectors->InsertNextValue(dataPayload[i](0,2));
544 p_vectors->InsertNextValue(dataPayload[i](1,0));
545 p_vectors->InsertNextValue(dataPayload[i](1,1));
546 p_vectors->InsertNextValue(dataPayload[i](1,2));
547 p_vectors->InsertNextValue(dataPayload[i](2,0));
548 p_vectors->InsertNextValue(dataPayload[i](2,1));
549 p_vectors->InsertNextValue(dataPayload[i](2,2));
553 vtkPointData* p_point_data = mpVtkUnstructedMesh->GetPointData();
554 p_point_data->AddArray(p_vectors);
611 bool keepOriginalElementIndexing)
617 if (
PetscTools::IsSequential() || !mWriteParallelFiles || (this->mpDistributedMesh ==
nullptr && mpNodesOnlyMesh ==
nullptr))
624 vtkPoints* p_pts = vtkPoints::New(VTK_DOUBLE);
625 p_pts->GetData()->SetName(
"Vertex positions");
632 c_vector<double, SPACE_DIM> current_item = node_iter->rGetLocation();
635 p_pts->InsertNextPoint(current_item[0], current_item[1], current_item[2]);
637 else if (SPACE_DIM == 2)
639 p_pts->InsertNextPoint(current_item[0], current_item[1], 0.0);
643 p_pts->InsertNextPoint(current_item[0], 0.0, 0.0);
648 if (this->mpDistributedMesh)
651 halo_iter != this->mpDistributedMesh->GetHaloNodeIteratorEnd();
654 c_vector<double, SPACE_DIM> current_item = (*halo_iter)->rGetLocation();
657 p_pts->InsertNextPoint(current_item[0], current_item[1], current_item[2]);
659 else if (SPACE_DIM == 2)
661 p_pts->InsertNextPoint(current_item[0], current_item[1], 0.0);
665 p_pts->InsertNextPoint(current_item[0], 0.0, 0.0);
670 mpVtkUnstructedMesh->SetPoints(p_pts);
678 vtkCell* p_cell=
nullptr;
680 if (ELEMENT_DIM == 3)
682 p_cell = vtkTetra::New();
684 else if (ELEMENT_DIM == 2)
686 p_cell = vtkTriangle::New();
690 p_cell = vtkLine::New();
692 vtkIdList* p_cell_id_list = p_cell->GetPointIds();
693 for (
unsigned j = 0; j < ELEMENT_DIM+1; ++j)
695 unsigned global_node_index = elem_iter->GetNodeGlobalIndex(j);
696 p_cell_id_list->SetId(j, mGlobalToNodeIndexMap[global_node_index]);
698 mpVtkUnstructedMesh->InsertNextCell(p_cell->GetCellType(), p_cell_id_list);
702 if (this->mpMixedMesh )
708 elem_iter != this->mpMixedMesh->GetCableElementIteratorEnd();
711 radii.push_back((*elem_iter)->GetAttribute());
712 vtkCell* p_cell=vtkLine::New();
713 vtkIdList* p_cell_id_list = p_cell->GetPointIds();
714 for (
unsigned j = 0; j < 2; ++j)
716 unsigned global_node_index = (*elem_iter)->GetNodeGlobalIndex(j);
717 p_cell_id_list->SetId(j, mGlobalToNodeIndexMap[global_node_index]);
719 mpVtkUnstructedMesh->InsertNextCell(p_cell->GetCellType(), p_cell_id_list);
722 AddCellData(
"Cable radius", radii);
729 assert(mpVtkUnstructedMesh->CheckAttributes() == 0);
730 vtkXMLPUnstructuredGridWriter* p_writer = vtkXMLPUnstructuredGridWriter::New();
732 p_writer->SetDataModeToBinary();
740#if VTK_MAJOR_VERSION >= 6
741 p_writer->SetInputData(mpVtkUnstructedMesh);
743 p_writer->SetInput(mpVtkUnstructedMesh);
745 std::string pvtk_file_name = this->mpOutputFileHandler->GetOutputDirectoryFullPath() + this->mBaseName+
".pvtu";
746 p_writer->SetFileName(pvtk_file_name.c_str());
753 std::stringstream filepath;
755 AddProvenance(filepath.str());
759 AddProvenance(this->mBaseName+
".pvtu");