|
Fluid Dynamics Library
|
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
1.7.4