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...
 
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

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

MeshPower_monitor_mesh_pt
 Pointer to mesh that stores the power monitor elements. More...
 
TriangleMesh< ELEMENT > * Bulk_mesh_pt
 Pointer to the "bulk" mesh. More...
 
MeshHelmholtz_inner_boundary_mesh_pt
 Mesh of FaceElements that apply the flux bc on the inner boundary. More...
 
MeshPML_right_mesh_pt
 Pointer to the right PML mesh. More...
 
MeshPML_top_mesh_pt
 Pointer to the top PML mesh. More...
 
MeshPML_bottom_mesh_pt
 Pointer to the bottom PML mesh. More...
 
MeshPML_top_right_mesh_pt
 Pointer to the top right corner PML mesh. More...
 
MeshPML_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)
 
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 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: