Hi deal.ii community,
I am bothering today about a code I have been writing in the shared triangulation framework and its transition to the parallel::distributed:: Triangulation<dim> framework. The shared version works just fine, and so does the parallel if run with 1 single process. I understand therefore that the numerics seem to work OK, but since I am having issues with more than one process, likely I am not understanding some fundamentals of the parallel::distributed::Triangulation<dim> framework. In particular it seems that a call of type std::vector< Vector< double > > old_solution_values ( quadrature_formula.size(), Vector< double >(dofs.GPDofs) ); fe_values.get_function_values ( locally_accumulated_displacement, old_solution_values ); provides nan, that propagates and make the code to fail. I wonder if this fact is due to DoFs that are not locally owned within cells that are indeed owned locally. In such a case, I am doing an implementation which is not appropriate and I wonder how to accomplish it properly. More details follows. I appreciate your help as usual. Alberto ---- The code is a standard 3 fields mechanics formulation, small strains. I have thus implemented a Newton Raphson scheme. The interesting part of the class definition is: template <int dim> class SmallStrainMechanicalProblem { public: SmallStrainMechanicalProblem ( const std::string, const unsigned = 1, const unsigned = 1 ); ~SmallStrainMechanicalProblem (); void run ( unsigned, bool, bool=false ); private: // Main methods ... // quadrature point integrators ... // MPI data structure MPI_Comm mpi_communicator; const unsigned int n_mpi_processes; const unsigned int this_mpi_process; ConditionalOStream pcout; std::vector<types::global_dof_index> local_dofs_per_process; std::vector<types::global_dof_index> starting_index_per_process; std::vector<types::global_dof_index> ending_index_per_process; IndexSet locally_owned_dofs; IndexSet locally_relevant_dofs; unsigned int n_local_cells; // FEM member variables parallel::distributed::Triangulation<dim> triangulation; DoFHandler<dim> dof_handler; FESystem<dim> fe; ConstraintMatrix hanging_node_constraints; const QGauss<dim> quadrature_formula; const QGauss<dim-1> face_quadrature_formula; LA::MPI::SparseMatrix system_matrix; LA::MPI::Vector locally_relevant_solution; // stores owned elements and also ghost entries. Initiated in setup_system(). LA::MPI::Vector locally_incremental_displacement; // stores owned elements only. Initiated in setup_system(), in refine_initial_grid() and in create_coarse_grid() LA::MPI::Vector locally_accumulated_displacement; // stores owned elements only. Initiated in setup_system(), in refine_initial_grid() and in create_coarse_grid() LA::MPI::Vector system_rhs; // Constitutive laws ... // IO ... debug_parallel_IO dbgIO; }; Here is the constructor: template <int dim> SmallStrainMechanicalProblem<dim>::SmallStrainMechanicalProblem ( const std:: string pathstr, const unsigned poly_degree, const unsigned printEveryNSteps) : mpi_communicator (MPI_COMM_WORLD), n_mpi_processes (Utilities::MPI::n_mpi_processes(mpi_communicator)), this_mpi_process (Utilities::MPI::this_mpi_process(mpi_communicator)), pcout (std::cout, this_mpi_process == 0), starting_index_per_process( n_mpi_processes ), ending_index_per_process( n_mpi_processes ), triangulation(mpi_communicator, typename Triangulation<dim>::MeshSmoothing (Triangulation<dim>::smoothing_on_refinement | Triangulation<dim>::smoothing_on_coarsening)), dof_handler (triangulation), fe(FE_Q<dim>(poly_degree), dim, // displacement FE_DGPMonomial<dim>(poly_degree - 1), 1, // pressure FE_DGPMonomial<dim>(poly_degree - 1), 1), // dilatation quadrature_formula (poly_degree + 1), face_quadrature_formula (4), PrintEveryNSteps( printEveryNSteps ), mmIO( pathstr, this_mpi_process ), IO( pathstr + "IO", this_mpi_process ), dbgIO( pathstr, this_mpi_process ) { ... } the setup: template <int dim> void SmallStrainMechanicalProblem<dim>::setup_system () { dof_handler.distribute_dofs (fe); locally_owned_dofs = dof_handler.locally_owned_dofs(); DoFTools::extract_locally_relevant_dofs (dof_handler,locally_relevant_dofs ); local_dofs_per_process = dof_handler.n_locally_owned_dofs_per_processor(); starting_index_per_process[ 0 ] = 0; ending_index_per_process[ 0 ] = local_dofs_per_process[ 0 ] - 1; for (unsigned ii=1; ii< n_mpi_processes; ii++) { starting_index_per_process[ ii ] = local_dofs_per_process[ ii-1 ] + starting_index_per_process[ ii-1 ] ; ending_index_per_process[ ii ] = local_dofs_per_process[ ii ] + ending_index_per_process[ ii-1 ] ; } locally_relevant_solution.reinit (locally_owned_dofs, locally_relevant_dofs, mpi_communicator); locally_incremental_displacement.reinit (locally_owned_dofs, mpi_communicator); system_rhs.reinit (locally_owned_dofs, mpi_communicator); // debug dbgIO.dbg() << "\n" << "In setup_system(): \n n_dofs() = " << dof_handler.n_dofs() << "\n" << std::flush; dbgIO.dbg() << " n_locally_owned_dofs() = " << dof_handler .n_locally_owned_dofs () << "\n" << std::flush; dbgIO.dbg() << " local_dofs_per_process = " << std::flush; for ( unsigned ii=0; ii < local_dofs_per_process.size(); ii++) dbgIO.dbg() << local_dofs_per_process[ ii ] << ", " << std::flush; dbgIO.dbg() << "\n" << " starting_index_per_process = " << std::flush; for ( unsigned ii=0; ii < starting_index_per_process.size(); ii++) dbgIO.dbg() << starting_index_per_process[ ii ] << ", " << std::flush; dbgIO.dbg() << "\n" << " ending_index_per_process = " << std::flush; for ( unsigned ii=0; ii < ending_index_per_process.size(); ii++) dbgIO.dbg() << ending_index_per_process[ ii ] << ", " << std::flush; dbgIO.dbg() << "\n" << " locally_owned_dofs = " << std::flush; locally_owned_dofs.print( dbgIO.dbg() ); hanging_node_constraints.clear (); hanging_node_constraints.reinit (locally_relevant_dofs); DoFTools::make_hanging_node_constraints (dof_handler, hanging_node_constraints); hanging_node_constraints.close (); DynamicSparsityPattern sparsity_pattern (locally_relevant_dofs); DoFTools::make_sparsity_pattern (dof_handler, sparsity_pattern, hanging_node_constraints, /*keep constrained dofs*/ false); SparsityTools::distribute_sparsity_pattern (sparsity_pattern, local_dofs_per_process, mpi_communicator, locally_relevant_dofs); system_matrix.reinit (locally_owned_dofs, locally_owned_dofs, sparsity_pattern, mpi_communicator); } and here where the issue lays: template <int dim> void SmallStrainMechanicalProblem<dim>::assemble_system_nr ( const TimeIntegrationDataManager* TIDM, const unsigned NRit ) //! system assembled for Newton-Raphson { // FE data and structures FEValues<dim> fe_values (fe, quadrature_formula, update_values | update_gradients | update_quadrature_points | update_JxW_values); FEFaceValues<dim> fe_face_values (fe, face_quadrature_formula, update_values | update_quadrature_points | update_normal_vectors | update_JxW_values); const unsigned int dofs_per_cell = fe.dofs_per_cell; const unsigned int n_q_points = quadrature_formula.size(); const unsigned int n_face_q_points = face_quadrature_formula.size(); FullMatrix<double> cell_matrix (dofs_per_cell, dofs_per_cell); Vector<double> cell_rhs (dofs_per_cell); std::vector<types::global_dof_index> local_dof_indices (dofs_per_cell); const FEValuesExtractors::Vector displacements (dofs.first_u_component); const FEValuesExtractors::Scalar pressure(dofs.p_component); const FEValuesExtractors::Scalar dilatation(dofs.J_component); ... // Evaluation typename DoFHandler<dim>::active_cell_iterator cell = dof_handler .begin_active(), endc = dof_handler.end(); int cellit = -1; for (; cell!=endc; ++cell) if (cell->is_locally_owned()) { ++cellit; cell_matrix = 0; cell_rhs = 0; // u,p,J from the former solution. fe_values must be reinitializated beforehand // fe_values reinitialization fe_values.reinit (cell); std::vector< Vector< double > > old_solution_values ( quadrature_formula.size(), Vector< double >(dofs.GPDofs) ); fe_values.get_function_values ( locally_accumulated_displacement, old_solution_values ); // fe_values.get_function_values (accumulated_displacement, old_solution_values); // debug dbgIO.dbg() << "In assemble_system_nr \n locally_accumulated_displacement =" << std::flush; for ( unsigned ii= starting_index_per_process[ this_mpi_process ]; ii <= ending_index_per_process[ this_mpi_process ]; ii++) dbgIO.dbg() << std::setw(8) << std::setprecision(4) << locally_accumulated_displacement[ ii ] << ", " << std::flush; dbgIO.dbg() << "\n" << std::flush; dbgIO.dbg() << "\n" << "old_solution_values =" << std::flush; for (unsigned ii=0; ii<n_q_points; ii++ ) dbgIO.dbg() << old_solution_values[ii] << std::flush; ..... } } the output for process 1 is: Debugger for the SmallStrainMechanicalProblem class defined on processor 1. In setup_system(): n_dofs() = 82 n_locally_owned_dofs() = 36 local_dofs_per_process = 46, 36, starting_index_per_process = 0, 46, ending_index_per_process = 45, 81, locally_owned_dofs = {[46,81]} locally_accumulated_displacement = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 old_solution_values =nan 1.320e-314 0.000e+00 0.000e+00 nan 3.537e-315 0.000e+00 0.000e+00 nan 3.537e-315 0.000e+00 0.000e+00 nan 9.476e-316 0.000e+00 0.000e+00 -- Informativa sulla Privacy: http://www.unibs.it/node/8155 -- 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. For more options, visit https://groups.google.com/d/optout.