FEI Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
fei_Filter.hpp
Go to the documentation of this file.
1 #ifndef _Filter_hpp_
2 #define _Filter_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_fwd.hpp>
13 #include <fei_defs.h>
14 #include <fei_macros.hpp>
15 #include <fei_iostream.hpp>
16 
27 class Filter {
28 
29  public:
31  Filter(SNL_FEI_Structure* probStruct);
32 
34  virtual ~Filter();
35 
36  virtual int initialize() = 0;
37 
38  // set a value (usually zeros) throughout the linear system
39  virtual int resetSystem(double s) = 0;
40  virtual int resetMatrix(double s) = 0;
41  virtual int resetRHSVector(double s) = 0;
42  virtual int resetInitialGuess(double s) = 0;
43 
44  virtual int deleteMultCRs() = 0;
45 
46  virtual int loadNodeBCs(int /*numNodes*/,
47  const GlobalID* /*nodeIDs*/,
48  int /*fieldID*/,
49  const int* /*offsetsIntoField*/,
50  const double* /*prescribedValues*/)
51  {
52  fei::console_out() << "fei ERROR, Filter::loadNodeBCs not overridden."<<FEI_ENDL;
53  return -1;
54  }
55 
56  virtual int loadElemBCs(int numElems,
57  const GlobalID *elemIDs,
58  int fieldID,
59  const double *const *alpha,
60  const double *const *beta,
61  const double *const *gamma) = 0;
62 
63  virtual int sumInElem(GlobalID /*elemBlockID*/,
64  GlobalID /*elemID*/,
65  const GlobalID* /*elemConn*/,
66  const double* const* /*elemStiffness*/,
67  const double* /*elemLoad*/,
68  int /*elemFormat*/) { return(0); }
69 
70  virtual int sumInElemMatrix(GlobalID /*elemBlockID*/,
71  GlobalID /*elemID*/,
72  const GlobalID* /*elemConn*/,
73  const double* const* /*elemStiffness*/,
74  int /*elemFormat*/) { return(0); }
75 
76  virtual int sumInElemRHS(GlobalID /*elemBlockID*/,
77  GlobalID /*elemID*/,
78  const GlobalID* /*elemConn*/,
79  const double* /*elemLoad*/) { return(0); }
80 
81  virtual int loadCRMult(int CRMultID,
82  int numCRNodes,
83  const GlobalID* CRNodes,
84  const int* CRFields,
85  const double* CRWeights,
86  double CRValue) = 0;
87 
88  virtual int loadCRPen(int CRPenID,
89  int numCRNodes,
90  const GlobalID* CRNodes,
91  const int *CRFields,
92  const double* CRWeights,
93  double CRValue,
94  double penValue) = 0;
95 
96  virtual int putIntoRHS(int IDType,
97  int fieldID,
98  int numIDs,
99  const GlobalID* IDs,
100  const double* rhsEntries) = 0;
101 
102  virtual int sumIntoRHS(int IDType,
103  int fieldID,
104  int numIDs,
105  const GlobalID* IDs,
106  const double* rhsEntries) = 0;
107 
108  virtual int sumIntoMatrixDiagonal(int /* IDType*/,
109  int /* fieldID*/,
110  int /* numIDs*/,
111  const GlobalID* /* IDs*/,
112  const double* /* coefficients*/)
113  { return -1; }
114 
115  virtual int loadComplete() = 0;
116 
117  // set parameters associated with solver choice, etc.
118  virtual int parameters(int numParams, const char *const* paramStrings);
119 
120  //get residual norms
121  virtual int residualNorm(int whichNorm, int numFields,
122  int* fieldIDs, double* norms, double& residTime) = 0;
123 
124  // start iterative solution
125  virtual int solve(int& status, double& sTime) = 0;
126 
127  // query function iterations performed.
128  virtual int iterations() const = 0;
129 
130 // Solution return services.......................................
131 
132  // return all nodal solution params on a block-by-block basis
133  virtual int getBlockNodeSolution(GlobalID elemBlockID,
134  int numNodes,
135  const GlobalID *nodeIDs,
136  int *offsets,
137  double *results) = 0;
138 
139  virtual int getNodalSolution(int numNodes,
140  const GlobalID *nodeIDs,
141  int *offsets,
142  double *results) = 0;
143 
144  // return nodal solution for one field on a block-by-block basis
145  virtual int getBlockFieldNodeSolution(GlobalID elemBlockID,
146  int fieldID,
147  int numNodes,
148  const GlobalID *nodeIDs,
149  double *results) = 0;
150 
151  // return element solution params on a block-by-block basis
152  virtual int getBlockElemSolution(GlobalID elemBlockID,
153  int numElems,
154  const GlobalID *elemIDs,
155  int& numElemDOFPerElement,
156  double *results) = 0;
157 
158  virtual int getCRMultipliers(int numCRs, const int* CRIDs,
159  double* multipliers) = 0;
160 
161 // associated "puts" paralleling the solution return services.
162 //
163 // the int sizing parameters are passed for error-checking purposes, so
164 // that the interface implementation can tell if the passed estimate
165 // vectors make sense -before- an attempt is made to utilize them as
166 // initial guesses by unpacking them into the solver's native solution
167 // vector format (these parameters include lenNodeIDList, lenElemIDList,
168 // numElemDOF, and numMultCRs -- all other passed params are either
169 // vectors or block/constraint-set IDs)
170 
171  // put nodal-based solution guess on a block-by-block basis
172  virtual int putBlockNodeSolution(GlobalID elemBlockID,
173  int numNodes,
174  const GlobalID *nodeIDs,
175  const int *offsets,
176  const double *estimates) = 0;
177 
178  // put nodal-based guess for one field on a block-by-block basis
179  virtual int putBlockFieldNodeSolution(GlobalID elemBlockID,
180  int fieldID,
181  int numNodes,
182  const GlobalID *nodeIDs,
183  const double *estimates) = 0;
184 
185  virtual int putBlockElemSolution(GlobalID elemBlockID,
186  int numElems,
187  const GlobalID *elemIDs,
188  int dofPerElem,
189  const double *estimates) = 0;
190 
191  virtual int putCRMultipliers(int numMultCRs,
192  const int* CRIDs,
193  const double *multEstimates) = 0;
194 
195 //===== a couple of public non-FEI functions... ================================
196 //These are intended to be used by an 'outer-layer' class like
197 //FEI_Implementation.
198 //
199  public:
200 
201  virtual int getNodalFieldSolution(int fieldID,
202  int numNodes,
203  const GlobalID* nodeIDs,
204  double* results) = 0;
205 
206  virtual int putNodalFieldData(int fieldID,
207  int numNodes,
208  const GlobalID* nodeIDs,
209  const double* nodeData) = 0;
210 
211  virtual int putNodalFieldSolution(int fieldID,
212  int numNodes,
213  const GlobalID* nodeIDs,
214  const double* nodeData) = 0;
215 
216  virtual int unpackSolution() = 0;
217 
218  virtual void setEqnCommMgr(EqnCommMgr* eqnCommMgr) = 0;
219 
220  virtual EqnCommMgr* getEqnCommMgr() = 0;
221 
222  virtual int setNumRHSVectors(int numRHSs, int* rhsIDs) = 0;
223  virtual int setCurrentRHS(int rhsID) = 0;
224 
225  virtual int exchangeRemoteEquations() { return 0; }
226 
227  virtual int enforceEssentialBCs(const int* eqns, const double* alpha,
228  const double* gamma, int numEqns) = 0;
229 
230  static void copyStiffness(const double* const* elemStiff, int numRows,
231  int elemFormat, double** copy);
232 
233  void setLogStream(std::ostream* logstrm);
234  std::ostream* logStream();
235 
236  protected:
237  virtual int generalElemInput(GlobalID /*elemBlockID*/,
238  GlobalID /*elemID*/,
239  const GlobalID* /*elemConn*/,
240  const double* const* /*elemStiffness*/,
241  const double* /*elemLoad*/,
242  int /*elemFormat*/) {return(-1);}
243 
244  int generalCoefInput(int /*patternID*/,
245  const int* /*rowIDTypes*/,
246  const GlobalID* /*rowIDs*/,
247  const int* /*colIDTypes*/,
248  const GlobalID* /*colIDs*/,
249  const double* const* /*matrixEntries*/,
250  const double* /*vectorEntries*/,
251  int /*numRows*/, int /*numCols*/) {return(-1);}
252 
253  int calculateResidualNorms(int whichNorm, int numFields,
254  int* fieldIDs, double* norms,
255  std::vector<double>& residValues);
256 
257  const NodeDescriptor* findNode(GlobalID nodeID) const;
258  const NodeDescriptor& findNodeDescriptor(GlobalID nodeID) const;
259 
261 
262  bool logInput_;
263  std::ostream* logInputStream_;
264 
266 
269 
270  private:
271  Filter(const Filter& /*src*/)
272  : problemStructure_(NULL), logInput_(false), logInputStream_(NULL),
274  {}
275 
276  Filter& operator=(const Filter& /*src*/)
277  {
278  return(*this);
279  }
280 };
281 
282 #endif
283 
virtual int residualNorm(int whichNorm, int numFields, int *fieldIDs, double *norms, double &residTime)=0
virtual int resetInitialGuess(double s)=0
Filter(SNL_FEI_Structure *probStruct)
Definition: fei_Filter.cpp:31
virtual ~Filter()
Definition: fei_Filter.cpp:40
virtual int getNodalSolution(int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)=0
virtual int getBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)=0
int localRank_
Definition: fei_Filter.hpp:268
Filter & operator=(const Filter &)
Definition: fei_Filter.hpp:276
int GlobalID
Definition: fei_defs.h:60
virtual int sumInElem(GlobalID, GlobalID, const GlobalID *, const double *const *, const double *, int)
Definition: fei_Filter.hpp:63
std::ostream * logStream()
Definition: fei_Filter.cpp:50
virtual int resetSystem(double s)=0
virtual int sumInElemMatrix(GlobalID, GlobalID, const GlobalID *, const double *const *, int)
Definition: fei_Filter.hpp:70
virtual int unpackSolution()=0
virtual int resetRHSVector(double s)=0
virtual int generalElemInput(GlobalID, GlobalID, const GlobalID *, const double *const *, const double *, int)
Definition: fei_Filter.hpp:237
virtual int parameters(int numParams, const char *const *paramStrings)
Definition: fei_Filter.cpp:283
virtual int putBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, const double *estimates)=0
virtual int putNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)=0
int outputLevel_
Definition: fei_Filter.hpp:265
virtual int putCRMultipliers(int numMultCRs, const int *CRIDs, const double *multEstimates)=0
virtual void setEqnCommMgr(EqnCommMgr *eqnCommMgr)=0
virtual int exchangeRemoteEquations()
Definition: fei_Filter.hpp:225
static void copyStiffness(const double *const *elemStiff, int numRows, int elemFormat, double **copy)
Definition: fei_Filter.cpp:56
virtual int setNumRHSVectors(int numRHSs, int *rhsIDs)=0
int calculateResidualNorms(int whichNorm, int numFields, int *fieldIDs, double *norms, std::vector< double > &residValues)
Definition: fei_Filter.cpp:161
virtual int setCurrentRHS(int rhsID)=0
virtual int sumIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)=0
virtual int putNodalFieldData(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)=0
virtual int sumIntoMatrixDiagonal(int, int, int, const GlobalID *, const double *)
Definition: fei_Filter.hpp:108
SNL_FEI_Structure * problemStructure_
Definition: fei_Filter.hpp:260
int generalCoefInput(int, const int *, const GlobalID *, const int *, const GlobalID *, const double *const *, const double *, int, int)
Definition: fei_Filter.hpp:244
virtual int loadElemBCs(int numElems, const GlobalID *elemIDs, int fieldID, const double *const *alpha, const double *const *beta, const double *const *gamma)=0
const NodeDescriptor & findNodeDescriptor(GlobalID nodeID) const
Definition: fei_Filter.cpp:145
virtual int putBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, const int *offsets, const double *estimates)=0
virtual int loadCRPen(int CRPenID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue, double penValue)=0
virtual int getBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int &numElemDOFPerElement, double *results)=0
virtual int resetMatrix(double s)=0
virtual int sumInElemRHS(GlobalID, GlobalID, const GlobalID *, const double *)
Definition: fei_Filter.hpp:76
void setLogStream(std::ostream *logstrm)
Definition: fei_Filter.cpp:44
Filter(const Filter &)
Definition: fei_Filter.hpp:271
virtual int getCRMultipliers(int numCRs, const int *CRIDs, double *multipliers)=0
#define FEI_ENDL
virtual int loadCRMult(int CRMultID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue)=0
std::ostream * logInputStream_
Definition: fei_Filter.hpp:263
std::ostream & console_out()
const NodeDescriptor * findNode(GlobalID nodeID) const
Definition: fei_Filter.cpp:135
virtual int enforceEssentialBCs(const int *eqns, const double *alpha, const double *gamma, int numEqns)=0
virtual int loadComplete()=0
virtual EqnCommMgr * getEqnCommMgr()=0
virtual int putBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int dofPerElem, const double *estimates)=0
int numProcs_
Definition: fei_Filter.hpp:267
virtual int solve(int &status, double &sTime)=0
virtual int initialize()=0
virtual int loadNodeBCs(int, const GlobalID *, int, const int *, const double *)
Definition: fei_Filter.hpp:46
virtual int getBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)=0
virtual int getNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)=0
virtual int deleteMultCRs()=0
bool logInput_
Definition: fei_Filter.hpp:262
virtual int iterations() const =0
virtual int putIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)=0