PMLFourierDecomposedHelmholtzProblem< ELEMENT > Class Template Reference

Problem class. More...

+ Inheritance diagram for PMLFourierDecomposedHelmholtzProblem< ELEMENT >:

Public Member Functions

 PMLFourierDecomposedHelmholtzProblem ()
 Constructor. More...
 
 ~PMLFourierDecomposedHelmholtzProblem ()
 Destructor (empty) More...
 
void actions_before_newton_solve ()
 Update the problem specs before solve (empty) More...
 
void actions_after_newton_solve ()
 Update the problem after solve (empty) More...
 
void doc_solution (DocInfo &doc_info)
 Doc the solution: doc_info contains labels/output directory etc. More...
 
void create_pml_meshes ()
 Create PML meshes. More...
 
void create_power_monitor_mesh ()
 Create mesh of face elements that monitor the radiated power. More...
 
void complete_problem_setup ()
 
- 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
 
virtual void actions_before_adapt ()
 
virtual void actions_after_adapt ()
 Actions that are to be performed after a mesh adaptation. More...
 
OomphCommunicator * communicator_pt ()
 access function to the oomph-lib communicator More...
 
const OomphCommunicator * communicator_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 ()
 
LinearSolver * mass_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...
 
Time * time_pt () const
 Return a pointer to the global time object (const version). More...
 
double & time ()
 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 TimeStepper * time_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...
 
double & minimum_dt ()
 Access function to min timestep in adaptive timestepping. More...
 
double & maximum_dt ()
 Access function to max timestep in adaptive timestepping. More...
 
unsigned & max_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...
 
double & max_residuals ()
 
bool & time_adaptive_newton_crash_on_solve_fail ()
 Access function for Time_adaptive_newton_crash_on_solve_fail. More...
 
double & newton_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...
 
double * global_dof_pt (const unsigned &i)
 
double & dof (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...
 
double * dof_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...
 
bool & use_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 Problem * make_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 ()
 
double * bifurcation_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 ()
 
int & sign_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

void create_flux_elements_on_inner_boundary ()
 Create flux elements on inner boundary. More...
 
void delete_face_elements (Mesh *const &boundary_mesh_pt)
 Delete boundary face elements and wipe the surface mesh. More...
 
void apply_zero_dirichlet_boundary_conditions ()
 

Private Attributes

Mesh * Power_monitor_mesh_pt
 Pointer to mesh that stores the power monitor elements. More...
 
TriangleMesh< ELEMENT > * Bulk_mesh_pt
 Pointer to the "bulk" mesh. More...
 
Mesh * Helmholtz_inner_boundary_mesh_pt
 Mesh of FaceElements that apply the flux bc on the inner boundary. More...
 
Mesh * PML_right_mesh_pt
 Pointer to the right PML mesh. More...
 
Mesh * PML_top_mesh_pt
 Pointer to the top PML mesh. More...
 
Mesh * PML_bottom_mesh_pt
 Pointer to the bottom PML mesh. More...
 
Mesh * PML_top_right_mesh_pt
 Pointer to the top right corner PML mesh. More...
 
Mesh * PML_bottom_right_mesh_pt
 Pointer to the bottom right corner PML 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)
 
double & dof_derivative (const unsigned &i)
 
double & dof_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 *, bool > Calculate_dparameter_analytic
 
bool Calculate_hessian_products_analytic
 
LinearAlgebraDistribution * Dof_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< double > Max_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< double > Dof_derivative
 Storage for the derivative of the problem variables wrt arc-length. More...
 
Vector< double > Dof_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
 
OomphCommunicator * Communicator_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 PMLFourierDecomposedHelmholtzProblem< ELEMENT >

Problem class.

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

Constructor & Destructor Documentation

◆ PMLFourierDecomposedHelmholtzProblem()

Constructor.

Constructor for Pml Fourier-decomposed Helmholtz problem.

Setup "bulk" mesh

