segregated_fsi_solver.h
Go to the documentation of this file.
1 //LIC// ====================================================================
2 //LIC// This file forms part of oomph-lib, the object-oriented,
3 //LIC// multi-physics finite-element library, available
4 //LIC// at http://www.oomph-lib.org.
5 //LIC//
6 //LIC// Version 1.0; svn revision $LastChangedRevision$
7 //LIC//
8 //LIC// $LastChangedDate$
9 //LIC//
10 //LIC// Copyright (C) 2006-2016 Matthias Heil and Andrew Hazel
11 //LIC//
12 //LIC// This library is free software; you can redistribute it and/or
13 //LIC// modify it under the terms of the GNU Lesser General Public
14 //LIC// License as published by the Free Software Foundation; either
15 //LIC// version 2.1 of the License, or (at your option) any later version.
16 //LIC//
17 //LIC// This library is distributed in the hope that it will be useful,
18 //LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
19 //LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 //LIC// Lesser General Public License for more details.
21 //LIC//
22 //LIC// You should have received a copy of the GNU Lesser General Public
23 //LIC// License along with this library; if not, write to the Free Software
24 //LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 //LIC// 02110-1301 USA.
26 //LIC//
27 //LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
28 //LIC//
29 //LIC//====================================================================
30 #ifndef OOMPH_SEGREGATED_FSI_SOLVER
31 #define OOMPH_SEGREGATED_FSI_SOLVER
32 
33 
34 #include "../generic/problem.h"
35 #include "../generic/geom_objects.h"
36 #include "../generic/mesh.h"
37 
38 namespace oomph
39 {
40 
41 
42 //===============================================================
43 /// Object that collates convergence data of Picard iteration
44 //===============================================================
46  {
47 
48  public:
49 
50  /// Constructor initialises all data
53  Tol_achieved(0.0), Has_converged(false)
54  {}
55 
56  /// Empty destructor
58 
59  /// Number of iterations performed
60  unsigned& niter(){return Niter;}
61 
62  /// Total CPU time for segregated solve
63  double& cpu_total(){return CPU_total;}
64 
65  /// \short Total essential CPU time for segregated solve
66  /// (excluding any actions that merely doc the progress
67  /// of the iteration, etc.)
69 
70  /// \short CPU time for computation of global residual vectors
71  /// Note: This time is contained in Total_CPU and is
72  /// only used if convergence is based on the residual
73  /// of the fully coupled system.
75 
76  /// Final tolerance achieved by the iteration
77  double& tol_achieved(){return Tol_achieved;}
78 
79  /// Flag to indicate if the solver has converged
80  bool has_converged() const {return Has_converged;}
81 
82  /// Set the flag to indicate that the solver has converged
84 
85  /// Set the flag to indicate that the solver has not converged
87 
88  private:
89 
90  /// Number of iterations performed
91  unsigned Niter;
92 
93  /// Total CPU time for segregated solve
94  double CPU_total;
95 
96  /// \short Total essential CPU time for segregated solve
97  /// (excluding any actions that merely doc the progress
98  /// of the iteration, etc.)
100 
101  /// \short CPU time for computation of global residual vectors
102  /// Note: This time is contained in Total_CPU and is
103  /// only used if convergence is based on the residual
104  /// of the fully coupled system
106 
107  /// Final tolerance achieved by the iteration
108  double Tol_achieved;
109 
110  /// Flag to indicate if the solver has converged
112 
113  };
114 
115 
116 /////////////////////////////////////////////////////////////////////
117 /////////////////////////////////////////////////////////////////////
118 /////////////////////////////////////////////////////////////////////
119 
120 
121 
122 //=======================================================================
123 /// A class to handle errors in the Segregated solver
124 //=======================================================================
126 {
127  public:
128 
129  /// Default constructor, does nothing
130  SegregatedSolverError(const bool& ran_out_of_iterations=false)
131  {
132  Ran_out_of_iterations=ran_out_of_iterations;
133  }
134 
135  /// Boolean indicating if the error occured because
136  /// we ran out of iterations
138 
139 };
140 
141 
142 
143 /////////////////////////////////////////////////////////////////////
144 /////////////////////////////////////////////////////////////////////
145 /////////////////////////////////////////////////////////////////////
146 
147 
148 
149 //===============================================================
150 /// Base class for problems that can be solved by segregated
151 /// FSI solver
152 //===============================================================
153  class SegregatableFSIProblem : public virtual Problem
154  {
155  protected:
156 
157  /// \short This function is called once at the start of each
158  /// segregated solve.
160 
161  /// \short This function is called once at the end of each
162  /// segregated solve.
164 
165  /// \short This function is to be filled with actions that take place
166  /// before the check for convergence of the entire segregated solve
168 
169  public:
170 
171  /// \short Constructor. Set default values for solver parameters:
172  /// - Don't use pointwise Aitken extrapolation but if it's used at
173  /// all, it's used immediately.
174  /// - No under-relaxation at all (neither classical nor Irons&Tuck)
175  /// - Base convergence on max. residual of coupled system of eqns
176  /// - Convergence tolerance = tolerance for Newton solver
177  /// defined in Problem base class
178  /// - Max. 50 Picard iterations
180  {
181  // Use pointwise Aitken extrapolation?
182  Use_pointwise_aitken=false;
183 
184  // Default: No under-relaxation
185  Omega_relax=1.0;
186 
187  // Don't use of Irons and Tuck's extrapolation for solid values
188  Use_irons_and_tuck_extrapolation=false;
189 
190  // Start using pointwise Aitken immediately
191  Pointwise_aitken_start=0;
192 
193  // By default we don't recheck convergence
194  Recheck_convergence_after_pointwise_aitken=false;
195 
196  // Default solve type is full solve
197  Solve_type = Full_solve;
198 
199  // Convergence criterion
200  Convergence_criterion=Assess_convergence_based_on_max_global_residual;
201 
202  // Convergence tolerance (as in global Newton solver)
203  Convergence_tolerance=Problem::Newton_solver_tolerance;
204 
205  // Doc max. global residual during iteration?
206  Doc_max_global_residual=false;
207 
208  // Max. number of Picard iterations
209  Max_picard=50;
210 
211  // Pointer to Mesh containing only fluid elements -- the elements in this
212  // Mesh will be excluded from the assembly process when
213  // the solid problem is solved
214  Fluid_mesh_pt=0;
215 
216  // Pointer to Mesh containing only solid elements -- the elements in this
217  // mesh will be excluded from the assembly process when
218  // the fluid problem is solved
219  Solid_mesh_pt=0;
220 
221  // Initialise timer that allows doc of iteration/cpu time
222  T_ref = clock();
223  T_spent_on_actual_solve=0.0;
224 
225  /// \short boolean flag to indicate if timer has been halted
226  Timer_has_been_halted=false;
227  }
228 
229  /// Empty virtual destructor
231 
232  /// \short Identify the fluid and solid Data. This is a pure virtual
233  /// function that MUST be implemented for every specific problem that
234  /// is to be solved by the segregated solver.
235  /// The two mesh pointers identify meshes that contain
236  /// elements and nodes used during the fluid
237  /// or solid solves respectively. Elements that feature during
238  /// both phases of the segretated solution must be included in both.
239  /// These pointers may be set to NULL. In this case, all elements
240  /// in the global mesh (set up during the monolithic discretisation
241  /// of the problem) contribute to the global Jacobian matrix
242  /// and the residual vector, even if their contributions only contain
243  /// zero entries. This can be costly, though the code will
244  /// still compute the correct results.
245  virtual void identify_fluid_and_solid_dofs(
246  Vector<Data*>& fluid_data_pt,
247  Vector<Data*>& solid_data_pt,
248  Mesh*& fluid_mesh_pt,
249  Mesh*& solid_mesh_pt)=0;
250 
251  /// \short Setup the segregated solver: Backup the pinned status of
252  /// the fluid and solid dofs and allocate the internal storage
253  /// based on the input provided by identify_fluid_and_solid_dofs(...)
254  /// In addition, reset storage associated with convergence acceleration
255  /// techniques.
256  /// If the problem and degrees of freedom has not changed between
257  /// calls to the solver then it is wasteful to call
258  /// identify_fluid_and_solid_dofs(...) again and again. If the optional
259  /// boolean flag is set to false then the storage for convergence
260  /// acceleration techniques is reset, but the fluid and solid dofs
261  /// are not altered.
262  void setup_segregated_solver(
263  const bool &full_setup_of_fluid_and_solid_dofs=true);
264 
265  /// \short Segregated solver. Peform a segregated step from
266  /// the present state of the system.
267  /// Returns PicardConvergenceData object that contains the vital
268  /// stats of the iteration
269  PicardConvergenceData segregated_solve();
270 
271  /// \short Steady version of segregated solver. Makes all
272  /// timesteppers steady before solving.
273  /// Returns PicardConvergenceData object that contains the
274  /// vital stats of the iteration.
275  PicardConvergenceData steady_segregated_solve();
276 
277 
278  /// \short Unsteady segregated solver, advance time by dt and solve
279  /// by the segregated solver. The time values are always shifted by
280  /// this function.
281  /// Returns PicardConvergenceData object that contains the
282  /// vital stats of the iteration.
283  PicardConvergenceData unsteady_segregated_solve(const double& dt);
284 
285 
286  /// \short Unsteady segregated solver. Advance time by dt and solve
287  /// the system by a segregated method. The boolean flag is used to
288  /// control whether the time values should be shifted. If it is true
289  /// the current data values will be shifted (stored as previous
290  /// timesteps) before the solution step.
291  /// Returns PicardConvergenceData object that contains the
292  /// vital stats of the iteration.
293  PicardConvergenceData unsteady_segregated_solve(const double& dt,
294  const bool &shift_values);
295 
296 
297  /// \short Assess convergence based on max. residual of coupled system of
298  /// eqns. The argument specifies the convergence tolerance.
300  const double& tol)
301  {
302  Convergence_criterion=Assess_convergence_based_on_max_global_residual;
303  Convergence_tolerance=tol;
304  }
305 
306  /// \short Assess convergence based on max. residuals of coupled
307  /// system of eqns. This interface has no argument
308  /// and the default convergence tolerance
309  /// for the Newton solver, Problem::Newton_solver_tolerance is used.
311  {
312  assess_convergence_based_on_max_global_residual(
314  }
315 
316  /// \short Assess convergence based on max. absolute change of solid
317  /// dofs. The argument specifies the convergence tolerance.
319  const double& tol)
320  {
321  Convergence_criterion=Assess_convergence_based_on_absolute_solid_change;
322  Convergence_tolerance=tol;
323  }
324 
325  /// \short Assess convergence based on max. absolute change of solid
326  /// dofs. This interface has no argument and the default
327  /// convergence tolerance
328  /// for the Newton solver, Problem::Newton_solver_tolerance is used.
330  {
331  assess_convergence_based_on_absolute_solid_change(
333  }
334 
335  /// \short Assess convergence based on max. relative change of solid
336  /// dofs. The argument specifies the convergence tolerance.
338  const double& tol)
339  {
340  Convergence_criterion=Assess_convergence_based_on_relative_solid_change;
341  Convergence_tolerance=tol;
342  }
343 
344  /// \short Assess convergence based on max. relative change of solid
345  /// dofs. This interface has no argument and the default
346  /// convergence tolerance
347  /// for the Newton solver, Problem::Newton_solver_tolerance is used.
349  {
350  assess_convergence_based_on_relative_solid_change(
352  }
353 
354 
355  /// \short Use pointwise Aitken extrapolation. The argument is used to
356  /// specify the Picard iteration after which pointwise Aitken extrapolation
357  /// is to be used for the first time.
358  void enable_pointwise_aitken(const unsigned& pointwise_aitken_start)
359  {
360  Pointwise_aitken_start = pointwise_aitken_start;
361  Use_pointwise_aitken = true;
362  }
363 
364  /// \short Use pointwise Aitken extrapolation. This interface has
365  /// no argument and the current value of Pointwise_aitken_start will
366  /// be used. The default is zero, extrapolation starts immediately
367  void enable_pointwise_aitken() {Use_pointwise_aitken = true;}
368 
369  /// \short Disable the use of pointwise Aitken extrapolation
370  void disable_pointwise_aitken() {Use_pointwise_aitken = false;}
371 
372  ///\short Use under-relaxation and (optionally) specify under-relaxation
373  /// parameter. Default: omega=1.0 (i.e. no actual under-relaxation;
374  /// Other extreme: omega=0.0 (freeze wall shape). Under-relaxation
375  /// parameter can also be computed dynamically by setting
376  /// use_irons_and_tuck_extrapolation()
377  void enable_under_relaxation(const double& omega=1.0)
378  {Omega_relax=omega;}
379 
380  ///\short Use Irons and Tuck extrapolation for solid dofs
382  {Use_irons_and_tuck_extrapolation = true;}
383 
384  ///\short Do not use Irons and Tuck extrapolation for solid dofs
386  {Use_irons_and_tuck_extrapolation = false;}
387 
388  /// Enumerated flags for convergence criteria
389  enum convergence_criteria{Assess_convergence_based_on_absolute_solid_change,
391  Assess_convergence_based_on_max_global_residual};
392 
393 
394  /// Enumerated flags to indicate which solve is taking place
395  enum solve_type{Full_solve,Fluid_solve,Solid_solve};
396 
397  /// \short Get rms of change in the solid dofs; the max. change of the
398  /// solid dofs and the rms norm of the solid dofs themselves.
399  /// Change is computed relative to the reference values stored when
400  /// store_solid_dofs() was last called.
401  void get_solid_change(double& rms_change,
402  double& max_change,
403  double& rms_norm);
404 
405  /// \short Store the current solid values as reference values for
406  /// future convergence check. Also add another entry to pointwise
407  /// Aitken history if required.
408  void store_solid_dofs();
409 
410  /// \short Reset timer
411  void reset_timer()
412  {
413  T_spent_on_actual_solve=0.0;
414  T_ref=clock();
415  Timer_has_been_halted=false;
416  }
417 
418 
419  /// \short (Re-)start timer (e.g. after completing non-essential
420  /// parts of the code such as documentation of the iteration's
421  /// progress)
423  {
424  T_ref=clock();
425  Timer_has_been_halted=false;
426  }
427 
428 
429  /// \short Halt timer (e.g. before performing non-essential
430  /// parts of the code such as documentation of the iteration's
431  /// progress)
432  void halt_timer()
433  {
434  if (!Timer_has_been_halted)
435  {
436  T_spent_on_actual_solve+=double(clock()-T_ref)/CLOCKS_PER_SEC;
437  Timer_has_been_halted=true;
438  }
439  }
440 
441 
442  /// \short Total elapsed time since start of solve
444  {
445  halt_timer();
446  double time=T_spent_on_actual_solve;
447  restart_timer();
448  return time;
449  }
450 
451 
452  protected:
453 
454  /// Rebuild global mesh for monolithic discretisation
455  void rebuild_monolithic_mesh();
456 
457  /// \short Number of Aitken histories available (int because after
458  /// extrapolation it's re-initialised to -1 to force the computation
459  /// of three new genuine iterates).
461 
462  /// Use pointwise Aitken extrapolation?
464 
465  /// \short Start pointwise Aitken extrpolation after specified number
466  /// of Picard iterations
468 
469  /// Solve that is taking place (enumerated flag)
471 
472  /// Convergence tolerance for Picard iteration
474 
475  /// Max. number of Picard iterations
476  unsigned Max_picard;
477 
478  /// Doc maximum global residual during iteration? (default: false)
480 
481  /// Restore pinned status of fluid dofs
482  void restore_fluid_dofs();
483 
484  /// Pin solid dofs
485  void pin_solid_dofs();
486 
487  /// Restore pinned status of solid dofs
488  void restore_solid_dofs();
489 
490 
491  /// Do pointwise Aitken extrapolation for solid
492  void pointwise_aitken_extrapolate();
493 
494  /// \short Vector storing the Data objects associated with the fluid
495  /// problem: Tyically the nodal and internal data of the elements in the
496  /// fluid bulk mesh
498 
499  /// \short Vector of vectors that store the pinned status of
500  /// fluid Data values
502 
503  /// \short Vector storing the Data objects associated with the solid
504  /// problem: Typically the positional data of solid nodes and
505  /// any quantities associated with displacement control, say.
507 
508  /// \short Vector of vectors that store the pinned status of
509  /// solid Data values
511 
512  /// \short Vector storing the previous solid values -- used for
513  /// convergence check
515 
516  /// \short Mesh containing only fluid elements -- the elements in this
517  /// Mesh will be excluded from the assembly process when
518  /// the solid problem is solved
520 
521  /// \short Mesh containing only solid elements -- the elements in this
522  /// mesh will be excluded from the assembly process when
523  /// the fluid problem is solved
525 
526  /// \short Backup for the pointers to the submeshes in the original problem
528 
529  /// Vector of changes in Irons and Tuck under-relaxation
531 
532  /// Irons and Tuck relaxation factor
534 
535  /// \short Vector of Vectors containing up to three previous
536  /// iterates for the solid dofs; used for pointwise Aitken extrapolation
538 
539  /// Have we just done a pointwise Aitken step
541 
542  private:
543 
544  /// Extrapolate solid data and update fluid mesh during unsteady run
545  void extrapolate_solid_data();
546 
547  /// \short Under-relax the most recently computed solid variables, either
548  /// by classical relaxation or by Irons & Tuck
549  void under_relax_solid();
550 
551  /// \short Only include fluid elements in the Problem's mesh. This is
552  /// called before the segregated fluid solve. The fluid elements are
553  /// identified by the user via the fluid_mesh_pt argument
554  /// in the pure virtual function identify_fluid_and_solid_dofs(...).
555  /// If a NULL pointer is returned by this function (i.e. if the user
556  /// hasn't bothered to identify the fluids elements in a submesh, then
557  /// no stripping of non-fluid elements is performed. The result
558  /// of the computation will be correct but
559  /// it won't be very efficient.
560  void use_only_fluid_elements();
561 
562  /// \short Only include solid elements in the Problem's mesh. This is
563  /// called before the segregated solid solve. The solid elements are
564  /// identified by the user via the solid_mesh_pt argument
565  /// in the pure virtual function identify_fluid_and_solid_dofs(...).
566  /// If a NULL pointer is returned by this function (i.e. if the user
567  /// hasn't bothered to identify the solid elements in a submesh, then
568  /// no stripping of non-solid elements is performed. The result
569  /// of the computation will be correct but
570  /// it won't be very efficient.
571  void use_only_solid_elements();
572 
573  /// Pin fluid dofs
574  void pin_fluid_dofs();
575 
576  /// \short Under-relaxation parameter. (1.0: no under-relaxation;
577  /// 0.0: Freeze wall shape)
578  double Omega_relax;
579 
580  /// \short Boolean flag to indicate use of Irons and Tuck's extrapolation
581  /// for solid values
583 
584  /// Convergence criterion (enumerated flag)
586 
587  /// \short Reference time for segregated solve. Can be
588  /// re-initialised whenever total elapsed time has been stored
589  /// (before entering non-essential doc sections of the code)
590  clock_t T_ref;
591 
592  /// \short Total elapsed time since start of solve, can be
593  /// accumulated by adding bits of time spent in relevant parts of
594  /// code (bypassing sections that only document the progress)
596 
597  /// \short boolean flag to indicate if timer has been halted
599 
600  };
601 
602 }
603 
604 
605 
606 #endif
unsigned & niter()
Number of iterations performed.
void assess_convergence_based_on_absolute_solid_change(const double &tol)
Assess convergence based on max. absolute change of solid dofs. The argument specifies the convergenc...
virtual void actions_before_segregated_solve()
This function is called once at the start of each segregated solve.
void restart_timer()
(Re-)start timer (e.g. after completing non-essential parts of the code such as documentation of the ...
Vector< Vector< double > > Pointwise_aitken_solid_value
Vector of Vectors containing up to three previous iterates for the solid dofs; used for pointwise Ait...
Vector< double > Del_irons_and_tuck
Vector of changes in Irons and Tuck under-relaxation.
double Newton_solver_tolerance
The Tolerance below which the Newton Method is deemed to have converged.
Definition: problem.h:593
double Essential_cpu_total
Total essential CPU time for segregated solve (excluding any actions that merely doc the progress of ...
Vector< Mesh * > Orig_sub_mesh_pt
Backup for the pointers to the submeshes in the original problem.
double T_spent_on_actual_solve
Total elapsed time since start of solve, can be accumulated by adding bits of time spent in relevant ...
double CPU_total
Total CPU time for segregated solve.
double Tol_achieved
Final tolerance achieved by the iteration.
virtual void actions_after_segregated_solve()
This function is called once at the end of each segregated solve.
double R_irons_and_tuck
Irons and Tuck relaxation factor.
bool Recheck_convergence_after_pointwise_aitken
Have we just done a pointwise Aitken step.
unsigned Niter
Number of iterations performed.
double & cpu_for_global_residual()
CPU time for computation of global residual vectors Note: This time is contained in Total_CPU and is ...
unsigned Max_picard
Max. number of Picard iterations.
void set_solver_converged()
Set the flag to indicate that the solver has converged.
The Problem class.
Definition: problem.h:152
virtual ~SegregatableFSIProblem()
Empty virtual destructor.
double t_spent_on_actual_solve()
Total elapsed time since start of solve.
void enable_irons_and_tuck_extrapolation()
Use Irons and Tuck extrapolation for solid dofs.
bool has_converged() const
Flag to indicate if the solver has converged.
void halt_timer()
Halt timer (e.g. before performing non-essential parts of the code such as documentation of the itera...
SegregatedSolverError(const bool &ran_out_of_iterations=false)
Default constructor, does nothing.
double Convergence_tolerance
Convergence tolerance for Picard iteration.
double & tol_achieved()
Final tolerance achieved by the iteration.
void enable_pointwise_aitken()
Use pointwise Aitken extrapolation. This interface has no argument and the current value of Pointwise...
void assess_convergence_based_on_max_global_residual()
Assess convergence based on max. residuals of coupled system of eqns. This interface has no argument ...
double & cpu_total()
Total CPU time for segregated solve.
void assess_convergence_based_on_relative_solid_change()
Assess convergence based on max. relative change of solid dofs. This interface has no argument and th...
bool Use_pointwise_aitken
Use pointwise Aitken extrapolation?
bool Timer_has_been_halted
boolean flag to indicate if timer has been halted
int Convergence_criterion
Convergence criterion (enumerated flag)
clock_t T_ref
Reference time for segregated solve. Can be re-initialised whenever total elapsed time has been store...
int Pointwise_aitken_counter
Number of Aitken histories available (int because after extrapolation it&#39;s re-initialised to -1 to fo...
void assess_convergence_based_on_relative_solid_change(const double &tol)
Assess convergence based on max. relative change of solid dofs. The argument specifies the convergenc...
A class to handle errors in the Segregated solver.
bool Use_irons_and_tuck_extrapolation
Boolean flag to indicate use of Irons and Tuck&#39;s extrapolation for solid values.
void enable_under_relaxation(const double &omega=1.0)
Use under-relaxation and (optionally) specify under-relaxation parameter. Default: omega=1...
~PicardConvergenceData()
Empty destructor.
solve_type
Enumerated flags to indicate which solve is taking place.
virtual void actions_before_segregated_convergence_check()
This function is to be filled with actions that take place before the check for convergence of the en...
double Omega_relax
Under-relaxation parameter. (1.0: no under-relaxation; 0.0: Freeze wall shape)
Vector< double > Previous_solid_value
Vector storing the previous solid values – used for convergence check.
double CPU_for_global_residual
CPU time for computation of global residual vectors Note: This time is contained in Total_CPU and is ...
bool Has_converged
Flag to indicate if the solver has converged.
bool Doc_max_global_residual
Doc maximum global residual during iteration? (default: false)
int Solve_type
Solve that is taking place (enumerated flag)
Vector< Data * > Solid_data_pt
Vector storing the Data objects associated with the solid problem: Typically the positional data of s...
convergence_criteria
Enumerated flags for convergence criteria.
Vector< std::vector< bool > > Fluid_value_is_pinned
Vector of vectors that store the pinned status of fluid Data values.
PicardConvergenceData()
Constructor initialises all data.
void assess_convergence_based_on_absolute_solid_change()
Assess convergence based on max. absolute change of solid dofs. This interface has no argument and th...
Object that collates convergence data of Picard iteration.
void disable_pointwise_aitken()
Disable the use of pointwise Aitken extrapolation.
unsigned Pointwise_aitken_start
Start pointwise Aitken extrpolation after specified number of Picard iterations.
Vector< std::vector< bool > > Solid_value_is_pinned
Vector of vectors that store the pinned status of solid Data values.
void set_solver_not_converged()
Set the flag to indicate that the solver has not converged.
SegregatableFSIProblem()
Constructor. Set default values for solver parameters:
Vector< Data * > Fluid_data_pt
Vector storing the Data objects associated with the fluid problem: Tyically the nodal and internal da...
Mesh * Fluid_mesh_pt
Mesh containing only fluid elements – the elements in this Mesh will be excluded from the assembly p...
double & essential_cpu_total()
Total essential CPU time for segregated solve (excluding any actions that merely doc the progress of ...
void assess_convergence_based_on_max_global_residual(const double &tol)
Assess convergence based on max. residual of coupled system of eqns. The argument specifies the conve...
Mesh * Solid_mesh_pt
Mesh containing only solid elements – the elements in this mesh will be excluded from the assembly p...
void disable_irons_and_tuck_extrapolation()
Do not use Irons and Tuck extrapolation for solid dofs.
A general mesh class.
Definition: mesh.h:74
void enable_pointwise_aitken(const unsigned &pointwise_aitken_start)
Use pointwise Aitken extrapolation. The argument is used to specify the Picard iteration after which ...