00001 #ifndef _deal2_myfunction_h_ 00002 #define _deal2_myfunction_h_ 00003 00004 #include <base/function_lib.h> 00005 00006 using namespace dealii; 00007 00008 00009 template<int dim> 00010 class MyFunction : public Function<dim> 00011 { 00012 public: 00013 00014 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00015 const unsigned int component = 0) const = 0 ; 00016 00017 virtual void hessian_list (const std::vector<Point<dim> > &points, 00018 std::vector<Tensor<2,dim> > &hessians, 00019 const unsigned int component = 0) const = 0; 00020 00021 }; 00022 00023 template<int dim> 00024 class TestFunction : public MyFunction<dim> 00025 { 00026 public: 00027 00028 TestFunction (); 00029 00030 virtual double value (const Point<dim> &p, 00031 const unsigned int component = 0) const; 00032 00033 virtual void value_list (const std::vector<Point<dim> > &points, 00034 std::vector<double> &values, 00035 const unsigned int component = 0) const; 00036 00037 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00038 const unsigned int component = 0) const; 00039 00040 virtual void gradient_list (const std::vector<Point<dim> > &points, 00041 std::vector<Tensor<1,dim> > &gradients, 00042 const unsigned int component = 0) const; 00043 00044 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00045 const unsigned int component = 0) const; 00046 00047 virtual void hessian_list (const std::vector<Point<dim> > &points, 00048 std::vector<Tensor<2,dim> > &hessians, 00049 const unsigned int component = 0) const; 00050 00051 virtual double laplacian (const Point<dim> &p, 00052 const unsigned int component = 0) const; 00053 00054 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00055 std::vector<double> &values, 00056 const unsigned int component = 0) const; 00057 private: 00058 }; 00059 00060 00061 00062 template<int dim> 00063 class QuarticFunction : public MyFunction<dim> 00064 { 00065 public: 00066 00067 QuarticFunction (); 00068 00069 virtual double value (const Point<dim> &p, 00070 const unsigned int component = 0) const; 00071 00072 virtual void value_list (const std::vector<Point<dim> > &points, 00073 std::vector<double> &values, 00074 const unsigned int component = 0) const; 00075 00076 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00077 const unsigned int component = 0) const; 00078 00079 virtual void gradient_list (const std::vector<Point<dim> > &points, 00080 std::vector<Tensor<1,dim> > &gradients, 00081 const unsigned int component = 0) const; 00082 00083 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00084 const unsigned int component = 0) const; 00085 00086 virtual void hessian_list (const std::vector<Point<dim> > &points, 00087 std::vector<Tensor<2,dim> > &hessians, 00088 const unsigned int component = 0) const; 00089 00090 virtual double laplacian (const Point<dim> &p, 00091 const unsigned int component = 0) const; 00092 00093 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00094 std::vector<double> &values, 00095 const unsigned int component = 0) const; 00096 private: 00097 }; 00098 00099 template<int dim> 00100 class QuadraticFunction : public MyFunction<dim> 00101 { 00102 public: 00103 00104 QuadraticFunction (); 00105 00106 virtual double value (const Point<dim> &p, 00107 const unsigned int component = 0) const; 00108 00109 virtual void value_list (const std::vector<Point<dim> > &points, 00110 std::vector<double> &values, 00111 const unsigned int component = 0) const; 00112 00113 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00114 const unsigned int component = 0) const; 00115 00116 virtual void gradient_list (const std::vector<Point<dim> > &points, 00117 std::vector<Tensor<1,dim> > &gradients, 00118 const unsigned int component = 0) const; 00119 00120 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00121 const unsigned int component = 0) const; 00122 00123 virtual void hessian_list (const std::vector<Point<dim> > &points, 00124 std::vector<Tensor<2,dim> > &hessians, 00125 const unsigned int component = 0) const; 00126 00127 virtual double laplacian (const Point<dim> &p, 00128 const unsigned int component = 0) const; 00129 00130 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00131 std::vector<double> &values, 00132 const unsigned int component = 0) const; 00133 private: 00134 }; 00135 00136 class CubicTestFunction : public MyFunction<2> 00137 { 00138 public: 00139 00140 CubicTestFunction (); 00141 00142 virtual double value (const Point<2> &p, 00143 const unsigned int component = 0) const; 00144 00145 virtual void value_list (const std::vector<Point<2> > &points, 00146 std::vector<double> &values, 00147 const unsigned int component = 0) const; 00148 00149 virtual Tensor<1,2> gradient (const Point<2> &p, 00150 const unsigned int component = 0) const; 00151 00152 virtual void gradient_list (const std::vector<Point<2> > &points, 00153 std::vector<Tensor<1,2> > &gradients, 00154 const unsigned int component = 0) const; 00155 00156 virtual Tensor<2,2> hessian (const Point<2> &p, 00157 const unsigned int component = 0) const; 00158 00159 virtual void hessian_list (const std::vector<Point<2> > &points, 00160 std::vector<Tensor<2,2> > &hessians, 00161 const unsigned int component = 0) const; 00162 00163 virtual double laplacian (const Point<2> &p, 00164 const unsigned int component = 0) const; 00165 00166 virtual void laplacian_list (const std::vector<Point<2> > &points, 00167 std::vector<double> &values, 00168 const unsigned int component = 0) const; 00169 private: 00170 }; 00171 00172 template<int dim> 00173 class LinearFunction : public MyFunction<dim> 00174 { 00175 public: 00176 00177 LinearFunction (); 00178 00179 virtual double value (const Point<dim> &p, 00180 const unsigned int component = 0) const; 00181 00182 virtual void value_list (const std::vector<Point<dim> > &points, 00183 std::vector<double> &values, 00184 const unsigned int component = 0) const; 00185 00186 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00187 const unsigned int component = 0) const; 00188 00189 virtual void gradient_list (const std::vector<Point<dim> > &points, 00190 std::vector<Tensor<1,dim> > &gradients, 00191 const unsigned int component = 0) const; 00192 00193 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00194 const unsigned int component = 0) const; 00195 00196 virtual void hessian_list (const std::vector<Point<dim> > &points, 00197 std::vector<Tensor<2,dim> > &hessians, 00198 const unsigned int component = 0) const; 00199 00200 virtual double laplacian (const Point<dim> &p, 00201 const unsigned int component = 0) const; 00202 00203 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00204 std::vector<double> &values, 00205 const unsigned int component = 0) const; 00206 private: 00207 }; 00208 00209 00210 template<int dim> 00211 class ExactSolutionSSSS : public MyFunction<dim> 00212 { 00213 public: 00214 00215 ExactSolutionSSSS (); 00216 00217 virtual double value (const Point<dim> &p, 00218 const unsigned int component = 0) const; 00219 00220 virtual void value_list (const std::vector<Point<dim> > &points, 00221 std::vector<double> &values, 00222 const unsigned int component = 0) const; 00223 00224 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00225 const unsigned int component = 0) const; 00226 00227 virtual void gradient_list (const std::vector<Point<dim> > &points, 00228 std::vector<Tensor<1,dim> > &gradients, 00229 const unsigned int component = 0) const; 00230 00231 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00232 const unsigned int component = 0) const; 00233 00234 virtual void hessian_list (const std::vector<Point<dim> > &points, 00235 std::vector<Tensor<2,dim> > &hessians, 00236 const unsigned int component = 0) const; 00237 00238 virtual double laplacian (const Point<dim> &p, 00239 const unsigned int component = 0) const; 00240 00241 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00242 std::vector<double> &values, 00243 const unsigned int component = 0) const; 00244 private: 00245 }; 00246 00247 template<int dim> 00248 class ExactSolutionCFCF : public MyFunction<dim> 00249 { 00250 public: 00251 00252 ExactSolutionCFCF (); 00253 00254 virtual double value (const Point<dim> &p, 00255 const unsigned int component = 0) const; 00256 00257 virtual void value_list (const std::vector<Point<dim> > &points, 00258 std::vector<double> &values, 00259 const unsigned int component = 0) const; 00260 00261 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00262 const unsigned int component = 0) const; 00263 00264 virtual void gradient_list (const std::vector<Point<dim> > &points, 00265 std::vector<Tensor<1,dim> > &gradients, 00266 const unsigned int component = 0) const; 00267 00268 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00269 const unsigned int component = 0) const; 00270 00271 virtual void hessian_list (const std::vector<Point<dim> > &points, 00272 std::vector<Tensor<2,dim> > &hessians, 00273 const unsigned int component = 0) const; 00274 00275 virtual double laplacian (const Point<dim> &p, 00276 const unsigned int component = 0) const; 00277 00278 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00279 std::vector<double> &values, 00280 const unsigned int component = 0) const; 00281 private: 00282 }; 00283 00284 template<int dim> 00285 class ExactSolutionSFSF : public MyFunction<dim> 00286 { 00287 public: 00288 00289 ExactSolutionSFSF (); 00290 00291 virtual double value (const Point<dim> &p, 00292 const unsigned int component = 0) const; 00293 00294 virtual void value_list (const std::vector<Point<dim> > &points, 00295 std::vector<double> &values, 00296 const unsigned int component = 0) const; 00297 00298 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00299 const unsigned int component = 0) const; 00300 00301 virtual void gradient_list (const std::vector<Point<dim> > &points, 00302 std::vector<Tensor<1,dim> > &gradients, 00303 const unsigned int component = 0) const; 00304 00305 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00306 const unsigned int component = 0) const; 00307 00308 virtual void hessian_list (const std::vector<Point<dim> > &points, 00309 std::vector<Tensor<2,dim> > &hessians, 00310 const unsigned int component = 0) const; 00311 00312 virtual double laplacian (const Point<dim> &p, 00313 const unsigned int component = 0) const; 00314 00315 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00316 std::vector<double> &values, 00317 const unsigned int component = 0) const; 00318 private: 00319 }; 00320 00321 template<int dim> 00322 class ExactSolutionCFSF : public MyFunction<dim> 00323 { 00324 public: 00325 00326 ExactSolutionCFSF (); 00327 00328 virtual double value (const Point<dim> &p, 00329 const unsigned int component = 0) const; 00330 00331 virtual void value_list (const std::vector<Point<dim> > &points, 00332 std::vector<double> &values, 00333 const unsigned int component = 0) const; 00334 00335 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00336 const unsigned int component = 0) const; 00337 00338 virtual void gradient_list (const std::vector<Point<dim> > &points, 00339 std::vector<Tensor<1,dim> > &gradients, 00340 const unsigned int component = 0) const; 00341 00342 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00343 const unsigned int component = 0) const; 00344 00345 virtual void hessian_list (const std::vector<Point<dim> > &points, 00346 std::vector<Tensor<2,dim> > &hessians, 00347 const unsigned int component = 0) const; 00348 00349 virtual double laplacian (const Point<dim> &p, 00350 const unsigned int component = 0) const; 00351 00352 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00353 std::vector<double> &values, 00354 const unsigned int component = 0) const; 00355 private: 00356 }; 00357 00358 template<int dim> 00359 class PillowSquareFunction : public MyFunction<dim> 00360 { 00361 public: 00362 00363 PillowSquareFunction (const double offset=0.); 00364 00365 00366 virtual double value (const Point<dim> &p, 00367 const unsigned int component = 0) const; 00368 00369 virtual void value_list (const std::vector<Point<dim> > &points, 00370 std::vector<double> &values, 00371 const unsigned int component = 0) const; 00372 00373 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00374 const unsigned int component = 0) const; 00375 00376 virtual void gradient_list (const std::vector<Point<dim> > &points, 00377 std::vector<Tensor<1,dim> > &gradients, 00378 const unsigned int component = 0) const; 00379 00380 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00381 const unsigned int component = 0) const; 00382 00383 virtual void hessian_list (const std::vector<Point<dim> > &points, 00384 std::vector<Tensor<2,dim> > &hessians, 00385 const unsigned int component = 0) const; 00386 00387 virtual double laplacian (const Point<dim> &p, 00388 const unsigned int component = 0) const; 00389 00390 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00391 std::vector<double> &values, 00392 const unsigned int component = 0) const; 00393 private: 00394 const double offset; 00395 }; 00396 00397 template <int dim> 00398 class CosineSquareFunction : public MyFunction<dim> 00399 { 00400 public: 00401 00402 virtual double value (const Point<dim> &p, 00403 const unsigned int component = 0) const; 00404 00405 virtual void value_list (const std::vector<Point<dim> > &points, 00406 std::vector<double> &values, 00407 const unsigned int component = 0) const; 00408 00409 virtual Tensor<1,dim> gradient (const Point<dim> &p, 00410 const unsigned int component = 0) const; 00411 00412 virtual void gradient_list (const std::vector<Point<dim> > &points, 00413 std::vector<Tensor<1,dim> > &gradients, 00414 const unsigned int component = 0) const; 00415 00416 virtual double laplacian (const Point<dim> &p, 00417 const unsigned int component = 0) const; 00418 00419 virtual void laplacian_list (const std::vector<Point<dim> > &points, 00420 std::vector<double> &values, 00421 const unsigned int component = 0) const; 00422 00423 virtual Tensor<2,dim> hessian (const Point<dim> &p, 00424 const unsigned int component = 0) const; 00425 00426 virtual void hessian_list (const std::vector<Point<dim> > &points, 00427 std::vector<Tensor<2,dim> > &hessians, 00428 const unsigned int component = 0) const; 00429 00430 }; 00431 00432 #endif // _deal2_myfunction_h