495 unsigned num_cells = this->GetNumAllCells();
500 for (
auto cell_writer_iter = this->mCellWriters.begin();
501 cell_writer_iter != this->mCellWriters.end();
505 std::vector<double> vtk_cell_data(num_cells);
508 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
509 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
513 unsigned elem_index = elem_iter->GetIndex();
516 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
520 vtk_cell_data[elem_index] = (*cell_writer_iter)->GetCellDataForVtkOutput(p_cell,
this);
523 mesh_writer.
AddCellData((*cell_writer_iter)->GetVtkCellDataName(), vtk_cell_data);
527 unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
528 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
530 std::vector<std::vector<double> > cell_data;
531 for (
unsigned var=0; var<num_cell_data_items; var++)
533 std::vector<double> cell_data_var(num_cells);
534 cell_data.push_back(cell_data_var);
538 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
539 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
543 unsigned elem_index = elem_iter->GetIndex();
546 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
549 for (
unsigned var=0; var<num_cell_data_items; var++)
551 cell_data[var][elem_index] = p_cell->GetCellData()->GetItem(cell_data_names[var]);
554 for (
unsigned var=0; var<num_cell_data_items; var++)
556 mesh_writer.
AddCellData(cell_data_names[var], cell_data[var]);
561 std::stringstream time;
562 time << num_timesteps;
566 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
567 *(this->mpVtkMetaFile) << num_timesteps;
568 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"results_";
569 *(this->mpVtkMetaFile) << num_timesteps;
570 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
582 unsigned num_cells = this->GetNumAllCells();
584 cell_writer_iter != this->mCellWriters.end();
588 std::vector<double> vtk_cell_data(num_cells);
592 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
596 unsigned elem_index = elem_iter->GetIndex();
599 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
603 vtk_cell_data[elem_index] = (*cell_writer_iter)->GetCellDataForVtkOutput(p_cell,
this);
606 mesh_writer.
AddCellData((*cell_writer_iter)->GetVtkCellDataName(), vtk_cell_data);
610 unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
611 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
613 std::vector<std::vector<double> > cell_data;
614 for (
unsigned var=0; var<num_cell_data_items; var++)
616 std::vector<double> cell_data_var(num_cells);
617 cell_data.push_back(cell_data_var);
622 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
626 unsigned elem_index = elem_iter->GetIndex();
629 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
632 for (
unsigned var=0; var<num_cell_data_items; var++)
634 cell_data[var][elem_index] = p_cell->GetCellData()->GetItem(cell_data_names[var]);
637 for (
unsigned var=0; var<num_cell_data_items; var++)
639 mesh_writer.
AddCellData(cell_data_names[var], cell_data[var]);
643 std::stringstream time;
644 time << num_timesteps;
648 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
649 *(this->mpVtkMetaFile) << num_timesteps;
650 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"cell_results_";
651 *(this->mpVtkMetaFile) << num_timesteps;
652 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
656 unsigned num_edges = 0;
659 const unsigned num_cells = this->GetNumElements();
663 std::vector<unsigned> cell_offset_dist(num_cells);
668 for (
unsigned i=1; i<num_cells; ++i)
670 cell_offset_dist[i] = cell_offset_dist[i-1]+this->GetElement(i-1)->GetNumEdges()+1;
671 num_edges += this->GetElement(i)->GetNumEdges();
674 num_edges += this->GetElement(0)->GetNumEdges();
679 for (
auto cell_writer : this->mCellWriters)
682 std::vector<double> vtk_cell_data(num_edges+num_cells);
685 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
686 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
690 unsigned elem_index = elem_iter->GetIndex();
693 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
697 unsigned elem_num_edges = elem_iter->GetNumEdges();
700 for (
unsigned e = 0; e < elem_num_edges; ++e)
703 vtk_cell_data[cell_offset_dist[elem_index]+e] = cell_writer->GetCellDataForVtkOutput(p_cell,
this);
706 vtk_cell_data[cell_offset_dist[elem_index]+elem_num_edges] = cell_writer->GetCellDataForVtkOutput(p_cell,
this);
708 mesh_writer.
AddCellData(cell_writer->GetVtkCellDataName(), vtk_cell_data);
714 const unsigned num_cell_data_items = this->Begin()->GetCellData()->GetNumItems();
715 std::vector<std::string> cell_data_names = this->Begin()->GetCellData()->GetKeys();
717 const unsigned num_edge_data_items = this->Begin()->GetCellEdgeData()->GetNumItems();
718 std::vector<std::string> edge_data_names = this->Begin()->GetCellEdgeData()->GetKeys();
721 const unsigned num_data_items = num_edge_data_items + num_cell_data_items;
722 std::vector<std::string> data_names(num_data_items);
723 for (
unsigned var=0; var<num_edge_data_items; ++var)
725 data_names[var] = edge_data_names[var];
727 for (
unsigned var=num_edge_data_items; var<num_data_items; ++var)
729 data_names[var] = cell_data_names[var-num_edge_data_items];
731 std::vector<std::vector<double> > data_values(num_data_items,
732 std::vector<double>(num_edges + num_cells));
736 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
737 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
740 const unsigned elem_index = elem_iter->GetIndex();
741 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
745 unsigned elem_num_edges = elem_iter->GetNumEdges();
746 for (
unsigned var = 0; var < num_edge_data_items; ++var)
749 for (
unsigned e = 0; e < elem_num_edges; ++e)
751 data_values[var][cell_offset_dist[elem_index]+e] = p_cell->GetCellEdgeData()->GetItem(data_names[var])[e];
754 data_values[var][cell_offset_dist[elem_index]+elem_num_edges] = 0.0;
760 for (
auto elem_iter = mpMutableVertexMesh->GetElementIteratorBegin();
761 elem_iter != mpMutableVertexMesh->GetElementIteratorEnd();
765 unsigned elem_index = elem_iter->GetIndex();
766 unsigned elem_num_edges = elem_iter->GetNumEdges();
769 CellPtr p_cell = this->GetCellUsingLocationIndex(elem_index);
772 for (
unsigned var = num_edge_data_items; var<num_data_items; ++var)
775 for (
unsigned e = 0; e < elem_num_edges; ++e)
777 data_values[var][cell_offset_dist[elem_index]+e] = 0.0;
780 data_values[var][cell_offset_dist[elem_index]+elem_num_edges] = p_cell->GetCellData()->GetItem(data_names[var]);
784 for (
unsigned var=0; var<num_data_items; var++)
786 mesh_writer.
AddCellData(data_names[var], data_values[var]);
790 std::stringstream time;
791 time << num_timesteps;
795 *(this->mpVtkMetaFile) <<
" <DataSet timestep=\"";
796 *(this->mpVtkMetaFile) << num_timesteps;
797 *(this->mpVtkMetaFile) <<
"\" group=\"\" part=\"0\" file=\"results_";
798 *(this->mpVtkMetaFile) << num_timesteps;
799 *(this->mpVtkMetaFile) <<
".vtu\"/>\n";
898 EXCEPTION(
"This function is only valid in 2D");
902 unsigned num_vertex_nodes = mpMutableVertexMesh->GetNumNodes();
903 unsigned num_vertex_elements = mpMutableVertexMesh->GetNumElements();
905 std::string mesh_file_name =
"mesh";
908 std::stringstream pid;
910 OutputFileHandler output_file_handler(
"2D_temporary_tetrahedral_mesh_" + pid.str());
914 unsigned num_tetrahedral_nodes = num_vertex_nodes + num_vertex_elements;
917 out_stream p_node_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".node");
918 (*p_node_file) << std::scientific;
919 (*p_node_file) << std::setprecision(20);
920 (*p_node_file) << num_tetrahedral_nodes <<
"\t2\t0\t1" << std::endl;
923 for (
unsigned node_index=0; node_index<num_vertex_nodes; node_index++)
925 Node<DIM>* p_node = mpMutableVertexMesh->GetNode(node_index);
928 unsigned index = p_node->
GetIndex();
929 const c_vector<double, DIM>& r_location = p_node->
rGetLocation();
932 (*p_node_file) << index <<
"\t" << r_location[0] <<
"\t" << r_location[1] <<
"\t" << is_boundary_node << std::endl;
936 unsigned num_tetrahedral_elements = 0;
937 for (
unsigned vertex_elem_index=0; vertex_elem_index<num_vertex_elements; vertex_elem_index++)
939 unsigned index = num_vertex_nodes + vertex_elem_index;
941 c_vector<double, DIM> location = mpMutableVertexMesh->GetCentroidOfElement(vertex_elem_index);
944 unsigned is_boundary_node = 0;
945 (*p_node_file) << index <<
"\t" << location[0] <<
"\t" << location[1] <<
"\t" << is_boundary_node << std::endl;
948 num_tetrahedral_elements += mpMutableVertexMesh->GetElement(vertex_elem_index)->GetNumNodes();
950 p_node_file->close();
953 out_stream p_elem_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".ele");
954 (*p_elem_file) << std::scientific;
955 (*p_elem_file) << num_tetrahedral_elements <<
"\t3\t0" << std::endl;
957 std::set<std::pair<unsigned, unsigned> > tetrahedral_edges;
959 unsigned tetrahedral_elem_index = 0;
960 for (
unsigned vertex_elem_index=0; vertex_elem_index<num_vertex_elements; vertex_elem_index++)
965 unsigned num_nodes_in_vertex_element = p_vertex_element->
GetNumNodes();
966 for (
unsigned local_index=0; local_index<num_nodes_in_vertex_element; local_index++)
969 unsigned node_1_index = p_vertex_element->
GetNodeGlobalIndex((local_index+1)%num_nodes_in_vertex_element);
970 unsigned node_2_index = num_vertex_nodes + vertex_elem_index;
972 (*p_elem_file) << tetrahedral_elem_index++ <<
"\t" << node_0_index <<
"\t" << node_1_index <<
"\t" << node_2_index << std::endl;
975 std::pair<unsigned, unsigned> edge_0 = this->CreateOrderedPair(node_0_index, node_1_index);
976 std::pair<unsigned, unsigned> edge_1 = this->CreateOrderedPair(node_1_index, node_2_index);
977 std::pair<unsigned, unsigned> edge_2 = this->CreateOrderedPair(node_2_index, node_0_index);
979 tetrahedral_edges.insert(edge_0);
980 tetrahedral_edges.insert(edge_1);
981 tetrahedral_edges.insert(edge_2);
984 p_elem_file->close();
987 out_stream p_edge_file = output_file_handler.
OpenOutputFile(mesh_file_name+
".edge");
988 (*p_edge_file) << std::scientific;
989 (*p_edge_file) << tetrahedral_edges.size() <<
"\t1" << std::endl;
991 unsigned edge_index = 0;
992 for (std::set<std::pair<unsigned, unsigned> >::iterator edge_iter = tetrahedral_edges.begin();
993 edge_iter != tetrahedral_edges.end();
996 std::pair<unsigned, unsigned> this_edge = *edge_iter;
999 bool is_boundary_edge =
false;
1000 if (this_edge.first < mpMutableVertexMesh->GetNumNodes() &&
1001 this_edge.second < mpMutableVertexMesh->GetNumNodes())
1003 is_boundary_edge = (mpMutableVertexMesh->GetNode(this_edge.first)->IsBoundaryNode() &&
1004 mpMutableVertexMesh->GetNode(this_edge.second)->IsBoundaryNode() );
1006 unsigned is_boundary_edge_unsigned = is_boundary_edge ? 1 : 0;
1008 (*p_edge_file) << edge_index++ <<
"\t" << this_edge.first <<
"\t" << this_edge.second <<
"\t" << is_boundary_edge_unsigned << std::endl;
1010 p_edge_file->close();
1095 unsigned pdeNodeIndex,
1096 std::string& rVariableName,
1097 bool dirichletBoundaryConditionApplies,
1098 double dirichletBoundaryValue)
1100 unsigned num_nodes = this->GetNumNodes();
1105 if (pdeNodeIndex >= num_nodes)
1108 assert(pdeNodeIndex-num_nodes < num_nodes);
1110 CellPtr p_cell = this->GetCellUsingLocationIndex(pdeNodeIndex - num_nodes);
1111 value = p_cell->GetCellData()->GetItem(rVariableName);
1116 if (dirichletBoundaryConditionApplies)
1119 value = dirichletBoundaryValue;
1123 assert(pdeNodeIndex < num_nodes);
1124 Node<DIM>* p_node = this->GetNode(pdeNodeIndex);
1128 for (std::set<unsigned>::iterator index_iter = containing_elements.begin();
1129 index_iter != containing_elements.end();
1132 assert(*index_iter < num_nodes);
1133 CellPtr p_cell = this->GetCellUsingLocationIndex(*index_iter);
1134 value += p_cell->GetCellData()->GetItem(rVariableName);
1136 value /= containing_elements.size();