791 {
792  string trace_file_location = ProblemParameters::Directory + "/trace.dat";
793 
794  // Open trace file
795  Trace_file.open(trace_file_location.c_str());
796 
798 
799  // Create the circle that represents the inner boundary
800  double x_c=0.0;
801  double y_c=0.0;
802  double r_min=1.0;
803  double r_max=3.0;
804  Circle* inner_circle_pt=new Circle(x_c,y_c,r_min);
805 
806 
807  // Edges/boundary segments making up outer boundary
808  //-------------------------------------------------
809  Vector<TriangleMeshCurveSection*> outer_boundary_line_pt(6);
810 
811  // All poly boundaries are defined by two vertices
812  Vector<Vector<double> > boundary_vertices(2);
813 
814 
815  // Bottom straight boundary on symmetry line
816  //------------------------------------------
817  boundary_vertices[0].resize(2);
818  boundary_vertices[0][0]=0.0;
819  boundary_vertices[0][1]=-r_min;
820  boundary_vertices[1].resize(2);
821  boundary_vertices[1][0]=0.0;
822  boundary_vertices[1][1]=-r_max;
823 
824  unsigned boundary_id=0;
825  outer_boundary_line_pt[0]=
826  new TriangleMeshPolyLine(boundary_vertices,boundary_id);
827 
828 
829  // Bottom boundary of bulk mesh
830  //-----------------------------
831  boundary_vertices[0][0]=0.0;
832  boundary_vertices[0][1]=-r_max;
833  boundary_vertices[1][0]=r_max;;
834  boundary_vertices[1][1]=-r_max;
835 
836  boundary_id=1;
837  outer_boundary_line_pt[1]=
838  new TriangleMeshPolyLine(boundary_vertices,boundary_id);
839 
840 
841  // Right boundary of bulk mesh
842  //----------------------------
843  boundary_vertices[0][0]=r_max;
844  boundary_vertices[0][1]=-r_max;
845  boundary_vertices[1][0]=r_max;;
846  boundary_vertices[1][1]=r_max;
847 
848  boundary_id=2;
849  outer_boundary_line_pt[2]=
850  new TriangleMeshPolyLine(boundary_vertices,boundary_id);
851 
852 
853  // Top boundary of bulk mesh
854  //--------------------------
855  boundary_vertices[0][0]=r_max;
856  boundary_vertices[0][1]=r_max;
857  boundary_vertices[1][0]=0.0;
858  boundary_vertices[1][1]=r_max;
859 
860  boundary_id=3;
861  outer_boundary_line_pt[3]=
862  new TriangleMeshPolyLine(boundary_vertices,boundary_id);
863 
864 // Top straight boundary on symmetry line
865  //---------------------------------------
866  boundary_vertices[0][0]=0.0;
867  boundary_vertices[0][1]=r_max;
868  boundary_vertices[1][0]=0.0;
869  boundary_vertices[1][1]=r_min;
870 
871  boundary_id=4;
872  outer_boundary_line_pt[4]=
873  new TriangleMeshPolyLine(boundary_vertices,boundary_id);
874 
875 
876  // Inner circular boundary:
877  //-------------------------
878 
879  // Number of segments used for representing the curvilinear boundary
880  unsigned n_segments = 20;
881 
882  // The intrinsic coordinates for the beginning and end of the curve
883  double s_start = 0.5*MathematicalConstants::Pi;
884  double s_end = -0.5*MathematicalConstants::Pi;
885 
886  boundary_id = 5;
887  outer_boundary_line_pt[5]=
888  new TriangleMeshCurviLine(inner_circle_pt,
889  s_start,
890  s_end,
891  n_segments,
892  boundary_id);
893 
894 
895  // Create closed curve that defines outer boundary
896  //------------------------------------------------
897  TriangleMeshClosedCurve *outer_boundary_pt =
898  new TriangleMeshClosedCurve(outer_boundary_line_pt);
899 
900 
901  // Use the TriangleMeshParameters object for helping on the manage of the
902  // TriangleMesh parameters. The only parameter that needs to take is the
903  // outer boundary.
904  TriangleMeshParameters triangle_mesh_parameters(outer_boundary_pt);
905 
906 
907  // Specify maximum element area
908  double element_area = ProblemParameters::Element_area;
909  triangle_mesh_parameters.element_area() = element_area;
910 
911 #ifdef ADAPTIVE
912 
913  // Build "bulk" mesh
914  Bulk_mesh_pt=new RefineableTriangleMesh<ELEMENT>(triangle_mesh_parameters);
915 
916  // Add the bulk mesh to the problem
918 
919  // Initialise mesh as geom object
920  Mesh_as_geom_obj_pt=0;
921 
922  // Create/set error estimator
923  Bulk_mesh_pt->spatial_error_estimator_pt()=new Z2ErrorEstimator;
924 
925  // Choose error tolerances to force some uniform refinement
926  Bulk_mesh_pt->min_permitted_error()=0.00004;
927  Bulk_mesh_pt->max_permitted_error()=0.0001;
928 
929  // Reduce wavenumber to make effect of singularity more prominent
931 
932 #else
933 
934  // Create the bulk mesh
935  Bulk_mesh_pt= new TriangleMesh<ELEMENT>(triangle_mesh_parameters);
936 
937  // Add the bulk mesh to the problem
939 
940  // Create flux elements on inner boundary
943 
944  // ...and add the mesh to the problem
946 
947 #endif
948 
949 
950  // Attach the power monitor elements
953 
954  // Create the pml meshes
956 
957  // Build the Problem's global mesh from its various sub-meshes
959 
960  // Complete the build of all elements
962 
963  // Setup equation numbering scheme
964  cout <<"Number of equations: " << assign_eqn_numbers() << std::endl;
965 
966 } // end of constructor
TriangleMesh< ELEMENT > * Bulk_mesh_pt
Pointer to the "bulk" mesh.
Definition: oscillating_sphere.cc:511
Mesh * Helmholtz_inner_boundary_mesh_pt
Mesh of FaceElements that apply the flux bc on the inner boundary.
Definition: oscillating_sphere.cc:516
void create_power_monitor_mesh()
Create mesh of face elements that monitor the radiated power.
Definition: oscillating_sphere.cc:544
ofstream Trace_file
Trace file.
Definition: oscillating_sphere.cc:534
Mesh * Power_monitor_mesh_pt
Pointer to mesh that stores the power monitor elements.
Definition: oscillating_sphere.cc:494
void complete_problem_setup()
Definition: oscillating_sphere.cc:649
void create_pml_meshes()
Create PML meshes.
Definition: oscillating_sphere.cc:1110
void create_flux_elements_on_inner_boundary()
Create flux elements on inner boundary.
Definition: oscillating_sphere.cc:1072
Definition: geom_objects.h:873
Definition: mesh.h:67
unsigned add_sub_mesh(Mesh *const &mesh_pt)
Definition: problem.h:1330
void build_global_mesh()
Definition: problem.cc:1493
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Definition: problem.cc:1989
Unstructured refineable Triangle Mesh.
Definition: triangle_mesh.template.h:2249
Base class defining a closed curve for the Triangle mesh generation.
Definition: unstructured_two_d_mesh_geometry_base.h:1339
Definition: unstructured_two_d_mesh_geometry_base.h:662
Definition: triangle_mesh.template.h:94
Class defining a polyline for use in Triangle Mesh generation.
Definition: unstructured_two_d_mesh_geometry_base.h:868
Definition: triangle_mesh.template.h:424
Definition: oomph-lib/src/generic/Vector.h:58
Definition: error_estimator.h:266
double r_min
Definition: two_d_biharmonic.cc:237
double r_max
Definition: two_d_biharmonic.cc:238
double Pi
Definition: two_d_biharmonic.cc:235
string Directory
Output directory.
Definition: oscillating_sphere.cc:59
double K_squared
Square of the wavenumber.
Definition: sphere_scattering.cc:225
double Element_area
Target area for initial mesh.
Definition: unstructured_two_d_curved.cc:474

