include/deal.II/base/flow_function.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: flow_function.h 25460 2012-04-27 09:19:06Z bangerth @f$
00003 //
00004 //    Copyright (C) 2007, 2008, 2010, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Tue May 22 2012 12:06:05 by doxygen 1.7.3