1 #ifndef _LinSysCoreFilter_hpp_
2 #define _LinSysCoreFilter_hpp_
12 #include "fei_macros.hpp"
14 #include "fei_fwd.hpp"
15 #include "fei_Filter.hpp"
16 #include <fei_CSRMat.hpp>
17 #include <fei_CSVec.hpp>
20 class DirichletBCManager;
47 virtual int resetSystem(
double s);
48 virtual int resetMatrix(
double s);
49 virtual int resetRHSVector(
double s);
50 virtual int resetInitialGuess(
double s);
52 virtual int deleteMultCRs();
54 virtual int loadNodeBCs(
int numNodes,
55 const GlobalID *nodeIDs,
57 const int* offsetsIntoField,
58 const double* prescribedValues);
60 virtual int loadElemBCs(
int numElems,
61 const GlobalID *elemIDs,
63 const double *
const *alpha,
64 const double *
const *beta,
65 const double *
const *gamma);
67 virtual int sumInElem(GlobalID elemBlockID,
69 const GlobalID* elemConn,
70 const double*
const* elemStiffness,
71 const double* elemLoad,
74 virtual int sumInElemMatrix(GlobalID elemBlockID,
76 const GlobalID* elemConn,
77 const double*
const* elemStiffness,
80 virtual int sumInElemRHS(GlobalID elemBlockID,
82 const GlobalID* elemConn,
83 const double* elemLoad);
85 virtual int loadCRMult(
int CRMultID,
87 const GlobalID* CRNodes,
89 const double* CRWeights,
92 virtual int loadCRPen(
int CRPenID,
94 const GlobalID* CRNodes,
96 const double* CRWeights,
100 virtual int putIntoRHS(
int IDType,
104 const double* rhsEntries);
106 virtual int sumIntoRHS(
int IDType,
110 const double* rhsEntries);
112 virtual int loadComplete();
115 virtual int parameters(
int numParams,
const char *
const* paramStrings);
118 virtual int residualNorm(
int whichNorm,
int numFields,
119 int* fieldIDs,
double* norms,
double& residTime);
122 virtual int solve(
int& status,
double& sTime);
125 virtual int iterations()
const {
return(iterations_);};
130 virtual int getBlockNodeSolution(GlobalID elemBlockID,
132 const GlobalID *nodeIDs,
136 virtual int getNodalSolution(
int numNodes,
137 const GlobalID *nodeIDs,
142 virtual int getBlockFieldNodeSolution(GlobalID elemBlockID,
145 const GlobalID *nodeIDs,
149 virtual int getBlockElemSolution(GlobalID elemBlockID,
151 const GlobalID *elemIDs,
152 int& numElemDOFPerElement,
155 virtual int getCRMultipliers(
int numCRs,
const int* CRIDs,
double* multipliers);
168 virtual int putBlockNodeSolution(GlobalID elemBlockID,
170 const GlobalID *nodeIDs,
172 const double *estimates);
175 virtual int putBlockFieldNodeSolution(GlobalID elemBlockID,
178 const GlobalID *nodeIDs,
179 const double *estimates);
182 virtual int putBlockElemSolution(GlobalID elemBlockID,
184 const GlobalID *elemIDs,
186 const double *estimates);
188 virtual int putCRMultipliers(
int numMultCRs,
190 const double *multEstimates);
197 virtual int getNodalFieldSolution(
int fieldID,
199 const GlobalID* nodeIDs,
202 virtual int putNodalFieldData(
int fieldID,
204 const GlobalID* nodeIDs,
205 const double* nodeData);
207 virtual int putNodalFieldSolution(
int fieldID,
209 const GlobalID* nodeIDs,
210 const double* nodeData);
212 virtual int unpackSolution();
216 EqnCommMgr* getEqnCommMgr() {
return(eqnCommMgr_);};
218 virtual int setNumRHSVectors(
int numRHSs,
int* rhsIDs);
219 virtual int setCurrentRHS(
int rhsID);
221 virtual int exchangeRemoteEquations();
222 virtual int exchangeRemoteBCs(std::vector<int>& essEqns,
223 std::vector<double>& essAlpha,
224 std::vector<double>& essGamma);
226 virtual int implementAllBCs();
228 virtual int enforceEssentialBCs(
const int* eqns,
const double* alpha,
229 const double* gamma,
int numEqns);
231 virtual int enforceRemoteEssBCs(
int numEqns,
const int* eqns,
232 const int*
const* colIndices,
const int* colIndLens,
233 const double*
const* coefs);
235 virtual int initialize();
241 int initLinSysCore();
242 void setLinSysCoreCREqns();
244 int unpackRemoteContributions(
EqnCommMgr& eqnCommMgr,
247 int loadFEDataMultCR(
int CRID,
249 const GlobalID* CRNodes,
251 const double* CRWeights,
254 int loadFEDataPenCR(
int CRID,
256 const GlobalID* CRNodes,
258 const double* CRWeights,
263 int fieldID,
int fieldSize,
267 int fieldID,
int fieldSize,
268 double* coefs,
int eqn);
270 int generalElemInput(GlobalID elemBlockID,
272 const double*
const* elemStiffness,
273 const double* elemLoad,
276 int generalElemInput(GlobalID elemBlockID,
278 const GlobalID* elemConn,
279 const double*
const* elemStiffness,
280 const double* elemLoad,
283 void storeNodalSendIndex(
const NodeDescriptor& node,
int fieldID,
int col);
284 void storeNodalSendEqn(
const NodeDescriptor& node,
int fieldID,
int col,
286 void storeNodalSendIndices(
const NodeDescriptor& iNode,
int iField,
290 int iField,
int iFieldSize,
293 int jField,
int jFieldSize,
295 double penValue,
double CRValue);
298 int iField,
int iFieldSize,
301 int jField,
int jFieldSize,
303 double penValue,
double CRValue);
305 void allocElemStuff();
307 int resolveConflictingCRs(
EqnBuffer& bcEqns);
309 int giveToMatrix_symm_noSlaves(
int numPtRows,
310 const int* ptRowNumbers,
311 const double*
const* coefs,
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,
320 int giveToMatrix(
int numPtRows,
const int* ptRows,
321 int numPtCols,
const int* ptCols,
322 const double*
const* values,
325 int giveToLocalReducedMatrix(
int numPtRows,
const int* ptRows,
326 int numPtCols,
const int* ptCols,
327 const double*
const* values,
330 int getFromMatrix(
int numPtRows,
const int* ptRows,
331 const int* rowColOffsets,
const int* ptCols,
332 int numColsPerRow,
double** values);
340 int giveToRHS(
int num,
const double* values,
341 const int* indices,
int mode);
343 int giveToLocalReducedRHS(
int num,
const double* values,
344 const int* indices,
int mode);
346 int getFromRHS(
int num,
double* values,
const int* indices);
350 int getEqnSolnEntry(
int eqnNumber,
double& solnValue);
352 int getSharedRemoteSolnEntry(
int eqnNumber,
double& solnValue);
354 int getReducedSolnEntry(
int eqnNumber,
double& solnValue);
356 int formResidual(
double* residValues,
int numLocalEqns);
358 int getRemoteSharedEqns(
int numPtRows,
const int* ptRows,
361 int resetTheMatrix(
double s);
362 int resetTheRHSVector(
double s);
364 int assembleEqns(
int numPtRows,
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);
373 int assembleReducedEqns();
375 int assembleRHS(
int numValues,
const int* indices,
const double* coefs,
int mode);
377 int assembleReducedRHS();
379 void debugOutput(
const char* mesg);
381 int createEqnCommMgr_put();
388 int timesInitializeCalled_;
397 bool newConstraintData_;
399 bool connectivitiesInitialized_;
400 bool firstRemEqnExchange_;
401 bool needToCallMatrixLoadComplete_;
403 bool resolveConflictRequested_;
405 int localStartRow_, localEndRow_, numLocalEqns_, numGlobalEqns_;
406 int reducedStartRow_, reducedEndRow_, numReducedRows_;
407 int numLocallyOwnedNodes_, numGlobalNodes_, firstLocalNodeNumber_;
410 bool tooLateToChooseBlock_;
412 int numLocalEqnBlks_;
413 int localReducedBlkOffset_, numLocalReducedEqnBlks_;
418 std::vector<int> rhsIDs_;
426 bool matrixAllocated_;
428 std::vector<int> rowIndices_;
429 std::vector<int> rowColOffsets_, colIndices_;
431 fei::FillableMat *Kid_, *Kdi_, *Kdd_;
432 fei::CSRMat csrD, csrKid, csrKdi, csrKdd, tmpMat1_, tmpMat2_;
434 int reducedEqnCounter_, reducedRHSCounter_;
435 std::vector<int> rSlave_, cSlave_;
438 fei::DirichletBCManager* bcManager_;
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_;