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_DOFMAPBUILDER_H
00032 #define SUNDANCE_DOFMAPBUILDER_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceDOFMapBase.hpp"
00036 #include "SundanceFunctionSupportResolver.hpp"
00037 #include "SundanceBasisFamily.hpp"
00038 #include "SundanceCellFilter.hpp"
00039 #include "SundanceCFMeshPair.hpp"
00040 #include "SundanceMap.hpp"
00041 #include "SundanceObjectWithVerbosity.hpp"
00042
00043 namespace Sundance
00044 {
00045
00046
00047
00048
00049
00050 class DOFMapBuilder
00051 {
00052 public:
00053
00054 DOFMapBuilder(int setupVerb);
00055
00056 DOFMapBuilder(const Mesh& mesh, const RCP<FunctionSupportResolver>& fsr,
00057 bool findBCCols, int setupVerb);
00058
00059
00060 const Array<RCP<DOFMapBase> >& rowMap() const {return rowMap_;}
00061
00062
00063 const Array<RCP<DOFMapBase> >& colMap() const {return colMap_;}
00064
00065
00066 const Array<RCP<Array<int> > >& isBCRow() const {return isBCRow_;}
00067
00068
00069 const Array<RCP<Array<int> > >& isBCCol() const {return isBCCol_;}
00070
00071
00072
00073 const Array<RCP<std::set<int> > >& remoteBCCols() const
00074 {return remoteBCCols_;}
00075
00076 Array<Array<RCP<BasisDOFTopologyBase> > > testBasisTopologyArray() const ;
00077
00078 Array<Array<RCP<BasisDOFTopologyBase> > > unkBasisTopologyArray() const ;
00079
00080 Array<Array<Set<CellFilter> > > testCellFilters() const ;
00081
00082 Array<Array<Set<CellFilter> > > unkCellFilters() const ;
00083
00084 const Mesh& mesh() const {return mesh_;}
00085
00086
00087
00088 RCP<DOFMapBase> makeMap(const Mesh& mesh,
00089 const Array<RCP<BasisDOFTopologyBase> >& basis,
00090 const Array<Set<CellFilter> >& filters) ;
00091
00092 bool hasOmnipresentNodalMap(const Array<RCP<BasisDOFTopologyBase> >& basis,
00093 const Mesh& mesh,
00094 const Array<Set<CellFilter> >& filters) const ;
00095
00096 bool hasCommonDomain(const Array<Set<CellFilter> >& filters) const ;
00097
00098 bool hasNodalBasis(const Array<RCP<BasisDOFTopologyBase> >& basis) const ;
00099
00100 bool hasEdgeLocalizedBasis(const Array<RCP<BasisDOFTopologyBase> >& basis) const ;
00101
00102 bool hasCellBasis(const Array<RCP<BasisDOFTopologyBase> >& basis) const ;
00103
00104 bool filtersAreZeroDimensional(const Mesh& mesh,
00105 const Array<Set<CellFilter> >& filters) const ;
00106
00107 bool allFuncsAreOmnipresent(const Mesh& mesh,
00108 const Array<Set<CellFilter> >& filters) const ;
00109
00110 bool isWholeDomain(const Mesh& mesh,
00111 int maxFilterDim,
00112 const Set<CellFilter>& filters) const ;
00113
00114 CellFilter getMaxCellFilter(const Array<Set<CellFilter> >& filters) const ;
00115
00116 static bool& allowNodalMap() {static bool rtn=true; return rtn;}
00117
00118
00119 void extractUnkSetsFromFSR(const FunctionSupportResolver& fsr,
00120 Array<Set<int> >& funcSets,
00121 Array<CellFilter>& regions) const ;
00122
00123
00124 void extractVarSetsFromFSR(const FunctionSupportResolver& fsr,
00125 Array<Set<int> >& funcSets,
00126 Array<CellFilter>& regions) const ;
00127
00128
00129 const RCP<FunctionSupportResolver>& fsr() const {return fsr_;}
00130
00131
00132 Sundance::Map<Set<int>, Set<CellFilter> >
00133 buildFuncSetToCFSetMap(const Array<Set<int> >& funcSets,
00134 const Array<CellFilter>& regions,
00135 const Mesh& mesh) const ;
00136
00137 void getSubdomainUnkFuncMatches(const FunctionSupportResolver& fsr,
00138 Array<Sundance::Map<CellFilter, Set<int> > >& fmap) const ;
00139
00140 void getSubdomainVarFuncMatches(const FunctionSupportResolver& fsr,
00141 Array<Sundance::Map<CellFilter, Set<int> > >& fmap) const ;
00142
00143 Array<Sundance::Map<Set<int>, CellFilter> >
00144 funcDomains(const Mesh& mesh,
00145 const Sundance::Map<CellFilter, Set<int> >& fmap,
00146 Sundance::Map<CellFilter, Sundance::Map<Set<int>, CellSet> >& inputToChildrenMap) const ;
00147
00148 Sundance::Map<CellFilter, Set<int> > domainToFuncSetMap(const Array<Set<CellFilter> >& filters) const ;
00149
00150 private:
00151
00152 Set<CellFilter> reduceCellFilters(const Mesh& mesh,
00153 const Set<CellFilter>& inputSet) const ;
00154
00155 bool hasUnks() const ;
00156
00157 bool unksAreOmnipresent() const ;
00158
00159 bool testsAreOmnipresent() const ;
00160
00161 bool regionIsMaximal(int r) const ;
00162
00163 bool isSymmetric(int block) const ;
00164
00165 void markBCRows(int block) ;
00166
00167 void markBCCols(int block) ;
00168
00169 const MPIComm& comm() const {return mesh().comm();}
00170
00171 void init(bool findBCCols);
00172
00173 int verb_;
00174
00175 Mesh mesh_;
00176
00177 RCP<FunctionSupportResolver> fsr_;
00178
00179 Array<RCP<DOFMapBase> > rowMap_;
00180
00181 Array<RCP<DOFMapBase> > colMap_;
00182
00183 Array<RCP<Array<int> > > isBCRow_;
00184
00185 Array<RCP<Array<int> > > isBCCol_;
00186
00187 Array<RCP<std::set<int> > > remoteBCCols_;
00188
00189 };
00190
00191
00192 Array<Array<BasisFamily> > testBasisArray(const RCP<FunctionSupportResolver>& fsr) ;
00193
00194
00195 Array<Array<BasisFamily> > unkBasisArray(const RCP<FunctionSupportResolver>& fsr) ;
00196
00197 }
00198
00199
00200 #endif