00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __deal2__flow_function_h
00013 #define __deal2__flow_function_h
00014
00015
00016 #include <deal.II/base/config.h>
00017 #include <deal.II/base/function.h>
00018 #include <deal.II/base/point.h>
00019 #include <deal.II/base/thread_management.h>
00020
00021 DEAL_II_NAMESPACE_OPEN
00022
00023 namespace Functions
00024 {
00044 template <int dim>
00045 class FlowFunction : public Function<dim>
00046 {
00047 public:
00052 FlowFunction();
00053
00057 virtual ~FlowFunction();
00058
00065 void pressure_adjustment(double p);
00066
00075 virtual void vector_values (const std::vector<Point<dim> >& points,
00076 std::vector<std::vector<double> >& values) const = 0;
00085 virtual void vector_gradients (const std::vector<Point<dim> > &points,
00086 std::vector<std::vector<Tensor<1,dim> > > &gradients) const = 0;
00101 virtual void vector_laplacians (const std::vector<Point<dim> > &points,
00102 std::vector<std::vector<double> > &values) const = 0;
00103
00104 virtual void vector_value (const Point<dim>& points, Vector<double>& value) const;
00105 virtual double value (const Point<dim>& points, const unsigned int component) const;
00106 virtual void vector_value_list (const std::vector<Point<dim> > &points,
00107 std::vector<Vector<double> > &values) const;
00108 virtual void vector_gradient_list (const std::vector<Point<dim> > &points,
00109 std::vector<std::vector<Tensor<1,dim> > > &gradients) const;
00114 virtual void vector_laplacian_list (const std::vector<Point<dim> > &points,
00115 std::vector<Vector<double> > &values) const;
00116
00117 std::size_t memory_consumption () const;
00118
00119 protected:
00125 double mean_pressure;
00126
00127 private:
00128
00133 mutable Threads::Mutex mutex;
00134
00139 mutable std::vector<std::vector<double> > aux_values;
00140
00145 mutable std::vector<std::vector<Tensor<1,dim> > > aux_gradients;
00146 };
00147
00157 template <int dim>
00158 class PoisseuilleFlow : public FlowFunction<dim>
00159 {
00160 public:
00167 PoisseuilleFlow<dim> (const double r,
00168 const double Re);
00169 virtual ~PoisseuilleFlow();
00170
00171 virtual void vector_values (const std::vector<Point<dim> >& points,
00172 std::vector<std::vector<double> >& values) const;
00173 virtual void vector_gradients (const std::vector<Point<dim> >& points,
00174 std::vector<std::vector<Tensor<1,dim> > >& gradients) const;
00175 virtual void vector_laplacians (const std::vector<Point<dim> > &points,
00176 std::vector<std::vector<double> > &values) const;
00177
00178 private:
00179 const double radius;
00180 const double Reynolds;
00181 };
00182
00183
00197 template <int dim>
00198 class StokesCosine :
00199 public FlowFunction<dim>
00200 {
00201 public:
00208 StokesCosine (const double viscosity = 1., const double reaction = 0.);
00213 void set_parameters (const double viscosity, const double reaction);
00214 virtual ~StokesCosine();
00215
00216 virtual void vector_values (const std::vector<Point<dim> >& points,
00217 std::vector<std::vector<double> >& values) const;
00218 virtual void vector_gradients (const std::vector<Point<dim> >& points,
00219 std::vector<std::vector<Tensor<1,dim> > >& gradients) const;
00220 virtual void vector_laplacians (const std::vector<Point<dim> > &points,
00221 std::vector<std::vector<double> > &values) const;
00222
00223 private:
00225 double viscosity;
00227 double reaction;
00228 };
00229
00230
00239 class StokesLSingularity : public FlowFunction<2>
00240 {
00241 public:
00243 StokesLSingularity();
00244
00245 virtual void vector_values (const std::vector<Point<2> >& points,
00246 std::vector<std::vector<double> >& values) const;
00247 virtual void vector_gradients (const std::vector<Point<2> >& points,
00248 std::vector<std::vector<Tensor<1,2> > >& gradients) const;
00249 virtual void vector_laplacians (const std::vector<Point<2> > &points,
00250 std::vector<std::vector<double> > &values) const;
00251 private:
00253 double Psi(double phi) const;
00255 double Psi_1(double phi) const;
00257 double Psi_2(double phi) const;
00259 double Psi_3(double phi) const;
00261 double Psi_4(double phi) const;
00263 const double omega;
00265 static const double lambda;
00267 const double coslo;
00269 const double lp;
00271 const double lm;
00272 };
00273
00283 class Kovasznay : public FlowFunction<2>
00284 {
00285 public:
00300 Kovasznay (const double Re, bool Stokes = false);
00301 virtual ~Kovasznay();
00302
00303 virtual void vector_values (const std::vector<Point<2> >& points,
00304 std::vector<std::vector<double> >& values) const;
00305 virtual void vector_gradients (const std::vector<Point<2> >& points,
00306 std::vector<std::vector<Tensor<1,2> > >& gradients) const;
00307 virtual void vector_laplacians (const std::vector<Point<2> > &points,
00308 std::vector<std::vector<double> > &values) const;
00309
00311 double lambda () const;
00312 private:
00313 const double Reynolds;
00314 double lbda;
00315 double p_average;
00316 const bool stokes;
00317 };
00318
00319 }
00320
00321 DEAL_II_NAMESPACE_CLOSE
00322
00323 #endif
00324