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.

Reply via email to