Line data Source code
1 : // Copyright (C) 2015 Technische Universitaet Muenchen
2 : // This file is part of the Mamico project. For conditions of distribution
3 : // and use, please see the copyright notice in Mamico's main folder, or at
4 : // www5.in.tum.de/mamico
5 : #ifndef _MOLECULARDYNAMICS_COUPLING_SOLVERS_COUETTESOLVER_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_SOLVERS_COUETTESOLVER_H_
7 :
8 : #include "tarch/la/Vector.h"
9 : #include <cmath>
10 :
11 : namespace coupling {
12 : /** @brief all numerical solvers are defined in the namespace, and their
13 : * interfaces */
14 : namespace solvers {
15 : /** @brief interface for continuum/macro fluid solvers for the Couette scenario
16 : * @author Philipp Neumann
17 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2,
18 : * or 3*/
19 116 : template <unsigned int dim> class AbstractCouetteSolver {
20 : public:
21 : /** @brief a dummy destructor
22 : * @todo Why a dummy destructor buut not a constructor */
23 116 : virtual ~AbstractCouetteSolver() {}
24 : /** @brief advances the solver in time
25 : * @param dt the solver will be advanced from the current time t to t+dt */
26 : virtual void advance(double dt) = 0;
27 : /** @brief returns the current velocity at the given position
28 : * @param pos position to return the velocity for
29 : * @returns a velocity vector */
30 : virtual tarch::la::Vector<dim, double> getVelocity(tarch::la::Vector<dim, double> pos) const = 0;
31 : /** @brief changes the velocity at the moving for, refers to Couette scenario
32 : * @param wallVelocity value to which the veloctiy will be set */
33 : virtual void setWallVelocity(const tarch::la::Vector<dim, double> wallVelocity) = 0;
34 : };
35 :
36 : template <unsigned int dim> class CouetteSolver;
37 : } // namespace solvers
38 : } // namespace coupling
39 :
40 : /** In our scenario, the lower wall is accelerated and the upper wall stands
41 : * still. The lower wall is located at zero height.
42 : * @brief implements an analytic Couette flow solver.
43 : * @author Philipp Neumann
44 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2,
45 : * or 3 */
46 : template <unsigned int dim> class coupling::solvers::CouetteSolver : public coupling::solvers::AbstractCouetteSolver<dim> {
47 : public:
48 : /** @brief a simple constructor
49 : * @param channelheight the height and width of the channel in y and z
50 : * direction
51 : * @param wallVelocity the velocity at the moving wall
52 : * @param kinVisc the kinematic viscosity of the fluid */
53 : CouetteSolver(const double& channelheight, const double& wallVelocity, const double kinVisc)
54 : : AbstractCouetteSolver<dim>(), _channelheight(channelheight), _wallVelocity(wallVelocity), _kinVisc(kinVisc), _time(0.0) {}
55 :
56 : /** @brief a dummy destructor */
57 : virtual ~CouetteSolver() {}
58 :
59 : /** @brief advances one time step dt in time
60 : * @param dt size of the time step to advance */
61 : virtual void advance(double dt) { _time += dt; }
62 :
63 : /** for the first entry of the vector is the analytic solution of the Couette
64 : * scenario returned, given by: u(z,t)= V(1-z/H) - 2V/pi*sum_k=1^infty
65 : * 1/k*sin(k*pi*z/H)*exp(-k^2 pi^2/H^2 * nu*t) The other two entries are 0
66 : * @brief returns the velocity vector at a certain channel position
67 : * @param pos the position to return the velocity for
68 : * @returns a velocity vector */
69 : virtual tarch::la::Vector<dim, double> getVelocity(tarch::la::Vector<dim, double> pos) const {
70 : tarch::la::Vector<dim, double> v(0.0);
71 : v[0] = _wallVelocity * (1.0 - pos[dim - 1] / _channelheight);
72 : const double pi = 3.141592653589793238;
73 : double sum = 0.0;
74 : for (int k = 1; k < 30; k++) {
75 : sum += 1.0 / k * sin(k * pi * pos[dim - 1] / _channelheight) * exp(-k * k * pi * pi / (_channelheight * _channelheight) * _kinVisc * _time);
76 : }
77 : v[0] = v[0] - 2.0 * _wallVelocity / pi * sum;
78 : return v;
79 : }
80 :
81 : /** @brief changes the velocity at the moving for, refers to Couette scenario
82 : * @param wallVelocity value to which the veloctiy will be set */
83 : virtual void setWallVelocity(const tarch::la::Vector<dim, double> wallVelocity) { _wallVelocity = wallVelocity[0]; }
84 :
85 : private:
86 : /** @brief height of couette channel */
87 : const double _channelheight;
88 : /** @brief velocity of moving wall */
89 : double _wallVelocity;
90 : /** @brief kinematic viscosity */
91 : const double _kinVisc;
92 : /** @brief current time */
93 : double _time;
94 : };
95 :
96 : #endif // _MOLECULARDYNAMICS_COUPLING_SOLVERS_COUETTESOLVER_H_
|