References ProblemParameters::Directory, ProblemParameters::Element_area, oomph::TriangleMeshParameters::element_area(), ProblemParameters::K_squared, oomph::MathematicalConstants::Pi, BiharmonicTestFunctions2::r_max, BiharmonicTestFunctions2::r_min, and oomph::Problem_Parameter::Trace_file.

◆ ~PMLFourierDecomposedHelmholtzProblem()

template<class ELEMENT >
PMLFourierDecomposedHelmholtzProblem< ELEMENT >::~PMLFourierDecomposedHelmholtzProblem ( )
inline

Destructor (empty)

438 {}

Member Function Documentation

◆ actions_after_newton_solve()

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

Update the problem after solve (empty)

Reimplemented from oomph::Problem.

444 {}

◆ actions_before_newton_solve()

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

Update the problem specs before solve (empty)

Reimplemented from oomph::Problem.

441 {}

◆ apply_zero_dirichlet_boundary_conditions()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::apply_zero_dirichlet_boundary_conditions
private
733 {
734  // Apply zero dirichlet conditions on the bottom straight boundary
735  // and the top straight boundary located on the symmetry line.
736 
737  // Bottom straight boundary on symmetry line:
738  {
739  //Boundary id
740  unsigned b=0;
741 
742  // How many nodes are there?
743  unsigned n_node=Bulk_mesh_pt->nboundary_node(b);
744  for (unsigned n=0;n<n_node;n++)
745  {
746  // Get the node
747  Node* nod_pt=Bulk_mesh_pt->boundary_node_pt(b,n);
748 
749  // Pin the node
750  nod_pt->pin(0);
751  nod_pt->pin(1);
752 
753  // Set the node's value
754  nod_pt->set_value(0, 0.0);
755  nod_pt->set_value(1, 0.0);
756  }
757  }
758 
759 // Top straight boundary on symmetry line:
760  {
761  //Boundary id
762  unsigned b=4;
763 
764  // How many nodes are there?
765  unsigned n_node=Bulk_mesh_pt->nboundary_node(b);
766  for (unsigned n=0;n<n_node;n++)
767  {
768  // Get the node
769  Node* nod_pt=Bulk_mesh_pt->boundary_node_pt(b,n);
770 
771  // Pin the node
772  nod_pt->pin(0);
773  nod_pt->pin(1);
774 
775  // Set the node's value
776  nod_pt->set_value(0, 0.0);
777  nod_pt->set_value(1, 0.0);
778  }
779  }
780 
781 
782 } // end of apply_zero_dirichlet_boundary_conditions
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

