Hello, 

I have two distinct distributed meshes representing the same spatial domain 
and (for now) with equal refinement (number of cells), but the finite 
elements, dof handlers and solution vectors on each mesh are defined 
differently. I want to interpolate values from a solution vector 
(solutionSet[0]) defined on the first mesh (solutionSet is a vector 
containing the solution vectors for all fields; we want the solution for 
field of index 0) into another solution vector (solution_cp) defined on the 
second mesh. 

When I run the code in series the solution vector is correctly transferred. 
However, this *fails if I run on more than one processor* (even 2 
processors). The runtime error is show below.

I examined the way the mesh is partitioned in both cases (from the parallel 
output files) and it appears to be the same.

Details of how each mesh and dofhandler are defined in the code, as well as 
how the data is transferred (using VectorTools::interpolate) are appended 
after the error message.

Any guidance would be appreciated.

Best,

David

--------------------------------------------------------

An error occurred in line <1588> of file 
</usr/local/include/deal.II/lac/la_parallel_vector.h> in function

    Number dealii::LinearAlgebra::distributed::Vector<Number, 
MemorySpace>::operator()(dealii::LinearAlgebra::distributed::Vector<Number, 
MemorySpace>::size_type) const [with Number = double; MemorySpace = 
dealii::MemorySpace::Host; 
dealii::LinearAlgebra::distributed::Vector<Number, MemorySpace>::size_type 
= unsigned int]

The violated condition was: 

    partitioner->in_local_range(global_index) || 
partitioner->ghost_indices().is_element(global_index)

Additional information: 

    You tried to access element 54 of a distributed vector, but this

    element is not stored on the current processor. Note: The range of

    locally owned elements is [135,242], and there are 27 ghost elements

    that this vector can access.

    

    A common source for this kind of problem is that you are passing a

    'fully distributed' vector into a function that needs read access to

    vector elements that correspond to degrees of freedom on ghost cells

    (or at least to 'locally active' degrees of freedom that are not also

    'locally owned'). You need to pass a vector that has these elements as

    ghost entries.

 

Stacktrace:

-----------

#0  ./main: dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>::operator()(unsigned int) const

#1  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>::extract_subvector_to<unsigned int const*, 
double*>(unsigned int const*, unsigned int const*, double*) const

#2  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::internal::DoFAccessorImplementation::Implementation::extract_subvector_to<dealii::LinearAlgebra::distributed::Vector<double,
 
dealii::MemorySpace::Host>, 
double*>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, unsigned int const*, unsigned int 
const*, double*)

#3  /usr/local/lib/libdeal_II.g.so.9.5.0: void dealii::DoFCellAccessor<3, 
3, 
false>::get_dof_values<dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>, 
double*>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, double*, double*) const

#4  /usr/local/lib/libdeal_II.g.so.9.5.0: void dealii::DoFCellAccessor<3, 
3, 
false>::get_dof_values<dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>, 
double>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, dealii::Vector<double>&) const

#5  /usr/local/lib/libdeal_II.g.so.9.5.0: void dealii::DoFCellAccessor<3, 
3, 
false>::get_interpolated_dof_values<dealii::LinearAlgebra::distributed::Vector<double,
 
dealii::MemorySpace::Host>, 
double>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, dealii::Vector<double>&, unsigned short) 
const

#6  /usr/local/lib/libdeal_II.g.so.9.5.0: void dealii::FEValuesBase<3, 
3>::CellIteratorContainer::get_interpolated_dof_values<dealii::LinearAlgebra::distributed::Vector<double,
 
dealii::MemorySpace::Host> 
>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, 
dealii::Vector<dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>::value_type>&) const

#7  /usr/local/lib/libdeal_II.g.so.9.5.0: void dealii::FEValuesBase<3, 
3>::get_function_values<dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> 
>(dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host> const&, 
std::vector<dealii::Vector<dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>::value_type>, 
std::allocator<dealii::Vector<dealii::LinearAlgebra::distributed::Vector<double,
 
dealii::MemorySpace::Host>::value_type> > >&) const

#8  /usr/local/lib/libdeal_II.g.so.9.5.0: 
dealii::Functions::FEFieldFunction<3, 
dealii::LinearAlgebra::distributed::Vector<double, 
dealii::MemorySpace::Host>, 
3>::vector_value_list(std::vector<dealii::Point<3, double>, 
std::allocator<dealii::Point<3, double> > > const&, 
std::vector<dealii::Vector<double>, std::allocator<dealii::Vector<double> > 
>&) const

#9  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::VectorTools::internal::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector, dealii::VectorTools::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector>(dealii::hp::MappingCollection<3, 3> 
const&, dealii::DoFHandler<3, 3> const&, dealii::Function<3, 
dealii::PETScWrappers::MPI::Vector::value_type> const&, 
dealii::PETScWrappers::MPI::Vector&, dealii::ComponentMask 
const&)::{lambda(dealii::TriaActiveIterator<dealii::DoFCellAccessor<3, 3, 
false> > const&)#1} const>(dealii::hp::MappingCollection<3, 3> const&, 
dealii::DoFHandler<3, 3> const&, dealii::VectorTools::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector>(dealii::hp::MappingCollection<3, 3> 
const&, dealii::DoFHandler<3, 3> const&, dealii::Function<3, 
dealii::PETScWrappers::MPI::Vector::value_type> const&, 
dealii::PETScWrappers::MPI::Vector&, dealii::ComponentMask 
const&)::{lambda(dealii::TriaActiveIterator<dealii::DoFCellAccessor<3, 3, 
false> > const&)#1} const&, dealii::PETScWrappers::MPI::Vector&, 
dealii::ComponentMask const&)

#10  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::VectorTools::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector>(dealii::hp::MappingCollection<3, 3> 
const&, dealii::DoFHandler<3, 3> const&, dealii::Function<3, 
dealii::PETScWrappers::MPI::Vector::value_type> const&, 
dealii::PETScWrappers::MPI::Vector&, dealii::ComponentMask const&)

