Fluid Dynamics Library
scalars.hpp
Go to the documentation of this file.
00001 
00049 #ifndef __FDL_SCALARS_HPP
00050 #define __FDL_SCALARS_HPP
00051 #include <cmath>
00052 #include <cassert>
00053 #include "ftnsbase.hpp"
00054 #include "io/xmlparser.h"
00055 
00056 namespace fdl {
00057         
00062 template <typename scalar_t>
00063 class Gaussian : public ScalarBase<scalar_t>
00064 {
00065 private:
00066         scalar_t alpha_, sigma2_;
00067         scalar_t x0_[3]; // no reason for phyics in dim >= 4. 
00068         
00069 public:
00071         Gaussian(unsigned dim, scalar_t x0[], 
00072                                 scalar_t sigma =scalar_t(1), scalar_t alpha = scalar_t(1)) 
00073         : ScalarBase<scalar_t>(dim), alpha_(alpha)
00074         {
00075                 assert (dim <= 3);
00076                 for (unsigned j = 0; j < dim; j++) 
00077                         x0_[j] = x0[j];
00078                 sigma2_ = sigma * sigma;
00079         }
00080         
00089         Gaussian(TiXmlNode* node)
00090         : ScalarBase<scalar_t>(3), alpha_(1), sigma2_(1)
00091         {
00092                 XmlParser Params(node);
00093                 scalar_t sigma;
00094                 x0_[0] = x0_[1] = x0_[2] = scalar_t(0);
00095                 const char* coordNames[3] = {"x0", "y0", "z0"};
00096                 Params.getAttribArray("Parameters", 3, coordNames, x0_);
00097                 Params.getAttrib("Parameters", "alpha", alpha_);
00098                 if (Params.getAttrib("Parameters", "sigma", sigma))
00099                         sigma2_ = sigma * sigma;
00100         }
00101         
00102         ~Gaussian() {}
00103         
00104         virtual scalar_t operator()(scalar_t t, const scalar_t x[])
00105         {
00106                 scalar_t r2(0), s;
00107                 for (unsigned j = 0; j < this->dim_; j++) {
00108                         s = x[j] - x0_[j];
00109                         r2 += s * s;
00110                 }
00111                 return alpha_ * exp( -r2 / sigma2_); 
00112         }
00113 };
00114 
00120 template <typename scalar_t>
00121 class Spherical : public ScalarBase<scalar_t>
00122 {
00123 private:
00124         scalar_t alpha_, r2_;
00125         scalar_t x0_[3]; // no reason for phyics in dim >= 4. 
00126         
00127 public:
00131         Spherical(unsigned dim, scalar_t x0[], 
00132                                 scalar_t sigma =scalar_t(1), scalar_t alpha = scalar_t(1)) 
00133         : ScalarBase<scalar_t>(dim), alpha_(alpha) 
00134         {
00135                 assert (dim <= 3);
00136                 for (unsigned j = 0; j < dim; j++) 
00137                         x0_[j] = x0[j];
00138                 r2_ = sigma * sigma;
00139         }
00140 
00149         Spherical(TiXmlNode* node)
00150         : ScalarBase<scalar_t>(3), alpha_(1), r2_(1)
00151         {
00152                 XmlParser Params(node);
00153                 scalar_t r;
00154                 x0_[0] = x0_[1] = x0_[2] = scalar_t(0);
00155                 const char* coordNames[3] = {"x0", "y0", "z0"};
00156                 Params.getAttribArray("Parameters", 3, coordNames, x0_);
00157                 Params.getAttrib("Parameters", "alpha", alpha_);
00158                 if (Params.getAttrib("Parameters", "radius", r)) 
00159                         r2_ = r * r;
00160         }
00161         
00162         ~Spherical() {}
00163         
00164         virtual scalar_t operator()(scalar_t t, const scalar_t x[])
00165         {
00166                 scalar_t r2(0), s;
00167                 for (unsigned j = 0; j < this->dim_; j++) {
00168                         s = x[j] - x0_[j];
00169                         r2 += s * s;
00170                 }
00171                 return (r2 < r2_) ? alpha_ : scalar_t(0); 
00172         }
00173 };
00174 
00180 template <typename scalar_t>
00181 class Cylindrical : public ScalarBase<scalar_t>
00182 {
00183 private:
00184         scalar_t alpha_;
00185         scalar_t z0_; 
00186         scalar_t z1_; 
00187         scalar_t xy0_[2]; 
00188         scalar_t r2_; 
00189         
00190 public:
00192         Cylindrical(unsigned dim, scalar_t xy0[], scalar_t radius, 
00193                                                         scalar_t z0, scalar_t z1, scalar_t alpha = scalar_t(1))
00194         : ScalarBase<scalar_t>(dim), z0_(z0), z1_(z1), alpha_(alpha)
00195         {
00196                 assert (dim <= 3);
00197                 xy0_[0] = xy0[0]; xy0_[1] = xy0[1];
00198                 r2_ = radius * radius;
00199         }
00200         
00209         Cylindrical(TiXmlNode* node)
00210         : ScalarBase<scalar_t>(3), z0_(0), z1_(0), alpha_(1), r2_(0)
00211         {
00212                 XmlParser Params(node);
00213                 scalar_t r;
00214                 xy0_[0] = xy0_[1] = scalar_t(0);
00215                 const char* coordNames[2] = {"x0", "y0"};
00216                 Params.getAttribArray("Parameters", 2, coordNames, xy0_);
00217                 Params.getAttrib("Parameters", "zmin", z0_);
00218                 Params.getAttrib("Parameters", "zmax", z1_);
00219                 Params.getAttrib("Parameters", "alpha", alpha_);
00220                 if (Params.getAttrib("Parameters", "radius", r))
00221                         r2_ = r * r;
00222         }
00223         
00224         ~Cylindrical() {}
00225         
00226         virtual scalar_t operator()(scalar_t t, const scalar_t x[])
00227         {
00228                 scalar_t s0 = x[0] - xy0_[0];
00229                 scalar_t s1 = x[1] - xy0_[1];
00230                 scalar_t r2 = s0 * s0 + s1 * s1;
00231                 
00232                 return (r2 < r2_ && z0_ <= x[2] && x[2] <= z1_) ? alpha_ : scalar_t(0);
00233         }
00234 };
00235 
00239 template <typename scalar_t>
00240 static ScalarBase<scalar_t>* ScalarCatalog(TiXmlNode* node)
00241 {
00242         std::string defn;
00243         std::stringstream errBffr;
00244         XmlParser Data(node);
00245         if (!Data.getField("Definition", defn)) {
00246                 errBffr << Data.getRootName() << " missing <Definition> tag.\n";
00247                 throw std::invalid_argument(errBffr.str());
00248         }
00249         if (!Data.hasChild("Parameters")) {
00250                 errBffr << Data.getRootName() << " missing <Parameters> tag.\n";
00251                 throw std::invalid_argument(errBffr.str());
00252         }
00253         if (defn == "Gaussian") {
00254                 return new Gaussian<scalar_t>(node);
00255         }
00256         else if (defn == "Spherical") {
00257                 return new Spherical<scalar_t>(node);
00258         }
00259         else if (defn == "Cylindrical") {
00260                 return new Cylindrical<scalar_t>(node);
00261         }
00262         else {
00263                 errBffr << defn << " not found in fdl::ScalarCatalog.\n";
00264                 throw std::invalid_argument(errBffr.str());
00265         }
00266         //std::cout << "ScalarCatalog\t scalar=" << scalar << std::endl;
00267 }
00268         
00269 } // namespace fdl
00270 
00271 #endif // __FDL_SCALARS_HPP