497 unsigned num_cells = this->GetNumAllCells();
502 for (
auto cell_writer_iter = this->mCellWriters.begin();
503 cell_writer_iter != this->mCellWriters.end();
507 std::vector<double> vtk_cell_data(num_cells);
510 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
511 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
515 unsigned elem_index = elem_iter->GetIndex();
518 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
522 vtk_cell_data[elem_index] = (*cell_writer_iter)->GetCellDataForVtkOutput(p_cell,
this);
525 mesh_writer.
AddCellData((*cell_writer_iter)->GetVtkCellDataName(), vtk_cell_data);
529 unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
530 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
532 std::vector<std::vector<double> > cell_data;
533 for (
unsigned var=0; var<num_cell_data_items; var++)
535 std::vector<double> cell_data_var(num_cells);
536 cell_data.push_back(cell_data_var);
540 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
541 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
545 unsigned elem_index = elem_iter->GetIndex();
548 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
551 for (
unsigned var=0; var<num_cell_data_items; var++)
553 cell_data[var][elem_index] = p_cell->GetCellData()->GetItem(cell_data_names[var]);
556 for (
unsigned var=0; var<num_cell_data_items; var++)
558 mesh_writer.
AddCellData(cell_data_names[var], cell_data[var]);
563 std::stringstream time;
564 time << num_timesteps;
568 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
569 *(this->mpVtkMetaFile) << num_timesteps;
570 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"results_";
571 *(this->mpVtkMetaFile) << num_timesteps;
572 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
587 unsigned num_cells = this->GetNumAllCells();
589 cell_writer_iter != this->mCellWriters.end();
593 std::vector<double> vtk_cell_data(num_cells);
597 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
601 unsigned elem_index = elem_iter->GetIndex();
604 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
608 vtk_cell_data[elem_index] = (*cell_writer_iter)->GetCellDataForVtkOutput(p_cell,
this);
611 mesh_writer.
AddCellData((*cell_writer_iter)->GetVtkCellDataName(), vtk_cell_data);
615 unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
616 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
618 std::vector<std::vector<double> > cell_data;
619 for (
unsigned var=0; var<num_cell_data_items; var++)
621 std::vector<double> cell_data_var(num_cells);
622 cell_data.push_back(cell_data_var);
627 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
631 unsigned elem_index = elem_iter->GetIndex();
634 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
637 for (
unsigned var=0; var<num_cell_data_items; var++)
639 cell_data[var][elem_index] = p_cell->GetCellData()->GetItem(cell_data_names[var]);
642 for (
unsigned var=0; var<num_cell_data_items; var++)
644 mesh_writer.
AddCellData(cell_data_names[var], cell_data[var]);
648 std::stringstream time;
649 time << num_timesteps;
653 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
654 *(this->mpVtkMetaFile) << num_timesteps;
655 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"cell_results_";
656 *(this->mpVtkMetaFile) << num_timesteps;
657 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
661 unsigned num_edges = 0;
664 const unsigned num_cells = this->GetNumElements();
668 std::vector<unsigned> cell_offset_dist(num_cells);
673 for (
unsigned i=1; i<num_cells; ++i)
675 cell_offset_dist[i] = cell_offset_dist[i-1]+this->GetElement(i-1)->GetNumEdges()+1;
676 num_edges += this->GetElement(i)->GetNumEdges();
679 num_edges += this->GetElement(0)->GetNumEdges();
684 for (
auto cell_writer : this->mCellWriters)
687 std::vector<double> vtk_cell_data(num_edges+num_cells);
690 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
691 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
695 unsigned elem_index = elem_iter->GetIndex();
698 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
702 unsigned elem_num_edges = elem_iter->GetNumEdges();
705 for (
unsigned e = 0; e < elem_num_edges; ++e)
708 vtk_cell_data[cell_offset_dist[elem_index]+e] = cell_writer->GetCellDataForVtkOutput(p_cell,
this);
711 vtk_cell_data[cell_offset_dist[elem_index]+elem_num_edges] = cell_writer->GetCellDataForVtkOutput(p_cell,
this);
713 mesh_writer.
AddCellData(cell_writer->GetVtkCellDataName(), vtk_cell_data);
719 const unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
720 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
722 const unsigned num_edge_data_items = this->Begin()->GetCellEdgeData()->GetNumItems();
723 std::vector<std::string> edge_data_names = this->Begin()->GetCellEdgeData()->GetKeys();
726 const unsigned num_data_items = num_edge_data_items + num_cell_data_items;
727 std::vector<std::string> data_names(num_data_items);
728 for (
unsigned var=0; var<num_edge_data_items; ++var)
730 data_names[var] = edge_data_names[var];
732 for (
unsigned var=num_edge_data_items; var<num_data_items; ++var)
734 data_names[var] = cell_data_names[var-num_edge_data_items];
736 std::vector<std::vector<double> > data_values(num_data_items,
737 std::vector<double>(num_edges + num_cells));
741 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
742 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
745 const unsigned elem_index = elem_iter->GetIndex();
746 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
750 unsigned elem_num_edges = elem_iter->GetNumEdges();
751 for (
unsigned var = 0; var < num_edge_data_items; ++var)
754 for (
unsigned e = 0; e < elem_num_edges; ++e)
756 data_values[var][cell_offset_dist[elem_index]+e] = p_cell->GetCellEdgeData()->GetItem(data_names[var])[e];
759 data_values[var][cell_offset_dist[elem_index]+elem_num_edges] = 0.0;
765 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
766 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
770 unsigned elem_index = elem_iter->GetIndex();
771 unsigned elem_num_edges = elem_iter->GetNumEdges();
774 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
777 for (
unsigned var = num_edge_data_items; var<num_data_items; ++var)
780 for (
unsigned e = 0; e < elem_num_edges; ++e)
782 data_values[var][cell_offset_dist[elem_index]+e] = 0.0;
785 data_values[var][cell_offset_dist[elem_index]+elem_num_edges] = p_cell->GetCellData()->GetItem(data_names[var]);
789 for (
unsigned var=0; var<num_data_items; var++)
791 mesh_writer.
AddCellData(data_names[var], data_values[var]);
795 std::stringstream time;
796 time << num_timesteps;
800 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
801 *(this->mpVtkMetaFile) << num_timesteps;
802 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"results_";
803 *(this->mpVtkMetaFile) << num_timesteps;
804 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
904 EXCEPTION(
"This function is only valid in 2D");
908 unsigned num_vertex_nodes = mpMutableVertexMesh->GetNumNodes();
909 unsigned num_vertex_elements = mpMutableVertexMesh->GetNumElements();
911 std::string mesh_file_name =
"mesh";
914 std::stringstream pid;
916 OutputFileHandler output_file_handler(
"2D_temporary_tetrahedral_mesh_" + pid.str());
920 unsigned num_tetrahedral_nodes = num_vertex_nodes + num_vertex_elements;
923 out_stream p_node_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".node");
924 (*p_node_file) << std::scientific;
925 (*p_node_file) << std::setprecision(20);
926 (*p_node_file) << num_tetrahedral_nodes <<
"\t2\t0\t1" << std::endl;
929 for (
unsigned node_index=0; node_index<num_vertex_nodes; node_index++)
931 Node<DIM>* p_node = mpMutableVertexMesh->GetNode(node_index);
934 unsigned index = p_node->
GetIndex();
935 const c_vector<double, DIM>& r_location = p_node->
rGetLocation();
938 (*p_node_file) << index <<
"\t" << r_location[0] <<
"\t" << r_location[1] <<
"\t" << is_boundary_node << std::endl;
942 unsigned num_tetrahedral_elements = 0;
943 for (
unsigned vertex_elem_index=0; vertex_elem_index<num_vertex_elements; vertex_elem_index++)
945 unsigned index = num_vertex_nodes + vertex_elem_index;
947 c_vector<double, DIM> location = mpMutableVertexMesh->GetCentroidOfElement(vertex_elem_index);
950 unsigned is_boundary_node = 0;
951 (*p_node_file) << index <<
"\t" << location[0] <<
"\t" << location[1] <<
"\t" << is_boundary_node << std::endl;
954 num_tetrahedral_elements += mpMutableVertexMesh->GetElement(vertex_elem_index)->GetNumNodes();
956 p_node_file->close();
959 out_stream p_elem_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".ele");
960 (*p_elem_file) << std::scientific;
961 (*p_elem_file) << num_tetrahedral_elements <<
"\t3\t0" << std::endl;
963 std::set<std::pair<unsigned, unsigned> > tetrahedral_edges;
965 unsigned tetrahedral_elem_index = 0;
966 for (
unsigned vertex_elem_index=0; vertex_elem_index<num_vertex_elements; vertex_elem_index++)
971 unsigned num_nodes_in_vertex_element = p_vertex_element->
GetNumNodes();
972 for (
unsigned local_index=0; local_index<num_nodes_in_vertex_element; local_index++)
975 unsigned node_1_index = p_vertex_element->
GetNodeGlobalIndex((local_index+1)%num_nodes_in_vertex_element);
976 unsigned node_2_index = num_vertex_nodes + vertex_elem_index;
978 (*p_elem_file) << tetrahedral_elem_index++ <<
"\t" << node_0_index <<
"\t" << node_1_index <<
"\t" << node_2_index << std::endl;
981 std::pair<unsigned, unsigned> edge_0 = this->CreateOrderedPair(node_0_index, node_1_index);
982 std::pair<unsigned, unsigned> edge_1 = this->CreateOrderedPair(node_1_index, node_2_index);
983 std::pair<unsigned, unsigned> edge_2 = this->CreateOrderedPair(node_2_index, node_0_index);
985 tetrahedral_edges.insert(edge_0);
986 tetrahedral_edges.insert(edge_1);
987 tetrahedral_edges.insert(edge_2);
990 p_elem_file->close();
993 out_stream p_edge_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".edge");
994 (*p_edge_file) << std::scientific;
995 (*p_edge_file) << tetrahedral_edges.size() <<
"\t1" << std::endl;
997 unsigned edge_index = 0;
998 for (std::set<std::pair<unsigned, unsigned> >::iterator edge_iter = tetrahedral_edges.begin();
999 edge_iter != tetrahedral_edges.end();
1002 std::pair<unsigned, unsigned> this_edge = *edge_iter;
1005 bool is_boundary_edge =
false;
1006 if (this_edge.first < mpMutableVertexMesh->GetNumNodes() &&
1007 this_edge.second < mpMutableVertexMesh->GetNumNodes())
1009 is_boundary_edge = (mpMutableVertexMesh->GetNode(this_edge.first)->IsBoundaryNode() &&
1010 mpMutableVertexMesh->GetNode(this_edge.second)->IsBoundaryNode() );
1012 unsigned is_boundary_edge_unsigned = is_boundary_edge ? 1 : 0;
1014 (*p_edge_file) << edge_index++ <<
"\t" << this_edge.first <<
"\t" << this_edge.second <<
"\t" << is_boundary_edge_unsigned << std::endl;
1016 p_edge_file->close();
1101 unsigned pdeNodeIndex,
1102 std::string& rVariableName,
1103 bool dirichletBoundaryConditionApplies,
1104 double dirichletBoundaryValue)
1106 unsigned num_nodes = this->GetNumNodes();
1111 if (pdeNodeIndex >= num_nodes)
1114 assert(pdeNodeIndex-num_nodes < num_nodes);
1116 CellPtr p_cell = this->GetCellUsingLocationIndex(pdeNodeIndex - num_nodes);
1117 value = p_cell->GetCellData()->GetItem(rVariableName);
1122 if (dirichletBoundaryConditionApplies)
1125 value = dirichletBoundaryValue;
1129 assert(pdeNodeIndex < num_nodes);
1130 Node<DIM>* p_node = this->GetNode(pdeNodeIndex);
1134 for (std::set<unsigned>::iterator index_iter = containing_elements.begin();
1135 index_iter != containing_elements.end();
1138 assert(*index_iter < num_nodes);
1139 CellPtr p_cell = this->GetCellUsingLocationIndex(*index_iter);
1140 value += p_cell->GetCellData()->GetItem(rVariableName);
1142 value /= containing_elements.size();