PMLStructuredCubicHelmholtz< ELEMENT > Class Template Reference

Problem class. More...

+ Inheritance diagram for PMLStructuredCubicHelmholtz< ELEMENT >:

Public Member Functions

 PMLStructuredCubicHelmholtz ()
 Constructor. More...
 
 ~PMLStructuredCubicHelmholtz ()
 Destructor (empty) More...
 
void doc_solution ()
 Doc the solution. More...
 
void actions_before_newton_solve ()
 Update the problem specs before solve (empty) More...
 
void actions_after_newton_solve ()
 Update the problem specs after solve (empty) More...
 
void actions_before_adapt ()
 Actions before adapt: (empty) More...
 
void actions_after_adapt ()
 Actions after adapt:(empty) More...
 
void set_gmres_multigrid_solver ()
 Set GMRES preconditioner by multigrid as the linear solver. More...
 
void enable_pmls ()
 Enable the PML mapping function for all nodes in the PML region. More...
 
void apply_boundary_conditions ()
 Apply boundary conditions. More...
 
- Public Member Functions inherited from oomph::HelmholtzMGProblem
 HelmholtzMGProblem ()
 Constructor. Initialise pointers to coarser and finer levels. More...
 
virtual ~HelmholtzMGProblem ()
 Destructor (empty) More...
 
- Public Member Functions inherited from oomph::Problem
virtual void debug_hook_fct (const unsigned &i)
 
void set_analytic_dparameter (double *const &parameter_pt)
 
void unset_analytic_dparameter (double *const &parameter_pt)
 
bool is_dparameter_calculated_analytically (double *const &parameter_pt)
 
void set_analytic_hessian_products ()
 
void unset_analytic_hessian_products ()
 
bool are_hessian_products_calculated_analytically ()
 
void set_pinned_values_to_zero ()
 
bool distributed () const
 
OomphCommunicatorcommunicator_pt ()
 access function to the oomph-lib communicator More...
 
const OomphCommunicatorcommunicator_pt () const
 access function to the oomph-lib communicator, const version More...
 
 Problem ()
 
 Problem (const Problem &dummy)=delete
 Broken copy constructor. More...
 
void operator= (const Problem &)=delete
 Broken assignment operator. More...
 
virtual ~Problem ()
 Virtual destructor to clean up memory. More...
 
Mesh *& mesh_pt ()
 Return a pointer to the global mesh. More...
 
Mesh *const & mesh_pt () const
 Return a pointer to the global mesh (const version) More...
 
Mesh *& mesh_pt (const unsigned &imesh)
 
Mesh *const & mesh_pt (const unsigned &imesh) const
 Return a pointer to the i-th submesh (const version) More...
 
unsigned nsub_mesh () const
 Return number of submeshes. More...
 
unsigned add_sub_mesh (Mesh *const &mesh_pt)
 
void flush_sub_meshes ()
 
void build_global_mesh ()
 
void rebuild_global_mesh ()
 
LinearSolver *& linear_solver_pt ()
 Return a pointer to the linear solver object. More...
 
LinearSolver *const & linear_solver_pt () const
 Return a pointer to the linear solver object (const version) More...
 
LinearSolver *& mass_matrix_solver_for_explicit_timestepper_pt ()
 
LinearSolvermass_matrix_solver_for_explicit_timestepper_pt () const
 
EigenSolver *& eigen_solver_pt ()
 Return a pointer to the eigen solver object. More...
 
EigenSolver *const & eigen_solver_pt () const
 Return a pointer to the eigen solver object (const version) More...
 
Time *& time_pt ()
 Return a pointer to the global time object. More...
 
Timetime_pt () const
 Return a pointer to the global time object (const version). More...
 
doubletime ()
 Return the current value of continuous time. More...
 
double time () const
 Return the current value of continuous time (const version) More...
 
TimeStepper *& time_stepper_pt ()
 
const TimeSteppertime_stepper_pt () const
 
TimeStepper *& time_stepper_pt (const unsigned &i)
 Return a pointer to the i-th timestepper. More...
 
ExplicitTimeStepper *& explicit_time_stepper_pt ()
 Return a pointer to the explicit timestepper. More...
 
unsigned long set_timestepper_for_all_data (TimeStepper *const &time_stepper_pt, const bool &preserve_existing_data=false)
 
virtual void shift_time_values ()
 Shift all values along to prepare for next timestep. More...
 
AssemblyHandler *& assembly_handler_pt ()
 Return a pointer to the assembly handler object. More...
 
AssemblyHandler *const & assembly_handler_pt () const
 Return a pointer to the assembly handler object (const version) More...
 
doubleminimum_dt ()
 Access function to min timestep in adaptive timestepping. More...
 
doublemaximum_dt ()
 Access function to max timestep in adaptive timestepping. More...
 
unsignedmax_newton_iterations ()
 Access function to max Newton iterations before giving up. More...
 
void problem_is_nonlinear (const bool &prob_lin)
 Access function to Problem_is_nonlinear. More...
 
doublemax_residuals ()
 
booltime_adaptive_newton_crash_on_solve_fail ()
 Access function for Time_adaptive_newton_crash_on_solve_fail. More...
 
doublenewton_solver_tolerance ()
 
void add_time_stepper_pt (TimeStepper *const &time_stepper_pt)
 
void set_explicit_time_stepper_pt (ExplicitTimeStepper *const &explicit_time_stepper_pt)
 
void initialise_dt (const double &dt)
 
void initialise_dt (const Vector< double > &dt)
 
Data *& global_data_pt (const unsigned &i)
 Return a pointer to the the i-th global data object. More...
 
void add_global_data (Data *const &global_data_pt)
 
void flush_global_data ()
 
LinearAlgebraDistribution *const & dof_distribution_pt () const
 Return the pointer to the dof distribution (read-only) More...
 
unsigned long ndof () const
 Return the number of dofs. More...
 
unsigned ntime_stepper () const
 Return the number of time steppers. More...
 
unsigned nglobal_data () const
 Return the number of global data values. More...
 
unsigned self_test ()
 Self-test: Check meshes and global data. Return 0 for OK. More...
 
void enable_store_local_dof_pt_in_elements ()
 
void disable_store_local_dof_pt_in_elements ()
 
unsigned long assign_eqn_numbers (const bool &assign_local_eqn_numbers=true)
 
void describe_dofs (std::ostream &out= *(oomph_info.stream_pt())) const
 
void enable_discontinuous_formulation ()
 
void disable_discontinuous_formulation ()
 
void get_dofs (DoubleVector &dofs) const
 
void get_dofs (const unsigned &t, DoubleVector &dofs) const
 Return vector of the t'th history value of all dofs. More...
 
void set_dofs (const DoubleVector &dofs)
 Set the values of the dofs. More...
 
void set_dofs (const unsigned &t, DoubleVector &dofs)
 Set the history values of the dofs. More...
 
