oomph::SegregatableFSIProblem Class Referenceabstract

#include <segregated_fsi_solver.h>

+ Inheritance diagram for oomph::SegregatableFSIProblem:

Public Types

enum  convergence_criteria { Assess_convergence_based_on_absolute_solid_change , Assess_convergence_based_on_relative_solid_change , Assess_convergence_based_on_max_global_residual }
 Enumerated flags for convergence criteria. More...
 
enum  solve_type { Full_solve , Fluid_solve , Solid_solve }
 Enumerated flags to indicate which solve is taking place. More...
 
- 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 Member Functions

 SegregatableFSIProblem ()
 
virtual ~SegregatableFSIProblem ()
 Empty virtual destructor. More...
 
virtual void identify_fluid_and_solid_dofs (Vector< Data * > &fluid_data_pt, Vector< Data * > &solid_data_pt, Mesh *&fluid_mesh_pt, Mesh *&solid_mesh_pt)=0
 
void setup_segregated_solver (const bool &full_setup_of_fluid_and_solid_dofs=true)
 
PicardConvergenceData segregated_solve ()
 
PicardConvergenceData steady_segregated_solve ()
 
PicardConvergenceData unsteady_segregated_solve (const double &dt)
 
PicardConvergenceData unsteady_segregated_solve (const double &dt, const bool &shift_values)
 
void assess_convergence_based_on_max_global_residual (const double &tol)
 
void assess_convergence_based_on_max_global_residual ()
 
void assess_convergence_based_on_absolute_solid_change (const double &tol)
 
void assess_convergence_based_on_absolute_solid_change ()
 
void assess_convergence_based_on_relative_solid_change (const double &tol)
 
void assess_convergence_based_on_relative_solid_change ()
 
void enable_pointwise_aitken (const unsigned &pointwise_aitken_start)
 
void enable_pointwise_aitken ()
 
void disable_pointwise_aitken ()
 Disable the use of pointwise Aitken extrapolation. More...
 
void enable_under_relaxation (const double &omega=1.0)
 
void enable_irons_and_tuck_extrapolation ()
 Use Irons and Tuck extrapolation for solid dofs. More...
 
void disable_irons_and_tuck_extrapolation ()
 Do not use Irons and Tuck extrapolation for solid dofs. More...
 
void get_solid_change (double &rms_change, double &max_change, double &rms_norm)
 
void store_solid_dofs ()
 
void reset_timer ()
 Reset timer. More...
 
void restart_timer ()
 
void halt_timer ()
 
double t_spent_on_actual_solve ()
 Total elapsed time since start of solve. More...
 
- Public Member Functions inherited from oomph::Problem
virtual void debug_hook_fct (const unsigned &i)
 
void set_analytic_dparameter (double *const &parameter_pt)
 
void unset_analytic_dparameter (double *const &parameter_pt)
 
bool is_dparameter_calculated_analytically (double *const &parameter_pt)
 
void set_analytic_hessian_products ()
 
void unset_analytic_hessian_products ()
 
bool are_hessian_products_calculated_analytically ()
 
void set_pinned_values_to_zero ()
 
bool distributed () const
 
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 ()
 

Protected Member Functions

virtual void actions_before_segregated_solve ()
 
virtual void actions_after_segregated_solve ()
 
virtual void actions_before_segregated_convergence_check ()
 
void rebuild_monolithic_mesh ()
 Rebuild global mesh for monolithic discretisation. More...
 
void restore_fluid_dofs ()
 Restore pinned status of fluid dofs. More...
 
void pin_solid_dofs ()
 Pin solid dofs. More...
 
void restore_solid_dofs ()
 Restore pinned status of solid dofs. More...
 
void pointwise_aitken_extrapolate ()
 Do pointwise Aitken extrapolation for solid. 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_solve ()
 
virtual void actions_after_newton_solve ()
 
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

int Pointwise_aitken_counter
 
bool Use_pointwise_aitken
 Use pointwise Aitken extrapolation? More...
 
unsigned Pointwise_aitken_start
 
int Solve_type
 Solve that is taking place (enumerated flag) More...
 
double Convergence_tolerance
 Convergence tolerance for Picard iteration. More...
 
unsigned Max_picard
 Max. number of Picard iterations. More...
 
bool Doc_max_global_residual
 Doc maximum global residual during iteration? (default: false) More...
 
Vector< Data * > Fluid_data_pt
 
Vector< std::vector< bool > > Fluid_value_is_pinned
 
Vector< Data * > Solid_data_pt
 
Vector< std::vector< bool > > Solid_value_is_pinned
 
Vector< doublePrevious_solid_value
 
MeshFluid_mesh_pt
 
MeshSolid_mesh_pt
 
Vector< Mesh * > Orig_sub_mesh_pt
 Backup for the pointers to the submeshes in the original problem. More...
 
Vector< doubleDel_irons_and_tuck
 Vector of changes in Irons and Tuck under-relaxation. More...
 
double R_irons_and_tuck
 Irons and Tuck relaxation factor. More...
 
Vector< Vector< double > > Pointwise_aitken_solid_value
 
bool Recheck_convergence_after_pointwise_aitken
 Have we just done a pointwise Aitken step. More...
 
- 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
 

Private Member Functions

void extrapolate_solid_data ()
 Extrapolate solid data and update fluid mesh during unsteady run. More...
 
void under_relax_solid ()
 Under-relax solid, either by classical relaxation or by Irons & Tuck. More...
 
void use_only_fluid_elements ()
 
void use_only_solid_elements ()
 
void pin_fluid_dofs ()
 Pin fluid dofs. More...
 

Private Attributes

double Omega_relax
 
bool Use_irons_and_tuck_extrapolation
 
int Convergence_criterion
 Convergence criterion (enumerated flag) More...
 
clock_t T_ref
 
double T_spent_on_actual_solve
 
bool Timer_has_been_halted
 boolean flag to indicate if timer has been halted More...
 

Additional Inherited Members

- 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...
 
- Static Protected Attributes inherited from oomph::Problem
static ContinuationStorageScheme Continuation_time_stepper
 Storage for the single static continuation timestorage object. More...
 

Detailed Description

////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// Base class for problems that can be solved by segregated FSI solver

Member Enumeration Documentation

◆ convergence_criteria

Enumerated flags for convergence criteria.

Enumerator
Assess_convergence_based_on_absolute_solid_change 
Assess_convergence_based_on_relative_solid_change 
Assess_convergence_based_on_max_global_residual 
410  {
414  };
@ Assess_convergence_based_on_relative_solid_change
Definition: segregated_fsi_solver.h:412
@ Assess_convergence_based_on_absolute_solid_change
Definition: segregated_fsi_solver.h:411
@ Assess_convergence_based_on_max_global_residual
Definition: segregated_fsi_solver.h:413

◆ solve_type

Enumerated flags to indicate which solve is taking place.

Enumerator
Full_solve 
Fluid_solve 
Solid_solve 
419  {
420  Full_solve,
421  Fluid_solve,
423  };
@ Full_solve
Definition: segregated_fsi_solver.h:420
@ Fluid_solve
Definition: segregated_fsi_solver.h:421
@ Solid_solve
Definition: segregated_fsi_solver.h:422

Constructor & Destructor Documentation

◆ SegregatableFSIProblem()

oomph::SegregatableFSIProblem::SegregatableFSIProblem ( )
inline

Constructor. Set default values for solver parameters:

  • Don't use pointwise Aitken extrapolation but if it's used at all, it's used immediately.
  • No under-relaxation at all (neither classical nor Irons&Tuck)
  • Base convergence on max. residual of coupled system of eqns
  • Convergence tolerance = tolerance for Newton solver defined in Problem base class
  • Max. 50 Picard iterations

boolean flag to indicate if timer has been halted

192  {
193  // Use pointwise Aitken extrapolation?
194  Use_pointwise_aitken = false;
195 
196  // Default: No under-relaxation
197  Omega_relax = 1.0;
198 
199  // Don't use of Irons and Tuck's extrapolation for solid values
201 
202  // Start using pointwise Aitken immediately
204 
205  // By default we don't recheck convergence
207 
208  // Default solve type is full solve
210 
211  // Convergence criterion
213 
214  // Convergence tolerance (as in global Newton solver)
216 
217  // Doc max. global residual during iteration?
218  Doc_max_global_residual = false;
219 
220  // Max. number of Picard iterations
221  Max_picard = 50;
222 
223  // Pointer to Mesh containing only fluid elements -- the elements in this
224  // Mesh will be excluded from the assembly process when
225  // the solid problem is solved
226  Fluid_mesh_pt = 0;
227 
228  // Pointer to Mesh containing only solid elements -- the elements in this
229  // mesh will be excluded from the assembly process when
230  // the fluid problem is solved
231  Solid_mesh_pt = 0;
232 
233  // Initialise timer that allows doc of iteration/cpu time
234  T_ref = clock();
236 
238  Timer_has_been_halted = false;
239  }
double Newton_solver_tolerance
Definition: problem.h:596
bool Recheck_convergence_after_pointwise_aitken
Have we just done a pointwise Aitken step.
Definition: segregated_fsi_solver.h:567
bool Use_pointwise_aitken
Use pointwise Aitken extrapolation?
Definition: segregated_fsi_solver.h:490
bool Use_irons_and_tuck_extrapolation
Definition: segregated_fsi_solver.h:608
Mesh * Solid_mesh_pt
Definition: segregated_fsi_solver.h:551
unsigned Pointwise_aitken_start
Definition: segregated_fsi_solver.h:494
double T_spent_on_actual_solve
Definition: segregated_fsi_solver.h:621
clock_t T_ref
Definition: segregated_fsi_solver.h:616
int Convergence_criterion
Convergence criterion (enumerated flag)
Definition: segregated_fsi_solver.h:611
unsigned Max_picard
Max. number of Picard iterations.
Definition: segregated_fsi_solver.h:503
bool Doc_max_global_residual
Doc maximum global residual during iteration? (default: false)
Definition: segregated_fsi_solver.h:506
bool Timer_has_been_halted
boolean flag to indicate if timer has been halted
Definition: segregated_fsi_solver.h:624
double Convergence_tolerance
Convergence tolerance for Picard iteration.
Definition: segregated_fsi_solver.h:500
Mesh * Fluid_mesh_pt
Definition: segregated_fsi_solver.h:546
double Omega_relax
Definition: segregated_fsi_solver.h:604
int Solve_type
Solve that is taking place (enumerated flag)
Definition: segregated_fsi_solver.h:497

