DFT-EFE
 
Loading...
Searching...
No Matches
MatrixFree.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (c) 2017-2022 The Regents of the University of Michigan and DFT-FE
4// authors.
5//
6// This file is part of the DFT-FE code.
7//
8// The DFT-FE code is free software; you can use it, redistribute
9// it, and/or modify it under the terms of the GNU Lesser General
10// Public License as published by the Free Software Foundation; either
11// version 2.1 of the License, or (at your option) any later version.
12// The full text of the license can be found in the file LICENSE at
13// the top level of the DFT-FE distribution.
14//
15// ---------------------------------------------------------------------
16//
17
23#ifndef MatrixFree_H_
24#define MatrixFree_H_
25#include <type_traits>
26#include <mpi.h>
27#include <deal.II/base/partitioner.h>
28#include <deal.II/lac/affine_constraints.h>
29#include <deal.II/matrix_free/matrix_free.h>
30#include <utils/TypeConfig.h>
32#include <utils/MemoryStorage.h>
34#include <cstdint>
35
36#ifdef _OPENMP
37# include <omp.h>
38#else
39# define omp_get_thread_num() 0
40#endif
41
42namespace dftefe
43{
52 template <typename T,
53 dftefe::operatorList operatorID,
55 bool isComplex,
56 std::uint32_t nDofsPerDim,
57 std::uint32_t nQuadPointsPerDim,
58 std::uint32_t batchSize,
59 std::uint32_t subBatchSize>
61 {
62 public:
64 MatrixFree(const MPI_Comm & mpi_comm,
65 const dealii::MatrixFree<3, double> * matrixFreeDataPtr,
66 const dealii::AffineConstraints<double> &constraintMatrix,
67 const std::uint32_t dofHandlerID,
68 const std::uint32_t quadratureID,
69 const dftefe::uInt nVectors);
70
75 void
76 init();
77
82 void
83 initOperatorCoeffs(T coeffHelmholtz);
84
89 void
90 computeAX(T *dst, T *src);
91
96 void
98
103 void
104 constraintsDistributeTranspose(T *dst, T *src);
105
106 private:
111 void
113
114 void
115 setupConstraints(const dealii::IndexSet &indexSet);
116
117 typedef std::conditional_t<isComplex, std::complex<T>, T> DataType;
118
121
123
127
129
130 static constexpr std::uint32_t d_quadODim = nQuadPointsPerDim / 2;
131 static constexpr std::uint32_t d_quadEDim =
132 nQuadPointsPerDim % 2 == 1 ? d_quadODim + 1 : d_quadODim;
133 static constexpr std::uint32_t d_dofODim = nDofsPerDim / 2;
134 static constexpr std::uint32_t d_dofEDim =
135 nDofsPerDim % 2 == 1 ? d_dofODim + 1 : d_dofODim;
136
137 std::array<T, d_quadEDim * d_dofEDim + d_quadODim * d_dofODim>
139 std::array<T, 2 * d_quadODim * d_quadEDim>
141 std::array<T, nQuadPointsPerDim> quadratureWeights;
142
145
146 // HOST only Data Structures
147 std::vector<std::vector<dftefe::uInt>> d_constrainingNodeBuckets,
149 std::vector<std::vector<T>> d_weightMatrixList;
150 std::vector<T> d_inhomogenityList;
151
152 // Device only Data Structures
155
161
162 // Buffer for shape function values and gradients at quadrature points for
163 // SYCL. For CUDA/HIP, these are stored in constant memory in
164 // MatrixFreeDevice.
167
168 // pointer to dealii MatrixFree object
169 const dealii::MatrixFree<3, double> *d_matrixFreeDataPtr;
170
171 // pointer to dealii AffineConstraints object
172 const dealii::AffineConstraints<double> *d_constraintMatrixPtr;
173
174 std::shared_ptr<const dealii::Utilities::MPI::Partitioner>
176
177 const MPI_Comm mpi_communicator;
178 const std::uint32_t n_mpi_processes;
179 const std::uint32_t this_mpi_process;
181 std::vector<MPI_Request> mpiRequestsGhost;
182 std::vector<MPI_Request> mpiRequestsCompress;
183 };
184
185} // namespace dftefe
186#endif // MatrixFree_H_
MatrixFree class template. template parameter nDofsPerDim is the finite element polynomial order....
Definition: MatrixFree.h:61
dftefe::uInt d_ghostBlockSize
Definition: MatrixFree.h:125
std::vector< MPI_Request > mpiRequestsGhost
Definition: MatrixFree.h:181
dftefe::uInt d_nRelaventDofs
Definition: MatrixFree.h:124
dftefe::utils::MemoryStorage< T, memorySpace > d_jacobianFactor
Definition: MatrixFree.h:143
void computeAX(T *dst, T *src)
Compute Laplace operator multipled by X.
Definition: MatrixFree.cpp:805
std::shared_ptr< const dealii::Utilities::MPI::Partitioner > d_singleBatchPartitioner
Definition: MatrixFree.h:175
static constexpr std::uint32_t d_dofODim
Definition: MatrixFree.h:133
std::vector< std::vector< T > > d_weightMatrixList
Definition: MatrixFree.h:149
std::array< T, d_quadEDim *d_dofEDim+d_quadODim *d_dofODim > nodalShapeFunctionValuesAtQuadPointsEO
Definition: MatrixFree.h:138
T d_coeffHelmholtz
Definition: MatrixFree.h:128
const std::uint32_t n_mpi_processes
Definition: MatrixFree.h:178
const dealii::MatrixFree< 3, double > * d_matrixFreeDataPtr
Definition: MatrixFree.h:169
void init()
Initialize data structures for MatrixFree class.
Definition: MatrixFree.cpp:97
std::vector< T > tempGhostStorage
Definition: MatrixFree.h:180
static constexpr std::uint32_t d_dofEDim
Definition: MatrixFree.h:134
std::shared_ptr< const dealii::Utilities::MPI::Partitioner > d_singleVectorPartitioner
Definition: MatrixFree.h:175
void constraintsDistributeTranspose(T *dst, T *src)
Apply transpose of constraints to src vector and set zero on src.
Definition: MatrixFree.cpp:760
void initConstraints()
Initialize optimized constraints.
Definition: MatrixFree.cpp:588
const std::uint32_t d_dofHandlerID
Definition: MatrixFree.h:119
std::vector< T > d_inhomogenityList
Definition: MatrixFree.h:150
dftefe::utils::MemoryStorage< dftefe::uInt, dftefe::utils::MemorySpace::DEVICE > d_constrainedNodeBucketsDevice
Definition: MatrixFree.h:158
dftefe::uInt d_localSize
Definition: MatrixFree.h:125
dftefe::uInt d_nCells
Definition: MatrixFree.h:124
const std::uint32_t this_mpi_process
Definition: MatrixFree.h:179
dftefe::utils::MemoryStorage< dftefe::uInt, memorySpace > d_map
Definition: MatrixFree.h:144
dftefe::utils::MemoryStorage< dftefe::uInt, dftefe::utils::MemorySpace::DEVICE > d_constrainingNodeOffsetDevice
Definition: MatrixFree.h:159
const std::uint32_t d_nDofsPerCell
Definition: MatrixFree.h:119
void initOperatorCoeffs(T coeffHelmholtz)
Initialize Helmholtz operator coefficient.
Definition: MatrixFree.cpp:566
dftefe::utils::MemoryStorage< dftefe::uInt, dftefe::utils::MemorySpace::DEVICE > d_constrainingNodeBucketsDevice
Definition: MatrixFree.h:158
dftefe::uInt d_nGhostDofs
Definition: MatrixFree.h:124
std::vector< T > tempCompressStorage
Definition: MatrixFree.h:180
dftefe::utils::MemoryStorage< dftefe::uInt, dftefe::utils::MemorySpace::DEVICE > d_constrainedNodeOffsetDevice
Definition: MatrixFree.h:159
static constexpr std::uint32_t d_quadODim
Definition: MatrixFree.h:130
const dftefe::uInt d_nBatch
Definition: MatrixFree.h:122
dftefe::uInt d_localBlockSize
Definition: MatrixFree.h:125
std::vector< MPI_Request > mpiRequestsCompress
Definition: MatrixFree.h:182
std::conditional_t< isComplex, std::complex< T >, T > DataType
Definition: MatrixFree.h:117
const std::uint32_t d_quadratureID
Definition: MatrixFree.h:119
std::vector< std::vector< dftefe::uInt > > d_constrainingNodeBuckets
Definition: MatrixFree.h:147
void setupConstraints(const dealii::IndexSet &indexSet)
Definition: MatrixFree.cpp:621
static constexpr std::uint32_t d_quadEDim
Definition: MatrixFree.h:131
dftefe::utils::MemoryStorage< T, dftefe::utils::MemorySpace::DEVICE > d_inhomogenityListDevice
Definition: MatrixFree.h:154
const MPI_Comm mpi_communicator
Definition: MatrixFree.h:177
dftefe::uInt d_ghostSize
Definition: MatrixFree.h:125
std::array< T, 2 *d_quadODim *d_quadEDim > quadShapeFunctionGradientsAtQuadPointsEO
Definition: MatrixFree.h:140
dftefe::utils::MemoryStorage< dftefe::uInt, dftefe::utils::MemorySpace::DEVICE > d_weightMatrixOffsetDevice
Definition: MatrixFree.h:160
dftefe::utils::MemoryStorage< T, dftefe::utils::MemorySpace::DEVICE > shapeBufferDevice
Definition: MatrixFree.h:166
const std::uint32_t d_nQuadsPerCell
Definition: MatrixFree.h:120
std::vector< std::vector< dftefe::uInt > > d_constrainedNodeBuckets
Definition: MatrixFree.h:148
dftefe::utils::MemoryStorage< T, dftefe::utils::MemorySpace::DEVICE > d_weightMatrixListDevice
Definition: MatrixFree.h:154
void constraintsDistribute(T *src)
Apply constraints to src vector.
Definition: MatrixFree.cpp:715
const dealii::AffineConstraints< double > * d_constraintMatrixPtr
Definition: MatrixFree.h:172
std::array< T, nQuadPointsPerDim > quadratureWeights
Definition: MatrixFree.h:141
dftefe::uInt d_nOwnedDofs
Definition: MatrixFree.h:124
const dftefe::uInt d_nVectors
Definition: MatrixFree.h:122
dftefe::uInt d_nOMPThreads
Definition: MatrixFree.h:126
Definition: MemoryStorage.h:38
MemorySpace
Definition: MemorySpaceType.h:37
dealii includes
Definition: AtomFieldDataSpherical.cpp:31
std::uint64_t uInt
Definition: TypeConfig.h:11
operatorList
Definition: MatrixFreeDevice.h:33