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_ASSEMBLER_H
00032 #define SUNDANCE_ASSEMBLER_H
00033
00034 #include "SundanceDefs.hpp"
00035 #include "PlayaLoadableVector.hpp"
00036 #include "PlayaLoadableMatrix.hpp"
00037 #include "PlayaLinearOperatorDecl.hpp"
00038 #include "PlayaVectorDecl.hpp"
00039 #include "PlayaVectorType.hpp"
00040 #include "Teuchos_HashSet.hpp"
00041 #include "Teuchos_ParameterList.hpp"
00042 #include "PlayaIncrementallyConfigurableMatrixFactory.hpp"
00043 #include "PlayaCollectivelyConfigurableMatrixFactory.hpp"
00044 #include "SundanceRegionQuadCombo.hpp"
00045 #include "SundanceMesh.hpp"
00046 #include "SundanceEvalContext.hpp"
00047 #include "SundanceIntegrationCellSpecifier.hpp"
00048 #include "SundanceComputationType.hpp"
00049
00050
00051 namespace Sundance
00052 {
00053 using namespace Teuchos;
00054 using namespace Playa;
00055
00056 class EquationSet;
00057 class EvaluatableExpr;
00058 class EvalManager;
00059 class EvalVector;
00060 class DiscreteSpace;
00061 class DiscreteFunction;
00062 class CellFilter;
00063 class DOFMapBase;
00064 class IntegralGroup;
00065 class StdFwkEvalMediator;
00066 class AssemblyKernelBase;
00067
00068 typedef std::set<int> ColSetType;
00069
00070
00071
00072
00073 class Assembler
00074 {
00075 public:
00076
00077 Assembler(
00078 const Mesh& mesh,
00079 const RCP<EquationSet>& eqn,
00080 const Array<VectorType<double> >& rowVectorType,
00081 const Array<VectorType<double> >& colVectorType,
00082 bool partitionBCs);
00083
00084
00085
00086 Assembler(
00087 const Mesh& mesh,
00088 const RCP<EquationSet>& eqn);
00089
00090
00091 const Array<RCP<DOFMapBase> >& rowMap() const
00092 {return rowMap_;}
00093
00094
00095 const Array<RCP<DOFMapBase> >& colMap() const
00096 {return colMap_;}
00097
00098
00099 const Array<RCP<DiscreteSpace> >& solutionSpace() const
00100 {return externalColSpace_;}
00101
00102
00103 const Array<RCP<DiscreteSpace> >& rowSpace() const
00104 {return externalRowSpace_;}
00105
00106
00107 VectorSpace<double> solnVecSpace() const ;
00108
00109
00110 VectorSpace<double> rowVecSpace() const ;
00111
00112
00113 const Array<RCP<Set<int> > >& bcRows() {return bcRows_;}
00114
00115
00116 Playa::LinearOperator<double> allocateMatrix() const ;
00117
00118
00119 void assemble(Playa::LinearOperator<double>& A,
00120 Array<Vector<double> >& b) const ;
00121
00122
00123 void assembleSensitivities(Playa::LinearOperator<double>& A,
00124 Array<Vector<double> >& b) const ;
00125
00126
00127
00128 void assemble(Array<Vector<double> >& b) const ;
00129
00130
00131 void evaluate(double& value,
00132 Array<Vector<double> >& gradient) const ;
00133
00134
00135 void evaluate(double& value) const ;
00136
00137
00138 static int& workSetSize() ;
00139
00140
00141
00142 void getGraph(int br, int bc,
00143 Array<int>& graphData,
00144 Array<int>& rowPtrs,
00145 Array<int>& nnzPerRow) const ;
00146
00147
00148 void incrementalGetGraph(int br, int bc,
00149 IncrementallyConfigurableMatrixFactory* mf) const ;
00150
00151
00152 void flushConfiguration() const;
00153
00154
00155 static int& numAssembleCalls() {static int rtn=0; return rtn;}
00156
00157
00158 static bool& matrixEliminatesRepeatedCols() {static bool x = false; return x;}
00159
00160
00161 const RCP<EquationSet>& eqnSet() const
00162 {return eqn_;}
00163
00164
00165 int maxWatchFlagSetting(const std::string& param) const ;
00166
00167
00168 static Time& assemblyTimer()
00169 {
00170 static RCP<Time> rtn
00171 = TimeMonitor::getNewTimer("assembly");
00172 return *rtn;
00173 }
00174
00175
00176 static Time& configTimer()
00177 {
00178 static RCP<Time> rtn
00179 = TimeMonitor::getNewTimer("matrix config");
00180 return *rtn;
00181 }
00182
00183
00184 static Time& fillTimer()
00185 {
00186 static RCP<Time> rtn
00187 = TimeMonitor::getNewTimer("matrix/vector fill");
00188 return *rtn;
00189 }
00190
00191
00192 private:
00193
00194
00195 void init(const Mesh& mesh, const RCP<EquationSet>& eqn);
00196
00197
00198 bool detectInternalBdry(int cellDim, const CellFilter& filter) const ;
00199
00200
00201 void displayEvaluationResults(
00202 const EvalContext& context,
00203 const EvaluatableExpr* evalExpr,
00204 const Array<double>& constantCoeffs,
00205 const Array<RCP<EvalVector> >& vectorCoeffs) const ;
00206
00207
00208 void assemblyLoop(const ComputationType& compType,
00209 RCP<AssemblyKernelBase> kernel) const ;
00210
00211
00212
00213 void configureMatrix(LinearOperator<double>& A,
00214 Array<Vector<double> >& b) const ;
00215
00216
00217 void configureVector(Array<Vector<double> >& b) const ;
00218
00219
00220 void configureMatrixBlock(int br, int bc,
00221 LinearOperator<double>& A) const ;
00222
00223
00224 void configureVectorBlock(int br, Vector<double>& b) const ;
00225
00226
00227 Array<Array<int> > findNonzeroBlocks() const ;
00228
00229
00230 IntegrationCellSpecifier whetherToUseCofacets(
00231 const Array<RCP<IntegralGroup> >& groups,
00232 const EvaluatableExpr* ee,
00233 bool isMaximalCell,
00234 int verb) const ;
00235
00236
00237
00238
00239 static int defaultWorkSetSize() {static int rtn=100; return rtn;}
00240
00241 bool partitionBCs_;
00242
00243 mutable bool matNeedsConfiguration_;
00244
00245 mutable bool matNeedsFinalization_;
00246
00247 mutable int numConfiguredColumns_;
00248
00249 Mesh mesh_;
00250
00251 RCP<EquationSet> eqn_;
00252
00253 Array<RCP<DOFMapBase> > rowMap_;
00254
00255 Array<RCP<DOFMapBase> > colMap_;
00256
00257 Array<RCP<DiscreteSpace> > externalRowSpace_;
00258
00259 Array<RCP<DiscreteSpace> > externalColSpace_;
00260
00261 Array<RCP<DiscreteSpace> > privateRowSpace_;
00262
00263 Array<RCP<DiscreteSpace> > privateColSpace_;
00264
00265 Array<RCP<Set<int> > > bcRows_;
00266
00267 Array<RCP<Set<int> > > bcCols_;
00268
00269 Array<RegionQuadCombo> rqc_;
00270
00271 Map<ComputationType, Array<EvalContext> > contexts_;
00272
00273 Map<ComputationType, Array<int> > skipRqc_;
00274
00275 Array<int> isBCRqc_;
00276
00277 Array<int> isInternalBdry_;
00278
00279 Map<ComputationType, Array<Array<RCP<IntegralGroup> > > > groups_;
00280
00281 Array<RCP<StdFwkEvalMediator> > mediators_;
00282
00283 Map<ComputationType, Array<const EvaluatableExpr*> > evalExprs_;
00284
00285 RCP<EvalManager> evalMgr_;
00286
00287 Array<RCP<Array<int> > > isBCRow_;
00288
00289 Array<RCP<Array<int> > > isBCCol_;
00290
00291 Array<RCP<std::set<int> > > remoteBCCols_;
00292
00293 Array<int> lowestRow_;
00294
00295 Array<int> lowestCol_;
00296
00297 Array<VectorType<double> > rowVecType_;
00298
00299 Array<VectorType<double> > colVecType_;
00300
00301 Map<int, int> testIDToBlockMap_;
00302
00303 Map<int, int> unkIDToBlockMap_;
00304
00305 Map<int, int> fixedParamIDToVectorNumber_;
00306
00307 Map<ComputationType, Array<IntegrationCellSpecifier> > rqcRequiresMaximalCofacets_;
00308
00309
00310 };
00311
00312 }
00313
00314
00315
00316 #endif