Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Private Attributes | List of all members
Nektar::MultiRegions::GlobalLinSysPETScFull Class Reference

A global linear system. More...

#include <GlobalLinSysPETScFull.h>

Inheritance diagram for Nektar::MultiRegions::GlobalLinSysPETScFull:
[legend]

Public Member Functions

 GlobalLinSysPETScFull (const GlobalLinSysKey &pLinSysKey, const std::weak_ptr< ExpList > &pExpList, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 Constructor for full direct matrix solve. More...
 
 ~GlobalLinSysPETScFull () override=default
 
- Public Member Functions inherited from Nektar::MultiRegions::GlobalLinSysPETSc
 GlobalLinSysPETSc (const GlobalLinSysKey &pKey, const std::weak_ptr< ExpList > &pExp, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 Constructor for full direct matrix solve. More...
 
 ~GlobalLinSysPETSc () override
 Clean up PETSc objects. More...
 
- Public Member Functions inherited from Nektar::MultiRegions::GlobalLinSys
 GlobalLinSys (const GlobalLinSysKey &pKey, const std::weak_ptr< ExpList > &pExpList, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 Constructor for full direct matrix solve. More...
 
virtual ~GlobalLinSys ()
 
const GlobalLinSysKeyGetKey (void) const
 Returns the key associated with the system. More...
 
const std::weak_ptr< ExpList > & GetLocMat (void) const
 
void InitObject ()
 
void Initialise (const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 
void Solve (const Array< OneD, const NekDouble > &in, Array< OneD, NekDouble > &out, const AssemblyMapSharedPtr &locToGloMap, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)
 Solve the linear system for given input and output vectors using a specified local to global map. More...
 
std::shared_ptr< GlobalLinSysGetSharedThisPtr ()
 Returns a shared pointer to the current object. More...
 
int GetNumBlocks ()
 
DNekScalMatSharedPtr GetBlock (unsigned int n)
 
void DropBlock (unsigned int n)
 
DNekScalBlkMatSharedPtr GetStaticCondBlock (unsigned int n)
 
void DropStaticCondBlock (unsigned int n)
 
void SolveLinearSystem (const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const AssemblyMapSharedPtr &locToGloMap, const int pNumDir=0)
 Solve the linear system for given input and output vectors. More...
 

Static Public Member Functions

static GlobalLinSysSharedPtr create (const GlobalLinSysKey &pLinSysKey, const std::weak_ptr< ExpList > &pExpList, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 Creates an instance of this class. More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 

Protected Member Functions

void v_Solve (const Array< OneD, const NekDouble > &in, Array< OneD, NekDouble > &out, const AssemblyMapSharedPtr &locToGloMap, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray) override
 Solve the linear system for given input and output vectors using a specified local to global map. More...
 
void v_DoMatrixMultiply (const Array< OneD, const NekDouble > &input, Array< OneD, NekDouble > &output) override
 Apply matrix-vector multiplication using local approach and the assembly map. More...
 
- Protected Member Functions inherited from Nektar::MultiRegions::GlobalLinSysPETSc
void SetUpScatter ()
 Set up PETSc local (equivalent to Nektar++ global) and global (equivalent to universal) scatter maps. More...
 
void SetUpMatVec (int nGlobal, int nDir)
 Construct PETSc matrix and vector handles. More...
 
void SetUpSolver (NekDouble tolerance)
 Set up KSP solver object. More...
 
void CalculateReordering (const Array< OneD, const int > &glo2uniMap, const Array< OneD, const int > &glo2unique, const AssemblyMapSharedPtr &pLocToGloMap)
 Calculate a reordering of universal IDs for PETSc. More...
 
void v_SolveLinearSystem (const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const AssemblyMapSharedPtr &locToGloMap, const int pNumDir) override
 Solve linear system using PETSc. More...
 
virtual void v_DoMatrixMultiply (const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput)=0
 
- Protected Member Functions inherited from Nektar::MultiRegions::GlobalLinSys
virtual void v_Solve (const Array< OneD, const NekDouble > &in, Array< OneD, NekDouble > &out, const AssemblyMapSharedPtr &locToGloMap, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)=0
 Solve a linear system based on mapping. More...
 
virtual void v_SolveLinearSystem (const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const AssemblyMapSharedPtr &locToGloMap, const int pNumDir)=0
 Solve a basic matrix system. More...
 
virtual void v_InitObject ()
 
virtual void v_Initialise (const std::shared_ptr< AssemblyMap > &pLocToGloMap)
 
virtual int v_GetNumBlocks ()
 Get the number of blocks in this system. More...
 
virtual DNekScalMatSharedPtr v_GetBlock (unsigned int n)
 Retrieves the block matrix from n-th expansion using the matrix key provided by the m_linSysKey. More...
 
virtual void v_DropBlock (unsigned int n)
 Releases the local block matrix from NekManager of n-th expansion using the matrix key provided by the m_linSysKey. More...
 
virtual DNekScalBlkMatSharedPtr v_GetStaticCondBlock (unsigned int n)
 Retrieves a the static condensation block matrices from n-th expansion using the matrix key provided by the m_linSysKey. More...
 
virtual void v_DropStaticCondBlock (unsigned int n)
 Releases the static condensation block matrices from NekManager of n-th expansion using the matrix key provided by the m_linSysKey. More...
 
PreconditionerSharedPtr CreatePrecon (AssemblyMapSharedPtr asmMap)
 Create a preconditioner object from the parameters defined in the supplied assembly map. More...
 

Private Attributes

std::shared_ptr< AssemblyMapm_locToGloMap
 

Additional Inherited Members

- Protected Attributes inherited from Nektar::MultiRegions::GlobalLinSysPETSc
Mat m_matrix
 PETSc matrix object. More...
 
Vec m_x
 PETSc vector objects used for local storage. More...
 
Vec m_b
 
Vec m_locVec
 
KSP m_ksp
 KSP object that represents solver system. More...
 
PC m_pc
 PCShell for preconditioner. More...
 
PETScMatMult m_matMult
 Enumerator to select matrix multiplication type. More...
 
std::vector< int > m_reorderedMap
 Reordering that takes universal IDs to a unique row in the PETSc matrix. More...
 
VecScatter m_ctx
 PETSc scatter context that takes us between Nektar++ global ordering and PETSc vector ordering. More...
 
int m_nLocal
 Number of unique degrees of freedom on this process. More...
 
PreconditionerSharedPtr m_precon
 
- Protected Attributes inherited from Nektar::MultiRegions::GlobalLinSys
const GlobalLinSysKey m_linSysKey
 Key associated with this linear system. More...
 
const std::weak_ptr< ExpListm_expList
 Local Matrix System. More...
 
const std::map< int, RobinBCInfoSharedPtrm_robinBCInfo
 Robin boundary info. More...
 
bool m_verbose
 

Detailed Description

A global linear system.

Definition at line 50 of file GlobalLinSysPETScFull.h.

Constructor & Destructor Documentation

◆ GlobalLinSysPETScFull()

Nektar::MultiRegions::GlobalLinSysPETScFull::GlobalLinSysPETScFull ( const GlobalLinSysKey pLinSysKey,
const std::weak_ptr< ExpList > &  pExpList,
const std::shared_ptr< AssemblyMap > &  pLocToGloMap 
)

Constructor for full direct matrix solve.

Definition at line 57 of file GlobalLinSysPETScFull.cpp.

60 : GlobalLinSys(pLinSysKey, pExp, pLocToGloMap),
61 GlobalLinSysPETSc(pLinSysKey, pExp, pLocToGloMap)
62{
63 const int nDirDofs = pLocToGloMap->GetNumGlobalDirBndCoeffs();
64
65 int i, j, n, cnt, gid1, gid2, loc_lda;
66 NekDouble sign1, sign2, value;
68
69 // CALCULATE REORDERING MAPPING
70 CalculateReordering(pLocToGloMap->GetGlobalToUniversalMap(),
71 pLocToGloMap->GetGlobalToUniversalMapUnique(),
72 pLocToGloMap);
73
74 // SET UP VECTORS AND MATRIX
75 SetUpMatVec(pLocToGloMap->GetNumGlobalCoeffs(), nDirDofs);
76
77 // SET UP SCATTER OBJECTS
79
80 // CONSTRUCT KSP OBJECT
81 SetUpSolver(pLocToGloMap->GetIterativeTolerance());
82
83 // POPULATE MATRIX
84 for (n = cnt = 0; n < m_expList.lock()->GetNumElmts(); ++n)
85 {
86 loc_mat = GetBlock(n);
87 loc_lda = loc_mat->GetRows();
88
89 for (i = 0; i < loc_lda; ++i)
90 {
91 gid1 = pLocToGloMap->GetLocalToGlobalMap(cnt + i) - nDirDofs;
92 sign1 = pLocToGloMap->GetLocalToGlobalSign(cnt + i);
93 if (gid1 >= 0)
94 {
95 int gid1ro = m_reorderedMap[gid1];
96 for (j = 0; j < loc_lda; ++j)
97 {
98 gid2 =
99 pLocToGloMap->GetLocalToGlobalMap(cnt + j) - nDirDofs;
100 sign2 = pLocToGloMap->GetLocalToGlobalSign(cnt + j);
101 if (gid2 >= 0)
102 {
103 int gid2ro = m_reorderedMap[gid2];
104 value = sign1 * sign2 * (*loc_mat)(i, j);
105 MatSetValue(m_matrix, gid1ro, gid2ro, value,
106 ADD_VALUES);
107 }
108 }
109 }
110 }
111 cnt += loc_lda;
112 }
113
114 // ASSEMBLE MATRIX
115 MatAssemblyBegin(m_matrix, MAT_FINAL_ASSEMBLY);
116 MatAssemblyEnd(m_matrix, MAT_FINAL_ASSEMBLY);
117}
const std::weak_ptr< ExpList > m_expList
Local Matrix System.
Definition: GlobalLinSys.h:122
GlobalLinSys(const GlobalLinSysKey &pKey, const std::weak_ptr< ExpList > &pExpList, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
Constructor for full direct matrix solve.
DNekScalMatSharedPtr GetBlock(unsigned int n)
Definition: GlobalLinSys.h:209
std::vector< int > m_reorderedMap
Reordering that takes universal IDs to a unique row in the PETSc matrix.
void SetUpScatter()
Set up PETSc local (equivalent to Nektar++ global) and global (equivalent to universal) scatter maps.
void SetUpSolver(NekDouble tolerance)
Set up KSP solver object.
GlobalLinSysPETSc(const GlobalLinSysKey &pKey, const std::weak_ptr< ExpList > &pExp, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
Constructor for full direct matrix solve.
void SetUpMatVec(int nGlobal, int nDir)
Construct PETSc matrix and vector handles.
void CalculateReordering(const Array< OneD, const int > &glo2uniMap, const Array< OneD, const int > &glo2unique, const AssemblyMapSharedPtr &pLocToGloMap)
Calculate a reordering of universal IDs for PETSc.
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
double NekDouble

References Nektar::MultiRegions::GlobalLinSysPETSc::CalculateReordering(), Nektar::MultiRegions::GlobalLinSys::GetBlock(), Nektar::MultiRegions::GlobalLinSys::m_expList, Nektar::MultiRegions::GlobalLinSysPETSc::m_matrix, Nektar::MultiRegions::GlobalLinSysPETSc::m_reorderedMap, Nektar::MultiRegions::GlobalLinSysPETSc::SetUpMatVec(), Nektar::MultiRegions::GlobalLinSysPETSc::SetUpScatter(), and Nektar::MultiRegions::GlobalLinSysPETSc::SetUpSolver().

◆ ~GlobalLinSysPETScFull()

Nektar::MultiRegions::GlobalLinSysPETScFull::~GlobalLinSysPETScFull ( )
overridedefault

Member Function Documentation

◆ create()

static GlobalLinSysSharedPtr Nektar::MultiRegions::GlobalLinSysPETScFull::create ( const GlobalLinSysKey pLinSysKey,
const std::weak_ptr< ExpList > &  pExpList,
const std::shared_ptr< AssemblyMap > &  pLocToGloMap 
)
inlinestatic

Creates an instance of this class.

Definition at line 54 of file GlobalLinSysPETScFull.h.

58 {
60 pLinSysKey, pExpList, pLocToGloMap);
61 }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ v_DoMatrixMultiply()

void Nektar::MultiRegions::GlobalLinSysPETScFull::v_DoMatrixMultiply ( const Array< OneD, const NekDouble > &  input,
Array< OneD, NekDouble > &  output 
)
overrideprotectedvirtual

Apply matrix-vector multiplication using local approach and the assembly map.

Parameters
inputVector input.
outputResult of multiplication.

Implements Nektar::MultiRegions::GlobalLinSysPETSc.

Definition at line 203 of file GlobalLinSysPETScFull.cpp.

205{
206 std::shared_ptr<MultiRegions::ExpList> expList = m_expList.lock();
207
208 int nLocDofs = m_locToGloMap->GetNumLocalCoeffs();
209
210 Array<OneD, NekDouble> tmp(nLocDofs);
211 Array<OneD, NekDouble> tmp1(nLocDofs);
212
213 m_locToGloMap->GlobalToLocal(input, tmp);
214
215 // Perform matrix-vector operation A*d_i
216 expList->GeneralMatrixOp(m_linSysKey, tmp, tmp1);
217
218 m_locToGloMap->Assemble(tmp1, output);
219}
const GlobalLinSysKey m_linSysKey
Key associated with this linear system.
Definition: GlobalLinSys.h:120
std::shared_ptr< AssemblyMap > m_locToGloMap

References Nektar::MultiRegions::GlobalLinSys::m_expList, Nektar::MultiRegions::GlobalLinSys::m_linSysKey, and m_locToGloMap.

◆ v_Solve()

void Nektar::MultiRegions::GlobalLinSysPETScFull::v_Solve ( const Array< OneD, const NekDouble > &  pLocInput,
Array< OneD, NekDouble > &  pLocOutput,
const AssemblyMapSharedPtr pLocToGloMap,
const Array< OneD, const NekDouble > &  pDirForcing = NullNekDouble1DArray 
)
overrideprotectedvirtual

Solve the linear system for given input and output vectors using a specified local to global map.

Solve the linear system using a full global matrix system.

Implements Nektar::MultiRegions::GlobalLinSys.

Definition at line 122 of file GlobalLinSysPETScFull.cpp.

127{
128 m_locToGloMap = pLocToGloMap;
129
130 bool dirForcCalculated = (bool)pDirForcing.size();
131 int nDirDofs = pLocToGloMap->GetNumGlobalDirBndCoeffs();
132 int nGlobDofs = pLocToGloMap->GetNumGlobalCoeffs();
133 int nLocDofs = pLocToGloMap->GetNumLocalCoeffs();
134
135 int nDirTotal = nDirDofs;
136 std::shared_ptr<MultiRegions::ExpList> expList = m_expList.lock();
137 expList->GetComm()->GetRowComm()->AllReduce(nDirTotal,
139
140 if (nDirTotal)
141 {
142 Array<OneD, NekDouble> rhs(nLocDofs);
143
144 // Calculate the Dirichlet forcing
145 if (dirForcCalculated)
146 {
147 // Assume pDirForcing is in local space
148 ASSERTL0(
149 pDirForcing.size() >= nLocDofs,
150 "DirForcing is not of sufficient size. Is it in local space?");
151 Vmath::Vsub(nLocDofs, pLocInput, 1, pDirForcing, 1, rhs, 1);
152 }
153 else
154 {
155 // Calculate initial condition and Dirichlet forcing and subtract it
156 // from the rhs
157 expList->GeneralMatrixOp(m_linSysKey, pLocOutput, rhs);
158
159 // Iterate over all the elements computing Robin BCs where
160 // necessary
161 for (auto &r : m_robinBCInfo) // add robin mass matrix
162 {
164 Array<OneD, NekDouble> rhsloc;
165
166 int n = r.first;
167 int offset = expList->GetCoeff_Offset(n);
168
169 LocalRegions::ExpansionSharedPtr vExp = expList->GetExp(n);
170 // Add local matrix contribution
171 for (rBC = r.second; rBC; rBC = rBC->next)
172 {
173 vExp->AddRobinTraceContribution(
174 rBC->m_robinID, rBC->m_robinPrimitiveCoeffs,
175 pLocOutput + offset, rhsloc = rhs + offset);
176 }
177 }
178 Vmath::Vsub(nLocDofs, pLocInput, 1, rhs, 1, rhs, 1);
179 }
180
181 Array<OneD, NekDouble> diff(nLocDofs);
182
183 // Solve for perturbation from initial guess in pOutput
184 SolveLinearSystem(nGlobDofs, rhs, diff, pLocToGloMap, nDirDofs);
185
186 // Add back initial and boundary condition
187 Vmath::Vadd(nLocDofs, diff, 1, pLocOutput, 1, pLocOutput, 1);
188 }
189 else
190 {
191 SolveLinearSystem(nGlobDofs, pLocInput, pLocOutput, pLocToGloMap,
192 nDirDofs);
193 }
194}
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
const std::map< int, RobinBCInfoSharedPtr > m_robinBCInfo
Robin boundary info.
Definition: GlobalLinSys.h:124
void SolveLinearSystem(const int pNumRows, const Array< OneD, const NekDouble > &pInput, Array< OneD, NekDouble > &pOutput, const AssemblyMapSharedPtr &locToGloMap, const int pNumDir=0)
Solve the linear system for given input and output vectors.
Definition: GlobalLinSys.h:190
std::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:66
std::shared_ptr< RobinBCInfo > RobinBCInfoSharedPtr
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.hpp:180
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.hpp:220

References ASSERTL0, Nektar::MultiRegions::GlobalLinSys::m_expList, Nektar::MultiRegions::GlobalLinSys::m_linSysKey, m_locToGloMap, Nektar::MultiRegions::GlobalLinSys::m_robinBCInfo, Nektar::LibUtilities::ReduceSum, Nektar::MultiRegions::GlobalLinSys::SolveLinearSystem(), Vmath::Vadd(), and Vmath::Vsub().

Member Data Documentation

◆ className

string Nektar::MultiRegions::GlobalLinSysPETScFull::className
static
Initial value:
=
"PETScFull", GlobalLinSysPETScFull::create, "PETSc Full Matrix.")
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:197
static GlobalLinSysSharedPtr create(const GlobalLinSysKey &pLinSysKey, const std::weak_ptr< ExpList > &pExpList, const std::shared_ptr< AssemblyMap > &pLocToGloMap)
Creates an instance of this class.
GlobalLinSysFactory & GetGlobalLinSysFactory()

Name of class.

Registers the class with the Factory.

Definition at line 64 of file GlobalLinSysPETScFull.h.

◆ m_locToGloMap

std::shared_ptr<AssemblyMap> Nektar::MultiRegions::GlobalLinSysPETScFull::m_locToGloMap
private

Definition at line 87 of file GlobalLinSysPETScFull.h.

Referenced by v_DoMatrixMultiply(), and v_Solve().