References Assess_convergence_based_on_max_global_residual, Convergence_criterion, Convergence_tolerance, Doc_max_global_residual, Fluid_mesh_pt, Full_solve, Max_picard, oomph::Problem::Newton_solver_tolerance, Omega_relax, Pointwise_aitken_start, Recheck_convergence_after_pointwise_aitken, Solid_mesh_pt, Solve_type, T_ref, T_spent_on_actual_solve, Timer_has_been_halted, Use_irons_and_tuck_extrapolation, and Use_pointwise_aitken.

◆ ~SegregatableFSIProblem()

virtual oomph::SegregatableFSIProblem::~SegregatableFSIProblem ( )
inlinevirtual

Empty virtual destructor.

242 {}

Member Function Documentation

◆ actions_after_segregated_solve()

virtual void oomph::SegregatableFSIProblem::actions_after_segregated_solve ( )
inlineprotectedvirtual

This function is called once at the end of each segregated solve.

176 {}

Referenced by segregated_solve().

◆ actions_before_segregated_convergence_check()

virtual void oomph::SegregatableFSIProblem::actions_before_segregated_convergence_check ( )
inlineprotectedvirtual

This function is to be filled with actions that take place before the check for convergence of the entire segregated solve

Reimplemented in SegregatedFSICollapsibleChannelProblem< ELEMENT >, and SegregatedFSICollapsibleChannelProblem< ELEMENT >.

180 {}

Referenced by segregated_solve().

◆ actions_before_segregated_solve()

virtual void oomph::SegregatableFSIProblem::actions_before_segregated_solve ( )
inlineprotectedvirtual

This function is called once at the start of each segregated solve.

Reimplemented in SegregatedFSICollapsibleChannelProblem< ELEMENT >.

172 {}

Referenced by segregated_solve().

