Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

NSE.h

Go to the documentation of this file.
00001 // Copyright (C) 2004 Johan Hoffman.
00002 // Licensed under the GNU GPL Version 2.
00003 
00004 #ifndef __NSE_H
00005 #define __NSE_H
00006 
00007 #include <dolfin/PDE.h>
00008 
00009 namespace dolfin {
00010   
00011   class NSE_Momentum : public PDE {
00012   public:
00013     
00014     NSE_Momentum(Function::Vector& source,
00015                  Function::Vector& uprevious,
00016                  Function::Vector& convection,
00017                  Function::Vector& pressure) :
00018       PDE(3, 3), f(1), up(3), b(3), p(1)
00019       {
00020         add(f,  source);
00021         add(up, uprevious);
00022         add(b,  convection);
00023         add(p,  pressure);
00024 
00025         C1 = 2.0;
00026         C2 = 1.0;
00027 
00028         nu = 1.0/1000.0;
00029 
00030         bcwt = 1.0e7;
00031       }
00032     
00033     real lhs(ShapeFunction::Vector& u, ShapeFunction::Vector& v)
00034     {
00035 
00036       unorm = sqrt(sqr(b(0)(cell_->node(0).id()))+sqr(b(1)(cell_->node(0).id()))+sqr(b(2)(cell_->node(0).id())));
00037       if ( (h/nu) > 1.0 ) d1 = C1 * (0.5 / sqrt( 1.0/sqr(k) + sqr(unorm/h) ));
00038       else d1 = C1 * sqr(h);
00039 
00040       if ( (h/nu) > 1.0 ) d2 = C2 * h;
00041       else d2 = C2 * sqr(h);
00042       
00043       MASS = (u(0)*v(0) + u(1)*v(1) + u(2)*v(2)) * dx;
00044       STIFF = nu*((grad(u(0)),grad(v(0))) + (grad(u(1)),grad(v(1))) + (grad(u(2)),grad(v(2)))) * dx;
00045       NL = ((b,grad(u(0)))*v(0) + (b,grad(u(1)))*v(1) + (b,grad(u(2)))*v(2)) * dx; 
00046 
00047       SD = (d1*((b,grad(u(0)))*(b,grad(v(0))) + (b,grad(u(1)))*(b,grad(v(1))) + (b,grad(u(2)))*(b,grad(v(2)))) + 
00048             d2*(ddx(u(0))+ddy(u(1))+ddz(u(2)))*(ddx(v(0))+ddy(v(1))+ddz(v(2)))) * dx;      
00049 
00050       BC = bcwt*(u(0)*v(0) + u(1)*v(1) + u(2)*v(2)) * ds;
00051 
00052       return (MASS*(1.0/k) + 0.5*(STIFF + NL + SD) + BC); 
00053 
00054     }
00055     
00056     real rhs(ShapeFunction::Vector& v)
00057     {
00058 
00059       unorm = sqrt(sqr(b(0)(cell_->node(0).id()))+sqr(b(1)(cell_->node(0).id()))+sqr(b(2)(cell_->node(0).id())));
00060       if ( (h/nu) > 1.0 ) d1 = C1 * (0.5 / sqrt( 1.0/sqr(k) + sqr(unorm/h) ));
00061       else d1 = C1 * sqr(h);
00062 
00063       if ( (h/nu) > 1.0 ) d2 = C2 * h;
00064       else d2 = C2 * sqr(h);
00065       
00066       MASS = ((up(0),v(0)) + (up(1),v(1)) + (up(2),v(2))) * dx;
00067       STIFF = nu*( ddx(up(0))*ddx(v(0)) + ddy(up(0))*ddy(v(0)) + ddz(up(0))*ddz(v(0)) +
00068                    ddx(up(1))*ddx(v(1)) + ddy(up(1))*ddy(v(1)) + ddz(up(1))*ddz(v(1)) + 
00069                    ddx(up(2))*ddx(v(2)) + ddy(up(2))*ddy(v(2)) + ddz(up(2))*ddz(v(2)) ) * dx; 
00070       NL = ( (b(0)*ddx(up(0)) + b(1)*ddy(up(0)) + b(2)*ddz(up(0)))*v(0) + 
00071              (b(0)*ddx(up(1)) + b(1)*ddy(up(1)) + b(2)*ddz(up(1)))*v(1) + 
00072              (b(0)*ddx(up(2)) + b(1)*ddy(up(2)) + b(2)*ddz(up(2)))*v(2) ) * dx;
00073       SD = ( d1*((b(0)*ddx(up(0)) + b(1)*ddy(up(0)) + b(2)*ddz(up(0)))*(b,grad(v(0))) + 
00074                  (b(0)*ddx(up(1)) + b(1)*ddy(up(1)) + b(2)*ddz(up(1)))*(b,grad(v(0))) + 
00075                  (b(0)*ddx(up(2)) + b(1)*ddy(up(2)) + b(2)*ddz(up(2)))*(b,grad(v(0)))) + 
00076              d2*(ddx(up(0))+ddy(up(1))+ddz(up(2)))*(ddx(v(0))+ddy(v(1))+ddz(v(2))) ) * dx; 
00077       SDP = d1*(ddx(p(0))*(b,grad(v(0))) + ddy(p(0))*(b,grad(v(1))) + ddz(p(0))*(b,grad(v(2)))) * dx;
00078       SDF = d1*(f(0)*(b,grad(v(0))) + f(1)*(b,grad(v(1))) + f(2)*(b,grad(v(2)))) * dx;
00079       PDV = p(0)*(ddx(v(0))+ddy(v(1))+ddz(v(2))) * dx;
00080       F = ((f(0),v(0)) + (f(1),v(1)) + (f(2),v(2))) * dx;
00081       
00082       ud0 = 0.0; ud1 = 0.0; ud2 = 0.0;
00083       un0 = 0.0; un1 = 0.0; un2 = 0.0;
00084       BC = bcwt*((ud0-un0)*v(0) + (ud1-un1)*v(1) + (ud2-un2)*v(2)) * ds;
00085       
00086       return (MASS*(1.0/k) - 0.5*(STIFF + NL + SD) - SDP + SDF + PDV + F + BC);
00087 
00088     }
00089     
00090   private:    
00091     ElementFunction::Vector f;   // Source term
00092     ElementFunction::Vector up;  // Velocity value at left end-point
00093     ElementFunction::Vector b;   // Convection = linearized velocity
00094     ElementFunction::Vector p;   // linearized pressure
00095 
00096     real nu,d1,d2,C1,C2,unorm,SD,SDP,SDF,MASS,STIFF,NL,PDV,F,BC,ud0,ud1,ud2,un0,un1,un2,bcwt;
00097   };
00098 
00099   //-------------------------------------------------------------------------------------------
00100 
00101   class NSE_Continuity : public PDE {
00102   public:
00103     
00104     NSE_Continuity(Function::Vector& source,
00105                    Function::Vector& convection) :
00106       PDE(1, 1), f(1), b(3)
00107       {
00108         add(f,  source);
00109         add(b,  convection);
00110 
00111         C1 = 2.0;
00112 
00113         nu = 1.0/1000.0;
00114 
00115         bcwt = 0.0;
00116       }
00117     
00118     real lhs(ShapeFunction& u, ShapeFunction& v)
00119     {
00120 
00121       STIFF = (grad(u),grad(v)) * dx;
00122 
00123       BC = bcwt*(u*v) * ds;
00124 
00125       return (STIFF + BC);
00126 
00127     }
00128     
00129     real rhs(ShapeFunction& v)
00130     {
00131 
00132       unorm = sqrt(sqr(b(0)(cell_->node(0).id()))+sqr(b(1)(cell_->node(0).id()))+sqr(b(2)(cell_->node(0).id())));
00133       if ( (h/nu) > 1.0 ) d1 = C1 * (0.5 / sqrt( 1.0/sqr(k) + sqr(unorm/h) ));
00134       else d1 = C1 * sqr(h);
00135       
00136       SD = ((b(0)*ddx(b(0)) + b(1)*ddy(b(0)) + b(2)*ddz(b(0)))*v.ddx() + 
00137             (b(0)*ddx(b(1)) + b(1)*ddy(b(1)) + b(2)*ddz(b(1)))*v.ddy() + 
00138             (b(0)*ddx(b(2)) + b(1)*ddy(b(2)) + b(2)*ddz(b(2)))*v.ddz()) * dx;   
00139       
00140       DIV = (ddx(b(0)) + ddy(b(1)) + ddz(b(2)))*v * dx;
00141 
00142       ud = 0.0;
00143       un = 0.0;
00144       BC = bcwt*((ud-un)*v) * ds;
00145 
00146       return ( (-1.0)*(SD + (1.0/d1)*DIV) + BC);
00147       
00148     }
00149     
00150   private:
00151 
00152     ElementFunction::Vector f;   // Source term
00153     ElementFunction::Vector b;   // Convection = linearized velocity
00154 
00155     real nu,d1,d2,C1,C2,unorm,bcwt,STIFF,SD,DIV,BC,ud,un;
00156 
00157   };
00158   
00159 
00160 
00161   
00162 }
00163 
00164 #endif


Documentation automatically generated with Doxygen on 10 Sep 2004.