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