Hello it is me again, I am trying to something very similar to this discussion: https://groups.google.com/g/dealii/c/Hh4iBsM21FI/m/cF-mzDP4GkwJ
My question would be how could I pass the solution vector of the pre-determined solution into the matrix free operator. I know this is a bad idea but currently I have the vector as a global variable so I don't have to pass it into the local_apply function or anything really. I do call initialize_dof_vector with the correct index but in the conjugate gradient solve function the preconditioner throws the error included at the bottom of this message. Also, attached is the just the setup_system() function similar to step-37 to try and keep code to a minimal. Nothing has been altered in the solve() function from step-37 in the code. Thanks if anyone has the time to get to this beforehand, Sean Johnson -------------------------------------------------------- An error occurred in line <238> of file </home/sjohnson/AE_beginnings/dealii/include/deal.II/matrix_free/vector_access_internal.h> in function void dealii::internal::check_vector_compatibility(const VectorType&, const dealii::MatrixFree<dim, Number, VectorizedArrayType>&, const dealii::internal::MatrixFreeFunctions::DoFInfo&) [with int dim = 2; Number = double; VectorizedArrayType = dealii::VectorizedArray<double, 2>; VectorType = dealii::LinearAlgebra::distributed::Vector<double>; typename std::enable_if<has_partitioners_are_compatible<VectorType>, VectorType>::type* <anonymous> = 0] The violated condition was: false Additional information: The parallel layout of the given vector is compatible neither with the Partitioner of the current FEEvaluation with dof_handler_index=1 nor with any Partitioner in MatrixFree. A potential reason is that you did not use MatrixFree::initialize_dof_vector() to get a compatible vector. Stacktrace: ----------- #0 ./step-37_minimal: void dealii::internal::check_vector_compatibility<2, double, dealii::VectorizedArray<double, 2ul>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, (dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>*)0>(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> > const&, dealii::internal::MatrixFreeFunctions::DoFInfo const&) #1 ./step-37_minimal: void dealii::FEEvaluationBase<2, 1, double, false, dealii::VectorizedArray<double, 2ul> >::read_write_operation<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const, dealii::internal::VectorReader<double, dealii::VectorizedArray<double, 2ul> > >(dealii::internal::VectorReader<double, dealii::VectorizedArray<double, 2ul> > const&, std::array<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const*, 1ul> const&, std::array<std::vector<dealii::ArrayView<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>::value_type const, dealii::MemorySpace::Host>, std::allocator<dealii::ArrayView<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>::value_type const, dealii::MemorySpace::Host> > > const*, 1ul> const&, std::bitset<2ul> const&, bool) const #2 ./step-37_minimal: void dealii::FEEvaluationBase<2, 1, double, false, dealii::VectorizedArray<double, 2ul> >::read_dof_values<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, unsigned int, std::bitset<2ul> const&) #3 ./step-37_minimal: Step37::LaplaceOperator<2, 3, double>::local_apply(dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> > const&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, std::pair<unsigned int, unsigned int> const&) const #4 ./step-37_minimal: dealii::internal::MFWorker<dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> >, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, Step37::LaplaceOperator<2, 3, double>, true>::process_range(void (Step37::LaplaceOperator<2, 3, double>::* const&)(dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> > const&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, std::pair<unsigned int, unsigned int> const&) const, std::vector<unsigned int, std::allocator<unsigned int> > const&, std::vector<unsigned int, std::allocator<unsigned int> > const&, unsigned int) #5 ./step-37_minimal: dealii::internal::MFWorker<dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> >, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, Step37::LaplaceOperator<2, 3, double>, true>::cell(unsigned int) #6 /home/sjohnson/AE_beginnings/dealii/lib/libdeal_II.g.so.9.4.0: dealii::internal::MatrixFreeFunctions::TaskInfo::loop(dealii::internal::MFWorkerInterface&) const #7 ./step-37_minimal: void dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> >::cell_loop<Step37::LaplaceOperator<2, 3, double>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >(void (Step37::LaplaceOperator<2, 3, double>::*)(dealii::MatrixFree<2, double, dealii::VectorizedArray<double, 2ul> > const&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, std::pair<unsigned int, unsigned int> const&) const, Step37::LaplaceOperator<2, 3, double> const*, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, bool) const #8 ./step-37_minimal: Step37::LaplaceOperator<2, 3, double>::apply_add(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #9 ./step-37_minimal: dealii::MatrixFreeOperators::Base<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::VectorizedArray<double, 2ul> >::mult_add(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, bool) const #10 ./step-37_minimal: dealii::MatrixFreeOperators::Base<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::VectorizedArray<double, 2ul> >::vmult_add(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #11 ./step-37_minimal: dealii::MatrixFreeOperators::Base<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::VectorizedArray<double, 2ul> >::vmult(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #12 ./step-37_minimal: dealii::internal::SolverCG::IterationWorker<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, Step37::LaplaceOperator<2, 3, double>, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >, int>::do_iteration(unsigned int) #13 ./step-37_minimal: void dealii::SolverCG<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >::solve<Step37::LaplaceOperator<2, 3, double>, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> > >(Step37::LaplaceOperator<2, 3, double> const&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> > const&) #14 ./step-37_minimal: dealii::PreconditionChebyshev<Step37::LaplaceOperator<2, 3, double>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> > >::estimate_eigenvalues(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #15 ./step-37_minimal: dealii::PreconditionChebyshev<Step37::LaplaceOperator<2, 3, double>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> > >::vmult(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #16 ./step-37_minimal: dealii::mg::SmootherRelaxation<dealii::PreconditionChebyshev<Step37::LaplaceOperator<2, 3, double>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::DiagonalMatrix<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> > >, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >::apply(unsigned int, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #17 /home/sjohnson/AE_beginnings/dealii/lib/libdeal_II.g.so.9.4.0: dealii::Multigrid<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >::level_v_step(unsigned int) #18 /home/sjohnson/AE_beginnings/dealii/lib/libdeal_II.g.so.9.4.0: dealii::Multigrid<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >::level_v_step(unsigned int) #19 /home/sjohnson/AE_beginnings/dealii/lib/libdeal_II.g.so.9.4.0: dealii::Multigrid<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >::cycle() #20 ./step-37_minimal: void dealii::internal::PreconditionMGImplementation::vmult<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::MGTransferMatrixFree<2, double>, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >(std::vector<dealii::DoFHandler<2, 2> const*, std::allocator<dealii::DoFHandler<2, 2> const*> > const&, dealii::Multigrid<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >&, dealii::MGTransferMatrixFree<2, double> const&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&, bool, dealii::mg::Signals const&, ...) #21 ./step-37_minimal: void dealii::PreconditionMG<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::MGTransferMatrixFree<2, double> >::vmult<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> >(dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>&, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host> const&) const #22 ./step-37_minimal: dealii::internal::SolverCG::IterationWorker<dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, Step37::LaplaceOperator<2, 3, double>, dealii::PreconditionMG<2, dealii::LinearAlgebra::distributed::Vector<double, dealii::MemorySpace::Host>, dealii::MGTransferMatrixFree<2, double> >, int>::do_iteration(unsigned int) -- 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/82328209-1ed1-4760-bcaa-2b818dd395bcn%40googlegroups.com.
template <int dim> void LaplaceProblem<dim>::setup_system() { Timer time; setup_time = 0; system_matrix.clear(); mg_matrices.clear_elements(); dof_handler.distribute_dofs(fe); dof_handler.distribute_mg_dofs(); dof_handler_DG.distribute_dofs(fe_DG); dof_handler_DG.distribute_mg_dofs(); pcout << "Number of degrees of freedom: " << dof_handler.n_dofs() << std::endl; const IndexSet locally_relevant_dofs = DoFTools::extract_locally_relevant_dofs(dof_handler); const IndexSet locally_relevant_dofs_DG = DoFTools::extract_locally_relevant_dofs(dof_handler_DG); constraints.clear(); constraints.reinit(locally_relevant_dofs); DoFTools::make_hanging_node_constraints(dof_handler, constraints); VectorTools::interpolate_boundary_values( mapping, dof_handler, 0, Functions::ZeroFunction<dim>(), constraints); constraints.close(); constraints_DG.clear(); constraints_DG.reinit(locally_relevant_dofs_DG); DoFTools::make_hanging_node_constraints(dof_handler_DG, constraints_DG); VectorTools::interpolate_boundary_values( mapping, dof_handler_DG, 0, Functions::ZeroFunction<dim>(), constraints_DG); constraints_DG.close(); setup_time += time.wall_time(); time_details << "Distribute DoFs & B.C. (CPU/wall) " << time.cpu_time() << "s/" << time.wall_time() << 's' << std::endl; time.restart(); const std::vector<const DoFHandler<dim> *> dof_handlers = {&dof_handler, &dof_handler_DG}; const std::vector<const AffineConstraints<double> *> constraints_list = {&constraints, &constraints_DG}; { typename MatrixFree<dim, double>::AdditionalData additional_data; additional_data.tasks_parallel_scheme = MatrixFree<dim, double>::AdditionalData::none; additional_data.mapping_update_flags = (update_gradients | update_JxW_values | update_quadrature_points); std::shared_ptr<MatrixFree<dim, double>> system_mf_storage( new MatrixFree<dim, double>()); system_mf_storage->reinit(mapping, dof_handlers, constraints_list, QGauss<1>(fe.degree + 1), additional_data); system_mf_storage->initialize_dof_vector(test_solution, 1); system_matrix.initialize(system_mf_storage,{0}); } system_matrix.initialize_dof_vector(extra_test); system_matrix.initialize_dof_vector(solution); system_matrix.initialize_dof_vector(system_rhs); system_matrix.evaluate_coefficient(Coefficient<dim>()); setup_time += time.wall_time(); time_details << "Setup matrix-free system (CPU/wall) " << time.cpu_time() << "s/" << time.wall_time() << 's' << std::endl; time.restart(); // Next, initialize the matrices for the multigrid method on all the // levels. The data structure MGConstrainedDoFs keeps information about // the indices subject to boundary conditions as well as the indices on // edges between different refinement levels as described in the step-16 // tutorial program. We then go through the levels of the mesh and // construct the constraints and matrices on each level. These follow // closely the construction of the system matrix on the original mesh, // except the slight difference in naming when accessing information on // the levels rather than the active cells. const unsigned int nlevels = triangulation.n_global_levels(); mg_matrices.resize(0, nlevels - 1); const std::set<types::boundary_id> dirichlet_boundary_ids = {0}; mg_constrained_dofs.initialize(dof_handler); mg_constrained_dofs.make_zero_boundary_constraints(dof_handler, dirichlet_boundary_ids); mg_constrained_dofs_DG.initialize(dof_handler_DG); mg_constrained_dofs_DG.make_zero_boundary_constraints(dof_handler_DG, dirichlet_boundary_ids); const std::vector<MGConstrainedDoFs> mg_constrained_list = {mg_constrained_dofs, mg_constrained_dofs_DG}; for (unsigned int level = 0; level < nlevels; ++level) { const IndexSet relevant_dofs = DoFTools::extract_locally_relevant_level_dofs(dof_handler, level); AffineConstraints<double> level_constraints; level_constraints.reinit(relevant_dofs); level_constraints.add_lines( mg_constrained_dofs.get_boundary_indices(level)); level_constraints.close(); const IndexSet relevant_dofs_DG = DoFTools::extract_locally_relevant_level_dofs(dof_handler_DG, level); AffineConstraints<double> level_constraints_DG; level_constraints_DG.reinit(relevant_dofs_DG); level_constraints_DG.add_lines( mg_constrained_dofs_DG.get_boundary_indices(level)); level_constraints_DG.close(); const std::vector<const AffineConstraints<double> *> level_constraints_list = {&level_constraints, &level_constraints_DG}; typename MatrixFree<dim, float>::AdditionalData additional_data; additional_data.tasks_parallel_scheme = MatrixFree<dim, float>::AdditionalData::none; additional_data.mapping_update_flags = (update_gradients | update_JxW_values | update_quadrature_points); additional_data.mg_level = level; std::shared_ptr<MatrixFree<dim, float>> mg_mf_storage_level( new MatrixFree<dim, float>()); mg_mf_storage_level->reinit(mapping, dof_handlers, level_constraints_list, QGauss<1>(fe.degree + 1), additional_data); mg_mf_storage_level->initialize_dof_vector(test_solution,1); mg_matrices[level].initialize(mg_mf_storage_level, mg_constrained_dofs, level,{0}); mg_matrices[level].evaluate_coefficient(Coefficient<dim>()); } setup_time += time.wall_time(); time_details << "Setup matrix-free levels (CPU/wall) " << time.cpu_time() << "s/" << time.wall_time() << 's' << std::endl; }