00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef DISCRETIZED_OPERATORS_HPP
00021 #define DISCRETIZED_OPERATORS_HPP
00022
00023 #include <TinyMatrix.hpp>
00024
00025 #include <ReferenceCounting.hpp>
00026
00027 #include <Problem.hpp>
00028 #include <ScalarFunctionBase.hpp>
00029
00030 #include <ElementaryMatrixSet.hpp>
00031
00032 #include <PDESystem.hpp>
00033
00034 #include <MassOperator.hpp>
00035 #include <FirstOrderOperator.hpp>
00036 #include <DivMuGrad.hpp>
00037 #include <SecondOrderOperator.hpp>
00038
00039
00040 #include <VariationalProblem.hpp>
00041 #include <VariationalOperatorMuGradUGradV.hpp>
00042 #include <VariationalOperatorAlphaDxUDxV.hpp>
00043 #include <VariationalOperatorNuUdxV.hpp>
00044 #include <VariationalOperatorNuDxUV.hpp>
00045 #include <VariationalOperatorAlphaUV.hpp>
00046
00047 #include <ErrorHandler.hpp>
00048
00049 #include <map>
00050
00060 template <typename ElementaryMatrixType>
00061 class DiscretizedOperators
00062 {
00063 public:
00067 class FunctionAndPosition
00068 {
00069 private:
00070 const size_t __i;
00071 const size_t __j;
00072 ConstReferenceCounting<ScalarFunctionBase>
00073 __function;
00074 public:
00080 inline const size_t& i() const
00081 {
00082 return __i;
00083 }
00084
00090 inline const size_t& j() const
00091 {
00092 return __j;
00093 }
00094
00100 inline real_t operator()(const TinyVector<3, real_t>& x) const
00101 {
00102 return (*__function)(x);
00103 }
00104
00110 FunctionAndPosition(const FunctionAndPosition& fap)
00111 : __i(fap.__i),
00112 __j(fap.__j),
00113 __function(fap.__function)
00114 {
00115 ;
00116 }
00117
00125 FunctionAndPosition(const size_t& line,
00126 const size_t& column,
00127 ConstReferenceCounting<ScalarFunctionBase> function)
00128 : __i(line),
00129 __j(column),
00130 __function(function)
00131 {
00132 ;
00133 }
00134
00139 ~FunctionAndPosition()
00140 {
00141 ;
00142 }
00143 };
00144
00145
00146
00147
00148
00149 typedef std::pair<const ElementaryMatrixType*,
00150 FunctionAndPosition > ListPair;
00151 typedef std::multimap<const ElementaryMatrixType*,
00152 FunctionAndPosition > List;
00153 typedef typename List::iterator iterator;
00154 typedef typename List::const_iterator const_iterator;
00155
00160 typename DiscretizedOperators::iterator
00161 begin()
00162 {
00163 return __list.begin();
00164 }
00165
00171 const typename DiscretizedOperators::const_iterator
00172 begin() const
00173 {
00174 return __list.begin();
00175 }
00176
00182 typename DiscretizedOperators::iterator
00183 end()
00184 {
00185 return __list.end();
00186 }
00187
00193 const typename DiscretizedOperators::const_iterator
00194 end() const
00195 {
00196 return __list.end();
00197 }
00198
00199 private:
00200 const ElementaryMatrixSet<ElementaryMatrixType>&
00201 __elementaryMatrixSet;
00204 List __list;
00212 DiscretizedOperators(const DiscretizedOperators& c);
00213
00214 public:
00221 DiscretizedOperators(const ElementaryMatrixSet<ElementaryMatrixType>& e,
00222 const Problem& problem)
00223 : __elementaryMatrixSet(e)
00224 {
00225 switch (problem.type()) {
00226 case Problem::pde: {
00227 const PDESystem& pdeSystem
00228 = dynamic_cast<const PDESystem&>(problem);
00229
00230 for (size_t i=0; i<problem.numberOfUnknown(); ++i) {
00231 const PDE& pde = pdeSystem[i].pde();
00232 for (size_t j=0; j<pdeSystem.numberOfEquations(); ++j) {
00233 const PDEOperatorSum& pdeOpSum = *pde[j];
00234 for (size_t k=0; k<pdeOpSum.numberOfOperators(); ++k) {
00235 const PDEOperator& pdeOperator = *pdeOpSum[k];
00236 switch (pdeOperator.type()) {
00237 case PDEOperator::firstorderop: {
00238 const FirstOrderOperator& firstOrderOperator
00239 = dynamic_cast<const FirstOrderOperator&>(pdeOperator);
00240 for (size_t m=0; m<3; ++m) {
00241 if (firstOrderOperator.isSet(m)) {
00242 __list.insert(ListPair(&__elementaryMatrixSet.firstOrderOperatorDxUV(m),
00243 FunctionAndPosition(i,j,firstOrderOperator.nu(m))));
00244 }
00245 }
00246 break;
00247 }
00248 case PDEOperator::divmugrad: {
00249 const DivMuGrad& divMuGrad
00250 = dynamic_cast<const DivMuGrad&>(pdeOperator);
00251 __list.insert(ListPair(&__elementaryMatrixSet.divMuGrad(),
00252 FunctionAndPosition(i,j,divMuGrad.mu())));
00253 break;
00254 }
00255 case PDEOperator::secondorderop: {
00256 const SecondOrderOperator& secondOrderOperator
00257 = dynamic_cast<const SecondOrderOperator&>(pdeOperator);
00258 for (size_t m=0; m<3; ++m)
00259 for (size_t n=0; n<3; ++n) {
00260 if (secondOrderOperator.isSet(m,n)) {
00261 __list.insert(ListPair(&__elementaryMatrixSet.secondOrderOperator(m,n),
00262 FunctionAndPosition(i,j,secondOrderOperator.A(m,n))));
00263 }
00264 }
00265 break;
00266 }
00267 case PDEOperator::massop: {
00268 const MassOperator& massOperator
00269 = dynamic_cast<const MassOperator&>(pdeOperator);
00270 __list.insert(ListPair(&__elementaryMatrixSet.massOperator(),
00271 FunctionAndPosition(i,j,massOperator.alpha())));
00272 break;
00273 }
00274 default: {
00275 throw ErrorHandler(__FILE__,__LINE__,
00276 "unknown operator",
00277 ErrorHandler::unexpected);
00278 }
00279 }
00280 }
00281 }
00282 }
00283 break;
00284 }
00285 case Problem::variational: {
00286 const VariationalProblem& P
00287 = dynamic_cast<const VariationalProblem&>(problem);
00288 for (VariationalProblem::bilinearOperatorConst_iterator
00289 i = P.beginBilinearOperator();
00290 i != P.endBilinearOperator(); ++i) {
00291 switch ((*(*i)).type()) {
00292 case VariationalBilinearOperator::muGradUGradV: {
00293 const VariationalMuGradUGradVOperator& O
00294 = dynamic_cast<const VariationalMuGradUGradVOperator&>(*(*i));
00295
00296 __list.insert(ListPair(&__elementaryMatrixSet.divMuGrad(),
00297 FunctionAndPosition(O.unknownNumber(),
00298 O.testFunctionNumber(),
00299 O.mu())));
00300
00301 break;
00302 }
00303 case VariationalBilinearOperator::alphaDxUDxV: {
00304 const VariationalAlphaDxUDxVOperator& O
00305 = dynamic_cast<const VariationalAlphaDxUDxVOperator&>(*(*i));
00306
00307 const size_t i = O.i();
00308 const size_t j = O.j();
00309
00310 __list.insert(ListPair(&__elementaryMatrixSet.secondOrderOperator(i,j),
00311 FunctionAndPosition(O.unknownNumber(),
00312 O.testFunctionNumber(),
00313 O.alpha())));
00314 break;
00315 }
00316 case VariationalBilinearOperator::nuUdxV: {
00317 const VariationalNuUdxVOperator& O
00318 = dynamic_cast<const VariationalNuUdxVOperator&>(*(*i));
00319
00320 const size_t n = O.i();
00321 __list.insert(ListPair(&__elementaryMatrixSet.firstOrderOperatorUdxV(n),
00322 FunctionAndPosition(O.unknownNumber(),
00323 O.testFunctionNumber(),
00324 O.nu())));
00325 break;
00326 }
00327 case VariationalBilinearOperator::nuDxUV: {
00328 const VariationalNuDxUVOperator& O
00329 = dynamic_cast<const VariationalNuDxUVOperator&>(*(*i));
00330
00331 const size_t n = O.i();
00332 __list.insert(ListPair(&__elementaryMatrixSet.firstOrderOperatorDxUV(n),
00333 FunctionAndPosition(O.unknownNumber(),
00334 O.testFunctionNumber(),
00335 O.nu())));
00336 break;
00337 }
00338 case VariationalBilinearOperator::alphaUV: {
00339 const VariationalAlphaUVOperator& O
00340 = dynamic_cast<const VariationalAlphaUVOperator&>(*(*i));
00341
00342 __list.insert(ListPair(&__elementaryMatrixSet.massOperator(),
00343 FunctionAndPosition(O.unknownNumber(),
00344 O.testFunctionNumber(),
00345 O.alpha())));
00346
00347 break;
00348 }
00349 default: {
00350 throw ErrorHandler(__FILE__,__LINE__,
00351 "unknown variational form",
00352 ErrorHandler::unexpected);
00353 }
00354 }
00355 }
00356 break;
00357 }
00358 default: {
00359 throw ErrorHandler(__FILE__,__LINE__,
00360 "Unknown problem type",
00361 ErrorHandler::unexpected);
00362 }
00363 }
00364 }
00365 };
00366
00367 #endif // DISCRETIZED_OPERATORS_HPP