#11  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::VectorTools::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector>(dealii::Mapping<3, 3> const&, 
dealii::DoFHandler<3, 3> const&, dealii::Function<3, 
dealii::PETScWrappers::MPI::Vector::value_type> const&, 
dealii::PETScWrappers::MPI::Vector&, dealii::ComponentMask const&)

#12  /usr/local/lib/libdeal_II.g.so.9.5.0: void 
dealii::VectorTools::interpolate<3, 3, 
dealii::PETScWrappers::MPI::Vector>(dealii::DoFHandler<3, 3> const&, 
dealii::Function<3, dealii::PETScWrappers::MPI::Vector::value_type> const&, 
dealii::PETScWrappers::MPI::Vector&, dealii::ComponentMask const&)

#13  ./main: MultiPhysicsBVP<3, 1>::solve_cp()

#14  ./main: crystalPlasticity<3>::run()

#15  ./main: main

--------------------------------------------------------

The following is a description of how the solution vectors are declared and 
initialized in each of the meshes.

*Source mesh:*

(note that dofHandlersSet, solutionSet and fe from this mesh are defined as 
pointers)

//Declare and define triangulation

parallel::distributed::Triangulation<dim> triangulation_pf;

GridGenerator::subdivided_hyper_rectangle (triangulation_pf, 
userInputs_pf.subdivisions,Point<dim>(), 
Point<dim>(userInputs_pf.domain_size[0],userInputs_pf.domain_size[1],userInputs_pf.domain_size[2]));

//Create FESet containing a fe for each field

FESystem<dim>* fe;

fe=new FESystem<dim>(FE_Q<dim>(QGaussLobatto<1>(degree+1)),1);

FESet.push_back(fe);

//distribute DOFs for every field

DoFHandler<dim>* dof_handler;

dof_handler=new DoFHandler<dim>(triangulation_pf);

dofHandlersSet.push_back(dof_handler);

dof_handler->distribute_dofs (*fe)

//SolutionSet is declared and initialized as

typedef dealii::LinearAlgebra::distributed::Vector<double> vectorType_pf;

std::vector<vectorType_pf*>  solutionSet;

//For every field we do

vectorType_pf *U, *R;

U=new vectorType_pf; R=new vectorType_pf;

solutionSet.push_back(U); residualSet.push_back(R);

matrixFreeObject.initialize_dof_vector(*R,  fieldIndex); *R=0;

matrixFreeObject.initialize_dof_vector(*U,  fieldIndex); *U=0;

constraintsDirichletSet[fieldIndex]->distribute(*solutionSet[fieldIndex]);

constraintsOtherSet[fieldIndex]->distribute(*solutionSet[fieldIndex]);

solutionSet[fieldIndex]->update_ghost_values();

//Apply Initial conditions for every field index (this interpolation works 
even in parallel)

VectorTools::interpolate (*dofHandlersSet[var_index], 
InitialCondition<dim,degree>(var_index,userInputs_pf,this), 
*solutionSet[var_index]);

*Target mesh:*

//Declare and define triangulation

parallel::distributed::Triangulation<dim> triangulation_cp

GridGenerator::subdivided_hyper_rectangle (triangulation_cp, 
userInputs_cp.subdivisions, Point<dim>(), 
Point<dim>(userInputs_cp.span[0],userInputs_cp.span[1],userInputs_cp.span[2]), 
true);

//Declare finite element

FESystem<dim>      FE_Scalar;

FE_Q<dim> fe_q(1);

FE_Scalar = FE_System(fe_q, 1);

//Create dofHandler  and distribute DOFs 

DoFHandler<dim>    dofHandler_Scalar;

dofHandler_Scalar (triangulation_cp), //In the constructor

dofHandler_Scalar.distribute_dofs (FE_Scalar);

//Declare solution vector

PETScWrappers::MPI::Vector solution_cp;

//Non-ghosted solution

PETScWrappers::MPI::Vector non_ghosted_solution_cp;

The data transfer is done the following way:

IndexSet own_dofs = dofHandler_Scalar.locally_owned_dofs();

IndexSet locally_relevant_dofs;

DoFTools::extract_locally_relevant_dofs(dofHandler_Scalar, 
locally_relevant_dofs);

//Creating function with data from source mesh

Functions::FEFieldFunction<dim, vectorType_pf> fe_function_1(

          *pf_obj.getDofHandlersSet()[0], *pf_obj.getSolutionSet()[0]);

//Setting size of solution_cp and non_ghosted_solution vectors

solution_cp.reinit(own_dofs, locally_relevant_dofs, mpi_communicator);

non_ghosted_solution_cp.reinit(own_dofs, mpi_communicator);

// Data transfer via interpolation of fe_function_1 - *Works in serial but 
crashes not in parallel*

*VectorTools::interpolate(dofHandler_Scalar, fe_function_1, 
non_ghosted_solution_cp);*

solution_cp = non_ghosted_solution_cp;
solution_cp.compress(VectorOperation::insert); 


-- 
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 visit 
https://groups.google.com/d/msgid/dealii/a9313e39-dc5f-4a9d-80d1-ac17a04fdce1n%40googlegroups.com.

Reply via email to