Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef SUNDANCE_FUNCTION_SUPPORT_RESOLVER_H
00043 #define SUNDANCE_FUNCTION_SUPPORT_RESOLVER_H
00044
00045 #include "SundanceDefs.hpp"
00046 #include "SundanceExpr.hpp"
00047 #include "SundanceSet.hpp"
00048 #include "SundanceMap.hpp"
00049 #include "SundanceOrderedHandle.hpp"
00050 #include "SundanceCellFilterStub.hpp"
00051
00052
00053 namespace Sundance
00054 {
00055
00056 class SumOfIntegrals;
00057 class SumOfBCs;
00058 class CommonFuncDataStub;
00059
00060
00061 class FunctionSupportResolver
00062 {
00063 public:
00064
00065 FunctionSupportResolver(
00066 const Expr& eqns,
00067 const Expr& bcs,
00068 const Array<Expr>& vars,
00069 const Array<Expr>& unks,
00070 const Expr& unkParams,
00071 const Expr& params,
00072 const Array<Expr>& fixedFields,
00073 bool isVariational);
00074
00075
00076
00077
00078
00079 int numVarBlocks() const {return varFuncs_.size();}
00080
00081
00082 int numUnkBlocks() const {return unkFuncs_.size();}
00083
00084
00085 int numUnkParams() const {return unkParams_.size();}
00086
00087
00088 int numFixedParams() const {return fixedParams_.size();}
00089
00090
00091 int numVars(int block) const {return varFuncs_[block].size();}
00092
00093
00094 int numUnks(int block) const {return unkFuncs_[block].size();}
00095
00096
00097
00098
00099
00100 int numVarIDs(int block) const {return varFuncData_[block].size();}
00101
00102
00103
00104
00105
00106 int numUnkIDs(int block) const {return unkFuncData_[block].size();}
00107
00108
00109 RCP<const CommonFuncDataStub> varFuncData(int b, int i) const {return varFuncData_[b][i];}
00110
00111
00112 RCP<const CommonFuncDataStub> unkFuncData(int b, int i) const {return unkFuncData_[b][i];}
00113
00114
00115 const Expr& unkParam(int i) const {return unkParams_[i];}
00116
00117
00118
00119 bool hasVarID(int fid) const
00120 {return varIDToBlockMap_.containsKey(fid);}
00121
00122
00123
00124 bool hasUnkID(int fid) const
00125 {return unkIDToBlockMap_.containsKey(fid);}
00126
00127
00128
00129 bool hasUnkParamID(int fid) const
00130 {return unkParamIDToReducedUnkParamIDMap_.containsKey(fid);}
00131
00132
00133
00134 bool hasFixedParamID(int fid) const
00135 {return fixedParamIDToReducedFixedParamIDMap_.containsKey(fid);}
00136
00137
00138
00139 int blockForVarID(int varID) const ;
00140
00141
00142
00143 int blockForUnkID(int unkID) const ;
00144
00145
00146
00147
00148
00149
00150
00151 const Set<int>& varsOnRegion(int d) const
00152 {return varsOnRegions_.get(regions_[d]);}
00153
00154
00155
00156 const Set<int>& unksOnRegion(int d) const
00157 {return unksOnRegions_.get(regions_[d]);}
00158
00159
00160
00161
00162 const Set<int>& bcVarsOnRegion(int d) const
00163 {return bcVarsOnRegions_.get(regions_[d]);}
00164
00165
00166
00167
00168 const Set<int>& bcUnksOnRegion(int d) const
00169 {return bcUnksOnRegions_.get(regions_[d]);}
00170
00171
00172
00173 const Array<Set<int> >& reducedVarsOnRegion(const OrderedHandle<CellFilterStub>& r) const
00174 {return reducedVarsOnRegions_[indexForRegion(r)];}
00175
00176
00177
00178 const Array<Set<int> >& reducedUnksOnRegion(const OrderedHandle<CellFilterStub>& r) const
00179 {return reducedUnksOnRegions_[indexForRegion(r)];}
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 int reducedVarID(int varID) const ;
00190
00191
00192
00193 int reducedUnkID(int unkID) const ;
00194
00195
00196
00197 int reducedUnkParamID(int unkID) const ;
00198
00199
00200
00201 int reducedFixedParamID(int unkID) const ;
00202
00203
00204
00205 int unreducedVarID(int block, int reducedVarID) const
00206 {return unreducedVarID_[block][reducedVarID];}
00207
00208
00209
00210 int unreducedUnkID(int block, int reducedUnkID) const
00211 {return unreducedUnkID_[block][reducedUnkID];}
00212
00213
00214
00215 int unreducedUnkParamID(int reducedUnkParamID) const
00216 {return unreducedUnkParamID_[reducedUnkParamID];}
00217
00218
00219
00220 int unreducedFixedParamID(int reducedFixedParamID) const
00221 {return unreducedFixedParamID_[reducedFixedParamID];}
00222
00223
00224 const Map<int, int>& fixedParamIDToReducedFixedParamIDMap() const
00225 {return fixedParamIDToReducedFixedParamIDMap_;}
00226
00227
00228
00229
00230
00231
00232
00233
00234 int numRegions() const {return regions_.size();}
00235
00236
00237 const RCP<CellFilterStub>& region(int d) const
00238 {return regions_[d].ptr();}
00239
00240
00241 int indexForRegion(const OrderedHandle<CellFilterStub>& region) const ;
00242
00243
00244 bool isBCRegion(int d) const
00245 {return bcVarsOnRegions_.containsKey(regions_[d]);}
00246
00247
00248
00249
00250 const Set<OrderedHandle<CellFilterStub> >&
00251 regionsForTestFunc(int unreducedTestID) const ;
00252
00253
00254
00255 const Set<OrderedHandle<CellFilterStub> >&
00256 regionsForUnkFunc(int unreducedUnkID) const ;
00257
00258
00259
00260
00261
00262
00263 Expr flattenSpectral(const Expr& input) const ;
00264
00265
00266
00267 Array<Expr> flattenSpectral(const Array<Expr>& input) const ;
00268
00269
00270 bool hasBCs() const ;
00271
00272
00273 const SumOfIntegrals* integralSum() const {return integralSum_;}
00274
00275
00276 const SumOfBCs* bcSum() const {return bcSum_;}
00277
00278
00279 const Array<Expr>& unks() const {return unkFuncs_;}
00280
00281
00282 const Array<Expr>& vars() const {return varFuncs_;}
00283
00284
00285 const Array<Expr>& fixedFields() const {return fixedFields_;}
00286
00287
00288 const Expr& fixedParams() const {return fixedParams_;}
00289
00290
00291 const Expr& unkParams() const {return unkParams_;}
00292
00293
00294 const Set<int>& varFuncSet() const {return varFuncSet_;}
00295
00296 const Set<int>& unkFuncSet() const {return unkFuncSet_;}
00297
00298 const Set<int>& unkParamSet() const {return unkParamSet_;}
00299
00300 const Set<int>& fixedParamSet() const {return fixedParamSet_;}
00301
00302
00303 private:
00304
00305
00306 Expr eqns_;
00307
00308
00309 Expr bcs_;
00310
00311
00312 const SumOfIntegrals* integralSum_;
00313
00314
00315 const SumOfBCs* bcSum_;
00316
00317
00318 Set<int> varFuncSet_;
00319
00320
00321 Set<int> unkFuncSet_;
00322
00323
00324 Set<int> unkParamSet_;
00325
00326
00327 Set<int> fixedParamSet_;
00328
00329
00330 Array<OrderedHandle<CellFilterStub> > regions_;
00331
00332
00333 Map<OrderedHandle<CellFilterStub>, int> regionToIndexMap_;
00334
00335
00336 Map<OrderedHandle<CellFilterStub>, Set<int> > varsOnRegions_;
00337
00338
00339 Map<OrderedHandle<CellFilterStub>, Set<int> > unksOnRegions_;
00340
00341
00342 Array<Array<Set<int> > > reducedVarsOnRegions_;
00343
00344
00345 Array<Array<Set<int> > > reducedUnksOnRegions_;
00346
00347
00348 Map<OrderedHandle<CellFilterStub>, Set<int> > bcVarsOnRegions_;
00349
00350
00351 Map<OrderedHandle<CellFilterStub>, Set<int> > bcUnksOnRegions_;
00352
00353
00354 Map<int, Set<OrderedHandle<CellFilterStub> > > testToRegionsMap_;
00355
00356
00357 Map<int, Set<OrderedHandle<CellFilterStub> > > unkToRegionsMap_;
00358
00359
00360 Array<Array<RCP<const CommonFuncDataStub> > > varFuncData_;
00361
00362
00363 Array<Array<RCP<const CommonFuncDataStub> > > unkFuncData_;
00364
00365
00366 Array<Expr> varFuncs_;
00367
00368
00369 Array<Expr> unkFuncs_;
00370
00371
00372 Array<Expr> fixedFields_;
00373
00374
00375
00376 Array<Expr> unkLinearizationPts_;
00377
00378
00379 Expr unkParams_;
00380
00381
00382 Expr fixedParams_;
00383
00384
00385
00386 Array<Map<int, int> > varIDToReducedIDMap_;
00387
00388
00389
00390 Array<Map<int, int> > unkIDToReducedIDMap_;
00391
00392
00393
00394 Map<int, int> unkParamIDToReducedUnkParamIDMap_;
00395
00396
00397
00398 Map<int, int> fixedParamIDToReducedFixedParamIDMap_;
00399
00400
00401
00402 Map<int, int> varIDToBlockMap_;
00403
00404
00405
00406 Map<int, int> unkIDToBlockMap_;
00407
00408
00409 Array<Array<int> > reducedVarID_;
00410
00411
00412 Array<Array<int> > reducedUnkID_;
00413
00414
00415 Array<int> reducedUnkParamID_;
00416
00417
00418 Array<int> reducedFixedParamID_;
00419
00420
00421 Array<Array<int> > unreducedVarID_;
00422
00423
00424 Array<Array<int> > unreducedUnkID_;
00425
00426
00427 Array<int> unreducedUnkParamID_;
00428
00429
00430 Array<int> unreducedFixedParamID_;
00431
00432
00433 bool isNonlinear_;
00434
00435
00436
00437 bool isVariationalProblem_;
00438 };
00439
00440
00441 RCP<const CommonFuncDataStub> getSharedFunctionData(const FuncElementBase* f);
00442
00443 }
00444
00445 #endif