References b, n, oomph::Data::pin(), and oomph::Data::set_value().

◆ complete_problem_setup()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::complete_problem_setup
650 {
651  // Complete the build of all elements so they are fully functional
652  unsigned n_element = this->mesh_pt()->nelement();
653  for(unsigned i=0;i<n_element;i++)
654  {
655  // Upcast from GeneralsedElement to the present element
656  PMLFourierDecomposedHelmholtzEquations *el_pt = dynamic_cast<
658  mesh_pt()->element_pt(i));
659 
660  if (!(el_pt==0))
661  {
662  //Set the frequency pointer
664 
665  // Set pointer to Fourier wave number
667  }
668  }
669 
670  // If the Fourier wavenumber is odd, then apply zero dirichlet boundary
671  // conditions on the two straight boundaries on the symmetry line.
672  if (ProblemParameters::N_fourier % 2 == 1)
673  {
674  cout
675  << "Zero Dirichlet boundary condition has been applied on symmetry line\n";
676  cout << "due to an odd Fourier wavenumber\n" << std::endl;
678  }
679 
680 } // end of complete_problem_setup
int i
Definition: BiCGSTAB_step_by_step.cpp:9
void apply_zero_dirichlet_boundary_conditions()
Definition: oscillating_sphere.cc:732
GeneralisedElement *& element_pt(const unsigned long &e)
Return pointer to element e.
Definition: mesh.h:448
unsigned long nelement() const
Return number of elements in the mesh.
Definition: mesh.h:590
Definition: pml_fourier_decomposed_helmholtz_elements.h:162
int *& pml_fourier_wavenumber_pt()
Get pointer to Fourier wavenumber.
Definition: pml_fourier_decomposed_helmholtz_elements.h:240
double *& k_squared_pt()
Get pointer to frequency.
Definition: pml_fourier_decomposed_helmholtz_elements.h:205
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
int N_fourier
Fourier wave number.
Definition: sphere_scattering.cc:228

