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;
} 

Reply via email to