◆ assess_convergence_based_on_absolute_solid_change() [1/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_absolute_solid_change ( )
inline

Assess convergence based on max. absolute change of solid dofs. This interface has no argument and the default convergence tolerance for the Newton solver, Problem::Newton_solver_tolerance is used.

339  {
342  }
void assess_convergence_based_on_absolute_solid_change()
Definition: segregated_fsi_solver.h:338

References oomph::Problem::Newton_solver_tolerance.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem(), and SegregatedFSIDrivenCavityProblem< ELEMENT >::SegregatedFSIDrivenCavityProblem().

◆ assess_convergence_based_on_absolute_solid_change() [2/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_absolute_solid_change ( const double tol)
inline

Assess convergence based on max. absolute change of solid dofs. The argument specifies the convergence tolerance.

References Assess_convergence_based_on_absolute_solid_change, Convergence_criterion, and Convergence_tolerance.

◆ assess_convergence_based_on_max_global_residual() [1/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_max_global_residual ( )
inline

Assess convergence based on max. residuals of coupled system of eqns. This interface has no argument and the default convergence tolerance for the Newton solver, Problem::Newton_solver_tolerance is used.

321  {
324  }
void assess_convergence_based_on_max_global_residual()
Definition: segregated_fsi_solver.h:320

References oomph::Problem::Newton_solver_tolerance.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem().

◆ assess_convergence_based_on_max_global_residual() [2/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_max_global_residual ( const double tol)
inline

Assess convergence based on max. residual of coupled system of eqns. The argument specifies the convergence tolerance.

References Assess_convergence_based_on_max_global_residual, Convergence_criterion, and Convergence_tolerance.

◆ assess_convergence_based_on_relative_solid_change() [1/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_relative_solid_change ( )
inline

Assess convergence based on max. relative change of solid dofs. This interface has no argument and the default convergence tolerance for the Newton solver, Problem::Newton_solver_tolerance is used.

357  {
360  }
void assess_convergence_based_on_relative_solid_change()
Definition: segregated_fsi_solver.h:356

References oomph::Problem::Newton_solver_tolerance.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem().

◆ assess_convergence_based_on_relative_solid_change() [2/2]

void oomph::SegregatableFSIProblem::assess_convergence_based_on_relative_solid_change ( const double tol)
inline

Assess convergence based on max. relative change of solid dofs. The argument specifies the convergence tolerance.

References Assess_convergence_based_on_relative_solid_change, Convergence_criterion, and Convergence_tolerance.

◆ disable_irons_and_tuck_extrapolation()

void oomph::SegregatableFSIProblem::disable_irons_and_tuck_extrapolation ( )
inline

Do not use Irons and Tuck extrapolation for solid dofs.

404  {
406  }

References Use_irons_and_tuck_extrapolation.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem().

◆ disable_pointwise_aitken()

void oomph::SegregatableFSIProblem::disable_pointwise_aitken ( )
inline

◆ enable_irons_and_tuck_extrapolation()

void oomph::SegregatableFSIProblem::enable_irons_and_tuck_extrapolation ( )
inline

Use Irons and Tuck extrapolation for solid dofs.

398  {
400  }

References Use_irons_and_tuck_extrapolation.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem().

◆ enable_pointwise_aitken() [1/2]

void oomph::SegregatableFSIProblem::enable_pointwise_aitken ( )
inline

Use pointwise Aitken extrapolation. This interface has no argument and the current value of Pointwise_aitken_start will be used. The default is zero, extrapolation starts immediately

376  {
377  Use_pointwise_aitken = true;
378  }

References Use_pointwise_aitken.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem().

◆ enable_pointwise_aitken() [2/2]

void oomph::SegregatableFSIProblem::enable_pointwise_aitken ( const unsigned pointwise_aitken_start)
inline

Use pointwise Aitken extrapolation. The argument is used to specify the Picard iteration after which pointwise Aitken extrapolation is to be used for the first time.

367  {
368  Pointwise_aitken_start = pointwise_aitken_start;
369  Use_pointwise_aitken = true;
370  }

References Pointwise_aitken_start, and Use_pointwise_aitken.

◆ enable_under_relaxation()

void oomph::SegregatableFSIProblem::enable_under_relaxation ( const double omega = 1.0)
inline

Use under-relaxation and (optionally) specify under-relaxation parameter. Default: omega=1.0 (i.e. no actual under-relaxation; Other extreme: omega=0.0 (freeze wall shape). Under-relaxation parameter can also be computed dynamically by setting use_irons_and_tuck_extrapolation()

392  {
393  Omega_relax = omega;
394  }
Vector::Scalar omega(const Vector &t, const Vector &s, RealScalar angle)
Definition: IDRS.h:36

References Eigen::internal::omega(), and Omega_relax.

Referenced by SegregatedFSICollapsibleChannelProblem< ELEMENT >::SegregatedFSICollapsibleChannelProblem(), and SegregatedFSIDrivenCavityProblem< ELEMENT >::SegregatedFSIDrivenCavityProblem().

◆ extrapolate_solid_data()

void oomph::SegregatableFSIProblem::extrapolate_solid_data ( )
private

Extrapolate solid data and update fluid mesh during unsteady run.

Extrapolate solid data and update fluid mesh. Extrapolation is based on previous history values and is therefore only called in time-dependent runs.

40  {
41  // Number of solid Data items:
42  unsigned n_data = Solid_data_pt.size();
43 
44  // Loop over all solid Data items:
45  for (unsigned i = 0; i < n_data; i++)
46  {
47  // Number of values stored at this Data item:
48  unsigned n_value = Solid_data_pt[i]->nvalue();
49 
50  // Number of values stored at this Data item:
51  unsigned n_prev = Solid_data_pt[i]->time_stepper_pt()->nprev_values();
52 
53  // Can't use this extrapolation if we don't have at least two
54  // history values; may be able to do better for higher order
55  // timesteppers, though.
56  if (n_prev >= 2)
57  {
58  // Extrapolate all values
59  for (unsigned k = 0; k < n_value; k++)
60  {
61  // Linear extrapolation based on previous two values,
62  // assuming constant timestep.
63  double new_value =
64  2.0 * Solid_data_pt[i]->value(1, k) - Solid_data_pt[i]->value(2, k);
65  *(Solid_data_pt[i]->value_pt(0, k)) = new_value;
66  }
67  }
68  }
69 
70  // Update fluid node position in response to changes in wall shape
71  // (If fluid mesh was specified via non-NULL Fluid_mesh_pt
72  // this node update will only act on the fluid nodes).
73  if (Fluid_mesh_pt != 0)
74  {
76  }
77  else
78  {
79  mesh_pt()->node_update();
80  }
81  }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
virtual void node_update(const bool &update_all_solid_nodes=false)
Definition: mesh.cc:287
Mesh *& mesh_pt()
Return a pointer to the global mesh.
Definition: problem.h:1280
Vector< Data * > Solid_data_pt
Definition: segregated_fsi_solver.h:533
char char char int int * k
Definition: level2_impl.h:374

References Fluid_mesh_pt, i, k, oomph::Problem::mesh_pt(), oomph::Mesh::node_update(), and Solid_data_pt.

Referenced by unsteady_segregated_solve().

◆ get_solid_change()

void oomph::SegregatableFSIProblem::get_solid_change ( double rms_change,
double max_change,
double rms_norm 
)

Get rms of change in the solid dofs; the max. change of the solid dofs and the rms norm of the solid dofs themselves. Change is computed relative to the reference values stored when store_solid_dofs() was last called.

306  {
307  // Initialise
308  rms_change = 0.0;
309  max_change = 0.0;
310  rms_norm = 0.0;
311 
312  // Counter for the number of values:
313  unsigned value_count = 0;
314 
315  // Number of solid Data items:
316  unsigned n_data = Solid_data_pt.size();
317 
318  // Loop over all solid Data items:
319  for (unsigned i = 0; i < n_data; i++)
320  {
321  // Number of values stored at this Data item:
322  unsigned n_value = Solid_data_pt[i]->nvalue();
323 
324  // Loop over all values
325  for (unsigned k = 0; k < n_value; k++)
326  {
327  // Change
328  double change =
329  Previous_solid_value[value_count] - Solid_data_pt[i]->value(k);
330 
331  // Max change?
332  if (std::fabs(change) > max_change) max_change = std::fabs(change);
333 
334  // Add square of change relative to previous value
335  rms_change += pow(change, 2);
336 
337  // Add square of previous value
338  rms_norm += pow(Previous_solid_value[value_count], 2);
339 
340  // Increment counter
341  value_count++;
342  }
343  }
344 
345  // Turn into rms:
346  rms_change = sqrt(rms_change / double(value_count));
347  rms_norm = sqrt(rms_norm / double(value_count));
348  }
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Vector< double > Previous_solid_value
Definition: segregated_fsi_solver.h:541
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
Real fabs(const Real &a)
Definition: boostmultiprec.cpp:117

References boost::multiprecision::fabs(), i, k, Eigen::bfloat16_impl::pow(), Previous_solid_value, Solid_data_pt, and sqrt().

Referenced by segregated_solve().

◆ halt_timer()

void oomph::SegregatableFSIProblem::halt_timer ( )
inline

Halt timer (e.g. before performing non-essential parts of the code such as documentation of the iteration's progress)

461  {
463  {
464  T_spent_on_actual_solve += double(clock() - T_ref) / CLOCKS_PER_SEC;
465  Timer_has_been_halted = true;
466  }
467  }

References T_ref, T_spent_on_actual_solve, and Timer_has_been_halted.

Referenced by t_spent_on_actual_solve().

◆ identify_fluid_and_solid_dofs()

virtual void oomph::SegregatableFSIProblem::identify_fluid_and_solid_dofs ( Vector< Data * > &  fluid_data_pt,
Vector< Data * > &  solid_data_pt,
Mesh *&  fluid_mesh_pt,
Mesh *&  solid_mesh_pt 
)
pure virtual

Identify the fluid and solid Data. This is a pure virtual function that MUST be implemented for every specific problem that is to be solved by the segregated solver. The two mesh pointers identify meshes that contain elements and nodes used during the fluid or solid solves respectively. Elements that feature during both phases of the segretated solution must be included in both. These pointers may be set to NULL. In this case, all elements in the global mesh (set up during the monolithic discretisation of the problem) contribute to the global Jacobian matrix and the residual vector, even if their contributions only contain zero entries. This can be costly, though the code will still compute the correct results.

Implemented in SegregatedFSIDrivenCavityProblem< ELEMENT >, SegregatedFSICollapsibleChannelProblem< ELEMENT >, and SegregatedFSICollapsibleChannelProblem< ELEMENT >.

Referenced by setup_segregated_solver().

◆ pin_fluid_dofs()

void oomph::SegregatableFSIProblem::pin_fluid_dofs ( )
private

Pin fluid dofs.

Pin all fluid dofs.

154  {
155  // Number of fluid Data items:
156  unsigned n_data = Fluid_data_pt.size();
157 
158  // Loop over all fluid Data items:
159  for (unsigned i = 0; i < n_data; i++)
160  {
161  // Number of values stored at this Data item:
162  unsigned n_value = Fluid_data_pt[i]->nvalue();
163 
164  // Pin all values
165  for (unsigned k = 0; k < n_value; k++)
166  {
167  Fluid_data_pt[i]->pin(k);
168  }
169  }
170  }
Vector< Data * > Fluid_data_pt
Definition: segregated_fsi_solver.h:524

References Fluid_data_pt, i, and k.

Referenced by segregated_solve().

◆ pin_solid_dofs()

void oomph::SegregatableFSIProblem::pin_solid_dofs ( )
protected

Pin solid dofs.

Pin all solid dofs.

207  {
208  // Number of solid Data items:
209  unsigned n_data = Solid_data_pt.size();
210 
211  // Loop over all solid Data items:
212  for (unsigned i = 0; i < n_data; i++)
213  {
214  // Number of values stored at this Data item:
215  unsigned n_value = Solid_data_pt[i]->nvalue();
216 
217  // Pin all values
218  for (unsigned k = 0; k < n_value; k++)
219  {
220  Solid_data_pt[i]->pin(k);
221  }
222  }
223  }

References i, k, and Solid_data_pt.

Referenced by segregated_solve().

◆ pointwise_aitken_extrapolate()

void oomph::SegregatableFSIProblem::pointwise_aitken_extrapolate ( )
protected

Do pointwise Aitken extrapolation for solid.

Pointwise Aitken extrapolation for solid variables.

491  {
492  // Counter for the number of values:
493  unsigned value_count = 0;
494 
495  // Number of solid Data items:
496  unsigned n_data = Solid_data_pt.size();
497 
498  // Loop over all solid Data items:
499  for (unsigned i = 0; i < n_data; i++)
500  {
501  // Number of values stored at this Data item:
502  unsigned n_value = Solid_data_pt[i]->nvalue();
503 
504  // Loop over all values
505  for (unsigned k = 0; k < n_value; k++)
506  {
507  // Shorthand
508  double v0 = Pointwise_aitken_solid_value[value_count][0];
509  double v1 = Pointwise_aitken_solid_value[value_count][1];
510  double v2 = Pointwise_aitken_solid_value[value_count][2];
511 
512  double new_value = v2;
513 
514  double max_diff = std::max(std::fabs(v1 - v0), std::fabs(v2 - v1));
515  if (max_diff > 1.0e-10)
516  {
517  new_value = v2 - std::pow((v2 - v1), int(2)) / (v2 - 2.0 * v1 + v0);
518  }
519  Solid_data_pt[i]->set_value(k, new_value);
520 
521  // Increment counter
522  value_count++;
523  }
524  }
525 
526  // Reset the counter for the Aitken convergence check
527  // (setting counter to -1 forces three new genuine
528  // iterates to be computed).
530  }
Map< RowVectorXf > v2(M2.data(), M2.size())
M1<< 1, 2, 3, 4, 5, 6, 7, 8, 9;Map< RowVectorXf > v1(M1.data(), M1.size())
Vector< Vector< double > > Pointwise_aitken_solid_value
Definition: segregated_fsi_solver.h:564
int Pointwise_aitken_counter
Definition: segregated_fsi_solver.h:487
#define max(a, b)
Definition: datatypes.h:23

References boost::multiprecision::fabs(), i, k, max, Pointwise_aitken_counter, Pointwise_aitken_solid_value, Eigen::bfloat16_impl::pow(), Solid_data_pt, v1(), and v2().

Referenced by segregated_solve().

◆ rebuild_monolithic_mesh()

void oomph::SegregatableFSIProblem::rebuild_monolithic_mesh ( )
protected

Rebuild global mesh for monolithic discretisation.

Rebuild global mesh for monolithic problem.

88  {
89  // Get rid of the previous submeshes
91 
92  // Add original submeshes
93  unsigned orig_n_sub_mesh = Orig_sub_mesh_pt.size();
94  for (unsigned i = 0; i < orig_n_sub_mesh; i++)
95  {
97  }
98 
99  // Rebuild global mesh
101  }
unsigned add_sub_mesh(Mesh *const &mesh_pt)
Definition: problem.h:1330
void rebuild_global_mesh()
Definition: problem.cc:1533
void flush_sub_meshes()
Definition: problem.h:1339
Vector< Mesh * > Orig_sub_mesh_pt
Backup for the pointers to the submeshes in the original problem.
Definition: segregated_fsi_solver.h:554

References oomph::Problem::add_sub_mesh(), oomph::Problem::flush_sub_meshes(), i, Orig_sub_mesh_pt, and oomph::Problem::rebuild_global_mesh().

Referenced by segregated_solve().

◆ reset_timer()

void oomph::SegregatableFSIProblem::reset_timer ( )
inline

Reset timer.

440  {
442  T_ref = clock();
443  Timer_has_been_halted = false;
444  }

References T_ref, T_spent_on_actual_solve, and Timer_has_been_halted.

Referenced by segregated_solve().

◆ restart_timer()

void oomph::SegregatableFSIProblem::restart_timer ( )
inline

(Re-)start timer (e.g. after completing non-essential parts of the code such as documentation of the iteration's progress)

451  {
452  T_ref = clock();
453  Timer_has_been_halted = false;
454  }

References T_ref, and Timer_has_been_halted.

Referenced by t_spent_on_actual_solve().

◆ restore_fluid_dofs()

void oomph::SegregatableFSIProblem::restore_fluid_dofs ( )
protected

Restore pinned status of fluid dofs.

Restore the pinned status of all fluid dofs.

177  {
178  // Number of fluid Data items:
179  unsigned n_data = Fluid_data_pt.size();
180 
181  // Loop over all fluid Data items:
182  for (unsigned i = 0; i < n_data; i++)
183  {
184  // Number of values stored at this Data item:
185  unsigned n_value = Fluid_data_pt[i]->nvalue();
186 
187  // Pin all values
188  for (unsigned k = 0; k < n_value; k++)
189  {
190  if (Fluid_value_is_pinned[i][k])
191  {
192  Fluid_data_pt[i]->pin(k);
193  }
194  else
195  {
196  Fluid_data_pt[i]->unpin(k);
197  }
198  }
199  }
200  }
Vector< std::vector< bool > > Fluid_value_is_pinned
Definition: segregated_fsi_solver.h:528

References Fluid_data_pt, Fluid_value_is_pinned, i, and k.

Referenced by segregated_solve().

◆ restore_solid_dofs()

void oomph::SegregatableFSIProblem::restore_solid_dofs ( )
protected

Restore pinned status of solid dofs.

Restore the pinned status of all solid dofs.

230  {
231  // Number of solid Data items:
232  unsigned n_data = Solid_data_pt.size();
233 
234  // Loop over all solid Data items:
235  for (unsigned i = 0; i < n_data; i++)
236  {
237  // Number of values stored at this Data item:
238  unsigned n_value = Solid_data_pt[i]->nvalue();
239 
240  // Pin all values
241  for (unsigned k = 0; k < n_value; k++)
242  {
243  if (Solid_value_is_pinned[i][k])
244  {
245  Solid_data_pt[i]->pin(k);
246  }
247  else
248  {
249  Solid_data_pt[i]->unpin(k);
250  }
251  }
252  }
253  }
Vector< std::vector< bool > > Solid_value_is_pinned
Definition: segregated_fsi_solver.h:537

References i, k, Solid_data_pt, and Solid_value_is_pinned.

Referenced by segregated_solve().

◆ segregated_solve()

PicardConvergenceData oomph::SegregatableFSIProblem::segregated_solve ( )

Segregated solver. Peform a segregated step from the present state of the system. Returns PicardConvergenceData object that contains the vital stats of the iteration

Segregated fixed point solver with optional pointwise Aitken acceleration on selected solid dofs. Returns PicardConvergenceData object that contains the vital stats of the iteration.

539  {
540  // Initialise timer for essential bits of code
541  reset_timer();
542  // Start timer for overall solve
543  clock_t t_total_start = clock();
544 
545  // If convergence is based on max. global residual we may as well
546  // document it...
547  bool get_max_global_residual = Doc_max_global_residual;
548  if (Convergence_criterion ==
550  {
551  get_max_global_residual = true;
552  }
553 
554  // Create object to doc convergence stats
555  PicardConvergenceData conv_data;
556 
557  // Initialise total time for computation of global residuals
558  double cpu_for_global_residual = 0.0;
559 
560  // Update anything that needs updating
562 
563  // Set flags to values that are appropriate if Picard iteration
564  // does not converge with Max_picard iterations
565  bool converged = false;
566  unsigned iter_taken = Max_picard;
567 
568  // This one will be overwritten during the convergence checks
569  double tol_achieved = 0.0;
570 
571  // Store the current values of the solid dofs as reference values
572  // and for the pointwise Aitken extrapolation
574 
575  // Loop over Picard iterations
576  //----------------------------
577  for (unsigned iter = 1; iter <= Max_picard; iter++)
578  {
579  // Calculate the initial residuals
580  if (iter == 1)
581  {
582  // Problem is always non-linear?
583  // Perform any actions before the convergence check
585 
586  double max_res = 0.0;
587  if (get_max_global_residual)
588  {
589  clock_t t_start = clock();
594  // This is now a full problem
596  DoubleVector residual;
597  get_residuals(residual);
598  // Get maximum residuals using our own abscmp function
599  max_res = residual.max();
600  clock_t t_end = clock();
601  cpu_for_global_residual += double(t_end - t_start) / CLOCKS_PER_SEC;
602  }
603 
604  oomph_info << "==================================================\n";
605  oomph_info << "Initial iteration : " << 0 << std::endl;
606  oomph_info << "RMS change : " << 0 << std::endl;
607  oomph_info << "Max. change : " << 0 << std::endl;
608  oomph_info << "RMS norm : " << 0 << std::endl;
609  if (get_max_global_residual)
610  {
611  oomph_info << "Max. global residual : " << max_res
612  << std::endl;
613  }
614  oomph_info << "==================================================\n\n";
615 
616  // Check for convergence, but this only makes sense
617  // for the maximum (rather than relative case)
618  if ((Convergence_criterion ==
620  (max_res < Convergence_tolerance))
621  {
622  oomph_info
623  << "\n\n\n////////////////////////////////////////////////////////"
624  << "\nPicard iteration converged after " << 0 << " steps!"
625  << std::endl
626  << "Convergence was based on max. residual of coupled eqns \n"
627  << "being less than " << Convergence_tolerance << "." << std::endl
628  << "////////////////////////////////////////////////////////\n\n\n"
629  << std::endl;
630 
631  // Converged, so bail out
632  // Number of iterations taken
633  iter_taken = 0;
634 
635  // We have converged (overwrites default of false)
636  conv_data.set_solver_converged();
637 
638  // Break loop using a GO TO! This is the first (and hopefully
639  // the last) one in the whole of oomph-lib. Here it's
640  // it's actually the cleanest way to exit from these
641  // nested control structures
642  goto jump_out_of_picard;
643  }
644  }
645 
646  // Stage 1: Freeze wall and solve single-physics fluid problem
647  //------------------------------------------------------------
648  // Pin the solid dofs, restore the pinned status of the fluid dofs
649  // and re-assign the equation numbers
651  pin_solid_dofs();
654 
655  // Solve the fluid problem for the current wall geometry
656  oomph_info << "\n\nDOING FLUID SOLVE\n\n";
657  // This is a fluid solve at the moment done by a newton solve
659  newton_solve();
660 
661  // Stage 2: Freeze fluid variables and update wall shape
662  //------------------------------------------------------
663 
664  // Now restore the pinned status of the wall and pin the fluid
665  // dofs in anticipation of the wall update:
667  pin_fluid_dofs();
670 
671  // Solve the solid problem for the wall solution
672  oomph_info << "\n\nDOING SOLID SOLVE\n\n";
673  // This is a solid solve, at the moment done by a newton method
675  newton_solve();
676 
677  // Under-relax, either by classical relaxation or by Irons & Tuck
678  // Note that we are under-relaxing before the convergence check
679  // because under-relaxtion may be required to acheieve any
680  // kind of convergence. If the convergence check is on the RELATIVE
681  // change of the residuals, however, then a small under-relaxation
682  // parameter will cause a false convergence. You have been warned!
684 
685  // Stage 3: Convergence check (possibly again after pointwise Aitken
686  //------------------------------------------------------------------
687  // extrapolation)
688  //---------------
689  // Assume that we are not doing Aitken acceleration
691  do
692  {
693  // Perform any actions before the convergence check
695 
696  // Get the change in the solid variables
697  double rms_change;
698  double max_change;
699  double rms_norm;
700  double max_res = 0.0;
701  get_solid_change(rms_change, max_change, rms_norm);
702 
703 
704  // If we are computing the maximum global residual, do so
705  if (get_max_global_residual)
706  {
707  clock_t t_start = clock();
708 
709  // Free all dofs so the residuals of the global equations are computed
714 
715  // We are now treating this as a full solve
717 
718  // Get the residuals
719  DoubleVector residual;
720  get_residuals(residual);
721 
722  // Get maximum residuals, using our own abscmp function
723  max_res = residual.max();
724 
725  clock_t t_end = clock();
726  cpu_for_global_residual += double(t_end - t_start) / CLOCKS_PER_SEC;
727  }
728 
729  oomph_info << "==================================================\n";
730  oomph_info << "Iteration : " << iter << std::endl;
731  oomph_info << "RMS change : " << rms_change
732  << std::endl;
733  oomph_info << "Max. change : " << max_change
734  << std::endl;
735  oomph_info << "RMS norm : " << rms_norm << std::endl;
736  if (get_max_global_residual)
737  {
738  oomph_info << "Max. global residual : " << max_res
739  << std::endl;
740  }
741  oomph_info << "==================================================\n\n";
742 
743  // Check for convergence
744  switch (Convergence_criterion)
745  {
747  tol_achieved = max_change;
748  if (tol_achieved < Convergence_tolerance)
749  {
750  oomph_info
751  << "\n\n\n/////////////////////////////////////////////////////"
752  "///"
753  << "\nPicard iteration converged after " << iter << " steps!"
754  << std::endl
755  << "Convergence was based on absolute change in solid dofs \n"
756  << "being less than " << Convergence_tolerance << "."
757  << std::endl
758  << "////////////////////////////////////////////////////////"
759  "\n\n\n"
760  << std::endl;
761  converged = true;
762  }
763  break;
764 
765 
767  tol_achieved = std::fabs(rms_change / rms_norm);
768  if (tol_achieved < Convergence_tolerance)
769  {
770  oomph_info
771  << "\n\n\n/////////////////////////////////////////////////////"
772  "//"
773  << "\nPicard iteration converged after " << iter << " steps!"
774  << std::endl
775  << "Convergence was based on relative change in solid dofs \n"
776  << "being less than " << Convergence_tolerance << "."
777  << std::endl
778  << "////////////////////////////////////////////////////////"
779  "\n\n\n"
780  << std::endl;
781  converged = true;
782  }
783  break;
784 
786  tol_achieved = max_res;
787  if (tol_achieved < Convergence_tolerance)
788  {
789  oomph_info
790  << "\n\n\n/////////////////////////////////////////////////////"
791  "///"
792  << "\nPicard iteration converged after " << iter << " steps!"
793  << std::endl
794  << "Convergence was based on max. residual of coupled eqns \n"
795  << "being less than " << Convergence_tolerance << "."
796  << std::endl
797  << "////////////////////////////////////////////////////////"
798  "\n\n\n"
799  << std::endl;
800  converged = true;
801  }
802  break;
803  }
804 
805  // If converged bail out
806  if (converged)
807  {
808  // Number of iterations taken
809  iter_taken = iter;
810 
811  // We have converged (overwrites default of false)
812  conv_data.set_solver_converged();
813 
814  // Break loop using a GO TO! This is the first (and hopefully
815  // the last) one in the whole of oomph-lib. Here it's
816  // it's actually the cleanest way to exit from these
817  // nested control structures
818  goto jump_out_of_picard;
819  }
820 
821  // Store the current values of the solid dofs as reference values
822  // and for the pointwise Aitken extrapolation
824 
825  // Correct wall shape by pointwise Aitken extrapolation if possible
826  //-----------------------------------------------------------------
827  // and desired
828  //------------
829  // This is an acceleration method for the (possibly under-relaxed)
830  // sequence of iterates.
832  (iter > Pointwise_aitken_start))
833  {
835 
836  // Repeat the convergence check
838  }
839  else
840  {
841  // Didn't change anything: Don't repeat the convergence check
843  }
844  }
845  // Repeat convergence while we are doing aitken extrapolation
847 
848  } // End of loop over iterations
849 
850 
851  // Jump address for converged or diverged iteration
852  jump_out_of_picard:
853 
854  // Reset everything
859  // This is a full solve again
861 
862  // Do any updates that are required
864 
865  // Number of iterations (either this is still Max_iter from
866  // the initialisation or it's been overwritten on convergence)
867  conv_data.niter() = iter_taken;
868 
869  // Total cpu time
870  clock_t t_total_end = clock();
871  conv_data.cpu_total() =
872  double(t_total_end - t_total_start) / CLOCKS_PER_SEC;
873 
874  // Total essential cpu time (exluding doc etc)
875  conv_data.essential_cpu_total() = t_spent_on_actual_solve();
876 
877  // cpu time for check/doc of global residual
878  conv_data.cpu_for_global_residual() = cpu_for_global_residual;
879 
880  // Final tolerance achieved by the iteration
881  conv_data.tol_achieved() = tol_achieved;
882 
883  // Doc non-convergence
884  if (!converged)
885  {
886  switch (Convergence_criterion)
887  {
889  oomph_info
890  << "\n\n\n////////////////////////////////////////////////////////"
891  << "\nPicard iteration did not converge after " << iter_taken
892  << " steps!" << std::endl
893  << "Convergence was based on absolute change in solid dofs \n"
894  << "being less than " << Convergence_tolerance << " " << std::endl
895  << "but we achieved only " << tol_achieved << "." << std::endl
896  << "////////////////////////////////////////////////////////\n\n\n"
897  << std::endl;
898  // Throw an error indicating if we ran out of iterations
899  if (iter_taken == Max_picard)
900  {
901  throw SegregatedSolverError(true);
902  }
903  else
904  {
905  throw SegregatedSolverError(false);
906  }
907  break;
908 
909 
911  oomph_info
912  << "\n\n\n///////////////////////////////////////////////////////"
913  << "\nPicard iteration did not converge after " << iter_taken
914  << " steps!" << std::endl
915  << "Convergence was based on relative change in solid dofs \n"
916  << "being less than " << Convergence_tolerance << " " << std::endl
917  << "but we achieved only " << tol_achieved << "." << std::endl
918  << "////////////////////////////////////////////////////////\n\n\n"
919  << std::endl;
920  // Throw an error indicating if we ran out of iterations
921  if (iter_taken == Max_picard)
922  {
923  throw SegregatedSolverError(true);
924  }
925  else
926  {
927  throw SegregatedSolverError(false);
928  }
929  break;
930 
932  oomph_info
933  << "\n\n\n////////////////////////////////////////////////////////"
934  << "\nPicard iteration did not converge after " << iter_taken
935  << " steps!" << std::endl
936  << "Convergence was based on max. residual of coupled eqns \n"
937  << "being less than " << Convergence_tolerance << " " << std::endl
938  << "but we achieved only " << tol_achieved << "." << std::endl
939 
940  << "////////////////////////////////////////////////////////\n\n\n"
941  << std::endl;
942  // Throw an error indicating if we ran out of iterations
943  if (iter_taken == Max_picard)
944  {
945  throw SegregatedSolverError(true);
946  }
947  else
948  {
949  throw SegregatedSolverError(false);
950  }
951  break;
952  }
953  }
954 
955  return conv_data;
956  }
std::vector< double > DoubleVector
loads clump configuration
Definition: ClumpInput.h:26
virtual void get_residuals(DoubleVector &residuals)
Get the total residuals Vector for the problem.
Definition: problem.cc:3714
void newton_solve()
Use Newton method to solve the problem.
Definition: problem.cc:8783
unsigned long assign_eqn_numbers(const bool &assign_local_eqn_numbers=true)
Definition: problem.cc:1989
void use_only_fluid_elements()
Definition: segregated_fsi_solver.cc:138
virtual void actions_after_segregated_solve()
Definition: segregated_fsi_solver.h:176
void use_only_solid_elements()
Definition: segregated_fsi_solver.cc:115
void pin_fluid_dofs()
Pin fluid dofs.
Definition: segregated_fsi_solver.cc:153
void reset_timer()
Reset timer.
Definition: segregated_fsi_solver.h:439
void rebuild_monolithic_mesh()
Rebuild global mesh for monolithic discretisation.
Definition: segregated_fsi_solver.cc:87
void restore_solid_dofs()
Restore pinned status of solid dofs.
Definition: segregated_fsi_solver.cc:229
void pointwise_aitken_extrapolate()
Do pointwise Aitken extrapolation for solid.
Definition: segregated_fsi_solver.cc:490
void under_relax_solid()
Under-relax solid, either by classical relaxation or by Irons & Tuck.
Definition: segregated_fsi_solver.cc:354
void restore_fluid_dofs()
Restore pinned status of fluid dofs.
Definition: segregated_fsi_solver.cc:176
virtual void actions_before_segregated_convergence_check()
Definition: segregated_fsi_solver.h:180
void pin_solid_dofs()
Pin solid dofs.
Definition: segregated_fsi_solver.cc:206
void get_solid_change(double &rms_change, double &max_change, double &rms_norm)
Definition: segregated_fsi_solver.cc:303
double t_spent_on_actual_solve()
Total elapsed time since start of solve.
Definition: segregated_fsi_solver.h:471
virtual void actions_before_segregated_solve()
Definition: segregated_fsi_solver.h:172
void store_solid_dofs()
Definition: segregated_fsi_solver.cc:260
OomphInfo oomph_info
Definition: oomph_definitions.cc:319

References actions_after_segregated_solve(), actions_before_segregated_convergence_check(), actions_before_segregated_solve(), Assess_convergence_based_on_absolute_solid_change, Assess_convergence_based_on_max_global_residual, Assess_convergence_based_on_relative_solid_change, oomph::Problem::assign_eqn_numbers(), Convergence_criterion, Convergence_tolerance, oomph::PicardConvergenceData::cpu_for_global_residual(), oomph::PicardConvergenceData::cpu_total(), Doc_max_global_residual, oomph::PicardConvergenceData::essential_cpu_total(), boost::multiprecision::fabs(), Fluid_solve, Full_solve, oomph::Problem::get_residuals(), get_solid_change(), oomph::DoubleVector::max(), Max_picard, oomph::Problem::newton_solve(), oomph::PicardConvergenceData::niter(), oomph::oomph_info, pin_fluid_dofs(), pin_solid_dofs(), Pointwise_aitken_counter, pointwise_aitken_extrapolate(), Pointwise_aitken_start, rebuild_monolithic_mesh(), Recheck_convergence_after_pointwise_aitken, reset_timer(), restore_fluid_dofs(), restore_solid_dofs(), oomph::PicardConvergenceData::set_solver_converged(), Solid_solve, Solve_type, store_solid_dofs(), t_spent_on_actual_solve(), oomph::PicardConvergenceData::tol_achieved(), under_relax_solid(), use_only_fluid_elements(), use_only_solid_elements(), and Use_pointwise_aitken.

Referenced by steady_segregated_solve(), and unsteady_segregated_solve().

◆ setup_segregated_solver()

void oomph::SegregatableFSIProblem::setup_segregated_solver ( const bool full_setup_of_fluid_and_solid_dofs = true)

Setup the segregated solver: Backup the pinned status of the fluid and solid dofs and allocate the internal storage based on the input provided by identify_fluid_and_solid_dofs(...) In addition, reset storage associated with convergence acceleration techniques. If the problem and degrees of freedom has not changed between calls to the solver then it is wasteful to call identify_fluid_and_solid_dofs(...) again and again. If the optional boolean flag is set to false then the storage for convergence acceleration techniques is reset, but the fluid and solid dofs are not altered.

Setup segregated solver, using the information provided by the user in his/her implementation of the pure virtual function identify_fluid_and_solid_dofs(...).

1113  {
1114  // If we are doing a full setup
1115  if (full_setup_of_fluid_and_solid_dofs)
1116  {
1117  // Identify the fluid and solid Data
1118  Vector<Data*> fluid_data_pt;
1119  Vector<Data*> solid_data_pt;
1121  fluid_data_pt, solid_data_pt, Fluid_mesh_pt, Solid_mesh_pt);
1122 
1123  if (Fluid_mesh_pt == 0)
1124  {
1125  oomph_info
1126  << std::endl
1127  << std::endl
1128  << "Warning: Your implementation of the pure virtual\n"
1129  << " function identify_fluid_and_solid_dofs(...)\n"
1130  << " returned a NULL pointer for Fluid_mesh_pt.\n"
1131  << " --> The fluid elements will remain activated\n"
1132  << " during the solid solve. This is inefficient!\n"
1133  << " You should combine all fluid elements into a combined\n"
1134  << " mesh and specify this mesh in your\n"
1135  << " implementation of \n\n"
1136  << " "
1137  "SegregatableFSIProblem::identify_fluid_and_solid_dofs(...)"
1138  << std::endl
1139  << std::endl;
1140  }
1141 
1142 
1143  if (Solid_mesh_pt == 0)
1144  {
1145  oomph_info
1146  << std::endl
1147  << std::endl
1148  << "Warning: Your implementation of the pure virtual\n"
1149  << " function identify_fluid_and_solid_dofs(...)\n"
1150  << " returned a NULL pointer for Solid_mesh_pt.\n"
1151  << " --> The solid elements will remain activated\n"
1152  << " during the fluid solve. This is inefficient!\n"
1153  << " You should combine all solid elements into a combined\n"
1154  << " mesh and specify this mesh in your\n"
1155  << " implementation of \n\n"
1156  << " "
1157  "SegregatableFSIProblem::identify_fluid_and_solid_dofs(...)"
1158  << std::endl
1159  << std::endl;
1160  }
1161 
1162  // Back up the pointers to the submeshes in the original problem
1163  // so we can restore the problem when we're done
1164  unsigned orig_n_sub_mesh = nsub_mesh();
1165  Orig_sub_mesh_pt.resize(orig_n_sub_mesh);
1166  for (unsigned i = 0; i < orig_n_sub_mesh; i++)
1167  {
1169  }
1170 
1171  // Fluid
1172  //------
1173 
1174  // Reset
1175  Fluid_data_pt.clear();
1176  Fluid_value_is_pinned.clear();
1177 
1178  // Make space for fluid data items
1179  unsigned n_fluid_data = fluid_data_pt.size();
1180  Fluid_data_pt.resize(n_fluid_data);
1181  Fluid_value_is_pinned.resize(n_fluid_data);
1182 
1183  // Counter for number of fluid values
1184  unsigned n_fluid_values = 0;
1185 
1186  // Loop over fluid data
1187  for (unsigned i = 0; i < n_fluid_data; i++)
1188  {
1189  // Copy data
1190  Fluid_data_pt[i] = fluid_data_pt[i];
1191 
1192  // Number of values stored at this Data item:
1193  unsigned n_value = fluid_data_pt[i]->nvalue();
1194  Fluid_value_is_pinned[i].resize(n_value);
1195 
1196  // Copy pinned status for all values
1197  for (unsigned k = 0; k < n_value; k++)
1198  {
1199  Fluid_value_is_pinned[i][k] = fluid_data_pt[i]->is_pinned(k);
1200 
1201  // Increment counter for number of fluid values
1202  n_fluid_values++;
1203  }
1204  }
1205 
1206 
1207  // Solid
1208  //------
1209 
1210  // Reset
1211  Solid_data_pt.clear();
1212  Solid_value_is_pinned.clear();
1213  Previous_solid_value.clear();
1215  Del_irons_and_tuck.clear();
1216 
1217 
1218  unsigned n_solid_data = solid_data_pt.size();
1219 
1220  // Make space for solid data items
1221  unsigned nsolid_data = solid_data_pt.size();
1222  Solid_data_pt.resize(nsolid_data);
1223  Solid_value_is_pinned.resize(nsolid_data);
1224 
1225  // Counter for number of solid values
1226  unsigned n_solid_values = 0;
1227 
1228  // Loop over solid data
1229  for (unsigned i = 0; i < n_solid_data; i++)
1230  {
1231  // Copy data
1232  Solid_data_pt[i] = solid_data_pt[i];
1233 
1234  // Number of values stored at this Data item:
1235  unsigned n_value = solid_data_pt[i]->nvalue();
1236  Solid_value_is_pinned[i].resize(n_value);
1237 
1238  // Copy pinned status for all values
1239  for (unsigned k = 0; k < n_value; k++)
1240  {
1241  Solid_value_is_pinned[i][k] = solid_data_pt[i]->is_pinned(k);
1242 
1243  // Increment counter for number of solid values
1244  n_solid_values++;
1245  }
1246  }
1247 
1248  // Make space for previous solid values
1249  Previous_solid_value.resize(n_solid_values);
1250 
1251  // Allocate storage and initialise Irons and Tuck extrapolation
1253  {
1254  Del_irons_and_tuck.resize(n_solid_values);
1255  }
1256 
1257  // Make space for pointwise Aitken extrapolation
1259  {
1260  Pointwise_aitken_solid_value.resize(n_solid_values);
1261  for (unsigned i = 0; i < n_solid_values; i++)
1262  {
1263  Pointwise_aitken_solid_value[i].resize(3);
1264  }
1265  }
1266 
1267  } // End of full setup
1268 
1269 
1270  // Initialise Irons and Tuck relaxation factor
1271  R_irons_and_tuck = 1.0 - Omega_relax;
1272 
1273  // Initialise Irons and Tuck delta values
1274  unsigned n_del = Del_irons_and_tuck.size();
1275  for (unsigned i = 0; i < n_del; i++)
1276  {
1277  Del_irons_and_tuck[i] = 1.0e20;
1278  }
1279 
1280  // Initialise counter for the number of pointwise Aitken values stored
1282  }
unsigned nsub_mesh() const
Return number of submeshes.
Definition: problem.h:1323
virtual void identify_fluid_and_solid_dofs(Vector< Data * > &fluid_data_pt, Vector< Data * > &solid_data_pt, Mesh *&fluid_mesh_pt, Mesh *&solid_mesh_pt)=0
double R_irons_and_tuck
Irons and Tuck relaxation factor.
Definition: segregated_fsi_solver.h:560
Vector< double > Del_irons_and_tuck
Vector of changes in Irons and Tuck under-relaxation.
Definition: segregated_fsi_solver.h:557

References Del_irons_and_tuck, Fluid_data_pt, Fluid_mesh_pt, Fluid_value_is_pinned, i, identify_fluid_and_solid_dofs(), k, oomph::Problem::mesh_pt(), oomph::Problem::nsub_mesh(), Omega_relax, oomph::oomph_info, Orig_sub_mesh_pt, Pointwise_aitken_counter, Pointwise_aitken_solid_value, Previous_solid_value, R_irons_and_tuck, Solid_data_pt, Solid_mesh_pt, Solid_value_is_pinned, Use_irons_and_tuck_extrapolation, and Use_pointwise_aitken.

◆ steady_segregated_solve()

PicardConvergenceData oomph::SegregatableFSIProblem::steady_segregated_solve ( )

Steady version of segregated solver. Makes all timesteppers steady before solving. Returns PicardConvergenceData object that contains the vital stats of the iteration.

Segregated fixed point solver with optional pointwise Aitken acceleration on selected solid dofs. Returns PicardConvergenceData object that contains the vital stats of the iteration.

965  {
966  // Find out how many timesteppers there are
967  unsigned n_time_steppers = ntime_stepper();
968 
969  // Vector of bools to store the is_steady status of the various
970  // timesteppers when we came in here
971  std::vector<bool> was_steady(n_time_steppers);
972 
973  // Loop over them all and make them (temporarily) static
974  for (unsigned i = 0; i < n_time_steppers; i++)
975  {
976  was_steady[i] = time_stepper_pt(i)->is_steady();
978  }
979 
980  // Create object to doc convergence stats
981  PicardConvergenceData conv_data;
982 
983  // Solve the non-linear problem by the segregated solver
984  try
985  {
986  conv_data = segregated_solve();
987  }
988  // Catch any exceptions thrown in the segregated solver
989  catch (SegregatedSolverError& error)
990  {
991  if (!error.Ran_out_of_iterations)
992  {
993  std::ostringstream error_stream;
994  error_stream << "Error occured in Segregated solver. " << std::endl;
995  throw OomphLibError(
996  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
997  }
998  else
999  {
1000  oomph_info << "Note: Ran out of iterations but continuing anyway"
1001  << std::endl;
1002  }
1003  }
1004 
1005  // Reset the is_steady status of all timesteppers that
1006  // weren't already steady when we came in here and reset their
1007  // weights
1008  for (unsigned i = 0; i < n_time_steppers; i++)
1009  {
1010  if (!was_steady[i])
1011  {
1013  }
1014  }
1015 
1016  // Since we performed a steady solve, the history values
1017  // now have to be set as if we had performed an impulsive start from
1018  // the current solution. This ensures that the time-derivatives
1019  // evaluate to zero even now that the timesteppers have been
1020  // reactivated.
1022 
1023  // Return the convergence data
1024  return conv_data;
1025  }
void assign_initial_values_impulsive()
Definition: problem.cc:11499
unsigned ntime_stepper() const
Return the number of time steppers.
Definition: problem.h:1680
TimeStepper *& time_stepper_pt()
Definition: problem.h:1524
PicardConvergenceData segregated_solve()
Definition: segregated_fsi_solver.cc:538
void make_steady()
Definition: timesteppers.h:374
virtual void undo_make_steady()
Definition: timesteppers.h:482
bool is_steady() const
Definition: timesteppers.h:389
int error
Definition: calibrate.py:297
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86

References oomph::Problem::assign_initial_values_impulsive(), calibrate::error, i, oomph::TimeStepper::is_steady(), oomph::TimeStepper::make_steady(), oomph::Problem::ntime_stepper(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::oomph_info, segregated_solve(), oomph::Problem::time_stepper_pt(), and oomph::TimeStepper::undo_make_steady().

◆ store_solid_dofs()

void oomph::SegregatableFSIProblem::store_solid_dofs ( )

Store the current solid values as reference values for future convergence check. Also add another entry to pointwise Aitken history if required.

Store the current solid values as reference values for future convergence check. Also add another entry to pointwise Aitken history.

261  {
262  // Counter for the number of values:
263  unsigned value_count = 0;
264 
265  // Number of solid Data items:
266  unsigned n_data = Solid_data_pt.size();
267 
268  // Loop over all solid Data items:
269  for (unsigned i = 0; i < n_data; i++)
270  {
271  // Number of values stored at this Data item:
272  unsigned n_value = Solid_data_pt[i]->nvalue();
273 
274  // Loop over all values
275  for (unsigned k = 0; k < n_value; k++)
276  {
277  // Make backup
278  Previous_solid_value[value_count] = Solid_data_pt[i]->value(k);
279 
280  // Store in pointwise Aitken history
282  {
284  Solid_data_pt[i]->value(k);
285  }
286 
287  // Increment counter
288  value_count++;
289  }
290  }
291 
292  // We stored another level of Aitken history values
294  }

References i, k, Pointwise_aitken_counter, Pointwise_aitken_solid_value, Previous_solid_value, Solid_data_pt, and Use_pointwise_aitken.

Referenced by segregated_solve().

◆ t_spent_on_actual_solve()

double oomph::SegregatableFSIProblem::t_spent_on_actual_solve ( )
inline

Total elapsed time since start of solve.

472  {
473  halt_timer();
474  double time = T_spent_on_actual_solve;
475  restart_timer();
476  return time;
477  }
double & time()
Return the current value of continuous time.
Definition: problem.cc:11531
void restart_timer()
Definition: segregated_fsi_solver.h:450
void halt_timer()
Definition: segregated_fsi_solver.h:460

References halt_timer(), restart_timer(), T_spent_on_actual_solve, and oomph::Problem::time().

Referenced by segregated_solve().

◆ under_relax_solid()

void oomph::SegregatableFSIProblem::under_relax_solid ( )
private

Under-relax solid, either by classical relaxation or by Irons & Tuck.

Under-relax the most recently computed solid variables, either by classical relaxation or by Irons & Tuck

355  {
356  // Irons and Tuck extrapolation/relaxation; an extension of Aitken's method
357  //-------------------------------------------------------------------------
359  {
360  double top = 0.0;
361  double den = 0.0;
362  double crit = 0.0;
363 
364  // Counter for the number of values:
365  unsigned value_count = 0;
366 
367  // Number of solid Data items:
368  unsigned n_data = Solid_data_pt.size();
369 
370  // Loop over all solid Data items:
371  for (unsigned i = 0; i < n_data; i++)
372  {
373  // Number of values stored at this Data item:
374  unsigned n_value = Solid_data_pt[i]->nvalue();
375 
376  // Loop over all values
377  for (unsigned k = 0; k < n_value; k++)
378  {
379  // Prediction from solid solver
380  double new_solid_value = Solid_data_pt[i]->value(k);
381 
382  // Previus value
383  double old_solid_value = Previous_solid_value[value_count];
384 
385  // Change
386  double change = old_solid_value - new_solid_value;
387 
388  // Change of change
389  double del2 = Del_irons_and_tuck[value_count] - change;
390 
391  // Update change
392  Del_irons_and_tuck[value_count] = change;
393 
394  // Update top
395  top += del2 * change;
396 
397  // Update denominator
398  den += del2 * del2;
399 
400  // Update convergence criterion
401  crit += std::fabs(change);
402 
403  // Increment counter
404  value_count++;
405  }
406  }
407 
408  // Update relaxation factor. The if buffers the case in which
409  // we haven't realised that we've converged (so that den=0).
410  // This can happen, e.g. if the convergence assessment is based on the
411  // global residual or during validation. In that case we
412  // obviously don't want any changes to the iterates.
413  if (den != 0.0)
414  {
415  double new_r = R_irons_and_tuck + (R_irons_and_tuck - 1.0) * top / den;
416  R_irons_and_tuck = new_r;
417  }
418  else
419  {
420  R_irons_and_tuck = 0.0;
421  }
422 
423  // Loop over all solid Data items for update
424  value_count = 0;
425  for (unsigned i = 0; i < n_data; i++)
426  {
427  // Number of values stored at this Data item:
428  unsigned n_value = Solid_data_pt[i]->nvalue();
429 
430  // Loop over all values
431  for (unsigned k = 0; k < n_value; k++)
432  {
433  // Compute relaxed/extrapolated value
434  double new_value = Solid_data_pt[i]->value(k) +
435  R_irons_and_tuck * Del_irons_and_tuck[value_count];
436 
437  // Assign
438  Solid_data_pt[i]->set_value(k, new_value);
439 
440  // Increment counter
441  value_count++;
442  }
443  }
444  return;
445  }
446 
447  // Standard relaxation
448  //--------------------
449  else
450  {
451  // No relaxation: Can return immediately
452  if (Omega_relax == 1.0) return;
453 
454  // Counter for the number of values:
455  unsigned value_count = 0;
456 
457  // Number of solid Data items:
458  unsigned n_data = Solid_data_pt.size();
459 
460  // Loop over all solid Data items:
461  for (unsigned i = 0; i < n_data; i++)
462  {
463  // Number of values stored at this Data item:
464  unsigned n_value = Solid_data_pt[i]->nvalue();
465 
466  // Loop over all values
467  for (unsigned k = 0; k < n_value; k++)
468  {
469  // Prediction from solid solver
470  double new_solid_value = Solid_data_pt[i]->value(k);
471 
472  // Previus value
473  double old_solid_value = Previous_solid_value[value_count];
474 
475  // Relax
476  Solid_data_pt[i]->set_value(k,
477  Omega_relax * new_solid_value +
478  (1.0 - Omega_relax) * old_solid_value);
479 
480  // Increment counter
481  value_count++;
482  }
483  }
484  }
485  }

References Del_irons_and_tuck, boost::multiprecision::fabs(), i, k, Omega_relax, Previous_solid_value, R_irons_and_tuck, Solid_data_pt, and Use_irons_and_tuck_extrapolation.

Referenced by segregated_solve().

◆ unsteady_segregated_solve() [1/2]

PicardConvergenceData oomph::SegregatableFSIProblem::unsteady_segregated_solve ( const double dt)

Unsteady segregated solver, advance time by dt and solve by the segregated solver. The time values are always shifted by this function. Returns PicardConvergenceData object that contains the vital stats of the iteration.

Segregated fixed point solver with optional pointwise Aitken acceleration on selected solid dofs. Returns PicardConvergenceData object that contains the vital stats of the iteration.

1035  {
1036  // We shift the values, so shift_values is true
1037  return unsteady_segregated_solve(dt, true);
1038  }
PicardConvergenceData unsteady_segregated_solve(const double &dt)
Definition: segregated_fsi_solver.cc:1033

◆ unsteady_segregated_solve() [2/2]

PicardConvergenceData oomph::SegregatableFSIProblem::unsteady_segregated_solve ( const double dt,
const bool shift_values 
)

Unsteady segregated solver. Advance time by dt and solve the system by a segregated method. The boolean flag is used to control whether the time values should be shifted. If it is true the current data values will be shifted (stored as previous timesteps) before the solution step. Returns PicardConvergenceData object that contains the vital stats of the iteration.

Segregated fixed point solver with optional pointwise Aitken acceleration on selected solid dofs. Returns PicardConvergenceData object that contains the vital stats of the iteration.

1047  {
1048  // Shift the time values and the dts according to the control flag
1049  if (shift_values)
1050  {
1052  }
1053 
1054  // Advance global time and set current value of dt
1055  time_pt()->time() += dt;
1056  time_pt()->dt() = dt;
1057 
1058  // Find out how many timesteppers there are
1059  unsigned n_time_steppers = ntime_stepper();
1060 
1061  // Loop over them all and set the weights
1062  for (unsigned i = 0; i < n_time_steppers; i++)
1063  {
1065  }
1066 
1067  // Now update anything that needs updating before the timestep
1068  // This could be time-dependent boundary conditions, for example.
1070 
1071  // Extrapolate the solid data and then update fluid mesh during unsteady run
1073 
1074  // Create object to doc convergence stats
1075  PicardConvergenceData conv_data;
1076 
1077  try
1078  {
1079  // Solve the non-linear problem for this timestep with Newton's method
1080  conv_data = segregated_solve();
1081  }
1082  // Catch any exceptions thrown in the segregated solver
1083  catch (SegregatedSolverError& error)
1084  {
1085  if (!error.Ran_out_of_iterations)
1086  {
1087  std::ostringstream error_stream;
1088  error_stream << "Error occured in Segregated solver. " << std::endl;
1089  throw OomphLibError(
1090  error_stream.str(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION);
1091  }
1092  else
1093  {
1094  oomph_info << "Note: Ran out of iterations but continuing anyway"
1095  << std::endl;
1096  }
1097  }
1098 
1099  // Now update anything that needs updating after the timestep
1101 
1102  return conv_data;
1103  }
virtual void actions_after_implicit_timestep()
Definition: problem.h:1070
virtual void shift_time_values()
Shift all values along to prepare for next timestep.
Definition: problem.cc:11634
Time *& time_pt()
Return a pointer to the global time object.
Definition: problem.h:1504
virtual void actions_before_implicit_timestep()
Definition: problem.h:1064
void extrapolate_solid_data()
Extrapolate solid data and update fluid mesh during unsteady run.
Definition: segregated_fsi_solver.cc:39
virtual void set_weights()=0
double & dt(const unsigned &t=0)
Definition: timesteppers.h:136
double & time()
Return the current value of the continuous time.
Definition: timesteppers.h:123

References oomph::Problem::actions_after_implicit_timestep(), oomph::Problem::actions_before_implicit_timestep(), oomph::Time::dt(), calibrate::error, extrapolate_solid_data(), i, oomph::Problem::ntime_stepper(), OOMPH_CURRENT_FUNCTION, OOMPH_EXCEPTION_LOCATION, oomph::oomph_info, segregated_solve(), oomph::TimeStepper::set_weights(), oomph::Problem::shift_time_values(), oomph::Time::time(), oomph::Problem::time_pt(), and oomph::Problem::time_stepper_pt().

◆ use_only_fluid_elements()

void oomph::SegregatableFSIProblem::use_only_fluid_elements ( )
private

Only include fluid elements in the Problem's mesh. This is called before the segregated fluid solve. The fluid elements are identified by the user via the fluid_mesh_pt argument in the pure virtual function identify_fluid_and_solid_dofs(...). If a NULL pointer is returned by this function (i.e. if the user hasn't bothered to identify the fluids elements in a submesh, then no stripping of non-fluid elements is performed. The result of the computation will be correct but it won't be very efficient.

139  {
140  // Wipe global mesh and rebuild it with just the fluid elements in it
141  if (Fluid_mesh_pt != 0)
142  {
146  }
147  }

References oomph::Problem::add_sub_mesh(), Fluid_mesh_pt, oomph::Problem::flush_sub_meshes(), and oomph::Problem::rebuild_global_mesh().

Referenced by segregated_solve().

◆ use_only_solid_elements()

void oomph::SegregatableFSIProblem::use_only_solid_elements ( )
private

Only include solid elements in the Problem's mesh. This is called before the segregated solid solve. The solid elements are identified by the user via the solid_mesh_pt argument in the pure virtual function identify_fluid_and_solid_dofs(...). If a NULL pointer is returned by this function (i.e. if the user hasn't bothered to identify the solid elements in a submesh, then no stripping of non-solid elements is performed. The result of the computation will be correct but it won't be very efficient.

Only include solid elements in the Problem's mesh. This is called before the segregated solid solve. The solid elements are identified by the user via the solid_mesh_pt argument in the pure virtual function identify_fluid_and_solid_dofs(...). If a NULL pointer is returned by this function (i.e. if the user hasn't bothered to identify the solids elements in a submesh, then no stripping of non-solid elements is performed. The result of the computation will be correct but it won't be very efficient.

116  {
117  // Wipe global mesh and rebuild it with just the solid elements in it
118  if (Solid_mesh_pt != 0)
119  {
123  }
124  }

References oomph::Problem::add_sub_mesh(), oomph::Problem::flush_sub_meshes(), oomph::Problem::rebuild_global_mesh(), and Solid_mesh_pt.

Referenced by segregated_solve().

Member Data Documentation

◆ Convergence_criterion

int oomph::SegregatableFSIProblem::Convergence_criterion
private

◆ Convergence_tolerance

double oomph::SegregatableFSIProblem::Convergence_tolerance
protected

◆ Del_irons_and_tuck

Vector<double> oomph::SegregatableFSIProblem::Del_irons_and_tuck
protected

Vector of changes in Irons and Tuck under-relaxation.

Referenced by setup_segregated_solver(), and under_relax_solid().

◆ Doc_max_global_residual

bool oomph::SegregatableFSIProblem::Doc_max_global_residual
protected

◆ Fluid_data_pt

Vector<Data*> oomph::SegregatableFSIProblem::Fluid_data_pt
protected

Vector storing the Data objects associated with the fluid problem: Tyically the nodal and internal data of the elements in the fluid bulk mesh

Referenced by pin_fluid_dofs(), restore_fluid_dofs(), and setup_segregated_solver().

◆ Fluid_mesh_pt

Mesh* oomph::SegregatableFSIProblem::Fluid_mesh_pt
protected

Mesh containing only fluid elements – the elements in this Mesh will be excluded from the assembly process when the solid problem is solved

Referenced by extrapolate_solid_data(), SegregatableFSIProblem(), setup_segregated_solver(), and use_only_fluid_elements().

◆ Fluid_value_is_pinned

Vector<std::vector<bool> > oomph::SegregatableFSIProblem::Fluid_value_is_pinned
protected

Vector of vectors that store the pinned status of fluid Data values

Referenced by restore_fluid_dofs(), and setup_segregated_solver().

◆ Max_picard

unsigned oomph::SegregatableFSIProblem::Max_picard
protected

◆ Omega_relax

double oomph::SegregatableFSIProblem::Omega_relax
private

Under-relaxation parameter. (1.0: no under-relaxation; 0.0: Freeze wall shape)

Referenced by enable_under_relaxation(), SegregatableFSIProblem(), setup_segregated_solver(), and under_relax_solid().

◆ Orig_sub_mesh_pt

Vector<Mesh*> oomph::SegregatableFSIProblem::Orig_sub_mesh_pt
protected

Backup for the pointers to the submeshes in the original problem.

Referenced by rebuild_monolithic_mesh(), and setup_segregated_solver().

◆ Pointwise_aitken_counter

int oomph::SegregatableFSIProblem::Pointwise_aitken_counter
protected

Number of Aitken histories available (int because after extrapolation it's re-initialised to -1 to force the computation of three new genuine iterates).

Referenced by pointwise_aitken_extrapolate(), segregated_solve(), setup_segregated_solver(), and store_solid_dofs().

◆ Pointwise_aitken_solid_value

Vector<Vector<double> > oomph::SegregatableFSIProblem::Pointwise_aitken_solid_value
protected

Vector of Vectors containing up to three previous iterates for the solid dofs; used for pointwise Aitken extrapolation

Referenced by pointwise_aitken_extrapolate(), setup_segregated_solver(), and store_solid_dofs().

◆ Pointwise_aitken_start

unsigned oomph::SegregatableFSIProblem::Pointwise_aitken_start
protected

Start pointwise Aitken extrpolation after specified number of Picard iterations

Referenced by enable_pointwise_aitken(), SegregatableFSIProblem(), and segregated_solve().

◆ Previous_solid_value

Vector<double> oomph::SegregatableFSIProblem::Previous_solid_value
protected

Vector storing the previous solid values – used for convergence check

Referenced by get_solid_change(), setup_segregated_solver(), store_solid_dofs(), and under_relax_solid().

◆ R_irons_and_tuck

double oomph::SegregatableFSIProblem::R_irons_and_tuck
protected

Irons and Tuck relaxation factor.

Referenced by setup_segregated_solver(), and under_relax_solid().

◆ Recheck_convergence_after_pointwise_aitken

bool oomph::SegregatableFSIProblem::Recheck_convergence_after_pointwise_aitken
protected

Have we just done a pointwise Aitken step.

Referenced by SegregatableFSIProblem(), and segregated_solve().

◆ Solid_data_pt

Vector<Data*> oomph::SegregatableFSIProblem::Solid_data_pt
protected

Vector storing the Data objects associated with the solid problem: Typically the positional data of solid nodes and any quantities associated with displacement control, say.

Referenced by extrapolate_solid_data(), get_solid_change(), pin_solid_dofs(), pointwise_aitken_extrapolate(), restore_solid_dofs(), setup_segregated_solver(), store_solid_dofs(), and under_relax_solid().

◆ Solid_mesh_pt

Mesh* oomph::SegregatableFSIProblem::Solid_mesh_pt
protected

Mesh containing only solid elements – the elements in this mesh will be excluded from the assembly process when the fluid problem is solved

Referenced by SegregatableFSIProblem(), setup_segregated_solver(), and use_only_solid_elements().

◆ Solid_value_is_pinned

Vector<std::vector<bool> > oomph::SegregatableFSIProblem::Solid_value_is_pinned
protected

Vector of vectors that store the pinned status of solid Data values

Referenced by restore_solid_dofs(), and setup_segregated_solver().

◆ Solve_type

int oomph::SegregatableFSIProblem::Solve_type
protected

Solve that is taking place (enumerated flag)

Referenced by SegregatableFSIProblem(), and segregated_solve().

◆ T_ref

clock_t oomph::SegregatableFSIProblem::T_ref
private

Reference time for segregated solve. Can be re-initialised whenever total elapsed time has been stored (before entering non-essential doc sections of the code)

Referenced by halt_timer(), reset_timer(), restart_timer(), and SegregatableFSIProblem().

◆ T_spent_on_actual_solve

double oomph::SegregatableFSIProblem::T_spent_on_actual_solve
private

Total elapsed time since start of solve, can be accumulated by adding bits of time spent in relevant parts of code (bypassing sections that only document the progress)

Referenced by halt_timer(), reset_timer(), SegregatableFSIProblem(), and t_spent_on_actual_solve().

◆ Timer_has_been_halted

bool oomph::SegregatableFSIProblem::Timer_has_been_halted
private

boolean flag to indicate if timer has been halted

Referenced by halt_timer(), reset_timer(), restart_timer(), and SegregatableFSIProblem().

◆ Use_irons_and_tuck_extrapolation

bool oomph::SegregatableFSIProblem::Use_irons_and_tuck_extrapolation
private

Boolean flag to indicate use of Irons and Tuck's extrapolation for solid values

Referenced by disable_irons_and_tuck_extrapolation(), enable_irons_and_tuck_extrapolation(), SegregatableFSIProblem(), setup_segregated_solver(), and under_relax_solid().

◆ Use_pointwise_aitken

bool oomph::SegregatableFSIProblem::Use_pointwise_aitken
protected

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