References i, ProblemParameters::K_squared, oomph::PMLFourierDecomposedHelmholtzEquations::k_squared_pt(), ProblemParameters::N_fourier, and oomph::PMLFourierDecomposedHelmholtzEquations::pml_fourier_wavenumber_pt().

◆ create_flux_elements_on_inner_boundary()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::create_flux_elements_on_inner_boundary
private

Create flux elements on inner boundary.

1073 {
1074  // Apply flux bc on inner boundary (boundary 5)
1075  unsigned b=5;
1076 
1077 // Loop over the bulk elements adjacent to boundary b
1078  unsigned n_element = Bulk_mesh_pt->nboundary_element(b);
1079  for(unsigned e=0;e<n_element;e++)
1080  {
1081  // Get pointer to the bulk element that is adjacent to boundary b
1082  ELEMENT* bulk_elem_pt = dynamic_cast<ELEMENT*>(
1083  Bulk_mesh_pt->boundary_element_pt(b,e));
1084 
1085  //Find the index of the face of element e along boundary b
1086  int face_index = Bulk_mesh_pt->face_index_at_boundary(b,e);
1087 
1088  // Build the corresponding prescribed incoming-flux element
1090  flux_element_pt = new
1092  (bulk_elem_pt,face_index);
1093 
1094  //Add the prescribed incoming-flux element to the surface mesh
1096 
1097  // Set the pointer to the prescribed flux function
1098  flux_element_pt->flux_fct_pt() = &ProblemParameters::exact_minus_dudr;
1099 
1100  } //end of loop over bulk elements adjacent to boundary b
1101 
1102 } // end of create flux elements on inner boundary
Array< double, 1, 3 > e(1./3., 0.5, 2.)
void add_element_pt(GeneralisedElement *const &element_pt)
Add a (pointer to) an element to the mesh.
Definition: mesh.h:617
Definition: pml_fourier_decomposed_helmholtz_flux_elements.h:56
PMLFourierDecomposedHelmholtzPrescribedFluxFctPt & flux_fct_pt()
Broken assignment operator.
Definition: pml_fourier_decomposed_helmholtz_flux_elements.h:93
void exact_minus_dudr(const Vector< double > &x, std::complex< double > &flux)
Definition: sphere_scattering.cc:302

References b, e(), ProblemParameters::exact_minus_dudr(), and oomph::PMLFourierDecomposedHelmholtzFluxElement< ELEMENT >::flux_fct_pt().

◆ create_pml_meshes()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::create_pml_meshes

Create PML meshes.

Create PML meshes and add them to the problem's sub-meshes.

1111 {
1112  // Bulk mesh bottom boundary id
1113  unsigned int bottom_boundary_id = 1;
1114 
1115  // Bulk mesh right boundary id
1116  unsigned int right_boundary_id = 2;
1117 
1118  // Bulk mesh top boundary id
1119  unsigned int top_boundary_id = 3;
1120 
1121  // PML width in elements for the right layer
1122  unsigned n_x_right_pml = ProblemParameters::Nel_pml;
1123 
1124  // PML width in elements for the top layer
1125  unsigned n_y_top_pml = ProblemParameters::Nel_pml;
1126 
1127  // PML width in elements for the bottom layer
1128  unsigned n_y_bottom_pml = ProblemParameters::Nel_pml;
1129 
1130 
1131  // Outer physical length of the PML layers
1132  // defaults to 4.0
1133  double width_x_right_pml = ProblemParameters::PML_thickness;
1134  double width_y_top_pml = ProblemParameters::PML_thickness;
1135  double width_y_bottom_pml = ProblemParameters::PML_thickness;
1136 
1137  // Build the PML meshes based on the new adapted triangular mesh
1140  right_boundary_id,
1141  n_x_right_pml,
1142  width_x_right_pml);
1145  top_boundary_id,
1146  n_y_top_pml,
1147  width_y_top_pml);
1150  bottom_boundary_id,
1151  n_y_bottom_pml,
1152  width_y_bottom_pml);
1153 
1154  // Add submeshes to the global mesh
1158 
1159  // Rebuild corner PML meshes
1164  Bulk_mesh_pt,
1165  right_boundary_id);
1166 
1171  Bulk_mesh_pt,
1172  right_boundary_id);
1173 
1174  // Add submeshes to the global mesh
1177 
1178 } // end of create_pml_meshes
Mesh * PML_right_mesh_pt
Pointer to the right PML mesh.
Definition: oscillating_sphere.cc:519
Mesh * PML_top_mesh_pt
Pointer to the top PML mesh.
Definition: oscillating_sphere.cc:522
Mesh * PML_bottom_right_mesh_pt
Pointer to the bottom right corner PML mesh.
Definition: oscillating_sphere.cc:531
Mesh * PML_bottom_mesh_pt
Pointer to the bottom PML mesh.
Definition: oscillating_sphere.cc:525
Mesh * PML_top_right_mesh_pt
Pointer to the top right corner PML mesh.
Definition: oscillating_sphere.cc:528
Definition: pml_meshes.h:48
double PML_thickness
Default physical PML thickness.
Definition: oscillating_sphere.cc:65
unsigned Nel_pml
Default number of elements within PMLs.
Definition: oscillating_sphere.cc:68
Mesh * create_bottom_right_pml_mesh(Mesh *pml_right_mesh_pt, Mesh *pml_bottom_mesh_pt, Mesh *bulk_mesh_pt, const unsigned &right_boundary_id, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: pml_meshes.h:2103
Mesh * create_top_right_pml_mesh(Mesh *pml_right_mesh_pt, Mesh *pml_top_mesh_pt, Mesh *bulk_mesh_pt, const unsigned &right_boundary_id, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: pml_meshes.h:1968
Mesh * create_top_pml_mesh(Mesh *bulk_mesh_pt, const unsigned &top_boundary_id, const unsigned &n_y_top_pml, const double &width_y_top_pml, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: pml_meshes.h:1646
Mesh * create_bottom_pml_mesh(Mesh *bulk_mesh_pt, const unsigned &bottom_boundary_id, const unsigned &n_y_bottom_pml, const double &width_y_bottom_pml, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: pml_meshes.h:1860
Mesh * create_right_pml_mesh(Mesh *bulk_mesh_pt, const unsigned &right_boundary_id, const unsigned &n_x_right_pml, const double &width_x_right_pml, TimeStepper *time_stepper_pt=&Mesh::Default_TimeStepper)
Definition: pml_meshes.h:1539

References oomph::TwoDimensionalPMLHelper::create_bottom_pml_mesh(), oomph::TwoDimensionalPMLHelper::create_bottom_right_pml_mesh(), oomph::TwoDimensionalPMLHelper::create_right_pml_mesh(), oomph::TwoDimensionalPMLHelper::create_top_pml_mesh(), oomph::TwoDimensionalPMLHelper::create_top_right_pml_mesh(), ProblemParameters::Nel_pml, and ProblemParameters::PML_thickness.

◆ create_power_monitor_mesh()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::create_power_monitor_mesh

Create mesh of face elements that monitor the radiated power.

Create BC elements on outer boundary.

545 {
546  // Loop over outer boundaries
547  for (unsigned b=1;b<4;b++)
548  {
549  // Loop over the bulk elements adjacent to boundary b?
550  unsigned n_element = Bulk_mesh_pt->nboundary_element(b);
551  for(unsigned e=0;e<n_element;e++)
552  {
553  // Get pointer to the bulk element that is adjacent to boundary b
554  ELEMENT* bulk_elem_pt = dynamic_cast<ELEMENT*>(
555  Bulk_mesh_pt->boundary_element_pt(b,e));
556 
557  //Find the index of the face of element e along boundary b
558  int face_index = Bulk_mesh_pt->face_index_at_boundary(b,e);
559 
560  // Build the corresponding element
562  flux_element_pt = new
564  (bulk_elem_pt,face_index);
565 
566  //Add the flux boundary element
567  Power_monitor_mesh_pt->add_element_pt(flux_element_pt);
568  }
569  }
570 } // end of create_power_monitor_mesh
Definition: pml_fourier_decomposed_helmholtz_flux_elements.h:410

References b, and e().

◆ delete_face_elements()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::delete_face_elements ( Mesh *const &  boundary_mesh_pt)
inlineprivate

Delete boundary face elements and wipe the surface mesh.

477  {
478  // Loop over the surface elements
479  unsigned n_element = boundary_mesh_pt->nelement();
480  for(unsigned e=0;e<n_element;e++)
481  {
482  // Kill surface element
483  delete boundary_mesh_pt->element_pt(e);
484  }
485 
486  // Wipe the mesh
487  boundary_mesh_pt->flush_element_and_node_storage();
488  }
void flush_element_and_node_storage()
Definition: mesh.h:407

References e(), oomph::Mesh::element_pt(), oomph::Mesh::flush_element_and_node_storage(), and oomph::Mesh::nelement().

◆ doc_solution()

template<class ELEMENT >
void PMLFourierDecomposedHelmholtzProblem< ELEMENT >::doc_solution ( DocInfo &  doc_info)

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

Doc the solution. DocInfo object stores flags/labels for where the output gets written to

976 {
977 
978  ofstream some_file;
979  char filename[100];
980 
981  // Number of plot points: npts x npts
982  unsigned npts=5;
983 
984 
985  // Total radiated power
986  double power=0.0;
987 
988  // Compute/output the radiated power
989  //----------------------------------
990  sprintf(filename,"%s/power%i.dat",doc_info.directory().c_str(),
991  doc_info.number());
992  some_file.open(filename);
993 
994  // Accumulate contribution from elements
995  unsigned nn_element=Power_monitor_mesh_pt->nelement();
996  for(unsigned e=0;e<nn_element;e++)
997  {
1000  <ELEMENT>*>(Power_monitor_mesh_pt->element_pt(e));
1001  power += el_pt->global_power_contribution(some_file);
1002  }
1003  some_file.close();
1004  oomph_info << "Total radiated power: " << power << std::endl;
1005 
1006 
1007  // Output solution within the bulk mesh
1008  //-------------------------------------
1009  sprintf(filename,"%s/soln%i.dat",doc_info.directory().c_str(),
1010  doc_info.number());
1011  some_file.open(filename);
1012  Bulk_mesh_pt->output(some_file,npts);
1013  some_file.close();
1014 
1015  // Output solution within pml domains
1016  //-----------------------------------
1017  sprintf(filename,"%s/pml_soln%i.dat",doc_info.directory().c_str(),
1018  doc_info.number());
1019  some_file.open(filename);
1020  PML_top_mesh_pt->output(some_file,npts);
1021  PML_right_mesh_pt->output(some_file,npts);
1022  PML_bottom_mesh_pt->output(some_file,npts);
1023  PML_top_right_mesh_pt->output(some_file,npts);
1024  PML_bottom_right_mesh_pt->output(some_file,npts);
1025  some_file.close();
1026 
1027 
1028  // Output exact solution
1029  //----------------------
1030  sprintf(filename,"%s/exact_soln%i.dat",doc_info.directory().c_str(),
1031  doc_info.number());
1032  some_file.open(filename);
1033  Bulk_mesh_pt->output_fct(some_file,npts,ProblemParameters::get_exact_u);
1034  some_file.close();
1035 
1036 
1037  // Doc error and return of the square of the L2 error
1038  //---------------------------------------------------
1039  double error,norm;
1040  sprintf(filename,"%s/error%i.dat",doc_info.directory().c_str(),
1041  doc_info.number());
1042  some_file.open(filename);
1043  Bulk_mesh_pt->compute_error(some_file,ProblemParameters::get_exact_u,
1044  error,norm);
1045  some_file.close();
1046 
1047  // Doc L2 error and norm of solution
1048  cout << "\nNorm of error : " << sqrt(error) << std::endl;
1049  cout << "Norm of solution: " << sqrt(norm) << std::endl << std::endl;
1050 
1051  sprintf(filename,"%s/int_error%i.dat",doc_info.directory().c_str(),
1052  doc_info.number());
1053  some_file.open(filename);
1054  // Doc L2 error and norm of solution
1055  some_file << "\nNorm of error : " << sqrt(error) << std::endl;
1056  some_file << "Norm of solution: " << sqrt(norm) << std::endl <<std::endl;
1057  some_file << "Relative error: " << sqrt(error)/sqrt(norm) << std::endl;
1058  some_file.close();
1059 
1060  // Write norm and radiated power of solution to trace file
1061  Bulk_mesh_pt->compute_norm(norm);
1062  Trace_file << norm << " " << power << std::endl;
1063 
1064 } // end of doc
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
std::string directory() const
Output directory.
Definition: oomph_utilities.h:524
unsigned & number()
Number used (e.g.) for labeling output files.
Definition: oomph_utilities.h:554
void output(std::ostream &outfile)
Output for all elements.
Definition: mesh.cc:2027
double global_power_contribution()
Definition: pml_fourier_decomposed_helmholtz_flux_elements.h:491
string filename
Definition: MergeRestartFiles.py:39
void get_exact_u(const Vector< double > &x, Vector< double > &u)
Exact solution as a Vector of size 2, containing real and imag parts.
Definition: sphere_scattering.cc:243
int error
Definition: calibrate.py:297
OomphInfo oomph_info
Definition: oomph_definitions.cc:319

References oomph::DocInfo::directory(), e(), calibrate::error, MergeRestartFiles::filename, ProblemParameters::get_exact_u(), oomph::PMLFourierDecomposedHelmholtzPowerMonitorElement< ELEMENT >::global_power_contribution(), oomph::DocInfo::number(), oomph::oomph_info, sqrt(), and oomph::Problem_Parameter::Trace_file.

Member Data Documentation

◆ Bulk_mesh_pt

template<class ELEMENT >
TriangleMesh<ELEMENT>* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::Bulk_mesh_pt
private

Pointer to the "bulk" mesh.

◆ Helmholtz_inner_boundary_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::Helmholtz_inner_boundary_mesh_pt
private

Mesh of FaceElements that apply the flux bc on the inner boundary.

◆ PML_bottom_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::PML_bottom_mesh_pt
private

Pointer to the bottom PML mesh.

◆ PML_bottom_right_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::PML_bottom_right_mesh_pt
private

Pointer to the bottom right corner PML mesh.

◆ PML_right_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::PML_right_mesh_pt
private

Pointer to the right PML mesh.

◆ PML_top_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::PML_top_mesh_pt
private

Pointer to the top PML mesh.

◆ PML_top_right_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::PML_top_right_mesh_pt
private

Pointer to the top right corner PML mesh.

◆ Power_monitor_mesh_pt

template<class ELEMENT >
Mesh* PMLFourierDecomposedHelmholtzProblem< ELEMENT >::Power_monitor_mesh_pt
private

Pointer to mesh that stores the power monitor elements.

◆ Trace_file

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

Trace file.


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