DFT-EFE
 
Loading...
Searching...
No Matches
PoissonSolverDealiiMatrixFreeFE.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (c) 2021. *
3 * The Regents of the University of Michigan and DFT-EFE developers. *
4 * *
5 * This file is part of the DFT-EFE code. *
6 * *
7 * DFT-EFE is free software: you can redistribute it and/or modify *
8 * it under the terms of the Lesser GNU General Public License as *
9 * published by the Free Software Foundation, either version 3 of *
10 * the License, or (at your option) any later version. *
11 * *
12 * DFT-EFE is distributed in the hope that it will be useful, but *
13 * WITHOUT ANY WARRANTY; without even the implied warranty *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
15 * See the Lesser GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU Lesser General Public *
18 * License at the top level of DFT-EFE distribution. If not, see *
19 * <https://www.gnu.org/licenses/>. *
20 ******************************************************************************/
21
22/*
23 * @author Avirup Sircar
24 */
25
26#ifndef dftefePoissonSolverDealiiMatrixFreeFE_h
27#define dftefePoissonSolverDealiiMatrixFreeFE_h
28
29#include <utils/TypeConfig.h>
43#include <vector>
44#include <memory>
45#include <utils/Profiler.h>
46#ifdef DFTEFE_WITH_DEVICE
47# include "MatrixFreeWrapper.h"
49#endif
50
51namespace dftefe
52{
53 namespace electrostatics
54 {
78 template <typename ValueTypeOperator,
79 typename ValueTypeOperand,
80 utils::MemorySpace memorySpace,
81 size_type dim>
83 {
84 public:
92 template <typename T>
95
96 using ValueType =
98 ValueTypeOperand>;
99
100 public:
105 std::shared_ptr<const basis::FEBasisManager<ValueTypeOperand,
106 ValueTypeOperator,
108 dim>> feBasisManagerField,
109 std::shared_ptr<
111 feBasisDataStorageStiffnessMatrix,
112 const std::map<
113 std::string,
114 std::shared_ptr<const basis::FEBasisDataStorage<ValueTypeOperator,
116 &feBasisDataStorageRhs,
117 const std::map<
118 std::string,
121 & inpRhs,
124 linAlgOpContext);
125
130 std::shared_ptr<const basis::FEBasisManager<ValueTypeOperand,
131 ValueTypeOperator,
133 dim>> feBasisManagerField,
134 std::shared_ptr<
136 feBasisDataStorageStiffnessMatrix,
137 std::shared_ptr<
139 feBasisDataStorageRhs,
141 & inpRhs,
144 linAlgOpContext);
145
146 void
147 reinit(
148 std::shared_ptr<const basis::FEBasisManager<ValueTypeOperand,
149 ValueTypeOperator,
151 dim>> feBasisManagerField,
152 const std::map<
153 std::string,
156 &inpRhs);
157
158 void
160 std::shared_ptr<const basis::FEBasisManager<ValueTypeOperand,
161 ValueTypeOperator,
163 dim>> feBasisManagerField,
165 &inpRhs);
166
168
169 void
170 solve(const double absTolerance, const size_type maxNumberIterations);
171
172 void
175
176 const utils::mpi::MPIComm &
177 getMPIComm() const;
178
179 private:
181 getRhs() const;
182
184 getInitialGuess() const;
185
186 void
188
189 void
191 const std::map<
192 std::string,
195 ValueTypeOperand>,
196 memorySpaceHost> &> &inpRhs);
197
198 void
200
201 void
203 const distributedCPUVec<double> &src) const;
204
205 void
207
208 void
209 AX(const dealii::MatrixFree<dim, double> &matrixFreeData,
211 const distributedCPUVec<double> & src,
212 const std::pair<size_type, size_type> &cell_range) const;
213
214 void
215 CGsolve(const double absTolerance,
216 const size_type maxNumberIterations,
217 bool distributeFlag);
218
220 &
221 getRhsDevice() const;
222
224 &
225 getInitialGuessDevice() const;
226
227 // Device-specific methods: only called when memorySpace == DEVICE.
228 // Requires DFTEFE_WITH_DEVICE for the GPU matrix-free AX kernel.
229 void
230 CGsolveDevice(const double absTolerance,
231 const size_type maxNumberIterations,
232 bool distributeFlag);
233
234 void
235 computeAXDevice(linearAlgebra::Vector<ValueTypeOperator,
237 linearAlgebra::Vector<ValueTypeOperator,
239
241 std::shared_ptr<const basis::FEBasisManager<ValueTypeOperand,
242 ValueTypeOperator,
244 dim>>
248
249
250 std::shared_ptr<basis::FEBasisManager<ValueTypeOperand,
251 ValueTypeOperator,
253 dim>>
255
257 std::shared_ptr<dealii::MatrixFree<dim, ValueTypeOperator>>
259 std::shared_ptr<const dealii::DoFHandler<dim>> d_dealiiDofHandler;
260 const dealii::AffineConstraints<ValueTypeOperand>
262 const dealii::AffineConstraints<ValueTypeOperand> *d_constraintsInfo;
264 std::map<std::string, size_type> d_num1DQuadPointsRhs;
267
268 std::map<
269 std::string,
270 std::shared_ptr<
273
274 std::vector<distributedCPUVec<ValueType>> d_nonTensorSructuredQuadeRhs;
275
277 std::map<dealii::CellId, size_type> d_cellIdToCellIndexMap;
278
279 std::vector<dealii::Quadrature<dim>> d_dealiiQuadratureRuleVec;
280 dealii::MappingQ1<dim, dim> d_mappingDealii;
281 // dealii::IndexSet d_ghostIndexSet, d_locallyOwnedIndexSet;
283
286 ValueTypeOperand>,
289
290 // Stored LinAlgOpContext needed for device vector creation and BLAS.
291 std::shared_ptr<linearAlgebra::LinAlgOpContext<memorySpace>>
293
294 // Device-resident copies of the solution, RHS, and Jacobi diagonal.
295 // Constructed lazily in the constructor body when memorySpace == DEVICE.
296 // Use unique_ptr because MPIPatternP2P (needed for construction) is not
297 // available at member-initializer-list time.
298 std::unique_ptr<linearAlgebra::Vector<ValueTypeOperator, memorySpace>>
300 std::unique_ptr<linearAlgebra::Vector<ValueTypeOperator, memorySpace>>
302 std::unique_ptr<linearAlgebra::Vector<ValueTypeOperator, memorySpace>>
307
308#ifdef DFTEFE_WITH_DEVICE
309 size_type d_xLocalDof;
310 double * d_devSumPtr;
312 d_devSum;
313
314 std::shared_ptr<
316 d_mpiPatternP2PDevice;
317 // Device-side matrix-free Laplace operator (from dftfe).
318 std::unique_ptr<
319 dftefe::MatrixFreeWrapperClass<ValueTypeOperator,
322 false>>
323 d_matrixFreeWrapperDevice;
324
329 double
330 applyPreconditionAndComputeDotProduct(const double *jacobi);
331
336 double
337 applyPreconditionComputeDotProductAndSadd(const double *jacobi);
338
343 double
344 scaleXRandComputeNorm(double *x, const double &alpha);
345
346 void
347 dotDevice(const size_type size,
348 double * x,
349 double * y,
350 double & alpha,
352#endif // DFTEFE_WITH_DEVICE
353
354 }; // end of class PoissonSolverDealiiMatrixFreeFE
355 } // namespace electrostatics
356} // end of namespace dftefe
358#endif // dftefePoissonSolverDealiiMatrixFreeFE_h
MatrixFreeWrapper class.
Definition: MatrixFreeWrapper.h:155
An abstract class to store and access data for a given basis, such as the basis function values on a ...
Definition: FEBasisDataStorage.h:54
An abstract class to encapsulate the partitioning of a finite element basis across multiple processor...
Definition: FEBasisManager.h:44
dealii::LinearAlgebra::distributed::Vector< T, dealii::MemorySpace::Host > distributedCPUVec
Definition: DealiiFEEvaluationWrapper.h:47
A derived class of linearAlgebra::LinearSolverFunction to encapsulate the Poisson partial differentia...
Definition: PoissonSolverDealiiMatrixFreeFE.h:83
std::unique_ptr< linearAlgebra::Vector< ValueTypeOperator, memorySpace > > d_initialDevice
Definition: PoissonSolverDealiiMatrixFreeFE.h:303
size_type d_dofHandlerIndex
Definition: PoissonSolverDealiiMatrixFreeFE.h:266
const distributedCPUVec< ValueTypeOperand > & getRhs() const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:601
std::shared_ptr< basis::FEBasisManager< ValueTypeOperand, ValueTypeOperator, memorySpaceHost, dim > > d_feBasisManagerHomo
Definition: PoissonSolverDealiiMatrixFreeFE.h:254
linearAlgebra::PreconditionerType d_pcType
Definition: PoissonSolverDealiiMatrixFreeFE.h:246
std::vector< dealii::Quadrature< dim > > d_dealiiQuadratureRuleVec
Definition: PoissonSolverDealiiMatrixFreeFE.h:279
void reinit(std::shared_ptr< const basis::FEBasisManager< ValueTypeOperand, ValueTypeOperator, memorySpaceHost, dim > > feBasisManagerField, const quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > &inpRhs)
void reinit(std::shared_ptr< const basis::FEBasisManager< ValueTypeOperand, ValueTypeOperator, memorySpaceHost, dim > > feBasisManagerField, const std::map< std::string, const quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > & > &inpRhs)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:430
std::map< dealii::CellId, size_type > d_cellIdToCellIndexMap
Definition: PoissonSolverDealiiMatrixFreeFE.h:277
linearAlgebra::Vector< ValueTypeOperator, memorySpace > d_dvec
Definition: PoissonSolverDealiiMatrixFreeFE.h:306
std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpace > > d_linAlgOpContext
Definition: PoissonSolverDealiiMatrixFreeFE.h:292
void vmult(distributedCPUVec< double > &Ax, distributedCPUVec< double > &x)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:816
size_type d_feOrder
Definition: PoissonSolverDealiiMatrixFreeFE.h:265
const dealii::AffineConstraints< ValueTypeOperand > * d_dealiiAffineConstraintMatrix
Definition: PoissonSolverDealiiMatrixFreeFE.h:261
void CGsolve(const double absTolerance, const size_type maxNumberIterations, bool distributeFlag)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:1064
const linearAlgebra::Vector< ValueTypeOperator, utils::MemorySpace::DEVICE > & getInitialGuessDevice() const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:642
utils::ConditionalOStream pcout
Definition: PoissonSolverDealiiMatrixFreeFE.h:282
const distributedCPUVec< ValueType > & getInitialGuess() const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:616
void AX(const dealii::MatrixFree< dim, double > &matrixFreeData, distributedCPUVec< double > &dst, const distributedCPUVec< double > &src, const std::pair< size_type, size_type > &cell_range) const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:673
linearAlgebra::MultiVector< linearAlgebra::blasLapack::scalar_type< ValueTypeOperator, ValueTypeOperand >, memorySpaceHost > d_scratchMultiVecHost
Definition: PoissonSolverDealiiMatrixFreeFE.h:288
std::shared_ptr< dealii::MatrixFree< dim, ValueTypeOperator > > d_dealiiMatrixFree
Definition: PoissonSolverDealiiMatrixFreeFE.h:258
std::map< std::string, size_type > d_num1DQuadPointsRhs
Definition: PoissonSolverDealiiMatrixFreeFE.h:264
void getSolution(linearAlgebra::MultiVector< ValueType, memorySpaceHost > &solution)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:563
PoissonSolverDealiiMatrixFreeFE(std::shared_ptr< const basis::FEBasisManager< ValueTypeOperand, ValueTypeOperator, memorySpaceHost, dim > > feBasisManagerField, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeOperator, memorySpaceHost > > feBasisDataStorageStiffnessMatrix, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeOperator, memorySpaceHost > > feBasisDataStorageRhs, const quadrature::QuadratureValuesContainer< ValueType, memorySpaceHost > &inpRhs, const linearAlgebra::PreconditionerType pcType, std::shared_ptr< linearAlgebra::LinAlgOpContext< memorySpace > > linAlgOpContext)
This constructor creates an instance of a base LinearSolverFunction called PoissonSolverDealiiMatrixF...
linearAlgebra::Vector< ValueTypeOperator, memorySpace > d_rvec
Definition: PoissonSolverDealiiMatrixFreeFE.h:305
void computeDiagonalA()
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:722
distributedCPUVec< ValueTypeOperator > d_diagonalA
Definition: PoissonSolverDealiiMatrixFreeFE.h:256
void computeAXDevice(linearAlgebra::Vector< ValueTypeOperator, utils::MemorySpace::DEVICE > &Ax, linearAlgebra::Vector< ValueTypeOperator, utils::MemorySpace::DEVICE > &x)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:1235
size_type d_matrixFreeQuadCompStiffnessMatrix
Definition: PoissonSolverDealiiMatrixFreeFE.h:276
linearAlgebra::Vector< ValueTypeOperator, memorySpace > d_qvec
define some temporary vectors for cgsolver device
Definition: PoissonSolverDealiiMatrixFreeFE.h:305
distributedCPUVec< ValueTypeOperator > d_initial
Definition: PoissonSolverDealiiMatrixFreeFE.h:256
std::vector< distributedCPUVec< ValueType > > d_nonTensorSructuredQuadeRhs
Definition: PoissonSolverDealiiMatrixFreeFE.h:274
void CGsolveDevice(const double absTolerance, const size_type maxNumberIterations, bool distributeFlag)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:1338
void solve(const double absTolerance, const size_type maxNumberIterations)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:655
const linearAlgebra::Vector< ValueTypeOperator, utils::MemorySpace::DEVICE > & getRhsDevice() const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:629
const dealii::AffineConstraints< ValueTypeOperand > * d_constraintsInfo
Definition: PoissonSolverDealiiMatrixFreeFE.h:262
std::shared_ptr< const basis::FEBasisManager< ValueTypeOperand, ValueTypeOperator, memorySpaceHost, dim > > d_feBasisManagerField
Definition: PoissonSolverDealiiMatrixFreeFE.h:245
void precondition_Jacobi(distributedCPUVec< double > &dst, const distributedCPUVec< double > &src) const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:796
std::map< std::string, std::shared_ptr< const basis::FEBasisDataStorage< ValueTypeOperator, memorySpaceHost > > > d_feBasisDataStorageRhs
Definition: PoissonSolverDealiiMatrixFreeFE.h:272
const utils::mpi::MPIComm & getMPIComm() const
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:1049
distributedCPUVec< ValueTypeOperator > d_x
Definition: PoissonSolverDealiiMatrixFreeFE.h:256
dealii::MappingQ1< dim, dim > d_mappingDealii
Definition: PoissonSolverDealiiMatrixFreeFE.h:280
basis::FEEvaluationWrapperBase::distributedCPUVec< T > distributedCPUVec
define ValueType as the superior (bigger set) of the ValueTypeOperator and ValueTypeOperand (e....
Definition: PoissonSolverDealiiMatrixFreeFE.h:94
std::unique_ptr< linearAlgebra::Vector< ValueTypeOperator, memorySpace > > d_diagonalADevice
Definition: PoissonSolverDealiiMatrixFreeFE.h:299
std::unique_ptr< linearAlgebra::Vector< ValueTypeOperator, memorySpace > > d_rhsDevice
Definition: PoissonSolverDealiiMatrixFreeFE.h:301
utils::Profiler< memorySpace > d_p
Definition: PoissonSolverDealiiMatrixFreeFE.h:247
distributedCPUVec< ValueTypeOperator > d_rhs
Definition: PoissonSolverDealiiMatrixFreeFE.h:256
void computeRhs(distributedCPUVec< double > &rhs, const std::map< std::string, const quadrature::QuadratureValuesContainer< linearAlgebra::blasLapack::scalar_type< ValueTypeOperator, ValueTypeOperand >, memorySpaceHost > & > &inpRhs)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:838
std::shared_ptr< const dealii::DoFHandler< dim > > d_dealiiDofHandler
Definition: PoissonSolverDealiiMatrixFreeFE.h:259
linearAlgebra::blasLapack::scalar_type< ValueTypeOperator, ValueTypeOperand > ValueType
Definition: PoissonSolverDealiiMatrixFreeFE.h:98
size_type d_num1DQuadPointsStiffnessMatrix
Definition: PoissonSolverDealiiMatrixFreeFE.h:263
size_type d_numComponents
Definition: PoissonSolverDealiiMatrixFreeFE.h:240
void setSolution(const distributedCPUVec< ValueType > &x)
Definition: PoissonSolverDealiiMatrixFreeFE.t.cpp:549
Definition: LinAlgOpContext.h:52
An class template to encapsulate a MultiVector. A MultiVector is a collection of vectors belonging t...
Definition: MultiVector.h:134
A class that encapsulates a vector. This is a vector in the mathematical sense and not in the sense o...
Definition: Vector.h:122
Definition: QuadratureValuesContainer.h:39
Provides an interface to print based on whether a certain condition is met or not....
Definition: ConditionalOStream.h:47
Definition: MemoryStorage.h:38
Definition: Profiler.h:50
A class template to store the communication pattern (i.e., which entries/nodes to receive from which ...
Definition: MPIPatternP2P.h:197
static constexpr utils::MemorySpace memorySpaceHost
Definition: PoissonSolverDealiiMatrixFreeFE.h:55
typeInternal::scalar_type< ValueType1, ValueType2 > scalar_type
Definition: BlasLapackTypedef.h:183
PreconditionerType
Definition: LinearAlgebraTypes.h:41
int MPIComm
Definition: MPITypes.h:84
MemorySpace
Definition: MemorySpaceType.h:37
dealii includes
Definition: AtomFieldDataSpherical.cpp:31
std::uint64_t size_type
Definition: TypeConfig.h:9
@ Laplace
Definition: MatrixFreeDevice.h:34