00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PDE_OPERATOR_EXPRESSION_HPP
00021 #define PDE_OPERATOR_EXPRESSION_HPP
00022
00023 #include <TinyVector.hpp>
00024
00025 #include <Expression.hpp>
00026
00027 #include <Variable.hpp>
00028 #include <FunctionExpression.hpp>
00029 #include <FunctionExpressionBinaryOperation.hpp>
00030
00031 #include <EmbededFunctions.hpp>
00032
00033 #include <ErrorHandler.hpp>
00034
00035 #include <limits>
00036
00037 class PDEOperator;
00038
00039 class PDEOperatorExpression
00040 : public Expression
00041 {
00042 public:
00043 enum PDEOperatorType {
00044 scalar,
00045 vectorial
00046 };
00047
00048 protected:
00049 PDEOperatorType __pdeOperatorType;
00050
00051 virtual void __execute() = 0;
00052
00053 public:
00054 virtual bool __checkBoundaryExpression() const = 0;
00055
00056 void execute();
00057
00058 const PDEOperatorType& pdeOperatorType() const
00059 {
00060 return __pdeOperatorType;
00061 }
00062
00063 PDEOperatorExpression(const PDEOperatorExpression& e);
00064
00065 PDEOperatorExpression(PDEOperatorType t);
00066
00067 virtual ~PDEOperatorExpression();
00068 };
00069
00070 class PDEScalarOperatorExpression
00071 : public PDEOperatorExpression
00072 {
00073 public:
00074 enum PDEScalarOperatorType {
00075 divMuGrad,
00076 secondOrder,
00077 firstOrder,
00078 zerothOrder
00079 };
00080
00081 protected:
00082 const std::string __unknownName;
00083
00084 ReferenceCounting<PDEOperator> __pdeOperator;
00085
00086 private:
00087 PDEScalarOperatorType __pdeScalarOperatorType;
00088
00089 public:
00090 const std::string& unknownName() const
00091 {
00092 return __unknownName;
00093 }
00094
00095 ReferenceCounting<PDEOperator> pdeOperator();
00096
00097 PDEScalarOperatorExpression(const PDEScalarOperatorExpression& e);
00098
00099 PDEScalarOperatorExpression(const std::string& unknownName,
00100 PDEScalarOperatorType t);
00101
00102 virtual ~PDEScalarOperatorExpression();
00103 };
00104
00105 class PDEVectorialOperatorExpression
00106 : public PDEOperatorExpression
00107 {
00108 public:
00109 enum PDEScalarOperatorType {
00110 firstOrder,
00111 secondOrder
00112 };
00113
00114 public:
00115 typedef std::map<std::string,
00116 ReferenceCounting<PDEOperator> > PDEOperatorList;
00117
00118 protected:
00119 PDEOperatorList __pdeOperatorList;
00120
00121 private:
00122 PDEScalarOperatorType __pdeOperatorType;
00123
00124 public:
00125
00126 PDEVectorialOperatorExpression::PDEOperatorList& pdeOperatorList()
00127 {
00128 return __pdeOperatorList;
00129 }
00130
00131 PDEVectorialOperatorExpression(const PDEVectorialOperatorExpression::
00132 PDEScalarOperatorType& t);
00133
00134 PDEVectorialOperatorExpression(const PDEVectorialOperatorExpression& e);
00135
00136 virtual ~PDEVectorialOperatorExpression();
00137 };
00138
00139 class PDEScalarOperatorExpressionDivMuGrad
00140 : public PDEScalarOperatorExpression
00141 {
00142 private:
00143 ReferenceCounting<FunctionExpression> __mu;
00144
00145 std::ostream& put(std::ostream& os) const
00146 {
00147 os << "div(" << (*__mu) << "*grad(" << __unknownName << "))";
00148 return os;
00149 }
00150
00151 void __execute();
00152 public:
00153
00154 bool __checkBoundaryExpression() const;
00155
00156 PDEScalarOperatorExpressionDivMuGrad(const std::string& unknownName,
00157 ReferenceCounting<FunctionExpression> mu)
00158 : PDEScalarOperatorExpression(unknownName, PDEScalarOperatorExpression::divMuGrad),
00159 __mu(mu)
00160 {
00161 ;
00162 }
00163
00164 PDEScalarOperatorExpressionDivMuGrad(const PDEScalarOperatorExpressionDivMuGrad& re)
00165 : PDEScalarOperatorExpression(re),
00166 __mu(re.__mu)
00167 {
00168 ;
00169 }
00170
00171 ~PDEScalarOperatorExpressionDivMuGrad()
00172 {
00173 ;
00174 }
00175 };
00176
00177
00178 class PDEScalarOperatorExpressionOrderZero
00179 : public PDEScalarOperatorExpression
00180 {
00181 private:
00182 ReferenceCounting<FunctionExpression> __Alpha;
00183
00184 std::ostream& put(std::ostream& os) const
00185 {
00186 os << (*__Alpha) << '*' << __unknownName;
00187 return os;
00188 }
00189
00190 void __execute();
00191
00192 public:
00193 bool __checkBoundaryExpression() const;
00194
00195 PDEScalarOperatorExpressionOrderZero(const std::string& unknownName,
00196 ReferenceCounting<FunctionExpression> alpha)
00197 : PDEScalarOperatorExpression(unknownName, PDEScalarOperatorExpression::zerothOrder),
00198 __Alpha(alpha)
00199 {
00200 ;
00201 }
00202
00203 PDEScalarOperatorExpressionOrderZero(const PDEScalarOperatorExpressionOrderZero& re)
00204 : PDEScalarOperatorExpression(re),
00205 __Alpha(re.__Alpha)
00206 {
00207 ;
00208 }
00209
00210 ~PDEScalarOperatorExpressionOrderZero()
00211 {
00212 ;
00213 }
00214 };
00215
00216
00217 class PDEScalarOperatorExpressionOrderOne
00218 : public PDEScalarOperatorExpression
00219 {
00220 protected:
00221 ReferenceCounting<FunctionExpression> __nu[3];
00222
00223 std::ostream& put(std::ostream& os) const
00224 {
00225 const char d[3] = { 'x', 'y', 'z'};
00226 bool plus = false;
00227 for (size_t i=0; i<3; ++i)
00228 if (__nu[i] != 0) {
00229 if (plus)
00230 os << '+';
00231 os << *(__nu[i]) << "*d" << d[i] << '(' << __unknownName << ')';
00232 plus = true;
00233 }
00234 return os;
00235 }
00236
00237 void __execute();
00238
00239 public:
00240 bool __checkBoundaryExpression() const;
00241
00242 void operator*=(ReferenceCounting<FunctionExpression> f)
00243 {
00244 for (size_t i=0; i<3; ++i) {
00245 if (__nu[i] != 0)
00246 __nu[i] = new FunctionExpressionBinaryOperation(BinaryOperation::product,f,__nu[i]);
00247 }
00248 }
00249
00250 virtual void preexec()
00251 {
00252 for(size_t i=0; i<3; ++i) {
00253 if (__nu[i] != 0)
00254 (*__nu[i]).execute();
00255 }
00256 }
00257
00258 ReferenceCounting<FunctionExpression> nu(const size_t i) const
00259 {
00260 ASSERT (i<3);
00261 return __nu[i];
00262 }
00263
00264 const std::string& unknownName() const
00265 {
00266 return __unknownName;
00267 }
00268
00269 PDEScalarOperatorExpressionOrderOne(const std::string& operatorName,
00270 const std::string&unknownName,
00271 ReferenceCounting<FunctionExpression> alpha)
00272 : PDEScalarOperatorExpression(unknownName, PDEScalarOperatorExpression::firstOrder)
00273 {
00274 __nu[0] = 0; __nu[1] = 0; __nu[2] = 0;
00275
00276 if (operatorName == "dx") {
00277 __nu[0] = alpha;
00278 return;
00279 }
00280 if (operatorName == "dy") {
00281 __nu[1] = alpha;
00282 return;
00283 }
00284
00285 if (operatorName == "dz") {
00286 __nu[2] = alpha;
00287 return;
00288 }
00289 }
00290
00291 PDEScalarOperatorExpressionOrderOne(const std::string& unknownName)
00292 : PDEScalarOperatorExpression(unknownName, PDEScalarOperatorExpression::firstOrder)
00293 {
00294 for (size_t i=0; i<3; ++i)
00295 __nu[i] = 0;
00296 }
00297
00298 PDEScalarOperatorExpressionOrderOne(const PDEScalarOperatorExpressionOrderOne& re)
00299 : PDEScalarOperatorExpression(re)
00300 {
00301 for (size_t i=0; i<3; ++i)
00302 __nu[i] = re.__nu[i];
00303 }
00304
00305 ~PDEScalarOperatorExpressionOrderOne()
00306 {
00307 ;
00308 }
00309 };
00310
00311 class PDEVectorialOperatorExpressionOrderTwo;
00312 class PDEVectorialOperatorExpressionOrderOne
00313 : public PDEVectorialOperatorExpression
00314 {
00315 friend class PDEVectorialOperatorExpressionOrderTwo;
00316 private:
00317 typedef
00318 std::multimap<std::string,
00319 ReferenceCounting<PDEScalarOperatorExpressionOrderOne> >
00320 FirstOrderSum;
00321
00322 FirstOrderSum __sum;
00323 FirstOrderSum __diff;
00324
00325 protected:
00326 std::ostream& put(std::ostream& os) const
00327 {
00328 bool plus = false;
00329 for (FirstOrderSum::const_iterator i = __sum.begin();
00330 i != __sum.end(); ++i) {
00331 if (plus)
00332 os << '+';
00333 os << (*(*i).second);
00334 plus = true;
00335 }
00336
00337 for (FirstOrderSum::const_iterator i = __diff.begin();
00338 i != __diff.end(); ++i) {
00339 os << '-' << (*(*i).second);
00340 }
00341 return os;
00342 }
00343
00344 void __execute()
00345 {
00346 throw ErrorHandler(__FILE__,__LINE__,
00347 "not implemented",
00348 ErrorHandler::unexpected);
00349 }
00350
00351 public:
00352 bool __checkBoundaryExpression() const;
00353
00354 void operator*=(ReferenceCounting<FunctionExpression> f)
00355 {
00356 for (FirstOrderSum::iterator i = __sum.begin();
00357 i != __sum.end(); ++i) {
00358 (*(*i).second) *= f;
00359 }
00360
00361 for (FirstOrderSum::iterator i = __diff.begin();
00362 i != __diff.end(); ++i) {
00363 (*(*i).second) *= f;
00364 }
00365 }
00366
00367 void operator+=(ReferenceCounting<PDEScalarOperatorExpressionOrderOne> pdeOp)
00368 {
00369 __sum.insert(std::make_pair(pdeOp->unknownName(),pdeOp));
00370 }
00371
00372 void operator+=(ReferenceCounting<PDEVectorialOperatorExpressionOrderOne> pdeVectOp)
00373 {
00374 for (FirstOrderSum::iterator i = (*pdeVectOp).__sum.begin();
00375 i != (*pdeVectOp).__sum.end(); ++i) {
00376 __sum.insert(*i);
00377 }
00378
00379 for (FirstOrderSum::iterator i = (*pdeVectOp).__diff.begin();
00380 i != (*pdeVectOp).__diff.end(); ++i) {
00381 __diff.insert(*i);
00382 }
00383 }
00384
00385 void operator-=(ReferenceCounting<PDEVectorialOperatorExpressionOrderOne> pdeVectOp)
00386 {
00387 for (FirstOrderSum::iterator i = (*pdeVectOp).__sum.begin();
00388 i != (*pdeVectOp).__sum.end(); ++i) {
00389 __diff.insert(*i);
00390 }
00391
00392 for (FirstOrderSum::iterator i = (*pdeVectOp).__diff.begin();
00393 i != (*pdeVectOp).__diff.end(); ++i) {
00394 __sum.insert(*i);
00395 }
00396 }
00397
00398 void preexec()
00399 {
00400 for(FirstOrderSum::iterator i = __sum.begin();
00401 i != __sum.end(); ++i) {
00402 (*(*i).second).preexec();
00403 }
00404 for(FirstOrderSum::iterator i = __diff.begin();
00405 i != __diff.end(); ++i) {
00406 (*(*i).second).preexec();
00407 }
00408 }
00409
00410 PDEVectorialOperatorExpressionOrderOne()
00411 : PDEVectorialOperatorExpression(PDEVectorialOperatorExpression::firstOrder)
00412 {
00413 ;
00414 }
00415
00416 ~PDEVectorialOperatorExpressionOrderOne()
00417 {
00418 ;
00419 }
00420 };
00421
00422 class PDEVectorialOperatorExpressionOrderTwo
00423 : public PDEVectorialOperatorExpression
00424 {
00425 private:
00426 typedef std::multimap<int,
00427 ReferenceCounting<PDEVectorialOperatorExpressionOrderOne> > FirstOperatorList;
00428 FirstOperatorList __firstOrderOp;
00429
00430 std::ostream& put(std::ostream& os) const
00431 {
00432 const char x[3] = {'x', 'y', 'z'};
00433 for (FirstOperatorList::const_iterator i = __firstOrderOp.begin();
00434 i != __firstOrderOp.end(); ++i) {
00435 os << 'd' << x[(*i).first] << '(' << (*(*i).second) << ')';
00436 }
00437 return os;
00438 }
00439
00440 void __execute();
00441
00442 public:
00443 bool __checkBoundaryExpression() const;
00444
00445 void add(const std::string& operatorName,
00446 ReferenceCounting<PDEVectorialOperatorExpressionOrderOne> pdeOp)
00447 {
00448 size_t operatorNumber = std::numeric_limits<size_t>::max();
00449
00450 if (operatorName == "dx") {
00451 operatorNumber = 0;
00452 }
00453 if (operatorName == "dy") {
00454 operatorNumber = 1;
00455 }
00456 if (operatorName == "dz") {
00457 operatorNumber = 2;
00458 }
00459
00460 if (operatorNumber > 2) {
00461 throw ErrorHandler(__FILE__,__LINE__,
00462 "unknown operator",
00463 ErrorHandler::unexpected);
00464 }
00465
00466 __firstOrderOp.insert(std::pair<int,
00467 ReferenceCounting<PDEVectorialOperatorExpressionOrderOne> >(operatorNumber,
00468 pdeOp));
00469 }
00470
00471 PDEVectorialOperatorExpressionOrderTwo();
00472
00473 ~PDEVectorialOperatorExpressionOrderTwo();
00474 };
00475
00476 #endif // PDE_OPERATOR_EXPRESSION_HPP
00477