mumps_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// 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 // This is the header file for the C++ wrapper functions for the
27 // mumps solver
28 
29 // Include guards to prevent multiple inclusions of the header
30 #ifndef NEW_MUMPS_SOLVER_HEADER
31 #define NEW_MUMPS_SOLVER_HEADER
32 
33 
34 // Config header generated by autoconfig
35 #ifdef HAVE_CONFIG_H
36 #include <oomph-lib-config.h>
37 #endif
38 
39 #ifdef OOMPH_HAS_MPI
40 #include "mpi.h"
41 #endif
42 
43 #include "linear_solver.h"
44 #include "preconditioner.h"
45 
46 #include <mumps_c_types.h>
47 #include <dmumps_c.h>
48 
49 // offset macros for the 1-indexed (FORTRAN) arrays in the
50 // MUMPS interface; makes the control integers, info etc. easier to
51 // read w.r.t. the MUMPS documentation
52 #define ICNTL(i) icntl[(i)-1]
53 #define INFOG(i) infog[(i)-1]
54 #define INFO(i) info[(i)-1]
55 
56 namespace oomph
57 {
58  //====================================================================
60  //====================================================================
61  class MumpsSolver : public LinearSolver
62  {
63  public:
67 
69  MumpsSolver();
70 
72  MumpsSolver(const MumpsSolver& dummy) = delete;
73 
75  void operator=(const MumpsSolver&) = delete;
76 
78  ~MumpsSolver();
79 
82  {
85  }
86 
90  {
92  }
93 
96  {
98  }
99 
103  {
105  }
106 
109  {
111  }
112 
116  void solve(Problem* const& problem_pt, DoubleVector& result);
117 
123  void solve(DoubleMatrixBase* const& matrix_pt,
124  const DoubleVector& rhs,
125  DoubleVector& result);
126 
130  void resolve(const DoubleVector& rhs, DoubleVector& result);
131 
134  {
135  Doc_stats = true;
136  }
137 
140  {
141  Doc_stats = false;
142  }
143 
147  {
148  return Jacobian_setup_time;
149  }
150 
154  {
155  return Solution_time;
156  }
157 
162  {
163  Suppress_solve = true;
164  }
165 
169  {
170  Suppress_solve = false;
171  }
172 
180  {
181  Delete_matrix_data = true;
182  }
183 
191  {
192  Delete_matrix_data = false;
193  }
194 
198  void factorise(DoubleMatrixBase* const& matrix_pt);
199 
202  void backsub(const DoubleVector& rhs, DoubleVector& result);
203 
205  void clean_up_memory();
206 
210 
213  {
215  }
216 
219  {
221  }
222 
225  {
227  }
228 
229  // tell MUMPS to use the PORD package for the ordering
231  {
233  }
234 
235  // tell MUMPS to use the METIS package for the ordering
237  {
239  }
240 
241  // tell MUMPS to use the SCOTCH package for the ordering
243  {
245  }
246 
247  private:
249  void initialise_mumps();
250 
252  void shutdown_mumps();
253 
256 
259 
262 
264  bool Doc_stats;
265 
269 
272 
275 
276  // Work space scaling factor
278 
286 
289 
290  // Vector for column numbers
292 
293  // Vector for entries
295 
297  DMUMPS_STRUC_C* Mumps_struc_pt;
298 
303  {
306  Symmetric = 2
307  };
308 
312  {
315  Metis_ordering = 5
316  };
317 
321 
326  };
327 
328 
332 
333 
334  //====================================================================
336  //====================================================================
338  {
339  public:
342 
345 
348 
350  void operator=(const NewMumpsPreconditioner&) = delete;
351 
357  void setup()
358  {
359  oomph_info << "Setting up Mumps (exact) preconditioner" << std::endl;
360 
361  DistributableLinearAlgebraObject* dist_matrix_pt =
363  if (dist_matrix_pt != 0)
364  {
365  LinearAlgebraDistribution dist(dist_matrix_pt->distribution_pt());
366  this->build_distribution(dist);
368  }
369  else
370  {
371  std::ostringstream error_message_stream;
372  error_message_stream
373  << "NewMumpsPreconditioner can only be applied to matrices derived \n"
374  << "DistributableLinearAlgebraObject.\n";
375  throw OomphLibError(error_message_stream.str(),
378  }
379  }
380 
384  {
385  Solver.resolve(r, z);
386  }
387 
388 
392  {
394  }
395 
396 
399  {
401  }
402 
405  {
407  }
408 
409  private:
412  };
413 
414 } // namespace oomph
415 
416 #endif
Definition: linear_algebra_distribution.h:435
LinearAlgebraDistribution * distribution_pt() const
access to the LinearAlgebraDistribution
Definition: linear_algebra_distribution.h:457
void build_distribution(const LinearAlgebraDistribution *const dist_pt)
Definition: linear_algebra_distribution.h:507
Definition: matrices.h:261
Definition: double_vector.h:58
Definition: linear_algebra_distribution.h:64
Definition: linear_solver.h:68
void disable_doc_time()
Disable documentation of solve times.
Definition: linear_solver.h:116
void enable_doc_time()
Enable documentation of solve times.
Definition: linear_solver.h:110
virtual void disable_resolve()
Definition: linear_solver.h:144
Wrapper to Mumps solver.
Definition: mumps_solver.h:62
double Jacobian_setup_time
Jacobian setup time.
Definition: mumps_solver.h:255
DMUMPS_STRUC_C * Mumps_struc_pt
Pointer to MUMPS struct that contains the solver data.
Definition: mumps_solver.h:297
void enable_suppress_warning_about_MPI_COMM_WORLD()
Definition: mumps_solver.h:89
~MumpsSolver()
Destructor: Cleanup.
Definition: mumps_solver.cc:168
void enable_doc_stats()
Enable documentation of statistics.
Definition: mumps_solver.h:133
void use_metis_ordering()
Definition: mumps_solver.h:236
unsigned Jacobian_ordering_flag
Definition: mumps_solver.h:325
void disable_suppress_solve()
Definition: mumps_solver.h:168
void use_scotch_ordering()
Definition: mumps_solver.h:242
bool Mumps_is_initialised
Has mumps been initialised?
Definition: mumps_solver.h:274
bool Suppress_warning_about_MPI_COMM_WORLD
Definition: mumps_solver.h:268
void disable_delete_matrix_data()
Definition: mumps_solver.h:190
virtual double linear_solver_solution_time()
Definition: mumps_solver.h:153
void use_pord_ordering()
Definition: mumps_solver.h:230
Vector< int > Jcn_loc
Definition: mumps_solver.h:291
Vector< double > A_loc
Definition: mumps_solver.h:294
void shutdown_mumps()
Shutdown mumps.
Definition: mumps_solver.cc:141
MumpsJacobianOrderingFlags
Definition: mumps_solver.h:312
@ Pord_ordering
Definition: mumps_solver.h:314
@ Metis_ordering
Definition: mumps_solver.h:315
@ Scotch_ordering
Definition: mumps_solver.h:313
double Solution_time
Solution time.
Definition: mumps_solver.h:258
void declare_jacobian_is_symmetric()
Tell MUMPS that the Jacobian matrix is general symmetric.
Definition: mumps_solver.h:218
unsigned Workspace_scaling_factor
Definition: mumps_solver.h:277
void resolve(const DoubleVector &rhs, DoubleVector &result)
Definition: mumps_solver.cc:1005
bool Suppress_solve
Suppress solve?
Definition: mumps_solver.h:261
MumpsSolver(const MumpsSolver &dummy)=delete
Broken copy constructor.
bool Delete_matrix_data
Definition: mumps_solver.h:285
void operator=(const MumpsSolver &)=delete
Broken assignment operator.
bool Doc_stats
Set to true for MumpsSolver to output statistics (false by default).
Definition: mumps_solver.h:264
void disable_doc_stats()
Disable documentation of statistics.
Definition: mumps_solver.h:139
void backsub(const DoubleVector &rhs, DoubleVector &result)
Definition: mumps_solver.cc:526
Vector< int > Irn_loc
Vector for row numbers.
Definition: mumps_solver.h:288
void enable_suppress_mumps_info_during_solve()
Definition: mumps_solver.h:102
static bool Suppress_incorrect_rhs_distribution_warning_in_resolve
Definition: mumps_solver.h:66
void enable_suppress_solve()
Definition: mumps_solver.h:161
unsigned Jacobian_symmetry_flag
Definition: mumps_solver.h:320
void disable_resolve()
Overload disable resolve so that it cleans up memory too.
Definition: mumps_solver.h:81
MumpsSolver()
Constructor: Call setup.
Definition: mumps_solver.cc:69
bool Suppress_mumps_info_during_solve
Boolean to suppress info being printed to screen during MUMPS solve.
Definition: mumps_solver.h:271
static int Default_workspace_scaling_factor
Definition: mumps_solver.h:209
void disable_suppress_mumps_info_during_solve()
Don't suppress info being printed to screen during MUMPS solve.
Definition: mumps_solver.h:108
void clean_up_memory()
Clean up the memory allocated by the mumps solver.
Definition: mumps_solver.cc:710
void disable_suppress_warning_about_MPI_COMM_WORLD()
Don't suppress warning about communicator not equal to MPI_COMM_WORLD.
Definition: mumps_solver.h:95
void solve(Problem *const &problem_pt, DoubleVector &result)
Definition: mumps_solver.cc:894
void initialise_mumps()
Initialise instance of mumps data structure.
Definition: mumps_solver.cc:86
double jacobian_setup_time()
Definition: mumps_solver.h:146
void factorise(DoubleMatrixBase *const &matrix_pt)
Definition: mumps_solver.cc:180
void declare_jacobian_is_symmetric_positive_definite()
Tell MUMPS that the Jacobian matrix is symmetric positive-definite.
Definition: mumps_solver.h:224
MumpsJacobianSymmetryFlags
Definition: mumps_solver.h:303
@ Unsymmetric
Definition: mumps_solver.h:304
@ Symmetric_positive_definite
Definition: mumps_solver.h:305
@ Symmetric
Definition: mumps_solver.h:306
void declare_jacobian_is_unsymmetric()
Tell MUMPS that the Jacobian matrix is unsymmetric.
Definition: mumps_solver.h:212
void enable_delete_matrix_data()
Definition: mumps_solver.h:179
An interface to allow Mumps to be used as an (exact) Preconditioner.
Definition: mumps_solver.h:338
void operator=(const NewMumpsPreconditioner &)=delete
Broken assignment operator.
void enable_doc_time()
Enable documentation of timings.
Definition: mumps_solver.h:398
void setup()
Definition: mumps_solver.h:357
void clean_up_memory()
Definition: mumps_solver.h:391
void preconditioner_solve(const DoubleVector &r, DoubleVector &z)
Definition: mumps_solver.h:383
void disable_doc_time()
Disable the documentation of timings.
Definition: mumps_solver.h:404
NewMumpsPreconditioner(const NewMumpsPreconditioner &)=delete
Broken copy constructor.
MumpsSolver Solver
the Mumps solver emplyed by this preconditioner
Definition: mumps_solver.h:411
NewMumpsPreconditioner()
Constructor.
Definition: mumps_solver.h:341
~NewMumpsPreconditioner()
Destructor.
Definition: mumps_solver.h:344
Definition: oomph_definitions.h:222
Definition: preconditioner.h:54
virtual DoubleMatrixBase * matrix_pt() const
Get function for matrix pointer.
Definition: preconditioner.h:150
Definition: problem.h:151
r
Definition: UniformPSDSelfTest.py:20
DRAIG: Change all instances of (SPATIAL_DIM) to (DIM-1).
Definition: AnisotropicHookean.h:10
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86