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