FEI Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
fei_LinSysCoreFilter.hpp
Go to the documentation of this file.
1#ifndef _LinSysCoreFilter_hpp_
2#define _LinSysCoreFilter_hpp_
3
4/*--------------------------------------------------------------------*/
5/* Copyright 2005 Sandia Corporation. */
6/* Under the terms of Contract DE-AC04-94AL85000, there is a */
7/* non-exclusive license for use of this work by or on behalf */
8/* of the U.S. Government. Export of this program may require */
9/* a license from the United States Government. */
10/*--------------------------------------------------------------------*/
11
12#include "fei_macros.hpp"
13#include "fei_defs.h"
14#include "fei_fwd.hpp"
15#include "fei_Filter.hpp"
16#include <fei_CSRMat.hpp>
17#include <fei_CSVec.hpp>
18
19namespace fei {
20 class DirichletBCManager;
21}
22
33class LinSysCoreFilter : public Filter {
34
35 public:
36 // Constructor.
38 SNL_FEI_Structure* probStruct,
40 int masterRank=0);
41
42 //Destructor
43 virtual ~LinSysCoreFilter();
44
45
46 // set a value (usually zeros) throughout the linear system
47 virtual int resetSystem(double s);
48 virtual int resetMatrix(double s);
49 virtual int resetRHSVector(double s);
50 virtual int resetInitialGuess(double s);
51
52 virtual int deleteMultCRs();
53
54 virtual int loadNodeBCs(int numNodes,
55 const GlobalID *nodeIDs,
56 int fieldID,
57 const int* offsetsIntoField,
58 const double* prescribedValues);
59
60 virtual int loadElemBCs(int numElems,
61 const GlobalID *elemIDs,
62 int fieldID,
63 const double *const *alpha,
64 const double *const *beta,
65 const double *const *gamma);
66
67 virtual int sumInElem(GlobalID elemBlockID,
68 GlobalID elemID,
69 const GlobalID* elemConn,
70 const double* const* elemStiffness,
71 const double* elemLoad,
72 int elemFormat);
73
74 virtual int sumInElemMatrix(GlobalID elemBlockID,
75 GlobalID elemID,
76 const GlobalID* elemConn,
77 const double* const* elemStiffness,
78 int elemFormat);
79
80 virtual int sumInElemRHS(GlobalID elemBlockID,
81 GlobalID elemID,
82 const GlobalID* elemConn,
83 const double* elemLoad);
84
85 virtual int loadCRMult(int CRMultID,
86 int numCRNodes,
87 const GlobalID* CRNodes,
88 const int* CRFields,
89 const double* CRWeights,
90 double CRValue);
91
92 virtual int loadCRPen(int CRPenID,
93 int numCRNodes,
94 const GlobalID* CRNodes,
95 const int *CRFields,
96 const double* CRWeights,
97 double CRValue,
98 double penValue);
99
100 virtual int putIntoRHS(int IDType,
101 int fieldID,
102 int numIDs,
103 const GlobalID* IDs,
104 const double* rhsEntries);
105
106 virtual int sumIntoRHS(int IDType,
107 int fieldID,
108 int numIDs,
109 const GlobalID* IDs,
110 const double* rhsEntries);
111
112 virtual int loadComplete();
113
114 // set parameters associated with solver choice, etc.
115 virtual int parameters(int numParams, const char *const* paramStrings);
116
117 //get residual norms
118 virtual int residualNorm(int whichNorm, int numFields,
119 int* fieldIDs, double* norms, double& residTime);
120
121 // start iterative solution
122 virtual int solve(int& status, double& sTime);
123
124 // query function iterations performed.
125 virtual int iterations() const {return(iterations_);};
126
127// Solution return services.......................................
128
129 // return all nodal solution params on a block-by-block basis
130 virtual int getBlockNodeSolution(GlobalID elemBlockID,
131 int numNodes,
132 const GlobalID *nodeIDs,
133 int *offsets,
134 double *results);
135
136 virtual int getNodalSolution(int numNodes,
137 const GlobalID *nodeIDs,
138 int *offsets,
139 double *results);
140
141 // return nodal solution for one field on a block-by-block basis
142 virtual int getBlockFieldNodeSolution(GlobalID elemBlockID,
143 int fieldID,
144 int numNodes,
145 const GlobalID *nodeIDs,
146 double *results);
147
148 // return element solution params on a block-by-block basis
149 virtual int getBlockElemSolution(GlobalID elemBlockID,
150 int numElems,
151 const GlobalID *elemIDs,
152 int& numElemDOFPerElement,
153 double *results);
154
155 virtual int getCRMultipliers(int numCRs, const int* CRIDs, double* multipliers);
156
157// associated "puts" paralleling the solution return services.
158//
159// the int sizing parameters are passed for error-checking purposes, so
160// that the interface implementation can tell if the passed estimate
161// vectors make sense -before- an attempt is made to utilize them as
162// initial guesses by unpacking them into the solver's native solution
163// vector format (these parameters include lenNodeIDList, lenElemIDList,
164// numElemDOF, and numMultCRs -- all other passed params are either
165// vectors or block/constraint-set IDs)
166
167 // put nodal-based solution guess on a block-by-block basis
168 virtual int putBlockNodeSolution(GlobalID elemBlockID,
169 int numNodes,
170 const GlobalID *nodeIDs,
171 const int *offsets,
172 const double *estimates);
173
174 // put nodal-based guess for one field on a block-by-block basis
175 virtual int putBlockFieldNodeSolution(GlobalID elemBlockID,
176 int fieldID,
177 int numNodes,
178 const GlobalID *nodeIDs,
179 const double *estimates);
180
181 // put element-based solution guess on a block-by-block basis
182 virtual int putBlockElemSolution(GlobalID elemBlockID,
183 int numElems,
184 const GlobalID *elemIDs,
185 int dofPerElem,
186 const double *estimates);
187
188 virtual int putCRMultipliers(int numMultCRs,
189 const int* CRIDs,
190 const double *multEstimates);
191
192//===== a couple of public non-FEI functions... ================================
193//These are intended to be used by an 'outer-layer' class like
194//FEI_Implementation.
195//
196 public:
197 virtual int getNodalFieldSolution(int fieldID,
198 int numNodes,
199 const GlobalID* nodeIDs,
200 double* results);
201
202 virtual int putNodalFieldData(int fieldID,
203 int numNodes,
204 const GlobalID* nodeIDs,
205 const double* nodeData);
206
207 virtual int putNodalFieldSolution(int fieldID,
208 int numNodes,
209 const GlobalID* nodeIDs,
210 const double* nodeData);
211
212 virtual int unpackSolution();
213
214 void setEqnCommMgr(EqnCommMgr* eqnCommMgr);
215
217
218 virtual int setNumRHSVectors(int numRHSs, int* rhsIDs);
219 virtual int setCurrentRHS(int rhsID);
220
221 virtual int exchangeRemoteEquations();
222 virtual int exchangeRemoteBCs(std::vector<int>& essEqns,
223 std::vector<double>& essAlpha,
224 std::vector<double>& essGamma);
225
226 virtual int implementAllBCs();
227
228 virtual int enforceEssentialBCs(const int* eqns, const double* alpha,
229 const double* gamma, int numEqns);
230
231 virtual int enforceRemoteEssBCs(int numEqns, const int* eqns,
232 const int* const* colIndices, const int* colIndLens,
233 const double* const* coefs);
234
235 virtual int initialize();
236
237//==============================================================================
238//private functions for internal implementation of LinSysCoreFilter.
239//==============================================================================
240 private:
241 int initLinSysCore();
242 void setLinSysCoreCREqns();
243
245 int assemblyMode);
246
247 int loadFEDataMultCR(int CRID,
248 int numCRNodes,
249 const GlobalID* CRNodes,
250 const int* CRFields,
251 const double* CRWeights,
252 double CRValue);
253
254 int loadFEDataPenCR(int CRID,
255 int numCRNodes,
256 const GlobalID* CRNodes,
257 const int* CRFields,
258 const double* CRWeights,
259 double CRValue,
260 double penValue);
261
262 int storeNodalColumnCoefs(int eqn, const NodeDescriptor& node,
263 int fieldID, int fieldSize,
264 double* coefs);
265
266 int storeNodalRowCoefs(const NodeDescriptor& node,
267 int fieldID, int fieldSize,
268 double* coefs, int eqn);
269
270 int generalElemInput(GlobalID elemBlockID,
271 GlobalID elemID,
272 const double* const* elemStiffness,
273 const double* elemLoad,
274 int elemFormat);
275
276 int generalElemInput(GlobalID elemBlockID,
277 GlobalID elemID,
278 const GlobalID* elemConn,
279 const double* const* elemStiffness,
280 const double* elemLoad,
281 int elemFormat);
282
283 void storeNodalSendIndex(const NodeDescriptor& node, int fieldID, int col);
284 void storeNodalSendEqn(const NodeDescriptor& node, int fieldID, int col,
285 double* coefs);
286 void storeNodalSendIndices(const NodeDescriptor& iNode, int iField,
287 const NodeDescriptor& jNode, int jField);
288
289 void storePenNodeSendData(const NodeDescriptor& iNode,
290 int iField, int iFieldSize,
291 double* iCoefs,
292 const NodeDescriptor& jNode,
293 int jField, int jFieldSize,
294 double* jCoefs,
295 double penValue, double CRValue);
296
297 int storePenNodeData(const NodeDescriptor& iNode,
298 int iField, int iFieldSize,
299 double* iCoefs,
300 const NodeDescriptor& jNode,
301 int jField, int jFieldSize,
302 double* jCoefs,
303 double penValue, double CRValue);
304
305 void allocElemStuff();
306
307 int resolveConflictingCRs(EqnBuffer& bcEqns);
308
309 int giveToMatrix_symm_noSlaves(int numPtRows,
310 const int* ptRowNumbers,
311 const double* const* coefs,
312 int mode);
313
314 int giveToBlkMatrix_symm_noSlaves(int numPtRows, const int* ptRows,
315 int numBlkRows, const int* blkRowNumbers,
316 const int* blkRowSizes,
317 const double* const* coefs,
318 int mode);
319
320 int giveToMatrix(int numPtRows, const int* ptRows,
321 int numPtCols, const int* ptCols,
322 const double* const* values,
323 int mode);
324
325 int giveToLocalReducedMatrix(int numPtRows, const int* ptRows,
326 int numPtCols, const int* ptCols,
327 const double* const* values,
328 int mode);
329
330 int getFromMatrix(int numPtRows, const int* ptRows,
331 const int* rowColOffsets, const int* ptCols,
332 int numColsPerRow, double** values);
333
334 int sumIntoMatrix(fei::CSRMat& mat);
335
336 int getEqnsFromMatrix(ProcEqns& procEqns, EqnBuffer& eqnData);
337
338 int getEqnsFromRHS(ProcEqns& procEqns, EqnBuffer& eqnData);
339
340 int giveToRHS(int num, const double* values,
341 const int* indices, int mode);
342
343 int giveToLocalReducedRHS(int num, const double* values,
344 const int* indices, int mode);
345
346 int getFromRHS(int num, double* values, const int* indices);
347
348 int sumIntoRHS(fei::CSVec& vec);
349
350 int getEqnSolnEntry(int eqnNumber, double& solnValue);
351
352 int getSharedRemoteSolnEntry(int eqnNumber, double& solnValue);
353
354 int getReducedSolnEntry(int eqnNumber, double& solnValue);
355
356 int formResidual(double* residValues, int numLocalEqns);
357
358 int getRemoteSharedEqns(int numPtRows, const int* ptRows,
359 ProcEqns& remoteProcEqns);
360
361 int resetTheMatrix(double s);
362 int resetTheRHSVector(double s);
363
364 int assembleEqns(int numPtRows,
365 int numPtCols,
366 const int* rowNumbers,
367 const int* colIndices,
368 const double* const* coefs,
369 bool structurallySymmetric,
370 int numBlkEqns, int* blkEqns, int* blkSizes,
371 bool useBlkEqns, int mode);
372
374
375 int assembleRHS(int numValues, const int* indices, const double* coefs, int mode);
376
377 int assembleReducedRHS();
378
379 void debugOutput(const char* mesg);
380
382
383//==============================================================================
384//private LinSysCoreFilter variables
385//==============================================================================
386 private:
387
389
392
394
402
404
408
411
414
418 std::vector<int> rhsIDs_;
419
421
424
427
428 std::vector<int> rowIndices_;
429 std::vector<int> rowColOffsets_, colIndices_;
430
435 std::vector<int> rSlave_, cSlave_;
436
438 fei::DirichletBCManager* bcManager_; //Boundary condition manager
439
440 EqnCommMgr* eqnCommMgr_; //equation communication manager
441 EqnCommMgr* eqnCommMgr_put_; //only created if users call the 'put'
442 // functions
443
445 std::vector<int> scatterIndices_;
446 std::vector<int> blkScatterIndices_;
447 std::vector<int> iworkSpace_, iworkSpace2_;
448 std::vector<double> dworkSpace_;
449 std::vector<const double*> dworkSpace2_;
450
451 double** eStiff_;
452 double* eStiff1D_;
453 double* eLoad_;
454};
455
456#endif
457
int assembleEqns(int numPtRows, int numPtCols, const int *rowNumbers, const int *colIndices, const double *const *coefs, bool structurallySymmetric, int numBlkEqns, int *blkEqns, int *blkSizes, bool useBlkEqns, int mode)
virtual int getCRMultipliers(int numCRs, const int *CRIDs, double *multipliers)
std::vector< int > rowColOffsets_
std::vector< int > rSlave_
virtual int residualNorm(int whichNorm, int numFields, int *fieldIDs, double *norms, double &residTime)
virtual int setNumRHSVectors(int numRHSs, int *rhsIDs)
int getSharedRemoteSolnEntry(int eqnNumber, double &solnValue)
std::vector< int > colIndices_
virtual int resetMatrix(double s)
int formResidual(double *residValues, int numLocalEqns)
virtual int putBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int dofPerElem, const double *estimates)
virtual int getBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int &numElemDOFPerElement, double *results)
virtual int enforceRemoteEssBCs(int numEqns, const int *eqns, const int *const *colIndices, const int *colIndLens, const double *const *coefs)
virtual int loadCRPen(int CRPenID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue, double penValue)
int storeNodalRowCoefs(const NodeDescriptor &node, int fieldID, int fieldSize, double *coefs, int eqn)
virtual int putBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, const double *estimates)
int resetTheRHSVector(double s)
fei::FillableMat * Kid_
virtual int sumInElemRHS(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *elemLoad)
int getRemoteSharedEqns(int numPtRows, const int *ptRows, ProcEqns &remoteProcEqns)
void storeNodalSendIndex(const NodeDescriptor &node, int fieldID, int col)
std::vector< const double * > dworkSpace2_
int loadFEDataPenCR(int CRID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue, double penValue)
SNL_FEI_Structure * problemStructure_
std::vector< int > iworkSpace_
virtual int iterations() const
int getEqnsFromRHS(ProcEqns &procEqns, EqnBuffer &eqnData)
void storePenNodeSendData(const NodeDescriptor &iNode, int iField, int iFieldSize, double *iCoefs, const NodeDescriptor &jNode, int jField, int jFieldSize, double *jCoefs, double penValue, double CRValue)
std::vector< int > rowIndices_
virtual int getNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
int getEqnsFromMatrix(ProcEqns &procEqns, EqnBuffer &eqnData)
std::vector< int > rhsIDs_
int getFromRHS(int num, double *values, const int *indices)
virtual int getNodalSolution(int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
int giveToMatrix_symm_noSlaves(int numPtRows, const int *ptRowNumbers, const double *const *coefs, int mode)
virtual int putIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)
virtual int getBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
virtual int parameters(int numParams, const char *const *paramStrings)
LinSysCoreFilter(FEI_Implementation *owner, MPI_Comm comm, SNL_FEI_Structure *probStruct, LinearSystemCore *lsc, int masterRank=0)
int getEqnSolnEntry(int eqnNumber, double &solnValue)
virtual int loadElemBCs(int numElems, const GlobalID *elemIDs, int fieldID, const double *const *alpha, const double *const *beta, const double *const *gamma)
virtual int sumIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)
int getReducedSolnEntry(int eqnNumber, double &solnValue)
virtual int putNodalFieldData(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)
virtual int putNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)
fei::FillableMat * Kdd_
std::vector< int > blkScatterIndices_
virtual int putBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, const int *offsets, const double *estimates)
int sumIntoMatrix(fei::CSRMat &mat)
int unpackRemoteContributions(EqnCommMgr &eqnCommMgr, int assemblyMode)
virtual int solve(int &status, double &sTime)
virtual int getBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
virtual int enforceEssentialBCs(const int *eqns, const double *alpha, const double *gamma, int numEqns)
virtual int sumInElemMatrix(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, int elemFormat)
virtual int exchangeRemoteEquations()
virtual int resetSystem(double s)
fei::FillableMat * Kdi_
void storeNodalSendIndices(const NodeDescriptor &iNode, int iField, const NodeDescriptor &jNode, int jField)
std::vector< int > scatterIndices_
virtual int sumInElem(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, const double *elemLoad, int elemFormat)
void debugOutput(const char *mesg)
int giveToLocalReducedMatrix(int numPtRows, const int *ptRows, int numPtCols, const int *ptCols, const double *const *values, int mode)
void setEqnCommMgr(EqnCommMgr *eqnCommMgr)
int assembleRHS(int numValues, const int *indices, const double *coefs, int mode)
virtual int setCurrentRHS(int rhsID)
void storeNodalSendEqn(const NodeDescriptor &node, int fieldID, int col, double *coefs)
int giveToRHS(int num, const double *values, const int *indices, int mode)
fei::DirichletBCManager * bcManager_
std::vector< int > cSlave_
int resolveConflictingCRs(EqnBuffer &bcEqns)
int storeNodalColumnCoefs(int eqn, const NodeDescriptor &node, int fieldID, int fieldSize, double *coefs)
int giveToLocalReducedRHS(int num, const double *values, const int *indices, int mode)
int generalElemInput(GlobalID elemBlockID, GlobalID elemID, const double *const *elemStiffness, const double *elemLoad, int elemFormat)
virtual int resetInitialGuess(double s)
int storePenNodeData(const NodeDescriptor &iNode, int iField, int iFieldSize, double *iCoefs, const NodeDescriptor &jNode, int jField, int jFieldSize, double *jCoefs, double penValue, double CRValue)
virtual int loadNodeBCs(int numNodes, const GlobalID *nodeIDs, int fieldID, const int *offsetsIntoField, const double *prescribedValues)
std::vector< int > iworkSpace2_
int giveToMatrix(int numPtRows, const int *ptRows, int numPtCols, const int *ptCols, const double *const *values, int mode)
int loadFEDataMultCR(int CRID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue)
virtual int putCRMultipliers(int numMultCRs, const int *CRIDs, const double *multEstimates)
virtual int resetRHSVector(double s)
std::vector< double > dworkSpace_
LinearSystemCore * lsc_
int giveToBlkMatrix_symm_noSlaves(int numPtRows, const int *ptRows, int numBlkRows, const int *blkRowNumbers, const int *blkRowSizes, const double *const *coefs, int mode)
virtual int exchangeRemoteBCs(std::vector< int > &essEqns, std::vector< double > &essAlpha, std::vector< double > &essGamma)
int getFromMatrix(int numPtRows, const int *ptRows, const int *rowColOffsets, const int *ptCols, int numColsPerRow, double **values)
virtual int loadCRMult(int CRMultID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue)
int GlobalID
Definition fei_defs.h:60
#define MPI_Comm
Definition fei_mpi.h:56