void set_dofs (const unsigned &t, Vector< double * > &dof_pt)
 
void add_to_dofs (const double &lambda, const DoubleVector &increment_dofs)
 Add lambda x incremenet_dofs[l] to the l-th dof. More...
 
doubleglobal_dof_pt (const unsigned &i)
 
doubledof (const unsigned &i)
 i-th dof in the problem More...
 
double dof (const unsigned &i) const
 i-th dof in the problem (const version) More...
 
double *& dof_pt (const unsigned &i)
 Pointer to i-th dof in the problem. More...
 
doubledof_pt (const unsigned &i) const
 Pointer to i-th dof in the problem (const version) More...
 
virtual void get_inverse_mass_matrix_times_residuals (DoubleVector &Mres)
 
virtual void get_dvaluesdt (DoubleVector &f)
 
virtual void get_residuals (DoubleVector &residuals)
 Get the total residuals Vector for the problem. More...
 
virtual void get_jacobian (DoubleVector &residuals, DenseDoubleMatrix &jacobian)
 
virtual void get_jacobian (DoubleVector &residuals, CRDoubleMatrix &jacobian)
 
virtual void get_jacobian (DoubleVector &residuals, CCDoubleMatrix &jacobian)
 
virtual void get_jacobian (DoubleVector &residuals, SumOfMatrices &jacobian)
 
void get_fd_jacobian (DoubleVector &residuals, DenseMatrix< double > &jacobian)
 Get the full Jacobian by finite differencing. More...
 
void get_derivative_wrt_global_parameter (double *const &parameter_pt, DoubleVector &result)
 
void get_hessian_vector_products (DoubleVectorWithHaloEntries const &Y, Vector< DoubleVectorWithHaloEntries > const &C, Vector< DoubleVectorWithHaloEntries > &product)
 
void solve_eigenproblem (const unsigned &n_eval, Vector< std::complex< double >> &eigenvalue, Vector< DoubleVector > &eigenvector, const bool &steady=true)
 Solve the eigenproblem. More...
 
void solve_eigenproblem (const unsigned &n_eval, Vector< std::complex< double >> &eigenvalue, const bool &steady=true)
 
virtual void get_eigenproblem_matrices (CRDoubleMatrix &mass_matrix, CRDoubleMatrix &main_matrix, const double &shift=0.0)
 
void assign_eigenvector_to_dofs (DoubleVector &eigenvector)
 Assign the eigenvector passed to the function to the dofs. More...
 
void add_eigenvector_to_dofs (const double &epsilon, const DoubleVector &eigenvector)
 
void store_current_dof_values ()
 Store the current values of the degrees of freedom. More...
 
void restore_dof_values ()
 Restore the stored values of the degrees of freedom. More...
 
void enable_jacobian_reuse ()
 
void disable_jacobian_reuse ()
 Disable recycling of Jacobian in Newton iteration. More...
 
bool jacobian_reuse_is_enabled ()
 Is recycling of Jacobian in Newton iteration enabled? More...
 
booluse_predictor_values_as_initial_guess ()
 
void newton_solve ()
 Use Newton method to solve the problem. More...
 
void enable_globally_convergent_newton_method ()
 enable globally convergent Newton method More...
 
void disable_globally_convergent_newton_method ()
 disable globally convergent Newton method More...
 
void newton_solve (unsigned const &max_adapt)
 
void steady_newton_solve (unsigned const &max_adapt=0)
 
void copy (Problem *orig_problem_pt)
 
virtual Problemmake_copy ()
 
virtual void read (std::ifstream &restart_file, bool &unsteady_restart)
 
virtual void read (std::ifstream &restart_file)
 
virtual void dump (std::ofstream &dump_file) const
 
void dump (const std::string &dump_file_name) const
 
void delete_all_external_storage ()
 
virtual void symmetrise_eigenfunction_for_adaptive_pitchfork_tracking ()
 
doublebifurcation_parameter_pt () const
 
void get_bifurcation_eigenfunction (Vector< DoubleVector > &eigenfunction)
 
void activate_fold_tracking (double *const &parameter_pt, const bool &block_solve=true)
 
void activate_bifurcation_tracking (double *const &parameter_pt, const DoubleVector &eigenvector, const bool &block_solve=true)
 
void activate_bifurcation_tracking (double *const &parameter_pt, const DoubleVector &eigenvector, const DoubleVector &normalisation, const bool &block_solve=true)
 
void activate_pitchfork_tracking (double *const &parameter_pt, const DoubleVector &symmetry_vector, const bool &block_solve=true)
 
void activate_hopf_tracking (double *const &parameter_pt, const bool &block_solve=true)
 
void activate_hopf_tracking (double *const &parameter_pt, const double &omega, const DoubleVector &null_real, const DoubleVector &null_imag, const bool &block_solve=true)
 
void deactivate_bifurcation_tracking ()
 
void reset_assembly_handler_to_default ()
 Reset the system to the standard non-augemented state. More...
 
double arc_length_step_solve (double *const &parameter_pt, const double &ds, const unsigned &max_adapt=0)
 
double arc_length_step_solve (Data *const &data_pt, const unsigned &data_index, const double &ds, const unsigned &max_adapt=0)
 
void reset_arc_length_parameters ()
 
intsign_of_jacobian ()
 
void explicit_timestep (const double &dt, const bool &shift_values=true)
 Take an explicit timestep of size dt. More...
 
void unsteady_newton_solve (const double &dt)
 
void unsteady_newton_solve (const double &dt, const bool &shift_values)
 
void unsteady_newton_solve (const double &dt, const unsigned &max_adapt, const bool &first, const bool &shift=true)
 
double doubly_adaptive_unsteady_newton_solve (const double &dt, const double &epsilon, const unsigned &max_adapt, const bool &first, const bool &shift=true)
 
double doubly_adaptive_unsteady_newton_solve (const double &dt, const double &epsilon, const unsigned &max_adapt, const unsigned &suppress_resolve_after_spatial_adapt_flag, const bool &first, const bool &shift=true)
 
double adaptive_unsteady_newton_solve (const double &dt_desired, const double &epsilon)
 
double adaptive_unsteady_newton_solve (const double &dt_desired, const double &epsilon, const bool &shift_values)
 
void assign_initial_values_impulsive ()
 
void assign_initial_values_impulsive (const double &dt)
 
void calculate_predictions ()
 Calculate predictions. More...
 
void enable_mass_matrix_reuse ()
 
void disable_mass_matrix_reuse ()
 
bool mass_matrix_reuse_is_enabled ()
 Return whether the mass matrix is being reused. More...
 
void refine_uniformly (const Vector< unsigned > &nrefine_for_mesh)
 
