Dear all, attached is a minimal example with 125 dofs, where dofs with indices 0-74 live on proccesor 0 and dofs with indices 75-124 live on processor 1 (two MPI processes).
Consider the following code to loop over the rows of a Trilinos sparsity pattern: // make_sparsity_pattern,... for(unsigned int row = 0; row < dofHandler.n_dofs(); ++row) { if( ! sparsityPattern.row_is_stored_locally(row)) continue; auto it = sparsityPattern.begin(row); auto itend = sparsityPattern.end(row); // do something with the columns while(it != itend) { it->column();...} } For row=74 on processor 0, there is an error dealii::TrilinosWrappers::SparsityPatternIterators::Accessor::visit_present_row() "An error with error number -1 occurred while calling a Trilinos function" The mentioned Trilinos function is ExtractGlobalRowCopy() and the error number suggests an access to a row which is not locally owned. This makes sense to me because sparsityPattern.end(74) calls visit_present_row(75), which is indeed not locally owned. Not sure whether I miss something or this is a bug. My expectation was to use the begin and end iterators on all locally owned rows. Thank you, Simon -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/dealii/cb270b3a-8c45-40cf-9efe-2a579fdab28an%40googlegroups.com.
#include <deal.II/lac/trilinos_vector.h> #include <deal.II/lac/affine_constraints.h> #include <deal.II/lac/trilinos_sparsity_pattern.h> #include <deal.II/lac/trilinos_sparse_matrix.h> #include <deal.II/dofs/dof_renumbering.h> #include <deal.II/dofs/dof_tools.h> #include <deal.II/base/index_set.h> #include <deal.II/base/utilities.h> #include <deal.II/dofs/dof_handler.h> #include <deal.II/distributed/grid_refinement.h> #include <deal.II/distributed/tria.h> #include <deal.II/grid/grid_generator.h> #include <deal.II/fe/fe_q.h> #include <iostream> namespace dealiiLA { using namespace dealii::TrilinosWrappers; } int main(int argc, char *argv[]) { dealii::Utilities::MPI::MPI_InitFinalize mpiInitialization(argc, argv, 1); MPI_Comm const &mpiCommunicator(MPI_COMM_WORLD); dealii::parallel::distributed::Triangulation<3> tria(mpiCommunicator); dealii::GridGenerator::hyper_cube(tria); tria.refine_global(2); dealii::DoFHandler<3> dofHandler(tria); dealii::FE_Q<3> fe(1); dofHandler.distribute_dofs(fe); dealii::DoFRenumbering::component_wise(dofHandler); dealii::IndexSet locallyOwnedDofs = dofHandler.locally_owned_dofs(); dealiiLA::SparsityPattern sparsityPattern; sparsityPattern.reinit(locallyOwnedDofs, mpiCommunicator); dealii::DoFTools::make_sparsity_pattern(dofHandler, sparsityPattern, dealii::AffineConstraints(), false, dealii::Utilities::MPI::this_mpi_process( mpiCommunicator)); sparsityPattern.compress(); for(unsigned int i=0; i<dofHandler.n_dofs(); ++i) { if(!sparsityPattern.row_is_stored_locally(i)) continue; auto it = sparsityPattern.begin(i); auto itend = sparsityPattern.end(i); } return 0; }