Dear Martin, unfortunately I have to revise all my statements. Updating the deal.II library to the most recent developement version did not solve the problem. I made a stupid mistake while creating the file for the test case. The function make_offdiagonal_sparsity_pattern () has been commented out in the test case file. And with this line commented out I need the same time to copy as you did. If I take into account this function the time to copy the dynamicsparsitypattern becomes as big as before. I attached the corrected testcase file to the post again and also the two log files one for each run. Can you run the program on your machine with the modified file again and figure out whether you get similiar results or not? If you observe the same behavior we can be sure that the problem is related to my function make_offdiagonal_sparsity_pattern () and the way I create the sparsity pattern.
Best, Dustin > -- The deal.II project is located at http://www.dealii.org/ For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en --- You received this message because you are subscribed to the Google Groups "deal.II User Group" group. To unsubscribe from this group and stop receiving emails from it, send an email to dealii+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
#include <deal.II/base/logstream.h> #include <deal.II/base/timer.h> #include <deal.II/dofs/dof_tools.h> #include <deal.II/fe/fe_nothing.h> #include <deal.II/fe/fe_q.h> #include <deal.II/fe/fe_system.h> #include <deal.II/grid/grid_generator.h> #include <deal.II/grid/tria.h> #include <deal.II/hp/dof_handler.h> #include <deal.II/hp/fe_values.h> #include <deal.II/hp/q_collection.h> #include <deal.II/lac/block_sparsity_pattern.h> #include <deal.II/lac/block_sparse_matrix.h> #include <deal.II/numerics/vector_tools.h> #include <fstream> struct FacePointData { unsigned int master_face_no, slave_face_no, master_q_point_index; dealii::hp::DoFHandler<3>::cell_iterator master_cell, slave_cell; std::vector<dealii::types::global_dof_index> slave_face_dofs, master_face_dofs, slave_local_face_dofs, master_local_face_dofs, biorthogonal_face_dofs; }; class InterfaceData { public: InterfaceData (); std::map<dealii::types::global_dof_index, dealii::IndexSet>& biorthogonal_master_dof_connections (); std::map<dealii::types::global_dof_index, dealii::IndexSet>& biorthogonal_slave_dof_connections (); void initialise (unsigned int const n_interface_q_points); std::map<dealii::types::global_dof_index, dealii::IndexSet>& master_biorthogonal_dof_connections (); std::vector<dealii::Point<3>>& master_q_points (); std::map<dealii::types::global_dof_index, dealii::IndexSet>& master_slave_dof_connections (); unsigned int n_cells_master (); unsigned int n_cells_slave (); unsigned int ndofs_biorthogonal (); std::vector<FacePointData>& q_point_data (); void setup_data (dealii::hp::DoFHandler<3> const& dofhandler_m, dealii::hp::DoFHandler<3> const& dofhandler_s, dealii::hp::QCollection<2> const& face_q_collection); std::map<dealii::types::global_dof_index, dealii::IndexSet>& slave_biorthogonal_dof_connections (); std::map<dealii::types::global_dof_index, dealii::IndexSet>& slave_master_dof_connections (); private: void add_interface_q_point_data (unsigned int const& index, unsigned int const& slave_face_no, dealii::hp::DoFHandler<3>::cell_iterator const& master_cell, dealii::hp::DoFHandler<3>::cell_iterator const& slave_cell); void detect_contact_interface(dealii::hp::DoFHandler<3> const& dofhandler_m, dealii::hp::DoFHandler<3> const& dofhandler_s, dealii::hp::QCollection<2> const& face_q_collection, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator>& master_cells, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator>& slave_cells, std::vector<unsigned int>& slave_face_no, unsigned int& master_counter, unsigned int& slave_counter, unsigned int& n_interface_q_points); void setup_interface_q_point_data(std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator> const& master_cells, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator> const& slave_cells, std::vector<unsigned int> const& slave_face_no, unsigned int const n_master_cells, unsigned int const n_slave_cells, dealii::hp::FECollection<3> const& fe_collection, dealii::hp::QCollection<2> const& face_q_collection); void setup_interface_dof_connections (unsigned int const ndofs_m, unsigned int const ndofs_s); unsigned int ndofs_bi, ncells_m, ncells_s; std::vector<dealii::Point<3>> m_q_points; std::vector<FacePointData> qpoint_data; std::map<dealii::types::global_dof_index, dealii::IndexSet> m_bi_dof_conn, s_bi_dof_conn, bi_m_dof_conn, bi_s_dof_conn, m_s_dof_conn, s_m_dof_conn; }; using namespace dealii; InterfaceData::InterfaceData () : ndofs_bi(0), ncells_m (0), ncells_s (0) { } std::map<types::global_dof_index, IndexSet>& InterfaceData::biorthogonal_master_dof_connections () { return bi_m_dof_conn; } std::map<types::global_dof_index, IndexSet>& InterfaceData::biorthogonal_slave_dof_connections () { return bi_s_dof_conn; } void InterfaceData::initialise (unsigned int const n_interface_q_points) { { std::vector<FacePointData> tmp; tmp.swap(qpoint_data); qpoint_data.resize(n_interface_q_points); } { std::vector<Point<3>> tmp; tmp.swap(m_q_points); m_q_points.resize(n_interface_q_points); } std::map<types::global_dof_index, IndexSet> tmp_m_bi, tmp_s_bi, tmp_bi_m, tmp_bi_s, tmp_m_s, tmp_s_m; tmp_m_bi.swap(m_bi_dof_conn); tmp_s_bi.swap(s_bi_dof_conn); tmp_bi_m.swap(bi_m_dof_conn); tmp_bi_s.swap(bi_s_dof_conn); tmp_m_s.swap(m_s_dof_conn); tmp_s_m.swap(s_m_dof_conn); } std::map<types::global_dof_index, IndexSet>& InterfaceData::master_biorthogonal_dof_connections () { return m_bi_dof_conn; } std::vector<Point<3>>& InterfaceData::master_q_points() { Assert (m_q_points.size() > 0, ExcNotInitialized ()); return m_q_points; } std::map<types::global_dof_index, IndexSet>& InterfaceData::master_slave_dof_connections () { return m_s_dof_conn; } unsigned int InterfaceData::n_cells_master () { return ncells_m; } unsigned int InterfaceData::n_cells_slave () { return ncells_s; } unsigned int InterfaceData::ndofs_biorthogonal() { Assert (ndofs_bi > 0, ExcInternalError ("No degrees of freedom found on the interface.")); return ndofs_bi; } std::vector<FacePointData>& InterfaceData::q_point_data() { Assert(qpoint_data.size() > 0, ExcNotInitialized()); return qpoint_data; } void InterfaceData::setup_data (hp::DoFHandler<3> const& dofhandler_m, hp::DoFHandler<3> const& dofhandler_s, hp::QCollection<2> const& face_q_collection) { std::vector<hp::DoFHandler<3>::active_cell_iterator> master_cells(dofhandler_m.get_triangulation().n_active_cells(), dofhandler_m.end()), slave_cells (dofhandler_s.get_triangulation().n_active_cells (), dofhandler_s.end ()); std::vector<unsigned int> slave_face_no (dofhandler_s.get_triangulation().n_faces(), 7); unsigned int slave_counter = 0, master_counter = 0, n_interface_q_points = 0; detect_contact_interface(dofhandler_m, dofhandler_s, face_q_collection, master_cells, slave_cells, slave_face_no, master_counter, slave_counter, n_interface_q_points); initialise(n_interface_q_points); hp::FECollection<3> const& fe_collection = dofhandler_m.get_fe(); setup_interface_q_point_data(master_cells, slave_cells, slave_face_no, master_counter, slave_counter, fe_collection, face_q_collection); setup_interface_dof_connections(dofhandler_m.n_dofs(), dofhandler_s.n_dofs()); } std::map<types::global_dof_index, IndexSet>& InterfaceData::slave_biorthogonal_dof_connections () { return s_bi_dof_conn; } std::map<types::global_dof_index, IndexSet>& InterfaceData::slave_master_dof_connections () { return s_m_dof_conn; } void InterfaceData::add_interface_q_point_data (unsigned int const& index, unsigned int const& slave_face_no, dealii::hp::DoFHandler<3>::cell_iterator const& master_cell, dealii::hp::DoFHandler<3>::cell_iterator const& slave_cell) { FiniteElement<3> const* master_fe(&master_cell->get_fe()); FiniteElement<3> const* slave_fe(&slave_cell->get_fe()); unsigned int const master_face_no = 1 - 2*(slave_face_no % 2) + slave_face_no; qpoint_data[index].master_q_point_index = index; qpoint_data[index].master_face_no = master_face_no; qpoint_data[index].master_cell = master_cell; qpoint_data[index].slave_face_no = slave_face_no; qpoint_data[index].slave_cell = slave_cell; qpoint_data[index].master_face_dofs.resize(master_fe->dofs_per_face); qpoint_data[index].slave_face_dofs.resize(slave_fe->dofs_per_face); master_cell->face(master_face_no)->get_dof_indices(qpoint_data[index].master_face_dofs, master_cell->active_fe_index()); slave_cell->face(slave_face_no)->get_dof_indices(qpoint_data[index].slave_face_dofs, slave_cell->active_fe_index()); for (unsigned int i = 0; i < master_fe->dofs_per_cell; ++i) { if (master_fe->has_support_on_face(i,master_face_no)) { qpoint_data[index].master_local_face_dofs.push_back(i); } } for (unsigned int i = 0; i < slave_fe->dofs_per_cell; ++i) { if (slave_fe->has_support_on_face(i, slave_face_no)) { qpoint_data[index].slave_local_face_dofs.push_back(i); } } } void InterfaceData::detect_contact_interface(dealii::hp::DoFHandler<3> const& dofhandler_m, dealii::hp::DoFHandler<3> const& dofhandler_s, dealii::hp::QCollection<2> const& face_q_collection, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator>& master_cells, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator>& slave_cells, std::vector<unsigned int>& slave_face_no, unsigned int& master_counter, unsigned int& slave_counter, unsigned int& n_interface_q_points) { ncells_m = 0; ncells_s = 0; typename hp::DoFHandler<3>::active_cell_iterator cell = dofhandler_s.begin_active(), endc = dofhandler_s.end(); for (; cell != endc; ++cell) { if (dynamic_cast<const FE_Nothing<3>*>(&cell->get_fe().base_element(0))) { continue; } cell->set_user_flag(); ++ncells_s; for (unsigned int face_no = 0; face_no < GeometryInfo<3>::faces_per_cell; ++face_no) { if (cell->face(face_no)->at_boundary()) { continue; } if (dynamic_cast<const FE_Nothing<3>*>(&cell->neighbor(face_no)->get_fe().base_element(0))) { slave_cells[slave_counter] = cell; slave_face_no[slave_counter] = face_no; n_interface_q_points += face_q_collection[cell->active_fe_index()].size(); ++slave_counter; } } } cell = dofhandler_m.begin_active(), endc = dofhandler_m.end(); for (; cell != endc; ++cell) { if (dynamic_cast<const FE_Nothing<3>*>(&cell->get_fe().base_element(0))) { continue; } cell->set_user_flag(); ++ncells_m; for (unsigned int face_no = 0; face_no < GeometryInfo<3>::faces_per_cell; ++face_no) { if (cell->face(face_no)->at_boundary()) { continue; } if (dynamic_cast<const FE_Nothing<3>*>(&cell->neighbor(face_no)->get_fe().base_element(0))) { master_cells[master_counter] = cell; ++master_counter; } } } } void InterfaceData::setup_interface_q_point_data(std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator> const& master_cells, std::vector<dealii::hp::DoFHandler<3>::active_cell_iterator> const& slave_cells, std::vector<unsigned int> const& slave_face_no, unsigned int const n_master_cells, unsigned int const n_slave_cells, dealii::hp::FECollection<3> const& fe_collection, dealii::hp::QCollection<2> const& face_q_collection) { unsigned int index = 0; hp::FEFaceValues<3> fe_face_values (fe_collection, face_q_collection, update_quadrature_points); for (unsigned int i = 0; i < n_slave_cells; ++i) { slave_cells[i]->face(slave_face_no[i])->set_user_pointer(&qpoint_data[index]); fe_face_values.reinit (slave_cells[i], slave_face_no[i]); std::vector<Point<3>> q_points(fe_face_values.get_present_fe_values().get_quadrature_points()); for (unsigned int q = 0; q < q_points.size(); ++q) { for (unsigned int j = 0; j < n_master_cells; ++j) { if (master_cells[j]->point_inside(q_points[q])) { add_interface_q_point_data(index, slave_face_no[i], master_cells[j], slave_cells[i]); m_q_points[index] = StaticMappingQ1<3>::mapping.transform_real_to_unit_cell (master_cells[j], q_points[q]); } } ++index; } } Assert(index == qpoint_data.size (), ExcInternalError()); } void InterfaceData::setup_interface_dof_connections (unsigned int const ndofs_m, unsigned int const ndofs_s) { std::map<types::global_dof_index, std::pair<types::global_dof_index, IndexSet>> s_s_dof_conn; unsigned int counter = 0; for (unsigned int i = 0; i < qpoint_data.size(); ++i) { std::vector<types::global_dof_index> master_dofs (qpoint_data[i].master_face_dofs), slave_dofs (qpoint_data[i].slave_face_dofs); for (unsigned int k = 0; k < master_dofs.size(); ++k) { for (unsigned int l = 0; l < slave_dofs.size(); ++l) { if (m_s_dof_conn.find(master_dofs[k]) == m_s_dof_conn.end()) { m_s_dof_conn.insert(std::make_pair(master_dofs[k], IndexSet (ndofs_s))); m_s_dof_conn[master_dofs[k]].add_index(slave_dofs[l]); } else { m_s_dof_conn[master_dofs[k]].add_index(slave_dofs[l]); m_s_dof_conn[master_dofs[k]].compress(); } if (s_m_dof_conn.find(slave_dofs[l]) == s_m_dof_conn.end()) { s_m_dof_conn.insert(std::make_pair(slave_dofs[l], IndexSet (ndofs_m))); s_m_dof_conn[slave_dofs[l]].add_index(master_dofs[k]); s_s_dof_conn.insert(std::make_pair(slave_dofs[l], std::make_pair(counter, IndexSet (ndofs_s)))); s_s_dof_conn[slave_dofs[l]].second.add_indices(slave_dofs.begin(), slave_dofs.end()); ++counter; } else { s_m_dof_conn[slave_dofs[l]].add_index(master_dofs[k]); s_m_dof_conn[slave_dofs[k]].compress(); s_s_dof_conn[slave_dofs[l]].second.add_indices(slave_dofs.begin(), slave_dofs.end()); s_s_dof_conn[slave_dofs[k]].second.compress(); } } } } ndofs_bi = s_s_dof_conn.size(); std::map<types::global_dof_index, std::pair<types::global_dof_index, IndexSet>>::iterator iter = s_s_dof_conn.begin(); for (; iter != s_s_dof_conn.end(); ++iter) { bi_s_dof_conn[iter->second.first] = iter->second.second; bi_s_dof_conn[iter->second.first].compress(); bi_m_dof_conn[iter->second.first] = s_m_dof_conn[iter->first]; bi_m_dof_conn[iter->second.first].compress(); } std::map<types::global_dof_index, IndexSet>::iterator it; for (it = bi_s_dof_conn.begin(); it != bi_s_dof_conn.end(); ++it) { for (unsigned int i = 0; i < it->second.n_elements(); ++i) { unsigned int const s_dof = it->second.nth_index_in_set(i); if (s_bi_dof_conn.find(s_dof) == s_bi_dof_conn.end()) { s_bi_dof_conn.insert(std::make_pair(s_dof, IndexSet(ndofs_bi))); s_bi_dof_conn[s_dof].add_index(it->first); } else { s_bi_dof_conn[s_dof].add_index(it->first); s_bi_dof_conn[s_dof].compress(); } } } for (it = bi_m_dof_conn.begin(); it != bi_m_dof_conn.end(); ++it) { for (unsigned int i = 0; i < it->second.n_elements(); ++i) { unsigned int const m_dof = it->second.nth_index_in_set(i); if (m_bi_dof_conn.find(m_dof) == m_bi_dof_conn.end()) { m_bi_dof_conn.insert(std::make_pair(m_dof, IndexSet(ndofs_bi))); m_bi_dof_conn[m_dof].add_index(it->first); } else { m_bi_dof_conn[m_dof].add_index(it->first); m_bi_dof_conn[m_dof].compress(); } } } for (unsigned int i = 0; i < qpoint_data.size(); ++i) { unsigned int const n_face_dofs = qpoint_data[i].slave_face_dofs.size(); qpoint_data[i].biorthogonal_face_dofs.resize(n_face_dofs); Assert (n_face_dofs > 0, ExcNotInitialized ()); for (unsigned int j = 0; j < n_face_dofs; ++j) { unsigned int const s_dof = qpoint_data[i].slave_face_dofs[j]; qpoint_data[i].biorthogonal_face_dofs[j] = s_s_dof_conn[s_dof].first; } } } class HybridMesh { public: HybridMesh (); ~HybridMesh (); void run (); private: void make_biorthogonal_sparsity_pattern (dealii::BlockDynamicSparsityPattern& dsp); void make_grid (); void setup_intial_fe_distribution(); void setup_system (); dealii::Triangulation<3> triangulation_m, triangulation_s; dealii::hp::DoFHandler<3> dofhandler_m, dofhandler_s; dealii::hp::FECollection<3> fe_collection; dealii::hp::QCollection<3> q_collection; dealii::hp::QCollection<2> face_q_collection; dealii::BlockSparsityPattern sparsity_pattern; dealii::BlockSparseMatrix<double> system_matrix; dealii::ConstraintMatrix constraints, constraints_m, constraints_s; InterfaceData interface_data; std::vector<FacePointData> data_interface; dealii::TimerOutput timer; unsigned int const tdim; unsigned int ndofs_m, ndofs_s, n_cells_m, n_cells_s; }; HybridMesh::HybridMesh () : dofhandler_m (triangulation_m), dofhandler_s (triangulation_s), q_collection (QGauss<3> (2)), face_q_collection (QGauss<2> (2)), timer (deallog.get_file_stream(), TimerOutput::every_call_and_summary, TimerOutput::wall_times), tdim (3), ndofs_m (0), ndofs_s (0), n_cells_m (0), n_cells_s (0) { fe_collection.push_back(FESystem<3> (FE_Q<3> (1), tdim)); fe_collection.push_back(FESystem<3> (FE_Nothing<3> (1), tdim)); } HybridMesh::~HybridMesh() { dofhandler_m.clear(); dofhandler_s.clear(); } void HybridMesh::run() { make_grid(); timer.enter_section("Setup"); timer.enter_subsection("setup_intial_fe_distribution"); setup_intial_fe_distribution(); timer.leave_subsection("setup_intial_fe_distribution"); timer.enter_subsection("setup_system"); setup_system(); timer.leave_subsection("setup_system"); } void HybridMesh::make_biorthogonal_sparsity_pattern (BlockDynamicSparsityPattern& dsp) { std::map<types::global_dof_index, IndexSet>::iterator it; for (it = interface_data.master_biorthogonal_dof_connections().begin(); it != interface_data.master_biorthogonal_dof_connections().end(); ++it) { std::vector<unsigned int> entries; it->second.fill_index_vector(entries); dsp.block(0,2).add_entries(it->first, entries.begin(), entries.end(), true); } for (it = interface_data.slave_biorthogonal_dof_connections().begin(); it != interface_data.slave_biorthogonal_dof_connections().end(); ++it) { std::vector<unsigned int> entries; it->second.fill_index_vector(entries); dsp.block(1,2).add_entries(it->first, entries.begin(), entries.end(), true); } for (it = interface_data.biorthogonal_master_dof_connections().begin(); it != interface_data.biorthogonal_master_dof_connections().end(); ++it) { std::vector<unsigned int> entries; it->second.fill_index_vector(entries); dsp.block(2,0).add_entries(it->first, entries.begin(), entries.end(), true); } for (it = interface_data.biorthogonal_slave_dof_connections().begin(); it != interface_data.biorthogonal_slave_dof_connections().end(); ++it) { std::vector<unsigned int> entries; it->second.fill_index_vector(entries); dsp.block(2,1).add_entries(it->first, entries.begin(), entries.end(), true); } } void HybridMesh::make_grid() { Point<3> const p1 (1.0, 1.0, 1.0), p2 (11.0, 4.0, 1.05), p3 (1.0, 1.0, 1.0), p4 (11.0, 4.0, 1.05); std::vector<unsigned int> rep1 = {10,4,1}, rep2 = {200,60,1}; GridGenerator::subdivided_hyper_rectangle(triangulation_m, rep1, p1, p2); GridGenerator::subdivided_hyper_rectangle(triangulation_s, rep2, p1, p2); typename Triangulation<3>::active_cell_iterator cell = triangulation_m.begin_active(), endc = triangulation_m.end(); for (; cell != endc; ++cell) { for (unsigned int face_no = 0; face_no < GeometryInfo<3>::faces_per_cell; ++face_no) { if (cell->face(face_no)->center()[0] == 11.0) cell->face(face_no)->set_boundary_id(2); if ((cell->face(face_no)->center()[2] == 1.05) && (cell->face(face_no)->center()[0] > 6.0)) cell->face(face_no)->set_boundary_id(4); } } cell = triangulation_s.begin_active(); endc = triangulation_s.end(); for (; cell != endc; ++cell) { for (unsigned int face_no = 0; face_no < GeometryInfo<3>::faces_per_cell; ++face_no) { if (cell->face(face_no)->center()[0] == 1.0) cell->face(face_no)->set_boundary_id(1); if ((cell->face(face_no)->center()[2] == 1.0) && (cell->face(face_no)->center()[0] < 3.0)) cell->face(face_no)->set_boundary_id(3); if ((cell->face(face_no)->center()[2] == 1.05) && (cell->face(face_no)->center()[0] < 3.0)) cell->face(face_no)->set_boundary_id(3); } } triangulation_s.refine_global(2); } void HybridMesh::setup_intial_fe_distribution() { typename hp::DoFHandler<3>::active_cell_iterator cell = dofhandler_m.begin_active(), endc = dofhandler_m.end (); for (; cell != endc; ++cell) { if (cell->center()[0] < 4.0) { cell->set_active_fe_index(1); } else { cell->set_active_fe_index(0); } } cell = dofhandler_s.begin_active(), endc = dofhandler_s.end (); for (; cell != endc; ++cell) { if (cell->center()[0] < 4.0) { cell->set_active_fe_index(0); } else { cell->set_active_fe_index(1); } } } void HybridMesh::setup_system() { system_matrix.clear(); dofhandler_m.distribute_dofs(fe_collection); dofhandler_s.distribute_dofs(fe_collection); interface_data.setup_data (dofhandler_m, dofhandler_s, face_q_collection); unsigned int ndofs_bi = interface_data.ndofs_biorthogonal(); ndofs_m = dofhandler_m.n_dofs(); ndofs_s = dofhandler_s.n_dofs(); n_cells_m = interface_data.n_cells_master(); n_cells_s = interface_data.n_cells_slave(); { constraints_m.clear(); constraints_s.clear(); constraints.clear(); DoFTools::make_hanging_node_constraints (dofhandler_m, constraints_m); DoFTools::make_hanging_node_constraints (dofhandler_s, constraints_s); class DirichletBoundary1 : public Function<3> { public: DirichletBoundary1 () : Function<3> (3) {}; void vector_value (Point<3> const& p, Vector<double>& value) const { value (0) = 0.1*std::sin((p[1]-1.0)/3.0*numbers::PI); value (1) = 0.0; value (2) = 0.0;}; void vector_value_list (std::vector<Point<3>> const& points, std::vector<Vector<double>>& values) const { for (unsigned int j=0; j < 3; ++j) {DirichletBoundary1::vector_value(points[j],values[j]);}}; }; VectorTools::interpolate_boundary_values (dofhandler_m, 2, ZeroFunction<3> (tdim), constraints_m, ComponentMask (std::vector<bool> ({true,true,false}))); VectorTools::interpolate_boundary_values (dofhandler_m, 4, ConstantFunction<3> (-0.1, tdim), constraints_m, ComponentMask (std::vector<bool> ({false,false,true}))); VectorTools::interpolate_boundary_values (dofhandler_s, 1, DirichletBoundary1 (), constraints_s, ComponentMask (std::vector<bool> ({true,true,false}))); VectorTools::interpolate_boundary_values (dofhandler_s, 3, ZeroFunction<3> (tdim), constraints_s, ComponentMask (std::vector<bool> ({false,false,true}))); BlockDynamicSparsityPattern dsp (3,3); dsp.block(0,0).reinit (ndofs_m, ndofs_m); dsp.block(0,1).reinit (ndofs_m, ndofs_s); dsp.block(0,2).reinit (ndofs_m, ndofs_bi); dsp.block(1,0).reinit (ndofs_s, ndofs_m); dsp.block(1,1).reinit (ndofs_s, ndofs_s); dsp.block(1,2).reinit (ndofs_s, ndofs_bi); dsp.block(2,0).reinit (ndofs_bi, ndofs_m); dsp.block(2,1).reinit (ndofs_bi, ndofs_s); dsp.block(2,2).reinit (ndofs_bi, ndofs_bi); dsp.collect_sizes(); DoFTools::make_sparsity_pattern(dofhandler_m, dsp.block(0,0), constraints_m, false); DoFTools::make_sparsity_pattern(dofhandler_s, dsp.block(1,1), constraints_s, false); make_biorthogonal_sparsity_pattern (dsp); deallog << std::endl; for (unsigned int block_i = 0; block_i < dsp.n_block_rows(); ++block_i) { for (unsigned int block_j = 0; block_j < dsp.n_block_cols(); ++block_j) { deallog << "Memory used by block (" << block_i << ", " << block_j << ") = " << dsp.block(block_i, block_j).memory_consumption() << std::endl; } } deallog << std::endl; deallog <<"Nonzero entries: " << dsp.n_nonzero_elements() << std::endl; deallog << std::endl; timer.enter_subsection("copy_sparsity_pattern"); sparsity_pattern.copy_from(dsp); timer.leave_subsection("copy_sparsity_pattern"); constraints_s.shift (ndofs_m); constraints.merge (constraints_m); constraints.merge (constraints_s); constraints.close (); } system_matrix.reinit(sparsity_pattern); deallog << "\t n_dofs dofhandler_m: " << ndofs_m << "\n\t\t n_dofs dofhandler_s: " << ndofs_s << "\n\t\t n_dofs biorthogonal basis: " << ndofs_bi << "\n\t\t n_dofs all: " << int(ndofs_bi + ndofs_m + ndofs_s) << "\n" << std::endl; } int main () { try { dealii::deallog.depth_console(1); std::ofstream out ("run/output_data/Run.log"); dealii::deallog.attach(out); HybridMesh test; test.run(); } catch (std::exception &exc) { std::cerr << std::endl << std::endl << "----------------------------------------------------" << std::endl; std::cerr << "Exception on processing: " << std::endl << exc.what() << std::endl << "Aborting!" << std::endl << "----------------------------------------------------" << std::endl; return 1; } catch (...) { std::cerr << std::endl << std::endl << "----------------------------------------------------" << std::endl; std::cerr << "Unknown exception!" << std::endl << "Aborting!" << std::endl << "----------------------------------------------------" << std::endl; return 1; } return 0; }
JobId thinkpad-lsx.site Tue Aug 30 14:01:00 2016 setup_intial_fe_distribution, wall time: 0.581621s. DEAL:: DEAL::Memory used by block (0, 0) = 50141 DEAL::Memory used by block (0, 1) = 5901 DEAL::Memory used by block (0, 2) = 5901 DEAL::Memory used by block (1, 0) = 20909301 DEAL::Memory used by block (1, 1) = 344734525 DEAL::Memory used by block (1, 2) = 20909301 DEAL::Memory used by block (2, 0) = 86901 DEAL::Memory used by block (2, 1) = 86901 DEAL::Memory used by block (2, 2) = 86901 DEAL:: DEAL::Nonzero entries: 53097165 DEAL:: copy_sparsity_pattern, wall time: 0.386629s. DEAL:: n_dofs dofhandler_m: 240 n_dofs dofhandler_s: 871215 n_dofs biorthogonal basis: 3615 n_dofs all: 875070 setup_system, wall time: 29.6744s. Setup, wall time: 30.257s. +---------------------------------------------+------------+------------+ | Total wallclock time elapsed since start | 39.9s | | | | | | | Section | no. calls | wall time | % of total | +---------------------------------+-----------+------------+------------+ | Setup | 1 | 30.3s | 76.% | | copy_sparsity_pattern | 1 | 0.387s | 0.97% | | setup_intial_fe_distribution | 1 | 0.582s | 1.5% | | setup_system | 1 | 29.7s | 74.% | +---------------------------------+-----------+------------+------------+
JobId thinkpad-lsx.site Tue Aug 30 14:02:48 2016 setup_intial_fe_distribution, wall time: 0.657087s. DEAL:: DEAL::Memory used by block (0, 0) = 50141 DEAL::Memory used by block (0, 1) = 5901 DEAL::Memory used by block (0, 2) = 180501 DEAL::Memory used by block (1, 0) = 20909301 DEAL::Memory used by block (1, 1) = 344734525 DEAL::Memory used by block (1, 2) = 21246729 DEAL::Memory used by block (2, 0) = 261501 DEAL::Memory used by block (2, 1) = 424329 DEAL::Memory used by block (2, 2) = 86901 DEAL:: DEAL::Nonzero entries: 53353179 DEAL:: copy_sparsity_pattern, wall time: 15.5338s. DEAL:: n_dofs dofhandler_m: 240 n_dofs dofhandler_s: 871215 n_dofs biorthogonal basis: 3615 n_dofs all: 875070 setup_system, wall time: 44.9071s. Setup, wall time: 45.5652s. +---------------------------------------------+------------+------------+ | Total wallclock time elapsed since start | 55.7s | | | | | | | Section | no. calls | wall time | % of total | +---------------------------------+-----------+------------+------------+ | Setup | 1 | 45.6s | 82.% | | copy_sparsity_pattern | 1 | 15.5s | 28.% | | setup_intial_fe_distribution | 1 | 0.657s | 1.2% | | setup_system | 1 | 44.9s | 81.% | +---------------------------------+-----------+------------+------------+