preconditioner_array.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// Include guards
27#ifndef OOMPH_PRECONDITION_ARRAY_HEADER
28#define OOMPH_PRECONDITION_ARRAY_HEADER
29
30// Config header generated by autoconfig
31#ifdef HAVE_CONFIG_H
32#include <oomph-lib-config.h>
33#endif
34
35// oomph-lib includes
36#include "Vector.h"
37#include "double_vector.h"
38#include "matrices.h"
39#include "preconditioner.h"
40
41
42// Preconditioner array is only really possible and useful if we have MPI
43// (and it uses a lot of MPI functions in the .cc file so changing that
44// would be hard). So if we don't have MPI just define a dummy
45// implementation that throws an error if you try to use it.
46#ifndef OOMPH_HAS_MPI
47namespace oomph
48{
50 {
51 public:
54 const OomphCommunicator* comm_pt)
55 {
56 throw OomphLibError("PreconditionerArray requires MPI",
57 OOMPH_CURRENT_FUNCTION,
58 OOMPH_EXCEPTION_LOCATION);
59 }
60
63 {
64 throw OomphLibError("PreconditionerArray requires MPI",
65 OOMPH_CURRENT_FUNCTION,
66 OOMPH_EXCEPTION_LOCATION);
67 }
68 };
69} // namespace oomph
70
71// Otherwise (if we have MPI do the real implementation)
72#else
73
74#include "mpi.h"
75
76
77namespace oomph
78{
79 //=============================================================================
80 /// PreconditionerArray -
81 /// NOTE - first implementation, a number of assumptions / simplifications
82 /// were made:
83 /// 1. Only works with CRDoubleMatrices
84 /// 2. The number of processors must be greater than the number of
85 /// preconditioners
86 /// 3. Currently only very crude load balancing - each preconditioner will
87 /// be setup and applied with the same number of processors (or as near to
88 /// as possible to the same number of processors)
89 /// 4. This class will, at the appropriate time, delete the all the
90 /// Preconditioners passed setup_preconditioners(...)
91 /// 5. (but) Deletion of matrices passed to setup_preconditioners(...) is NOT
92 /// performed by this class
93 /// 6. It is assumed that preconditioners do not require access to matrix
94 /// once setup(...) is called
95 /// 7. The matrix on the subset of processors will be the same type
96 /// (distributed or global) as the matrix passed to
97 /// setup_preconditioners(...)
98 /// 8. If the matrix is a distributed matrix - it will be assembled with
99 /// a uniform distribution on the subset of processors.
100 //=============================================================================
101 class PreconditionerArray
102 {
103 public:
104 /// Constructor (empty)
109 {
110 Method = 0;
111 Nprec = 0;
112 };
113
114 /// Broken copy constructor
116
117 /// Broken assignment operator
118 void operator=(const PreconditionerArray&) = delete;
119
120 /// Destructor (empty)
122 {
123 this->clean_up_memory();
124 }
125
126 /// Setup the preconditioners. Sets up each preconditioner in the
127 /// array for the corresponding matrix in the vector matrix_pt.
128 /// The number of preconditioners in the array is taken to be the length of
129 /// prec_pt
130 /// The preconditioners that are not used on this processor are deleted.
133 const OomphCommunicator* comm_pt);
134
135 /// Applies each preconditioner to the corresponding vector in
136 /// r and z
139
140 /// Clean up memory.
142 {
143 // delete the preconditioner pt
144 delete Preconditioner_pt;
146
147 // delete the communicators
152
153 // clear vectors
154 First_row_for_proc.clear();
155 Nrow_local_for_proc.clear();
156 First_row_from_proc.clear();
157 Nrow_local_from_proc.clear();
158 First_proc_for_prec.clear();
159 Nproc_for_prec.clear();
160
161 // zero
162 Color = 0;
163
164#ifdef PARANOID
165 // delete PARANOID check distribution pts
166 for (unsigned i = 0; i < Nprec; i++)
167 {
168 delete Distribution_pt[i];
169 }
170 Distribution_pt.resize(0);
171#endif
172 }
173
174 // access function to Method
175 unsigned& method()
176 {
177 return Method;
178 }
179
180 private:
181 /// helper method for computing the MPI_Isend and MPI_Irecv tags
182 int compute_tag(const int& nproc,
183 const int& source,
184 const int& dest,
185 const int& type)
186 {
187 return source + (nproc * dest) + (nproc * nproc * type);
188 }
189
190 /// the number of preconditioner in the array
191 unsigned Nprec;
192
193 /// The pointer to the local preconditioner on this processor
195
196 /// The first_row component of the distribution of the processors
197 /// over the preconditioners
199
200 /// The nrow_local component of the distribution of the processors
201 /// over the preconditioners
203
204 /// Storage (indexed [i][j]) for the first row that will be sent
205 /// from this processor to processor j for preconditioner i
207
208 /// Storage (indexed [i][j]) for the nrow_local that will be sent
209 /// from this processor to processor j for preconditioner i
211
212 /// Storage (indexed [i][j]) for the first row that will be received
213 /// by this processor from processor j for preconditioner i
215
216 /// Storage (indexed [i][j]) for the nrow_local that will be
217 /// received by this processor from processor j for preconditioner i
219
220 /// the Color of this processor (or the preconditioner number)
221 unsigned Color;
222
223 /// pointer to the global communicator for this preconditioner array
225
226 /// Vector of communicators for the preconditioners
228
229#ifdef PARANOID
230 // Vector of distribution of each preconditioner - for PARANOID checks only
232#endif
233
234 /// the communication method in the setup_preconditioners(...) method
235 /// 1. Non-blocking Send with Blocking Recv
236 /// 2. MPI_Datatypes with Non-blocking sends and receives
237 unsigned Method;
238
239 }; // PreconditionerArray
240} // namespace oomph
241
242// End of "if we have MPI"
243#endif
244
245// End of include guard
246#endif
cstr elem_len * i
Definition: cfortran.h:603
An oomph-lib wrapper to the MPI_Comm communicator object. Just contains an MPI_Comm object (which is ...
Definition: communicator.h:54
An OomphLibError object which should be thrown when an run-time error is encountered....
PreconditionerArray - NOTE - first implementation, a number of assumptions / simplifications were mad...
void solve_preconditioners(const Vector< DoubleVector > &r, Vector< DoubleVector > &z)
Applies each preconditioner to the corresponding vector in r and z.
unsigned Method
the communication method in the setup_preconditioners(...) method
Vector< Vector< unsigned > > First_row_for_proc
Storage (indexed [i][j]) for the first row that will be sent from this processor to processor j for p...
Vector< unsigned > First_proc_for_prec
The first_row component of the distribution of the processors over the preconditioners.
unsigned Color
the Color of this processor (or the preconditioner number)
Vector< Vector< unsigned > > Nrow_local_for_proc
Storage (indexed [i][j]) for the nrow_local that will be sent from this processor to processor j for ...
Vector< Vector< unsigned > > First_row_from_proc
Storage (indexed [i][j]) for the first row that will be received by this processor from processor j f...
int compute_tag(const int &nproc, const int &source, const int &dest, const int &type)
helper method for computing the MPI_Isend and MPI_Irecv tags
OomphCommunicator * Global_communicator_pt
pointer to the global communicator for this preconditioner array
void setup_preconditioners(Vector< CRDoubleMatrix * > matrix_pt, Vector< Preconditioner * > prec_pt, const OomphCommunicator *comm_pt)
Setup the preconditioners. Sets up each preconditioner in the array for the corresponding matrix in t...
PreconditionerArray(const PreconditionerArray &)=delete
Broken copy constructor.
OomphCommunicator * Local_communicator_pt
Vector of communicators for the preconditioners.
Preconditioner * Preconditioner_pt
The pointer to the local preconditioner on this processor.
void clean_up_memory()
Clean up memory.
unsigned Nprec
the number of preconditioner in the array
~PreconditionerArray()
Destructor (empty)
Vector< Vector< unsigned > > Nrow_local_from_proc
Storage (indexed [i][j]) for the nrow_local that will be received by this processor from processor j ...
Vector< LinearAlgebraDistribution * > Distribution_pt
Vector< unsigned > Nproc_for_prec
The nrow_local component of the distribution of the processors over the preconditioners.
void operator=(const PreconditionerArray &)=delete
Broken assignment operator.
PreconditionerArray()
Constructor (empty)
Preconditioner base class. Gives an interface to call all other preconditioners through and stores th...
A slight extension to the standard template vector class so that we can include "graceful" array rang...
Definition: Vector.h:58
//////////////////////////////////////////////////////////////////// ////////////////////////////////...