From 8cdb3b213a10f570115bb665c1794f838d861af3 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Wed, 6 May 1998 14:10:07 +0000 Subject: [PATCH] Use geometry information instead of hand-crafted values. git-svn-id: https://svn.dealii.org/trunk@255 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/source/dofs/dof_handler.cc | 41 ++++++++++---------- deal.II/deal.II/source/grid/tria.cc | 33 +++++++++------- deal.II/deal.II/source/grid/tria_accessor.cc | 25 +++++++----- deal.II/deal.II/source/numerics/data_io.cc | 19 +++++---- 4 files changed, 69 insertions(+), 49 deletions(-) diff --git a/deal.II/deal.II/source/dofs/dof_handler.cc b/deal.II/deal.II/source/dofs/dof_handler.cc index 3fa5fda2a7..1f325e9270 100644 --- a/deal.II/deal.II/source/dofs/dof_handler.cc +++ b/deal.II/deal.II/source/dofs/dof_handler.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -665,7 +666,7 @@ int DoFHandler<1>::distribute_dofs_on_cell (active_cell_iterator &cell, unsigned int next_free_dof) { // distribute dofs of vertices - for (unsigned int v=0; v<2; ++v) + for (unsigned int v=0; v::vertices_per_cell; ++v) { cell_iterator neighbor = cell->neighbor(v); @@ -716,7 +717,7 @@ int DoFHandler<2>::distribute_dofs_on_cell (active_cell_iterator &cell, unsigned int next_free_dof) { if (selected_fe->dofs_per_vertex > 0) // number dofs on vertices - for (unsigned int vertex=0; vertex<4; ++vertex) + for (unsigned int vertex=0; vertex::vertices_per_cell; ++vertex) // check whether dofs for this // vertex have been distributed // (only check the first dof) @@ -725,7 +726,7 @@ int DoFHandler<2>::distribute_dofs_on_cell (active_cell_iterator &cell, cell->set_vertex_dof_index (vertex, d, next_free_dof++); // for the four sides - for (unsigned int side=0; side<4; ++side) + for (unsigned int side=0; side::faces_per_cell; ++side) { line_iterator line = cell->line(side); @@ -1105,11 +1106,11 @@ void DoFHandler<2>::make_sparsity_pattern (dSMatrixStruct &sparsity) const { int dof_number=0; // fill dof indices on vertices - for (unsigned int vertex=0; vertex<4; ++vertex) + for (unsigned int vertex=0; vertex::vertices_per_cell; ++vertex) for (unsigned int d=0; ddofs_per_vertex; ++d) dofs_on_this_cell[dof_number++] = cell->vertex_dof_index (vertex,d); - for (unsigned int line=0; line<4; ++line) + for (unsigned int line=0; line::faces_per_cell; ++line) for (unsigned int d=0; ddofs_per_line; ++d) dofs_on_this_cell[dof_number++] = cell->line(line)->dof_index (d); @@ -1139,7 +1140,7 @@ void DoFHandler::make_transfer_matrix (const DoFHandler &transfer_from // assert for once at the beginning the // the matrices have the correct sizes #ifdef DEBUG - for (unsigned int c=0; c<(1<::children_per_cell; ++c) { Assert (selected_fe->prolongate(c).m() == selected_fe->total_dofs, ExcMatrixHasWrongSize(selected_fe->prolongate(c).m())); @@ -1185,7 +1186,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat dSMatrixStruct &transfer_pattern) const { if (!new_cell->active() && !old_cell->active()) // both cells have children; go deeper - for (unsigned int child=0; child<(1<::children_per_cell; ++child) transfer_cell (old_cell->child(child), new_cell->child(child), transfer_pattern); else @@ -1208,8 +1209,8 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat if (!new_cell->active() && old_cell->active()) // new cell has children, old one has not { - cell_iterator child[1<::children_per_cell]; + for (unsigned int c=0; c::children_per_cell; ++c) { child[c] = new_cell->child(c); Assert (child[c]->active(), @@ -1223,7 +1224,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat Assert (old_dof_indices.size() == selected_fe->total_dofs, ExcInternalError ()); - for (unsigned int c=0; c<(1<::children_per_cell; ++c) { // numbers of child dofs vector child_dof_indices; @@ -1240,8 +1241,8 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat }; } else { // old cell has children, new one has not - cell_iterator child[1<::children_per_cell]; + for (unsigned int c=0; c::children_per_cell; ++c) { child[c] = old_cell->child(c); Assert (child[c]->active(), @@ -1255,7 +1256,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat Assert (new_dof_indices.size() == selected_fe->total_dofs, ExcInternalError ()); - for (unsigned int c=0; c<(1<::children_per_cell; ++c) { // numbers of child dofs vector child_dof_indices; @@ -1281,7 +1282,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat dSMatrix &transfer_matrix) const { if (!new_cell->active() && !old_cell->active()) // both cells have children; go deeper - for (unsigned int child=0; child<(1<::children_per_cell; ++child) transfer_cell (old_cell->child(child), new_cell->child(child), transfer_matrix); else @@ -1304,8 +1305,8 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat if (!new_cell->active() && old_cell->active()) // new cell has children, old one has not { - cell_iterator child[1<::children_per_cell]; + for (unsigned int c=0; c::children_per_cell; ++c) { child[c] = new_cell->child(c); Assert (child[c]->active(), @@ -1319,7 +1320,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat Assert (old_dof_indices.size() == selected_fe->total_dofs, ExcInternalError ()); - for (unsigned int c=0; c<(1<::children_per_cell; ++c) { // numbers of child dofs vector child_dof_indices; @@ -1337,8 +1338,8 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat }; } else { // old cell has children, new one has not - cell_iterator child[1<::children_per_cell]; + for (unsigned int c=0; c::children_per_cell; ++c) { child[c] = old_cell->child(c); Assert (child[c]->active(), @@ -1352,7 +1353,7 @@ void DoFHandler::transfer_cell (const typename DoFHandler::cell_iterat Assert (new_dof_indices.size() == selected_fe->total_dofs, ExcInternalError ()); - for (unsigned int c=0; c<(1<::children_per_cell; ++c) { // numbers of child dofs vector child_dof_indices; diff --git a/deal.II/deal.II/source/grid/tria.cc b/deal.II/deal.II/source/grid/tria.cc index acc8ae2a49..0a2daf6ca7 100644 --- a/deal.II/deal.II/source/grid/tria.cc +++ b/deal.II/deal.II/source/grid/tria.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -109,7 +110,7 @@ void Triangulation<1>::create_triangulation (const vector > &v, // for all lines for (; line!=end(); ++line) // for each of the two vertices - for (unsigned int vertex=0; vertex<(1<::vertices_per_cell; ++vertex) // if first cell adjacent to this // vertex is the present one, then // the neighbor is the second adjacent @@ -210,10 +211,14 @@ void Triangulation<2>::create_triangulation (const vector > &v, swap (cells[cell].vertices[0], cells[cell].vertices[2]); swap (cells[cell].vertices[1], cells[cell].vertices[3]); // remake lines - line_vertices[0] = make_pair (cells[cell].vertices[0], cells[cell].vertices[1]); - line_vertices[1] = make_pair (cells[cell].vertices[1], cells[cell].vertices[2]); - line_vertices[2] = make_pair (cells[cell].vertices[0], cells[cell].vertices[3]); - line_vertices[3] = make_pair (cells[cell].vertices[3], cells[cell].vertices[2]); + line_vertices[0] + = make_pair (cells[cell].vertices[0], cells[cell].vertices[1]); + line_vertices[1] + = make_pair (cells[cell].vertices[1], cells[cell].vertices[2]); + line_vertices[2] + = make_pair (cells[cell].vertices[0], cells[cell].vertices[3]); + line_vertices[3] + = make_pair (cells[cell].vertices[3], cells[cell].vertices[2]); // allow for only one such // rotation break; @@ -1654,7 +1659,7 @@ unsigned int Triangulation::max_adjacent_cells () const { // used on level 0 unsigned int max_vertex_index = 0; for (; cell!=endc; ++cell) - for (unsigned vertex=0; vertex<(1<::vertices_per_cell; ++vertex) if (cell->vertex_index(vertex) > (signed int)max_vertex_index) max_vertex_index = cell->vertex_index(vertex); @@ -1665,10 +1670,10 @@ unsigned int Triangulation::max_adjacent_cells () const { // touch a vertex's usage count everytime // we find an adjacent element for (cell=begin(); cell!=endc; ++cell) - for (unsigned vertex=0; vertex<(1<::vertices_per_cell; ++vertex) ++usage_count[cell->vertex_index(vertex)]; - return max (static_cast(1<::vertices_per_cell, static_cast(*(max_element (usage_count.begin(), usage_count.end())))); }; @@ -1701,7 +1706,7 @@ void Triangulation::print_gnuplot (ostream &out, const unsigned int level) void Triangulation<1>::print_gnuplot (ostream &out, - const TriaDimensionInfo<1>::active_cell_iterator & cell) const { + const active_cell_iterator & cell) const { out << cell->vertex(0) << " " << cell->level() << endl << cell->vertex(1) << " " << cell->level() << endl << endl; @@ -1710,7 +1715,7 @@ void Triangulation<1>::print_gnuplot (ostream &out, void Triangulation<2>::print_gnuplot (ostream &out, - const TriaDimensionInfo<2>::active_cell_iterator & cell) const { + const active_cell_iterator & cell) const { out << cell->vertex(0) << " " << cell->level() << endl << cell->vertex(1) << " " << cell->level() << endl << cell->vertex(2) << " " << cell->level() << endl @@ -1792,12 +1797,14 @@ void Triangulation<1>::execute_refinement () { // 2*flagged_cells that will be created // on that level levels[level+1]-> - TriangulationLevel<0>::reserve_space (used_cells+2*flagged_cells, 1); + TriangulationLevel<0>::reserve_space (used_cells+ + GeometryInfo<1>::children_per_cell * + flagged_cells, 1); // reserve space for 2*flagged_cells // new lines on the next higher // level levels[level+1]-> - TriangulationLevel<1>::reserve_space (2*flagged_cells); + TriangulationLevel<1>::reserve_space (GeometryInfo<1>::children_per_cell*flagged_cells); needed_vertices += flagged_cells; }; @@ -2517,7 +2524,7 @@ void Triangulation::prepare_refinement () { for (; cell != endc; --cell) if (cell->refine_flag_set() == true) // loop over neighbors of cell - for (unsigned int i=0; i<(2*dim); ++i) + for (unsigned int i=0; i::faces_per_cell; ++i) if (cell->neighbor(i).state() == valid) if ((cell->neighbor_level(i) == cell->level()-1) && diff --git a/deal.II/deal.II/source/grid/tria_accessor.cc b/deal.II/deal.II/source/grid/tria_accessor.cc index cd609f7d7c..0992b5c017 100644 --- a/deal.II/deal.II/source/grid/tria_accessor.cc +++ b/deal.II/deal.II/source/grid/tria_accessor.cc @@ -4,6 +4,7 @@ #include #include #include +#include /* Note: explicit instantiations at the end of the different sections! */ @@ -595,18 +596,20 @@ CellAccessor<2>::face (const unsigned int i) const { template int CellAccessor::neighbor_index (const unsigned int i) const { - Assert (i<2*dim, + Assert (i::faces_per_cell, typename TriaSubstructAccessor::ExcInvalidNeighbor(i)); - return tria->levels[present_level]->neighbors[present_index*2*dim+i].second; + return tria->levels[present_level]-> + neighbors[present_index*GeometryInfo::faces_per_cell+i].second; }; template int CellAccessor::neighbor_level (const unsigned int i) const { - Assert (i<2*dim, + Assert (i::faces_per_cell, typename TriaSubstructAccessor::ExcInvalidNeighbor(i)); - return tria->levels[present_level]->neighbors[present_index*2*dim+i].first; + return tria->levels[present_level]-> + neighbors[present_index*GeometryInfo::faces_per_cell+i].first; }; @@ -614,10 +617,13 @@ int CellAccessor::neighbor_level (const unsigned int i) const { template void CellAccessor::set_neighbor (const unsigned int i, const TriaIterator > &pointer) const { - Assert (i<2*dim, typename TriaSubstructAccessor::ExcInvalidNeighbor(i)); - tria->levels[present_level]->neighbors[present_index*2*dim+i].first + Assert (i::faces_per_cell, + typename TriaSubstructAccessor::ExcInvalidNeighbor(i)); + tria->levels[present_level]-> + neighbors[present_index*GeometryInfo::faces_per_cell+i].first = pointer.accessor.present_level; - tria->levels[present_level]->neighbors[present_index*2*dim+i].second + tria->levels[present_level]-> + neighbors[present_index*GeometryInfo::faces_per_cell+i].second = pointer.accessor.present_index; }; @@ -626,8 +632,9 @@ void CellAccessor::set_neighbor (const unsigned int i, template bool CellAccessor::at_boundary (const unsigned int i) const { Assert (used(), typename TriaSubstructAccessor::ExcCellNotUsed()); - Assert (i<2*dim, - typename TriaSubstructAccessor::ExcInvalidIndex (i,0,2*dim-1)); + Assert (i::faces_per_cell, + typename TriaSubstructAccessor:: + ExcInvalidIndex (i,0,GeometryInfo::faces_per_cell-1)); return (neighbor_index(i) == -1); }; diff --git a/deal.II/deal.II/source/numerics/data_io.cc b/deal.II/deal.II/source/numerics/data_io.cc index c5194bb06d..a6531dd253 100644 --- a/deal.II/deal.II/source/numerics/data_io.cc +++ b/deal.II/deal.II/source/numerics/data_io.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -119,13 +120,13 @@ void DataIn::read_ucd (istream &in) { { // allocate and read indices cells.push_back (CellData()); - for (unsigned int i=0; i<(1<::vertices_per_cell; ++i) in >> cells.back().vertices[i]; cells.back().material_id = material_id; // transform from ucd to // consecutive numbering - for (unsigned int i=0; i<(1<::vertices_per_cell; ++i) if (vertex_indices.find (cells.back().vertices[i]) != vertex_indices.end()) // vertex with this index exists cells.back().vertices[i] = vertex_indices[cells.back().vertices[i]]; @@ -246,7 +247,8 @@ void DataOut::write_ucd (ostream &out) const { // use vector is_vertex_dof (dofs->n_dofs(), false); for (cell=dofs->begin_active(); cell!=endc; ++cell) - for (unsigned int vertex=0; vertex<(1<::vertices_per_cell; + ++vertex) is_vertex_dof[cell->vertex_dof_index(vertex,0)] = true; n_vertex_dofs = 0; @@ -295,7 +297,8 @@ void DataOut::write_ucd (ostream &out) const { vector already_written (dofs->n_dofs(), false); // write vertices for (cell=dofs->begin_active(); cell!=endc; ++cell) - for (unsigned int vertex=0; vertex<(1<::vertices_per_cell; + ++vertex) if (already_written[cell->vertex_dof_index(vertex,0)]==false) { out << cell->vertex_dof_index(vertex,0) // vertex index @@ -329,7 +332,8 @@ void DataOut::write_ucd (ostream &out) const { default: Assert (false, ExcNotImplemented()); }; - for (unsigned int vertex=0; vertex<(1<::vertices_per_cell; + ++vertex) out << cell->vertex_dof_index(vertex,0) << ' '; out << endl; }; @@ -360,7 +364,8 @@ void DataOut::write_ucd (ostream &out) const { vector already_written (dofs->n_dofs(), false); // write vertices for (cell=dofs->begin_active(); cell!=endc; ++cell) - for (unsigned int vertex=0; vertex<(1<::vertices_per_cell; + ++vertex) if (already_written[cell->vertex_dof_index(vertex,0)]==false) { out << cell->vertex_dof_index(vertex,0) // vertex index @@ -429,7 +434,7 @@ void DataOut::write_ucd_faces (ostream &out, default: Assert (false, ExcNotImplemented()); }; - for (unsigned int vertex=0; vertex<(1<<(dim-1)); ++vertex) + for (unsigned int vertex=0; vertex::vertices_per_face; ++vertex) out << face->vertex_dof_index(vertex,0) << ' '; out << endl; -- 2.39.5