lagrange_enforced_flow_preconditioner.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// Copyright (C) 2006-2022 Matthias Heil and Andrew Hazel
7 // LIC//
8 // LIC// This library is free software; you can redistribute it and/or
9 // LIC// modify it under the terms of the GNU Lesser General Public
10 // LIC// License as published by the Free Software Foundation; either
11 // LIC// version 2.1 of the License, or (at your option) any later version.
12 // LIC//
13 // LIC// This library is distributed in the hope that it will be useful,
14 // LIC// but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // LIC// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // LIC// Lesser General Public License for more details.
17 // LIC//
18 // LIC// You should have received a copy of the GNU Lesser General Public
19 // LIC// License along with this library; if not, write to the Free Software
20 // LIC// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 // LIC// 02110-1301 USA.
22 // LIC//
23 // LIC// The authors may be contacted at oomph-lib@maths.man.ac.uk.
24 // LIC//
25 // LIC//====================================================================
26 #ifndef OOMPH_LAGRANGE_ENFORCED_FLOW_PRECONDITIONERS_HEADER
27 #define OOMPH_LAGRANGE_ENFORCED_FLOW_PRECONDITIONERS_HEADER
28 
29 
30 // Config header generated by autoconfig
31 #ifdef HAVE_CONFIG_H
32 #include <oomph-lib-config.h>
33 #endif
34 
35 // oomphlib headers
36 #include "../generic/matrices.h"
37 #include "../generic/assembly_handler.h"
38 #include "../generic/problem.h"
39 #include "../generic/block_preconditioner.h"
40 #include "../generic/preconditioner.h"
41 #include "../generic/SuperLU_preconditioner.h"
42 #include "../generic/matrix_vector_product.h"
43 #include "../generic/general_purpose_preconditioners.h"
44 #include "../generic/general_purpose_block_preconditioners.h"
45 #ifdef OOMPH_HAS_HYPRE
46 #include "../generic/hypre_solver.h"
47 #endif
48 #ifdef OOMPH_HAS_TRILINOS
49 #include "../generic/trilinos_solver.h"
50 #endif
51 
52 namespace oomph
53 {
54  //==========================================================================
56  //==========================================================================
57  namespace Lagrange_Enforced_Flow_Preconditioner_Subsidiary_Operator_Helper
58  {
62 
67 
72 
76 
80 
84 
88 
89  } // namespace
90  // Lagrange_Enforced_Flow_Preconditioner_Subsidiary_Operator_Helper
91 
92 
93  //==========================================================================
165  //==========================================================================
167  : public BlockPreconditioner<CRDoubleMatrix>
168  {
169  public:
175  typedef Preconditioner* (*SubsidiaryPreconditionerFctPt)();
176 
179  {
180  // The null pointer.
182 
183  // By default, the linear systems associated with the diagonal blocks
184  // are solved "exactly" using SuperLU (in its incarnation as an exact
185  // preconditioner. This is not a block preconditioner.
187 
188  // Flag to indicate to use SuperLU or not.
190 
191  // Empty vector of meshes and set the number of meshes to zero.
192  My_mesh_pt.resize(0, 0);
193  My_nmesh = 0;
194 
195  // The number of DOF types within the meshes.
196  My_ndof_types_in_mesh.resize(0, 0);
197 
198  // Initialise other variables.
200  Scaling_sigma = 0.0;
202  N_fluid_doftypes = 0;
205  } // constructor
206 
209  {
210  this->clean_up_memory();
211  }
212 
215  const LagrangeEnforcedFlowPreconditioner&) = delete;
216 
219 
221  void setup();
222 
226 
229  void set_meshes(const Vector<Mesh*>& mesh_pt);
230 
237  {
239  }
240 
246  void set_scaling_sigma(const double& scaling_sigma)
247  {
248  // Check if scaling sigma is zero or positive.
249 #ifdef PARANOID
250  if (scaling_sigma == 0.0)
251  {
252  std::ostringstream warning_stream;
253  warning_stream << "WARNING: \n"
254  << "Setting scaling_sigma = 0.0 may cause values.\n";
255  OomphLibWarning(warning_stream.str(),
258  }
259  if (scaling_sigma > 0.0)
260  {
261  std::ostringstream warning_stream;
262  warning_stream << "WARNING: " << std::endl
263  << "The scaling (scaling_sigma) is positive: "
264  << Scaling_sigma << "\n"
265  << "Performance may be degraded.\n";
266  OomphLibWarning(warning_stream.str(),
269  }
270 #endif
271 
274  }
275 
277  double scaling_sigma() const
278  {
279  return Scaling_sigma;
280  }
281 
285  Preconditioner* new_ns_preconditioner_pt = 0);
286 
290  {
292  {
296  }
297  }
298 
300  void clean_up_memory();
301 
302  private:
307 
310 
314 
317 
320 
324 
327 
332 
336 
339  unsigned My_nmesh;
340 
343 
346 
349 
350  }; // end of LagrangeEnforcedFlowPreconditioner class
351 
352 } // namespace oomph
353 #endif
Definition: block_preconditioner.h:422
const Mesh * mesh_pt(const unsigned &i) const
Definition: block_preconditioner.h:1782
Definition: matrices.h:888
Definition: double_vector.h:58
Definition: lagrange_enforced_flow_preconditioner.h:168
Preconditioner * Navier_stokes_preconditioner_pt
Pointer to the 'preconditioner' for the Navier-Stokes block.
Definition: lagrange_enforced_flow_preconditioner.h:319
unsigned N_lagrange_doftypes
The number of Lagrange multiplier DOF types.
Definition: lagrange_enforced_flow_preconditioner.h:342
void set_scaling_sigma(const double &scaling_sigma)
Definition: lagrange_enforced_flow_preconditioner.h:246
unsigned N_fluid_doftypes
The number of fluid DOF types (including pressure).
Definition: lagrange_enforced_flow_preconditioner.h:345
void set_navier_stokes_preconditioner(Preconditioner *new_ns_preconditioner_pt=0)
Definition: lagrange_enforced_flow_preconditioner.cc:1214
LagrangeEnforcedFlowPreconditioner(const LagrangeEnforcedFlowPreconditioner &)=delete
Broken copy constructor.
bool Preconditioner_has_been_setup
Definition: lagrange_enforced_flow_preconditioner.h:306
bool Use_norm_f_for_scaling_sigma
Definition: lagrange_enforced_flow_preconditioner.h:313
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Definition: lagrange_enforced_flow_preconditioner.cc:310
double scaling_sigma() const
Read (const) function to get the scaling sigma.
Definition: lagrange_enforced_flow_preconditioner.h:277
Vector< unsigned > My_ndof_types_in_mesh
Definition: lagrange_enforced_flow_preconditioner.h:335
LagrangeEnforcedFlowPreconditioner()
Constructor - initialise variables.
Definition: lagrange_enforced_flow_preconditioner.h:178
Vector< Vector< double > > Inv_w_diag_values
Inverse W values.
Definition: lagrange_enforced_flow_preconditioner.h:316
void set_meshes(const Vector< Mesh * > &mesh_pt)
Definition: lagrange_enforced_flow_preconditioner.cc:419
unsigned My_nmesh
Definition: lagrange_enforced_flow_preconditioner.h:339
virtual ~LagrangeEnforcedFlowPreconditioner()
Destructor.
Definition: lagrange_enforced_flow_preconditioner.h:208
void use_norm_f_for_scaling_sigma()
Definition: lagrange_enforced_flow_preconditioner.h:236
void operator=(const LagrangeEnforcedFlowPreconditioner &)=delete
Broken assignment operator.
double Scaling_sigma
Scaling for the augmentation: Scaling_sigma*(LL^T)
Definition: lagrange_enforced_flow_preconditioner.h:309
void setup()
Setup method for the LagrangeEnforcedFlowPreconditioner.
Definition: lagrange_enforced_flow_preconditioner.cc:507
bool Using_superlu_ns_preconditioner
Flag to indicate whether the default NS preconditioner is used.
Definition: lagrange_enforced_flow_preconditioner.h:326
bool Navier_stokes_preconditioner_is_block_preconditioner
Definition: lagrange_enforced_flow_preconditioner.h:323
void clean_up_memory()
Clears the memory.
Definition: lagrange_enforced_flow_preconditioner.cc:1250
void set_superlu_for_navier_stokes_preconditioner()
Definition: lagrange_enforced_flow_preconditioner.h:289
Vector< Mesh * > My_mesh_pt
Definition: lagrange_enforced_flow_preconditioner.h:331
unsigned N_velocity_doftypes
The number of velocity DOF types.
Definition: lagrange_enforced_flow_preconditioner.h:348
Definition: oomph_definitions.h:267
Definition: preconditioner.h:54
An interface to allow SuperLU to be used as an (exact) Preconditioner.
Definition: SuperLU_preconditioner.h:40
unsigned Preconditioner
----------------------—Domain Properties------------------------—
Definition: space_time_oscillating_cylinder.cc:725
r
Definition: UniformPSDSelfTest.py:20
Preconditioner * boomer_amg_for_2D_momentum_stressdiv_visc()
Definition: lagrange_enforced_flow_preconditioner.cc:107
Preconditioner * boomer_amg_for_3D_momentum()
Definition: lagrange_enforced_flow_preconditioner.cc:146
Preconditioner * get_w_cg_preconditioner()
Definition: lagrange_enforced_flow_preconditioner.cc:37
Preconditioner * boomer_amg_for_3D_poisson_problem()
Definition: lagrange_enforced_flow_preconditioner.cc:264
Preconditioner * boomer_amg_for_2D_poisson_problem()
Definition: lagrange_enforced_flow_preconditioner.cc:225
Preconditioner * boomer_amg_for_2D_momentum_simple_visc()
Definition: lagrange_enforced_flow_preconditioner.cc:67
Preconditioner * boomer_amg2v22_for_3D_momentum()
Definition: lagrange_enforced_flow_preconditioner.cc:185
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86