Hello all,
I am new to libMesh. I am trying to solve a generalized eigen-value problem
for an integral equation. I tried example "Solving a generalized Eigen
Problem" and it works fine.
Next, I modified the assembly routine to have a skeleton like this:
for (const auto & elem : mesh.active_local_element_ptr_range())
for (const auto & elem_remote : mesh.active_element_ptr_range())
So basically for each local element, I am looping over all the active
elements (local and nonlocal) to assemble the integral equation. I am
pretty confident that I used fe->reinit and other housekeeping stuff
properly.
However, as expected, I encountered the following error from PETSc:
[0]PETSC ERROR: Argument out of range
[0]PETSC ERROR: New nonzero at (0,4) caused a malloc
because I didn't augment the sparsity pattern of my matrix.
Next, I added the following lines to suppress the PETSc error:
PetscMatrix<Number> * matrix_A_petsc = dynamic_cast<PetscMatrix<Number>
*>(eigen_system.matrix_A.get());
MatSetOption(matrix_A_petsc->mat(), MAT_NEW_NONZERO_ALLOCATION_ERR,
PETSC_FALSE);
Now my calculation could run to completion, and both the assembled matrix
and the solution are correct.
However, this is undesirable because my "*total number of mallocs used
during MatSetValues calls != 0*" and therefore the assembly process is
unbelievably slow.
I think I have to augment the sparsity correctly to speed up the assembly.
Next, I followed miscellaneous ex9 to augment the sparsity pattern using
the coupling functor. I created a class called AugmentSparsityToDense,
deriving from GhostingFunctor, and its operator() looks like:
void
AugmentSparsityToDense::operator()(const MeshBase::const_element_iterator &
range_begin,
const MeshBase::const_element_iterator &
range_end,
processor_id_type p,
map_type & coupled_elements)
{
const CouplingMatrix * const null_mat = nullptr;
for (const auto & elem : as_range(range_begin, range_end))
{
coupled_elements.emplace(elem, null_mat);
for (const auto & elem_remote : as_range(range_begin, range_end))
coupled_elements.emplace(elem_remote, null_mat);
}
}
and I attached it to the DofMap using the following lines:
std::shared_ptr<AugmentSparsityToDense> augment_sparsity(new
AugmentSparsityToDense());
eigen_system.get_dof_map().add_coupling_functor(augment_sparsity);
but then I still get the PETSc error:
[0]PETSC ERROR: Argument out of range
[0]PETSC ERROR: New nonzero at (0,4) caused a malloc
and when I examine the n_nz and n_oz from DofMap, the sparsity is indeed
not augmented. Can anyone give me some suggestions?
Thanks,
Gary
_______________________________________________
Libmesh-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-users