00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef REAL_EXPRESSION_HPP
00021 #define REAL_EXPRESSION_HPP
00022
00023 #include <Types.hpp>
00024 #include <ErrorHandler.hpp>
00025
00026 #include <Expression.hpp>
00027
00028 #include <cmath>
00029
00030 #include <Variable.hpp>
00031
00032 #include <ScalarDiscretizationTypeBase.hpp>
00033
00034 class RealExpression
00035 : public Expression
00036 {
00037 protected:
00039 real_t __realValue;
00040
00041 private:
00042 std::ostream& put(std::ostream& os) const
00043 {
00044 os << this->realValue();
00045 return os;
00046 }
00047
00048 public:
00049 virtual ReferenceCounting<RealExpression> value() = 0;
00050
00057 inline const real_t& realValue() const
00058 {
00059 return __realValue;
00060 }
00061
00068 inline real_t& realValue()
00069 {
00070 return __realValue;
00071 }
00072
00073 RealExpression(const RealExpression& e)
00074 : Expression(e),
00075 __realValue(e.__realValue)
00076 {
00077 ;
00078 }
00079
00080 RealExpression()
00081 : Expression(Expression::real),
00082 __realValue(0)
00083 {
00084 ;
00085 }
00086
00087 virtual ~RealExpression()
00088 {
00089 ;
00090 }
00091 };
00092
00093 class RealExpressionValue
00094 : public RealExpression
00095 {
00096 public:
00097 ReferenceCounting<RealExpression> value()
00098 {
00099 return this;
00100 }
00101
00102 void execute()
00103 {
00104 ;
00105 }
00106
00107 RealExpressionValue(const real_t d)
00108 {
00109 __realValue = d;
00110 }
00111
00112 RealExpressionValue(const RealExpressionValue& re)
00113 {
00114 ;
00115 }
00116
00117 ~RealExpressionValue()
00118 {
00119 ;
00120 }
00121 };
00122
00123 class BooleanExpression;
00124 class RealExpressionBoolean
00125 : public RealExpression
00126 {
00127 private:
00128 ReferenceCounting<BooleanExpression> __booleanExpression;
00129
00130 public:
00131 ReferenceCounting<RealExpression> value();
00132
00133 void execute();
00134
00135 RealExpressionBoolean(ReferenceCounting<BooleanExpression> be);
00136
00137 RealExpressionBoolean(const RealExpressionBoolean& re);
00138
00139 ~RealExpressionBoolean();
00140 };
00141
00142 class RealExpressionVariable
00143 : public RealExpression
00144 {
00145 private:
00146 std::string __variableName;
00147 ReferenceCounting<RealVariable> __realVariable;
00148 ReferenceCounting<RealExpression> __expression;
00149
00151 std::istream& _get(std::istream& is);
00152
00153 public:
00154 friend class RealExpressionPreIncrement;
00155 friend class RealExpressionPostIncrement;
00156 friend class RealExpressionPreDecrement;
00157 friend class RealExpressionPostDecrement;
00158
00159 ReferenceCounting<RealExpression> value();
00160
00161 void execute();
00162
00163 RealExpressionVariable(const std::string& variableName);
00164
00165 RealExpressionVariable(const RealExpressionVariable& e);
00166
00167 ~RealExpressionVariable();
00168 };
00169
00170 class FunctionExpression;
00171 class Vector3Expression;
00172
00177 class RealExpressionFunctionEvaluate
00178 : public RealExpression
00179 {
00180 private:
00181 ReferenceCounting<FunctionExpression> __realFunction;
00182 ReferenceCounting<Vector3Expression> __v;
00183 ReferenceCounting<RealExpression> __x;
00184 ReferenceCounting<RealExpression> __y;
00185 ReferenceCounting<RealExpression> __z;
00186
00187 public:
00188 ReferenceCounting<RealExpression> value();
00189
00190 void execute();
00191
00192 RealExpressionFunctionEvaluate(ReferenceCounting<FunctionExpression> f,
00193 ReferenceCounting<RealExpression> x,
00194 ReferenceCounting<RealExpression> y,
00195 ReferenceCounting<RealExpression> z);
00196
00197 RealExpressionFunctionEvaluate(ReferenceCounting<FunctionExpression> f,
00198 ReferenceCounting<Vector3Expression> v);
00199
00200 RealExpressionFunctionEvaluate(const RealExpressionFunctionEvaluate& e);
00201
00202 ~RealExpressionFunctionEvaluate();
00203 };
00204
00205 class RealExpressionIntegrate
00206 : public RealExpression
00207 {
00208 private:
00209 ReferenceCounting<FunctionExpression> __realFunction;
00210 ReferenceCounting<MeshExpression> __mesh;
00211 const ScalarDiscretizationTypeBase::Type __discretizationType;
00212
00213 template <typename MeshType, typename QuadratureType>
00214 real_t __integrate(const MeshType& M, const QuadratureType& Q, FunctionExpression& f);
00215
00216 template <typename MeshType>
00217 real_t __integrate(const MeshType& M, FunctionExpression& f);
00218
00219 public:
00220 ReferenceCounting<RealExpression> value();
00221
00222 void execute();
00223
00224 RealExpressionIntegrate(ReferenceCounting<FunctionExpression> f,
00225 ReferenceCounting<MeshExpression> m,
00226 const ScalarDiscretizationTypeBase::Type& discretizationType = ScalarDiscretizationTypeBase::lagrangianFEM1);
00227
00228 RealExpressionIntegrate(const RealExpressionIntegrate& e);
00229
00230 ~RealExpressionIntegrate();
00231 };
00232
00233 class RealExpressionMinMax
00234 : public RealExpression
00235 {
00236 private:
00237 const std::string __operatorName;
00238
00239 ReferenceCounting<FunctionExpression> __realFunction;
00240 ReferenceCounting<MeshExpression> __mesh;
00241
00242 public:
00243 ReferenceCounting<RealExpression> value();
00244
00245 void execute();
00246
00247 RealExpressionMinMax(const std::string& operatorName,
00248 ReferenceCounting<FunctionExpression> f,
00249 ReferenceCounting<MeshExpression> m);
00250
00251 RealExpressionMinMax(const RealExpressionMinMax& e);
00252
00253 ~RealExpressionMinMax();
00254 };
00255
00256 class RealExpressionPreIncrement
00257 : public RealExpression
00258 {
00259 private:
00260 ReferenceCounting<RealExpressionVariable> __variable;
00261
00262 public:
00263 ReferenceCounting<RealExpression> value()
00264 {
00265 return new RealExpressionValue(__realValue);
00266 }
00267
00268 void execute()
00269 {
00270 (*__variable).execute();
00271 __realValue = (*__variable).realValue()+1;
00272 (*(*__variable).__realVariable) = new RealExpressionValue(__realValue);
00273 }
00274
00275 RealExpressionPreIncrement(ReferenceCounting<RealExpressionVariable> v)
00276 : __variable(v)
00277 {
00278 ;
00279 }
00280
00281 RealExpressionPreIncrement(const RealExpressionPreIncrement& r)
00282 : RealExpression(r),
00283 __variable(r.__variable)
00284 {
00285 ;
00286 }
00287
00288 ~RealExpressionPreIncrement()
00289 {
00290 ;
00291 }
00292 };
00293
00294 class RealExpressionPostIncrement
00295 : public RealExpression
00296 {
00297 private:
00298 ReferenceCounting<RealExpressionVariable> __variable;
00299
00300 public:
00301 ReferenceCounting<RealExpression> value()
00302 {
00303 return new RealExpressionValue(__realValue);
00304 }
00305
00306 void execute()
00307 {
00308 (*__variable).execute();
00309 __realValue = (*__variable).realValue();
00310 (*(*__variable).__realVariable) = new RealExpressionValue(__realValue+1);
00311 }
00312
00313 RealExpressionPostIncrement(ReferenceCounting<RealExpressionVariable> v)
00314 : __variable(v)
00315 {
00316 ;
00317 }
00318
00319 RealExpressionPostIncrement(const RealExpressionPostIncrement& r)
00320 : RealExpression(r),
00321 __variable(r.__variable)
00322 {
00323 ;
00324 }
00325
00326 ~RealExpressionPostIncrement()
00327 {
00328 ;
00329 }
00330 };
00331
00332 class RealExpressionPreDecrement
00333 : public RealExpression
00334 {
00335 private:
00336 ReferenceCounting<RealExpressionVariable> __variable;
00337
00338 public:
00339 ReferenceCounting<RealExpression> value()
00340 {
00341 return this;
00342 }
00343
00344 void execute()
00345 {
00346 (*__variable).execute();
00347 __realValue = (*__variable).realValue()-1;
00348 (*(*__variable).__realVariable) = new RealExpressionValue(__realValue);
00349 }
00350
00351 RealExpressionPreDecrement(ReferenceCounting<RealExpressionVariable> v)
00352 : __variable(v)
00353 {
00354 ;
00355 }
00356
00357 RealExpressionPreDecrement(const RealExpressionPreDecrement& r)
00358 : RealExpression(r),
00359 __variable(r.__variable)
00360 {
00361 ;
00362 }
00363
00364 ~RealExpressionPreDecrement()
00365 {
00366 ;
00367 }
00368 };
00369
00370 class RealExpressionPostDecrement
00371 : public RealExpression
00372 {
00373 private:
00374 ReferenceCounting<RealExpressionVariable> __variable;
00375
00376 public:
00377 ReferenceCounting<RealExpression> value()
00378 {
00379 return this;
00380 }
00381
00382 void execute()
00383 {
00384 (*__variable).execute();
00385 __realValue = (*__variable).realValue();
00386 (*(*__variable).__realVariable) = new RealExpressionValue(__realValue-1);
00387 }
00388
00389 RealExpressionPostDecrement(ReferenceCounting<RealExpressionVariable> v)
00390 : __variable(v)
00391 {
00392 ;
00393 }
00394
00395 RealExpressionPostDecrement(const RealExpressionPostDecrement& r)
00396 : RealExpression(r),
00397 __variable(r.__variable)
00398 {
00399 ;
00400 }
00401
00402 ~RealExpressionPostDecrement()
00403 {
00404 ;
00405 }
00406 };
00407
00408 class RealExpressionCFunction
00409 : public RealExpression
00410 {
00411 private:
00412 const std::string __cfunction;
00413 ReferenceCounting<RealExpression> __r;
00414
00415 public:
00416 ReferenceCounting<RealExpression> value()
00417 {
00418 return new RealExpressionValue(__realValue);
00419 }
00420
00421 void execute()
00422 {
00423 (*__r).execute();
00424 if (__cfunction == "abs") {
00425 __realValue = std::abs(__r->realValue());
00426 return;
00427 }
00428 if (__cfunction == "sin") {
00429 __realValue = std::sin(__r->realValue());
00430 return;
00431 }
00432 if (__cfunction == "cos") {
00433 __realValue = std::cos(__r->realValue());
00434 return;
00435 }
00436 if (__cfunction == "tan") {
00437 __realValue = std::tan(__r->realValue());
00438 return;
00439 }
00440 if (__cfunction == "asin") {
00441 __realValue = std::asin(__r->realValue());
00442 return;
00443 }
00444 if (__cfunction == "acos") {
00445 __realValue = std::acos(__r->realValue());
00446 return;
00447 }
00448 if (__cfunction == "atan") {
00449 __realValue = std::atan(__r->realValue());
00450 return;
00451 }
00452 if (__cfunction == "sqrt") {
00453 __realValue = std::sqrt(__r->realValue());
00454 return;
00455 }
00456 if (__cfunction == "exp") {
00457 __realValue = std::exp(__r->realValue());
00458 return;
00459 }
00460 if (__cfunction == "log") {
00461 __realValue = std::log(__r->realValue());
00462 return;
00463 }
00464 throw ErrorHandler(__FILE__,__LINE__,
00465 "not implemented",
00466 ErrorHandler::unexpected);
00467 }
00468
00469 RealExpressionCFunction(const std::string& cfuntion,
00470 ReferenceCounting<RealExpression> r)
00471 : __cfunction(cfuntion),
00472 __r(r)
00473 {
00474 ;
00475 }
00476
00477 RealExpressionCFunction(const RealExpressionCFunction& e)
00478 : __cfunction(e.__cfunction),
00479 __r(e.__r)
00480 {
00481 ;
00482 }
00483
00484 ~RealExpressionCFunction()
00485 {
00486 ;
00487 }
00488 };
00489
00490 template <real_t (*F)(const real_t x)>
00491 class RealExpressionUnaryOperator
00492 : public RealExpression
00493 {
00494 private:
00495 ReferenceCounting<RealExpression> __r;
00496
00497 public:
00498 ReferenceCounting<RealExpression> value()
00499 {
00500 return new RealExpressionValue(__realValue);
00501 }
00502
00503 void execute()
00504 {
00505 (*__r).execute();
00506 __realValue = (*F)((*__r).realValue());
00507 }
00508
00509 RealExpressionUnaryOperator(ReferenceCounting<RealExpression> r)
00510 : __r(r)
00511 {
00512 ;
00513 }
00514
00515 RealExpressionUnaryOperator(const RealExpressionUnaryOperator<F>& e)
00516 : __r(e.__r)
00517 {
00518 ;
00519 }
00520
00521 ~RealExpressionUnaryOperator()
00522 {
00523 ;
00524 }
00525 };
00526
00527 template <real_t(*B)(const real_t x, const real_t y)>
00528 class RealExpressionBinaryOperator
00529 : public RealExpression
00530 {
00531 private:
00532 ReferenceCounting<RealExpression> __r1;
00533 ReferenceCounting<RealExpression> __r2;
00534
00535 public:
00536 ReferenceCounting<RealExpression> value()
00537 {
00538 return new RealExpressionValue(__realValue);
00539 }
00540
00541 void execute()
00542 {
00543 (*__r1).execute();
00544 (*__r2).execute();
00545 __realValue = B((*__r1).realValue(), (*__r2).realValue());
00546 }
00547
00548 RealExpressionBinaryOperator(ReferenceCounting<RealExpression> r1,
00549 ReferenceCounting<RealExpression> r2)
00550 : __r1(r1),
00551 __r2(r2)
00552 {
00553 ;
00554 }
00555
00556 RealExpressionBinaryOperator(const RealExpressionBinaryOperator<B>& e)
00557 : __r1(e.__r1),
00558 __r2(e.__r2)
00559 {
00560 ;
00561 }
00562
00563 ~RealExpressionBinaryOperator()
00564 {
00565 ;
00566 }
00567 };
00568
00569 #endif // REAL_EXPRESSION_HPP