void refine_uniformly (const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
 
void refine_uniformly_and_prune (const Vector< unsigned > &nrefine_for_mesh)
 
void refine_uniformly_and_prune (const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
 
void refine_uniformly (DocInfo &doc_info)
 
void refine_uniformly_and_prune (DocInfo &doc_info)
 
void refine_uniformly ()
 
void refine_uniformly (const unsigned &i_mesh, DocInfo &doc_info)
 Do uniform refinement for submesh i_mesh with documentation. More...
 
void refine_uniformly (const unsigned &i_mesh)
 Do uniform refinement for submesh i_mesh without documentation. More...
 
void p_refine_uniformly (const Vector< unsigned > &nrefine_for_mesh)
 
void p_refine_uniformly (const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
 
void p_refine_uniformly_and_prune (const Vector< unsigned > &nrefine_for_mesh)
 
void p_refine_uniformly_and_prune (const Vector< unsigned > &nrefine_for_mesh, DocInfo &doc_info)
 
void p_refine_uniformly (DocInfo &doc_info)
 
void p_refine_uniformly_and_prune (DocInfo &doc_info)
 
void p_refine_uniformly ()
 
void p_refine_uniformly (const unsigned &i_mesh, DocInfo &doc_info)
 Do uniform p-refinement for submesh i_mesh with documentation. More...
 
void p_refine_uniformly (const unsigned &i_mesh)
 Do uniform p-refinement for submesh i_mesh without documentation. More...
 
void refine_selected_elements (const Vector< unsigned > &elements_to_be_refined)
 
void refine_selected_elements (const Vector< RefineableElement * > &elements_to_be_refined_pt)
 
void refine_selected_elements (const unsigned &i_mesh, const Vector< unsigned > &elements_to_be_refined)
 
void refine_selected_elements (const unsigned &i_mesh, const Vector< RefineableElement * > &elements_to_be_refined_pt)
 
void refine_selected_elements (const Vector< Vector< unsigned >> &elements_to_be_refined)
 
void refine_selected_elements (const Vector< Vector< RefineableElement * >> &elements_to_be_refined_pt)
 
void p_refine_selected_elements (const Vector< unsigned > &elements_to_be_refined)
 
void p_refine_selected_elements (const Vector< PRefineableElement * > &elements_to_be_refined_pt)
 
void p_refine_selected_elements (const unsigned &i_mesh, const Vector< unsigned > &elements_to_be_refined)
 
void p_refine_selected_elements (const unsigned &i_mesh, const Vector< PRefineableElement * > &elements_to_be_refined_pt)
 
void p_refine_selected_elements (const Vector< Vector< unsigned >> &elements_to_be_refined)
 
void p_refine_selected_elements (const Vector< Vector< PRefineableElement * >> &elements_to_be_refined_pt)
 
unsigned unrefine_uniformly ()
 
unsigned unrefine_uniformly (const unsigned &i_mesh)
 
void p_unrefine_uniformly (DocInfo &doc_info)
 
void p_unrefine_uniformly (const unsigned &i_mesh, DocInfo &doc_info)
 Do uniform p-unrefinement for submesh i_mesh without documentation. More...
 
void adapt (unsigned &n_refined, unsigned &n_unrefined)
 
void adapt ()
 
void p_adapt (unsigned &n_refined, unsigned &n_unrefined)
 
void p_adapt ()
 
void adapt_based_on_error_estimates (unsigned &n_refined, unsigned &n_unrefined, Vector< Vector< double >> &elemental_error)
 
void adapt_based_on_error_estimates (Vector< Vector< double >> &elemental_error)
 
void get_all_error_estimates (Vector< Vector< double >> &elemental_error)
 
void doc_errors (DocInfo &doc_info)
 Get max and min error for all elements in submeshes. More...
 
void doc_errors ()
 Get max and min error for all elements in submeshes. More...
 
void enable_info_in_newton_solve ()
 
void disable_info_in_newton_solve ()
 Disable the output of information when in the newton solver. More...
 
- Public Member Functions inherited from oomph::ExplicitTimeSteppableObject
 ExplicitTimeSteppableObject ()
 Empty constructor. More...
 
 ExplicitTimeSteppableObject (const ExplicitTimeSteppableObject &)=delete
 Broken copy constructor. More...
 
void operator= (const ExplicitTimeSteppableObject &)=delete
 Broken assignment operator. More...
 
virtual ~ExplicitTimeSteppableObject ()
 Empty destructor. More...
 
virtual void actions_before_explicit_stage ()
 
virtual void actions_after_explicit_stage ()
 

Private Member Functions

HelmholtzMGProblemmake_new_problem ()
 Overload the make_new_problem function to return an object of this class. More...
 
TreeBasedRefineableMeshBasemg_bulk_mesh_pt ()
 

Private Attributes

RefineableSimpleCubicMesh< ELEMENT > * Bulk_mesh_pt
 Pointer to the "bulk" mesh. More...
 
ofstream Trace_file
 Trace file. More...
 

Additional Inherited Members

- Public Types inherited from oomph::Problem
typedef void(* SpatialErrorEstimatorFctPt) (Mesh *&mesh_pt, Vector< double > &elemental_error)
 Function pointer for spatial error estimator. More...
 
typedef void(* SpatialErrorEstimatorWithDocFctPt) (Mesh *&mesh_pt, Vector< double > &elemental_error, DocInfo &doc_info)
 Function pointer for spatial error estimator with doc. More...
 
- Public Attributes inherited from oomph::Problem
bool Shut_up_in_newton_solve
 
- Static Public Attributes inherited from oomph::Problem
static bool Suppress_warning_about_actions_before_read_unstructured_meshes
 
- Protected Types inherited from oomph::Problem
enum  Assembly_method {
  Perform_assembly_using_vectors_of_pairs , Perform_assembly_using_two_vectors , Perform_assembly_using_maps , Perform_assembly_using_lists ,
  Perform_assembly_using_two_arrays
}
 Enumerated flags to determine which sparse assembly method is used. More...
 
- Protected Member Functions inherited from oomph::Problem
unsigned setup_element_count_per_dof ()
 
virtual void sparse_assemble_row_or_column_compressed (Vector< int * > &column_or_row_index, Vector< int * > &row_or_column_start, Vector< double * > &value, Vector< unsigned > &nnz, Vector< double * > &residual, bool compressed_row_flag)
 
virtual void actions_before_newton_convergence_check ()
 
virtual void actions_before_newton_step ()
 
virtual void actions_after_newton_step ()
 
virtual void actions_before_implicit_timestep ()
 
virtual void actions_after_implicit_timestep ()
 
virtual void actions_after_implicit_timestep_and_error_estimation ()
 
virtual void actions_before_explicit_timestep ()
 Actions that should be performed before each explicit time step. More...
 
virtual void actions_after_explicit_timestep ()
 Actions that should be performed after each explicit time step. More...
 
virtual void actions_before_read_unstructured_meshes ()
 
virtual void actions_after_read_unstructured_meshes ()
 
virtual void actions_after_change_in_global_parameter (double *const &parameter_pt)
 
virtual void actions_after_change_in_bifurcation_parameter ()
 
virtual void actions_after_parameter_increase (double *const &parameter_pt)
 
doubledof_derivative (const unsigned &i)
 
doubledof_current (const unsigned &i)
 
virtual void set_initial_condition ()
 
virtual double global_temporal_error_norm ()
 
unsigned newton_solve_continuation (double *const &parameter_pt)
 
unsigned newton_solve_continuation (double *const &parameter_pt, DoubleVector &z)
 
void calculate_continuation_derivatives (double *const &parameter_pt)
 
void calculate_continuation_derivatives (const DoubleVector &z)
 
void calculate_continuation_derivatives_fd (double *const &parameter_pt)
 
bool does_pointer_correspond_to_problem_data (double *const &parameter_pt)
 
void set_consistent_pinned_values_for_continuation ()
 
- Protected Attributes inherited from oomph::Problem
Vector< Problem * > Copy_of_problem_pt
 
std::map< double *, boolCalculate_dparameter_analytic
 
bool Calculate_hessian_products_analytic
 
LinearAlgebraDistributionDof_distribution_pt
 
Vector< double * > Dof_pt
 Vector of pointers to dofs. More...
 
DoubleVectorWithHaloEntries Element_count_per_dof
 
double Relaxation_factor
 
double Newton_solver_tolerance
 
unsigned Max_newton_iterations
 Maximum number of Newton iterations. More...
 
unsigned Nnewton_iter_taken
 
Vector< doubleMax_res
 Maximum residuals at start and after each newton iteration. More...
 
double Max_residuals
 
bool Time_adaptive_newton_crash_on_solve_fail
 
bool Jacobian_reuse_is_enabled
 Is re-use of Jacobian in Newton iteration enabled? Default: false. More...
 
bool Jacobian_has_been_computed
 
bool Problem_is_nonlinear
 
bool Pause_at_end_of_sparse_assembly
 
bool Doc_time_in_distribute
 
unsigned Sparse_assembly_method
 
unsigned Sparse_assemble_with_arrays_initial_allocation
 
unsigned Sparse_assemble_with_arrays_allocation_increment
 
Vector< Vector< unsigned > > Sparse_assemble_with_arrays_previous_allocation
 
double Numerical_zero_for_sparse_assembly
 
double FD_step_used_in_get_hessian_vector_products
 
bool Mass_matrix_reuse_is_enabled
 
bool Mass_matrix_has_been_computed
 
bool Discontinuous_element_formulation
 
double Minimum_dt
 Minimum desired dt: if dt falls below this value, exit. More...
 
double Maximum_dt
 Maximum desired dt. More...
 
double DTSF_max_increase
 
double DTSF_min_decrease
 
double Minimum_dt_but_still_proceed
 
bool Scale_arc_length
 Boolean to control whether arc-length should be scaled. More...
 
double Desired_proportion_of_arc_length
 Proportion of the arc-length to taken by the parameter. More...
 
double Theta_squared
 
int Sign_of_jacobian
 Storage for the sign of the global Jacobian. More...
 
double Continuation_direction
 
double Parameter_derivative
 Storage for the derivative of the global parameter wrt arc-length. More...
 
double Parameter_current
 Storage for the present value of the global parameter. More...
 
bool Use_continuation_timestepper
 Boolean to control original or new storage of dof stuff. More...
 
unsigned Dof_derivative_offset
 
unsigned Dof_current_offset
 
Vector< doubleDof_derivative
 Storage for the derivative of the problem variables wrt arc-length. More...
 
Vector< doubleDof_current
 Storage for the present values of the variables. More...
 
double Ds_current
 Storage for the current step value. More...
 
unsigned Desired_newton_iterations_ds
 
double Minimum_ds
 Minimum desired value of arc-length. More...
 
bool Bifurcation_detection
 Boolean to control bifurcation detection via determinant of Jacobian. More...
 
bool Bisect_to_find_bifurcation
 Boolean to control wheter bisection is used to located bifurcation. More...
 
bool First_jacobian_sign_change
 Boolean to indicate whether a sign change has occured in the Jacobian. More...
 
bool Arc_length_step_taken
 Boolean to indicate whether an arc-length step has been taken. More...
 
bool Use_finite_differences_for_continuation_derivatives
 
OomphCommunicatorCommunicator_pt
 The communicator for this problem. More...
 
bool Always_take_one_newton_step
 
double Timestep_reduction_factor_after_nonconvergence
 
bool Keep_temporal_error_below_tolerance
 
- Static Protected Attributes inherited from oomph::Problem
static ContinuationStorageScheme Continuation_time_stepper
 Storage for the single static continuation timestorage object. More...
 

Detailed Description

template<class ELEMENT>
class PMLStructuredCubicHelmholtz< ELEMENT >

Problem class.

/////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////

Constructor & Destructor Documentation

◆ PMLStructuredCubicHelmholtz()

template<class ELEMENT >
PMLStructuredCubicHelmholtz< ELEMENT >::PMLStructuredCubicHelmholtz

Constructor.

Constructor for Helmholtz problem.

339 {
340  // Indicate that the problem is nonlinear to ensure the residual is
341  // calculated at the end of the iteration
342  problem_is_nonlinear(true);
343 
344  // Set the number of Newton iterations to one
346 
347  // Set up solver specific information:
348  //------------------------------------
349  // If we're choosing to use GMRES & MG as our linear solver
351  {
352  // Set the solver
354  }
355 
356  // Open trace file
357  Trace_file.open("RESLT/trace.dat");
358 
359  // Build the mesh using the specified parameters:
360  //-----------------------------------------------
361  // Build the "bulk" mesh
365 
366  // Create/set error estimator
367  Bulk_mesh_pt->spatial_error_estimator_pt()=new Z2ErrorEstimator;
368 
369  // Choose error tolerances
370  Bulk_mesh_pt->max_permitted_error()=1.0e-03;
371  Bulk_mesh_pt->min_permitted_error()=1.0e-06;
372 
373  // Create the main mesh
375 
376  // Build the entire mesh from its submeshes
378 
379  // Complete the build of all elements so they are fully functional:
380  //-----------------------------------------------------------------
381  // How many elements in the mesh?
382  unsigned n_element=mesh_pt()->nelement();
383 
384  // Loop over the elements and pass a pointer to the value of k^2
385  for (unsigned e=0;e<n_element;e++)
386  {
387  // Upcast from GeneralisedElement to Helmholtz bulk element
388  ELEMENT* el_pt=dynamic_cast<ELEMENT*>(Bulk_mesh_pt->element_pt(e));
389 
390  // If the upcast was successful
391  if (el_pt!=0)
392  {
393  // Set the wavenumber function pointer
394  el_pt->k_squared_pt()=&GlobalParameters::K_squared;
395 
396  // If we're using Jonathon's new test mapping
398  {
399  // Set the PML mapping function
400  el_pt->pml_mapping_pt()=GlobalParameters::Test_pml_mapping_pt;
401  }
402  } // if (el_pt!=0)
403  } // for (unsigned e=0;e<n_element;e++)
404 
405  // Apply the boundary conditions, both in the central region and on the
406  // outer boundary (since these nodes are PML nodes)
408 
409  // Enable the PML mapping in elements in the PML region
410  enable_pmls();
411 
412  // Setup equation numbering scheme
414 } // End of constructor
Array< double, 1, 3 > e(1./3., 0.5, 2.)
void apply_boundary_conditions()
Apply boundary conditions.
Definition: structured_cubic_point_source.cc:525
void enable_pmls()
Enable the PML mapping function for all nodes in the PML region.
Definition: structured_cubic_point_source.cc:638
void set_gmres_multigrid_solver()
Set GMRES preconditioner by multigrid as the linear solver.
Definition: structured_cubic_point_source.cc:458
RefineableSimpleCubicMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
Definition: structured_cubic_point_source.cc:313
ofstream Trace_file
Trace file.
Definition: structured_cubic_point_source.cc:331
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
unsigned add_sub_mesh(Mesh *const &mesh_pt)
Definition: problem.h:1330
void problem_is_nonlinear(const bool &prob_lin)
Access function to Problem_is_nonlinear.
Definition: problem.h:1600
void build_global_mesh()
Definition: problem.cc:1493
unsigned & max_newton_iterations()
Access function to max Newton iterations before giving up.
Definition: problem.h:1594
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Definition: problem.cc:1989
Refineable version of simple cubic 3D Brick mesh class.
Definition: simple_cubic_mesh.template.h:169
Definition: error_estimator.h:266
unsigned Enable_test_pml_mapping_flag
Definition: structured_cubic_point_source.cc:215
double Lx
Definition: structured_cubic_point_source.cc:109
double Ly
Definition: structured_cubic_point_source.cc:110
unsigned Nz
Definition: structured_cubic_point_source.cc:116
unsigned Nx
Number of elements in each direction (used by SimpleCubicMesh)
Definition: structured_cubic_point_source.cc:114
double K_squared
Square of the wavenumber.
Definition: helmholtz_point_source.cc:60
unsigned Linear_solver_flag
Definition: structured_cubic_point_source.cc:85
unsigned Ny
Definition: structured_cubic_point_source.cc:115
TestPMLMapping * Test_pml_mapping_pt
Set the new PML mapping.
Definition: structured_cubic_point_source.cc:210
double Lz
Definition: structured_cubic_point_source.cc:111

References e(), GlobalParameters::Enable_test_pml_mapping_flag, GlobalParameters::K_squared, GlobalParameters::Linear_solver_flag, GlobalParameters::Lx, GlobalParameters::Ly, GlobalParameters::Lz, GlobalParameters::Nx, GlobalParameters::Ny, GlobalParameters::Nz, GlobalParameters::Test_pml_mapping_pt, and oomph::Problem_Parameter::Trace_file.

◆ ~PMLStructuredCubicHelmholtz()

template<class ELEMENT >
PMLStructuredCubicHelmholtz< ELEMENT >::~PMLStructuredCubicHelmholtz

Destructor (empty)

Destructor for Helmholtz problem.

421 {
422  // If we're using GMRES & MG as the linear solver
424  {
425  // Delete the MG solver pointers
426  delete dynamic_cast<HelmholtzFGMRESMG<CRDoubleMatrix>* >
427  (linear_solver_pt())->preconditioner_pt();
428 
429  // Set the pointer to null
430  dynamic_cast<HelmholtzFGMRESMG<CRDoubleMatrix>* >
431  (linear_solver_pt())->preconditioner_pt()=0;
432 
433  // Delete the MG solver pointers
434  delete linear_solver_pt();
435 
436  // Set the pointer to null
437  linear_solver_pt()=0;
438  }
439 
440  // Delete the error estimator
441  delete Bulk_mesh_pt->spatial_error_estimator_pt();
442 
443  // Set the pointer to null
444  Bulk_mesh_pt->spatial_error_estimator_pt()=0;
445 
446  // Delete the "bulk" mesh
447  delete Bulk_mesh_pt;
448 
449  // Set the pointer to null
450  Bulk_mesh_pt=0;
451 
452 } // End of ~PMLStructuredCubicHelmholtz
Definition: complex_smoother.h:3241
LinearSolver *& linear_solver_pt()
Return a pointer to the linear solver object.
Definition: problem.h:1466

References GlobalParameters::Linear_solver_flag.

Member Function Documentation

◆ actions_after_adapt()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::actions_after_adapt
virtual

Actions after adapt:(empty)

Actions after adapt: Re-apply the boundary conditions.

Reimplemented from oomph::Problem.

714 {
715  // Complete the build of all elements so they are fully functional:
716  //-----------------------------------------------------------------
717  // How many elements in the mesh?
718  unsigned n_element=mesh_pt()->nelement();
719 
720  // Loop over the elements and pass a pointer to the value of k^2
721  for (unsigned e=0;e<n_element;e++)
722  {
723  // Upcast from GeneralisedElement to Helmholtz bulk element
724  ELEMENT* el_pt=dynamic_cast<ELEMENT*>(Bulk_mesh_pt->element_pt(e));
725 
726  // If the upcast was successful
727  if (el_pt!=0)
728  {
729  // Set the wavenumber function pointer
730  el_pt->k_squared_pt()=&GlobalParameters::K_squared;
731  }
732  } // for (unsigned e=0;e<n_element;e++)
733 
734  // Re-apply boundary conditions
736 
737  // Re-enable the PML mapping in elements in the PML region
738  enable_pmls();
739 
740  // Rebuild the mesh
742 } // End of actions_after_adapt
void rebuild_global_mesh()
Definition: problem.cc:1533

References e(), and GlobalParameters::K_squared.

◆ actions_after_newton_solve()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::actions_after_newton_solve ( )
inlinevirtual

Update the problem specs after solve (empty)

Reimplemented from oomph::Problem.

290  {
291  // Document the solution
292  doc_solution();
293  }
void doc_solution()
Doc the solution.
Definition: structured_cubic_point_source.cc:748

◆ actions_before_adapt()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::actions_before_adapt ( )
inlinevirtual

Actions before adapt: (empty)

Reimplemented from oomph::Problem.

296 {}

◆ actions_before_newton_solve()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::actions_before_newton_solve ( )
inlinevirtual

Update the problem specs before solve (empty)

Reimplemented from oomph::Problem.

286 {}

◆ apply_boundary_conditions()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::apply_boundary_conditions

Apply boundary conditions.

526 {
527  // Find the number of elements in the mesh
528  unsigned n_element=Bulk_mesh_pt->nelement();
529 
530  // Vector to hold the local coordinates of a point in any given element
531  Vector<double> s(3,0.0);
532 
533  // Vector to hold the (Eulerian) coordinates of a point
534  Vector<double> x(3,0.0);
535 
536  // Vector to hold the real and imaginary part of the solution
537  Vector<double> u(2,0.0);
538 
539  // If the user wishes to silence everything
541  {
542  // Store the output stream pointer
544 
545  // Now set the oomph_info stream pointer to the null stream to
546  // disable all possible output
548  }
549 
550  // Loop over the elements in the mesh
551  for (unsigned e=0;e<n_element;e++)
552  {
553  // Upcast from GeneralisedElement to Helmholtz bulk element
554  ELEMENT* el_pt=dynamic_cast<ELEMENT*>(Bulk_mesh_pt->element_pt(e));
555 
556  // If the upcast was successful
557  if (el_pt!=0)
558  {
559  // Get the (Eulerian) coordinates of the centre of the element
560  el_pt->get_x(s,x);
561 
562  // Check if the element lies in the central cube region
564  {
565  // Calculate the number of nodes in the element
566  unsigned nnode=el_pt->nnode();
567 
568  // Loop over all of the nodes in the element
569  for (unsigned i=0;i<nnode;i++)
570  {
571  // Create a node pointer to store the i-th node in the element
572  Node* node_pt=el_pt->node_pt(i);
573 
574  // Get the spatial position of this node
575  for (unsigned k=0;k<3;k++)
576  {
577  // Store the k-th coordinate value in the vector, x
578  x[k]=node_pt->x(k);
579  }
580 
581  // Get the exact solution at this (Eulerian) position
583 
584  // Make sure each dof at this point is pinned (real and imaginary)
585  node_pt->pin(0);
586  node_pt->pin(1);
587 
588  // Set the solution value at this point
589  node_pt->set_value(0,u[0]);
590  node_pt->set_value(1,u[1]);
591  }
592  } // if(abs(x[0]-GlobalParameters::Centre) < 0.51 ...
593  } // if (el_pt!=0)
594  } // for (unsigned e=0;e<n_element;e++)
595 
596  // If the user wishes to suppress all output restore the the stream pointer
598  {
599  // Now set the oomph_info stream pointer to the null stream to
600  // disable all possible output
602  }
603 
604  // Find the number of boundaries in the mesh
605  unsigned n_bound=Bulk_mesh_pt->nboundary();
606 
607  // Loop over all boundaries
608  for (unsigned b=0;b<n_bound;b++)
609  {
610  // Find the number of nodes on the b-th boundary
611  unsigned n_node=Bulk_mesh_pt->nboundary_node(b);
612 
613  // Loop over the nodes on the b-th boundary
614  for(unsigned n=0;n<n_node;n++)
615  {
616  // All of these nodes sides are PMLs so pin to 0
617  Node* boundary_node_pt=Bulk_mesh_pt->boundary_node_pt(b,n);
618 
619  // Pin the (real) dof at this node
620  boundary_node_pt->pin(0);
621 
622  // Pin the (imaginary) dof at this node
623  boundary_node_pt->pin(1);
624 
625  // Set the solution value at this point (real part)
626  boundary_node_pt->set_value(0,0.0);
627 
628  // Set the solution value at this point (imaginary part)
629  boundary_node_pt->set_value(1,0.0);
630  }
631  } // for(unsigned b=0;b<n_bound;b++)
632 } // End of apply_boundary_conditions
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Scalar * b
Definition: benchVecAdd.cpp:17
void pin(const unsigned &i)
Pin the i-th stored variable.
Definition: nodes.h:385
void set_value(const unsigned &i, const double &value_)
Definition: nodes.h:271
Definition: nodes.h:906
double & x(const unsigned &i)
Return the i-th nodal coordinate.
Definition: nodes.h:1060
std::ostream *& stream_pt()
Access function for the stream pointer.
Definition: oomph_definitions.h:464
RealScalar s
Definition: level1_cplx_impl.h:130
char char char int int * k
Definition: level2_impl.h:374
void get_simple_exact_u(const Vector< double > &x, Vector< double > &u)
Get the exact solution, u, at the spatial position, x.
Definition: structured_cubic_point_source.cc:148
unsigned Output_management_flag
Definition: structured_cubic_point_source.cc:92
bool is_in_pinned_region(const Vector< double > &x)
Definition: structured_cubic_point_source.cc:222
std::ostream * Stream_pt
Definition: structured_cubic_point_source.cc:104
Nullstream oomph_nullstream
Single (global) instantiation of the Nullstream.
Definition: oomph_definitions.cc:313
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
list x
Definition: plotDoE.py:28

References b, e(), GlobalParameters::get_simple_exact_u(), i, GlobalParameters::is_in_pinned_region(), k, n, oomph::oomph_info, oomph::oomph_nullstream, GlobalParameters::Output_management_flag, oomph::Data::pin(), s, oomph::Data::set_value(), GlobalParameters::Stream_pt, oomph::OomphInfo::stream_pt(), plotDoE::x, and oomph::Node::x().

◆ doc_solution()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::doc_solution

Doc the solution.

Doc the solution: doc_info contains labels/output directory etc.

749 {
750  // Tell the user
751  oomph_info << "\nDocumentation step: "
752  << GlobalParameters::Doc_info.number() << std::endl;
753 
754  // Create an output stream
755  ofstream some_file;
756 
757  // Create space for the file name
758  char filename[100];
759 
760  // Number of plot points
761  unsigned npts=5;
762 
763  // Number of plot points in the coarse solution
764  unsigned npts_coarse=2;
765 
766  // Output solution
767  //-----------------
768  sprintf(filename,"%s/soln%i.dat",
769  GlobalParameters::Doc_info.directory().c_str(),
770  GlobalParameters::Doc_info.number());
771  some_file.open(filename);
772  Bulk_mesh_pt->output(some_file,npts);
773  some_file.close();
774 
775  // Ouput exact solution
776  //---------------------
777  sprintf(filename,"%s/exact_soln%i.dat",
778  GlobalParameters::Doc_info.directory().c_str(),
779  GlobalParameters::Doc_info.number());
780  some_file.open(filename);
781  Bulk_mesh_pt->output_fct(some_file,npts,GlobalParameters::simple_exact_u_pt);
782  some_file.close();
783 
784  // Output coarse solution
785  //-----------------------
786  sprintf(filename,"%s/coarse_soln%i.dat",
787  GlobalParameters::Doc_info.directory().c_str(),
788  GlobalParameters::Doc_info.number());
789  some_file.open(filename);
790  Bulk_mesh_pt->output(some_file,npts_coarse);
791  some_file.close();
792 
793  // Compute error
794  //--------------
795  sprintf(filename,"%s/error%i.dat",
796  GlobalParameters::Doc_info.directory().c_str(),
797  GlobalParameters::Doc_info.number());
798  some_file.open(filename);
799 
800  //---------------------------------------------------------------------
801  // To compute the norm of the error norm we first need to loop over all
802  // of the elements in the mesh. Before we compute the norm of the error
803  // in any element we need to make sure it doesn't lie in the PML region
804  // or in the pinned region
805  //---------------------------------------------------------------------
806  // Variables to hold the L2 norm of the error in the solution
807  double error=0.0;
808 
809  // Variable to hold the L2 norm of the solution
810  double norm=0.0;
811 
812  // Vector to hold the local coordinates of a point in an element
813  Vector<double> s(3,0.0);
814 
815  // Vector to hold the spatial position of a point in an element
816  Vector<double> x(3,0.0);
817 
818  // Store the required coordinate of the inner boundary of the left PML;
819  // in any given direction this will be the value of Pml_thickness
820  double left_boundary=GlobalParameters::Pml_thickness;
821 
822  // Store the required coordinate of the inner boundary of the right
823  // PML; in the x-direction this will be the value of Lx-Pml_thickness
824  // (or Ly-Pml_thickness in the y-direction and Lz-Pml_thickness in
825  // the z-direction) but we assume the PML has the same thickness in
826  // all directions
828 
829  // Find out how many elements there are in the mesh
830  unsigned n_element=Bulk_mesh_pt->nelement();
831 
832  // Loop over all of the elements in the mesh
833  for (unsigned e=0;e<n_element;e++)
834  {
835  // Variables to hold the L2 norm of the error in the elemental solution
836  double el_error=0.0;
837 
838  // Variable to hold the L2 norm of the elemental solution
839  double el_norm=0.0;
840 
841  // Upcast from GeneralisedElement to Helmholtz bulk element
842  ELEMENT* el_pt=dynamic_cast<ELEMENT*>(Bulk_mesh_pt->element_pt(e));
843 
844  // If the upcast was successful
845  if (el_pt!=0)
846  {
847  // Get the (Eulerian) coordinates of the centre of the element
848  el_pt->get_x(s,x);
849 
850  // We only take the contribution from this element if it does
851  // not lie in the PML region
852  if(x[0]<=left_boundary) continue;
853  if(x[0]>=right_boundary) continue;
854  if(x[1]<=left_boundary) continue;
855  if(x[1]>=right_boundary) continue;
856  if(x[2]<=left_boundary) continue;
857  if(x[2]>=right_boundary) continue;
858 
859  // If it's in the (pinned) central region, ignore it
860 
861  // Check if the element lies in the central cube region
863  {
864  // Skip to the next element
865  continue;
866  }
867 
868  // Otherwise, compute the L2 norm of the error over this element
869  el_pt->compute_error(some_file,
871  el_error,
872  el_norm);
873 
874  // Update the global error norm value
875  error+=el_error;
876 
877  // Update the global norm value
878  norm+=el_norm;
879  }
880  } // for(unsigned e=0;e<n_element;e++)
881 
882  // Now close the file
883  some_file.close();
884 
885  // Output the L2 norm of the error and the solution and then output
886  // the relative error of the solution
887  oomph_info << "\nSolution norm : " << norm
888  << "\nAbsolute error: " << error
889  << "\nRelative error: " << error/norm
890  << std::endl;
891 
892  // Write the L2 norm of the solution to the trace file
893  Trace_file << norm << std::endl;
894 
895  // Increment the documentation number
897 } // End of doc_solution
unsigned & number()
Number used (e.g.) for labeling output files.
Definition: oomph_utilities.h:554
FiniteElement::SteadyExactSolutionFctPt simple_exact_u_pt
Definition: structured_cubic_point_source.cc:179
DocInfo Doc_info
Helper for documenting.
Definition: extrude_triangle_generated_mesh.cc:57
double Pml_thickness
Length of cube in each direction.
Definition: structured_cubic_point_source.cc:122
string filename
Definition: MergeRestartFiles.py:39
int error
Definition: calibrate.py:297

References GlobalParameters::Doc_info, e(), calibrate::error, MergeRestartFiles::filename, GlobalParameters::get_simple_exact_u(), GlobalParameters::is_in_pinned_region(), GlobalParameters::Lx, oomph::DocInfo::number(), oomph::oomph_info, GlobalParameters::Pml_thickness, s, GlobalParameters::simple_exact_u_pt, oomph::Problem_Parameter::Trace_file, and plotDoE::x.

◆ enable_pmls()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::enable_pmls

Enable the PML mapping function for all nodes in the PML region.

Enable the PML mapping function for each node in the PML region.

639 {
640  // Find the number of elements in the mesh
641  unsigned n_element=Bulk_mesh_pt->nelement();
642 
643  // Vector to hold the local coordinates of a point in any given element
644  Vector<double> s(3,0.0);
645 
646  // Vector to hold the (Eulerian) coordinates of a point
647  Vector<double> x(3,0.0);
648 
649  // Vector to hold the real and imaginary part of the solution
650  Vector<double> u(2,0.0);
651 
652  // Store the required coordinate of the inner boundary of the left PML;
653  // in any given direction this will be the value of Pml_thickness
654  double left_boundary=GlobalParameters::Pml_thickness;
655 
656  // Store the required coordinate of the inner boundary of the right
657  // PML; in the x-direction this will be the value of Lx-Pml_thickness
658  // (or Ly-Pml_thickness in the y-direction and Lz-Pml_thickness in
659  // the z-direction) but we assume the PML has the same thickness in
660  // all directions
662 
663  // Loop over the elements in the mesh
664  for (unsigned e=0;e<n_element;e++)
665  {
666  // Upcast from GeneralisedElement to Helmholtz bulk element
667  ELEMENT* el_pt=dynamic_cast<ELEMENT*>(Bulk_mesh_pt->element_pt(e));
668 
669  // If the upcast was successful
670  if (el_pt!=0)
671  {
672  // If we're using Jonathon's new test mapping
674  {
675  // Set the PML mapping function
676  el_pt->pml_mapping_pt()=GlobalParameters::Test_pml_mapping_pt;
677  }
678 
679  // Get the (Eulerian) coordinates of the centre of the element
680  el_pt->get_x(s,x);
681 
682  // If it's in the left (x-direction) PML region
683  if (x[0]<=left_boundary)
684  el_pt->enable_pml(0,left_boundary,0.0);
685 
686  // If it's in the right (x-direction) PML region
687  if (x[0]>=right_boundary)
688  el_pt->enable_pml(0,right_boundary,GlobalParameters::Lx);
689 
690  // If it's in the left (y-direction) PML region
691  if (x[1]<=left_boundary)
692  el_pt->enable_pml(1,left_boundary,0.0);
693 
694  // If it's in the right (y-direction) PML region
695  if (x[1]>=right_boundary)
696  el_pt->enable_pml(1,right_boundary,GlobalParameters::Ly);
697 
698  // If it's in the left (z-direction) PML region
699  if (x[2]<=left_boundary)
700  el_pt->enable_pml(2,left_boundary,0.0);
701 
702  // If it's in the right (z-direction) PML region
703  if (x[2]>=right_boundary)
704  el_pt->enable_pml(2,right_boundary,GlobalParameters::Lz);
705  }
706  } // for (unsigned e=0;e<n_element;e++)
707 } // End of enable_pmls

References e(), GlobalParameters::Enable_test_pml_mapping_flag, GlobalParameters::Lx, GlobalParameters::Ly, GlobalParameters::Lz, GlobalParameters::Pml_thickness, s, GlobalParameters::Test_pml_mapping_pt, and plotDoE::x.

◆ make_new_problem()

template<class ELEMENT >
HelmholtzMGProblem* PMLStructuredCubicHelmholtz< ELEMENT >::make_new_problem ( )
inlineprivatevirtual

Overload the make_new_problem function to return an object of this class.

Implements oomph::HelmholtzMGProblem.

317  {
318  // Return a new problem pointer
320  }
Problem class.
Definition: structured_cubic_point_source.cc:272

◆ mg_bulk_mesh_pt()

template<class ELEMENT >
TreeBasedRefineableMeshBase* PMLStructuredCubicHelmholtz< ELEMENT >::mg_bulk_mesh_pt ( )
inlineprivatevirtual

Overload the mg_bulk_mesh_pt function to return a pointer to the "refineable" portion of the mesh

Implements oomph::HelmholtzMGProblem.

325  {
326  // Return the pointer to the bulk mesh
327  return Bulk_mesh_pt;
328  }

◆ set_gmres_multigrid_solver()

template<class ELEMENT >
void PMLStructuredCubicHelmholtz< ELEMENT >::set_gmres_multigrid_solver

Set GMRES preconditioner by multigrid as the linear solver.

Build and set GMRES preconditioner by multigrid as the linear solver.

459 {
460  // Create linear solver
463 
464  // Set the number of iterations
465  solver_pt->max_iter()=200;
466 
467  // Set the tolerance (to ensure the Newton solver converges in one step)
468  solver_pt->tolerance()=1.0e-10;
469 
470  // If the user wishes to document the convergence information
472  {
473  // Create a file to record the convergence history
474  solver_pt->open_convergence_history_file_stream("RESLT/conv.dat");
475  }
476 
477  // Create linear solver
478  linear_solver_pt()=solver_pt;
479 
480  // This preconditioner uses multigrid on the block version of the full
481  // matrix. 2 V-cycles will be used here per preconditioning step
483 
484  // Set preconditioner
485  solver_pt->preconditioner_pt()=prec_pt;
486 
487  // Set the shift
489 
490  // If the user wants to use damped Jacobi on every level as a smoother
492  {
493  // Set the pre-smoother factory function
496  }
497 
498  // If the user wants to use damped Jacobi on every level as a smoother
500  {
501  // Set the post-smoother factory function
504  }
505 
506  // Suppress certain timings
508  {
509  prec_pt->disable_doc_time();
510  }
512  {
513  prec_pt->disable_v_cycle_output();
514  }
516  {
517  prec_pt->disable_output();
518  }
519 } // End of set_gmres_multigrid_solver
Definition: helmholtz_geometric_multigrid.h:83
void disable_v_cycle_output()
Definition: helmholtz_geometric_multigrid.h:226
void disable_output()
Definition: helmholtz_geometric_multigrid.h:237
void disable_doc_time()
Disable time documentation.
Definition: helmholtz_geometric_multigrid.h:218
void set_post_smoother_factory_function(PostSmootherFactoryFctPt post_smoother_fn)
Access function to set the post-smoother creation function.
Definition: helmholtz_geometric_multigrid.h:102
double & alpha_shift()
Function to change the value of the shift.
Definition: helmholtz_geometric_multigrid.h:211
void set_pre_smoother_factory_function(PreSmootherFactoryFctPt pre_smoother_fn)
Access function to set the pre-smoother creation function.
Definition: helmholtz_geometric_multigrid.h:94
void open_convergence_history_file_stream(const std::string &file_name, const std::string &zone_title="")
Definition: iterative_linear_solver.h:138
Preconditioner *& preconditioner_pt()
Access function to preconditioner.
Definition: iterative_linear_solver.h:95
double & tolerance()
Access to convergence tolerance.
Definition: iterative_linear_solver.h:107
unsigned & max_iter()
Access to max. number of iterations.
Definition: iterative_linear_solver.h:113
double Alpha_shift
Definition: structured_cubic_point_source.cc:129
unsigned Doc_convergence_flag
Definition: structured_cubic_point_source.cc:98
unsigned Pre_smoother_flag
Definition: structured_cubic_point_source.cc:75
unsigned Post_smoother_flag
Definition: structured_cubic_point_source.cc:80
HelmholtzSmoother * set_post_smoother()
Definition: structured_cubic_point_source.cc:256
HelmholtzSmoother * set_pre_smoother()
Definition: structured_cubic_point_source.cc:248

References GlobalParameters::Alpha_shift, oomph::HelmholtzMGPreconditioner< DIM >::alpha_shift(), oomph::HelmholtzMGPreconditioner< DIM >::disable_doc_time(), oomph::HelmholtzMGPreconditioner< DIM >::disable_output(), oomph::HelmholtzMGPreconditioner< DIM >::disable_v_cycle_output(), GlobalParameters::Doc_convergence_flag, oomph::IterativeLinearSolver::max_iter(), oomph::IterativeLinearSolver::open_convergence_history_file_stream(), GlobalParameters::Output_management_flag, GlobalParameters::Post_smoother_flag, GlobalParameters::Pre_smoother_flag, oomph::IterativeLinearSolver::preconditioner_pt(), Smoother_Factory_Function_Helper::set_post_smoother(), oomph::HelmholtzMGPreconditioner< DIM >::set_post_smoother_factory_function(), Smoother_Factory_Function_Helper::set_pre_smoother(), oomph::HelmholtzMGPreconditioner< DIM >::set_pre_smoother_factory_function(), and oomph::IterativeLinearSolver::tolerance().

Member Data Documentation

◆ Bulk_mesh_pt

template<class ELEMENT >
RefineableSimpleCubicMesh<ELEMENT>* PMLStructuredCubicHelmholtz< ELEMENT >::Bulk_mesh_pt
private

Pointer to the "bulk" mesh.

◆ Trace_file

template<class ELEMENT >
ofstream PMLStructuredCubicHelmholtz< ELEMENT >::Trace_file
private

Trace file.


The documentation for this class was generated from the following file: