Hi All
I have been solving the step-43 in parallel. I am solving first the Darcy
part in parallel using technics in step-32. It's almost done. I used the
same linear solver as in step-43 and in the solver, I add some line from
step-32. I am having an error message easy to understand but had to see
where I can fix it.
See error message below.
An error occurred in line <1962> of file
</home/franckm/deal.ii-candi/tmp/unpack/deal.II-v8.5.0/source/lac/trilinos_sparse_matrix.cc>
in function
void dealii::TrilinosWrappers::SparseMatrix::vmult(VectorType&, const
VectorType&) const [with VectorType = dealii::TrilinosWrappers::VectorBase]
The violated condition was:
(dst_local_size) ==
(static_cast<size_type>(matrix->RangeMap().NumMyPoints()))
Additional information:
Dimension 81 not equal to 45.
Stacktrace:
-----------
#0 /home/franckm/deal.ii-candi/deal.II-v8.5.0/lib/libdeal_II.g.so.8.5.0:
void
dealii::TrilinosWrappers::SparseMatrix::vmult<dealii::TrilinosWrappers::VectorBase>(dealii::TrilinosWrappers::VectorBase&,
dealii::TrilinosWrappers::VectorBase const&) const
#1 /home/franckm/deal.ii-candi/deal.II-v8.5.0/lib/libdeal_II.g.so.8.5.0:
dealii::TrilinosWrappers::SparseMatrix::residual(dealii::TrilinosWrappers::VectorBase&,
dealii::TrilinosWrappers::VectorBase const&,
dealii::TrilinosWrappers::VectorBase const&) const
#2 ./darcyparl:
Step43::LinearSolvers::BlockSchurPreconditioner<dealii::TrilinosWrappers::PreconditionIC,
dealii::TrilinosWrappers::PreconditionIC>::vmult(dealii::TrilinosWrappers::MPI::BlockVector&,
dealii::TrilinosWrappers::MPI::BlockVector const&) const
#3 ./darcyparl: void
dealii::SolverGMRES<dealii::TrilinosWrappers::MPI::BlockVector>::solve<dealii::TrilinosWrappers::BlockSparseMatrix,
Step43::LinearSolvers::BlockSchurPreconditioner<dealii::TrilinosWrappers::PreconditionIC,
dealii::TrilinosWrappers::PreconditionIC>
>(dealii::TrilinosWrappers::BlockSparseMatrix const&,
dealii::TrilinosWrappers::MPI::BlockVector&,
dealii::TrilinosWrappers::MPI::BlockVector const&,
Step43::LinearSolvers::BlockSchurPreconditioner<dealii::TrilinosWrappers::PreconditionIC,
dealii::TrilinosWrappers::PreconditionIC> const&)
#4 ./darcyparl: Step43::TwoPhaseFlowProblem<2>::solve()
#5 ./darcyparl: Step43::TwoPhaseFlowProblem<2>::run()
#6 ./darcyparl: main
here the linear solver (as in step-43)
namespace LinearSolvers
{
template <class Matrix, class Preconditioner>
class InverseMatrix : public Subscriptor
{
public:
InverseMatrix (const Matrix &m,
const Preconditioner &preconditioner);
template <typename VectorType>
void vmult (VectorType &dst,
const VectorType &src) const;
private:
const SmartPointer<const Matrix> matrix;
const Preconditioner &preconditioner;
};
template <class Matrix, class Preconditioner>
InverseMatrix<Matrix,Preconditioner>::
InverseMatrix (const Matrix &m,
const Preconditioner &preconditioner)
:
matrix (&m),
preconditioner (preconditioner)
{}
template <class Matrix, class Preconditioner>
template <typename VectorType>
void
InverseMatrix<Matrix,Preconditioner>::
vmult (VectorType &dst,
const VectorType &src) const
{
SolverControl solver_control (src.size(), 1e-7*src.l2_norm());
SolverCG<VectorType> cg (solver_control);
dst = 0;
try
{
cg.solve (*matrix, dst, src, preconditioner);
}
catch (std::exception &e)
{
Assert (false, ExcMessage(e.what()));
}
}
template <class PreconditionerA, class PreconditionerMp>
class BlockSchurPreconditioner : public Subscriptor
{
public:
BlockSchurPreconditioner (const
TrilinosWrappers::BlockSparseMatrix &S,
const
InverseMatrix<TrilinosWrappers::SparseMatrix,PreconditionerMp> &Mpinv,
const PreconditionerA
&Apreconditioner);
void vmult (TrilinosWrappers::MPI::BlockVector &dst,
const TrilinosWrappers::MPI::BlockVector &src) const;
private:
const SmartPointer<const TrilinosWrappers::BlockSparseMatrix>
darcy_matrix;
const SmartPointer<const InverseMatrix<TrilinosWrappers::SparseMatrix,
PreconditionerMp > > m_inverse;
const PreconditionerA &a_preconditioner;
mutable TrilinosWrappers::MPI::Vector tmp;
};
template <class PreconditionerA, class PreconditionerMp>
BlockSchurPreconditioner<PreconditionerA, PreconditionerMp>::
BlockSchurPreconditioner(const TrilinosWrappers::BlockSparseMatrix &S,
const
InverseMatrix<TrilinosWrappers::SparseMatrix,
PreconditionerMp> &Mpinv,
const PreconditionerA &Apreconditioner)
:
darcy_matrix (&S),
m_inverse (&Mpinv),
a_preconditioner (Apreconditioner),
tmp
(complete_index_set(darcy_matrix->block(1,1).m()))
{}
template <class PreconditionerA, class PreconditionerMp>
void BlockSchurPreconditioner<PreconditionerA, PreconditionerMp>::vmult
(
TrilinosWrappers::MPI::BlockVector &dst,
const TrilinosWrappers::MPI::BlockVector &src) const
{
a_preconditioner.vmult (dst.block(0), src.block(0));
darcy_matrix->block(1,0).residual(tmp, dst.block(0), src.block(1));
tmp *= -1;
m_inverse->vmult (dst.block(1), tmp);
}
}
and the solver
template <int dim>
void TwoPhaseFlowProblem<dim>::solve ()
{
//const bool
//solve_for_pressure_and_velocity =
determine_whether_to_solve_for_pressure_and_velocity ();
//if (solve_for_pressure_and_velocity == true)
// {
assemble_darcy_system ();
//darcy_matrix.print(std::cout);
build_darcy_preconditioner ();
computing_timer.enter_section (" Solve Darcy system");
//std::cout << " Solving Darcy (pressure-velocity) system..." <<
std::endl;
pcout << " Solving Darcy (pressure-velocity) system..." << std::flush;
TrilinosWrappers::MPI::BlockVector
distributed_darcy_solution (darcy_rhs);
distributed_darcy_solution = darcy_solution;
const unsigned int
start = (distributed_darcy_solution.block(0).size() +
distributed_darcy_solution.block(1).local_range().first),
end = (distributed_darcy_solution.block(0).size() +
distributed_darcy_solution.block(1).local_range().second);
for (unsigned int i=start; i<end; ++i)
if (darcy_constraints.is_constrained (i))
distributed_darcy_solution(i) = 0;
{
const LinearSolvers::InverseMatrix<TrilinosWrappers::SparseMatrix,
TrilinosWrappers::PreconditionIC>
mp_inverse (darcy_preconditioner_matrix.block(1,1),
*Mp_preconditioner);
const
LinearSolvers::BlockSchurPreconditioner<TrilinosWrappers::PreconditionIC,
TrilinosWrappers::PreconditionIC>
preconditioner (darcy_matrix, mp_inverse, *Amg_preconditioner);
SolverControl solver_control (darcy_matrix.m(),
1e-16*darcy_rhs.l2_norm());
SolverGMRES<TrilinosWrappers::MPI::BlockVector>
gmres (solver_control,SolverGMRES<TrilinosWrappers::MPI::BlockVector
>::AdditionalData(100));
/*for (unsigned int i=0; i<darcy_solution.size(); ++i)
if (darcy_constraints.is_constrained(i))
darcy_solution(i) = 0;*/
gmres.solve(darcy_matrix, distributed_darcy_solution, darcy_rhs,
preconditioner);
//darcy_constraints.distribute (darcy_solution);
darcy_constraints.distribute (distributed_darcy_solution);
darcy_solution = distributed_darcy_solution;
}
computing_timer.exit_section();
}
Thanks
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.