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