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

Elasticity.h

Go to the documentation of this file.
00001 // Copyright (C) 2003 Fredrik Bengzon and Johan Jansson.
00002 // Licensed under the GNU GPL Version 2.
00003 
00004 #ifndef __ELASTICITY_H
00005 #define __ELASTICITY_H
00006 
00007 #include <dolfin/PDE.h>
00008 
00009 namespace dolfin {
00010   
00011   class Elasticity : public PDE {
00012   public:
00013     
00014     Elasticity(Function::Vector& source,
00015                Function::Vector& uprevious,
00016                Function::Vector& wprevious) : PDE(3, 3), f(3), up(3), wp(3)
00017     {
00018       add(f,  source);
00019       add(up, uprevious);
00020       add(wp, wprevious);
00021     }
00022     
00023     real lhs(ShapeFunction::Vector& u, ShapeFunction::Vector& v)
00024     {
00025       real lambda = 1.0;
00026       real mu = 1.0;
00027 
00028       ElementFunction
00029         epsilon00, epsilon01, epsilon02,
00030         epsilon10, epsilon11, epsilon12,
00031         epsilon20, epsilon21, epsilon22;
00032 
00033       ElementFunction
00034         epsilonv00, epsilonv01, epsilonv02,
00035         epsilonv10, epsilonv11, epsilonv12,
00036         epsilonv20, epsilonv21, epsilonv22;
00037 
00038       ElementFunction
00039         sigma00, sigma01, sigma02,
00040         sigma10, sigma11, sigma12,
00041         sigma20, sigma21, sigma22;
00042 
00043       epsilon00 = u(0).ddx();
00044       epsilon01 = 0.5 * (u(0).ddy() + u(1).ddx());
00045       epsilon02 = 0.5 * (u(0).ddz() + u(2).ddx());
00046       epsilon10 = 0.5 * (u(1).ddx() + u(0).ddy());
00047       epsilon11 = u(1).ddy();
00048       epsilon12 = 0.5 * (u(1).ddz() + u(2).ddy());
00049       epsilon20 = 0.5 * (u(2).ddx() + u(0).ddz());
00050       epsilon21 = 0.5 * (u(2).ddy() + u(1).ddz());
00051       epsilon22 = u(2).ddz();
00052 
00053       epsilonv00 = v(0).ddx();
00054       epsilonv01 = 0.5 * (v(0).ddy() + v(1).ddx());
00055       epsilonv02 = 0.5 * (v(0).ddz() + v(2).ddx());
00056       epsilonv10 = 0.5 * (v(1).ddx() + v(0).ddy());
00057       epsilonv11 = v(1).ddy();
00058       epsilonv12 = 0.5 * (v(1).ddz() + v(2).ddy());
00059       epsilonv20 = 0.5 * (v(2).ddx() + v(0).ddz());
00060       epsilonv21 = 0.5 * (v(2).ddy() + v(1).ddz());
00061       epsilonv22 = v(2).ddz();
00062 
00063       sigma00 = lambda * (u(0).ddx() + u(1).ddy() + u(2).ddz()) +
00064         2 * mu * epsilon00;
00065       sigma01 = 2 * mu * epsilon01;
00066       sigma02 = 2 * mu * epsilon02;
00067       sigma10 = 2 * mu * epsilon10;
00068       sigma11 = lambda * (u(0).ddx() + u(1).ddy() + u(2).ddz()) +
00069         2 * mu * epsilon11;
00070       sigma12 = 2 * mu * epsilon12;
00071       sigma20 = 2 * mu * epsilon20;
00072       sigma21 = 2 * mu * epsilon21;
00073       sigma22 = lambda * (u(0).ddx() + u(1).ddy() + u(2).ddz()) +
00074         2 * mu * epsilon22;
00075 
00076       return
00077         ((u(0) * v(0) + u(1) * v(1) + u(2) * v(2)) + k * k *
00078          (sigma00 * epsilonv00 + sigma01 * epsilonv01 + sigma02 * epsilonv02 +
00079           sigma10 * epsilonv10 + sigma11 * epsilonv11 + sigma12 * epsilonv12 +
00080           sigma20 * epsilonv20 + sigma21 * epsilonv21 + sigma22 * epsilonv22)) * dx;
00081     }
00082     
00083     real rhs(ShapeFunction::Vector& v)
00084     {
00085       return ((up(0) * v(0) + up(1) * v(1) + up(2) * v(2)) +
00086               k * (wp(0) * v(0) + wp(1) * v(1) + wp(2) * v(2)) +
00087               k * k * (f(0) * v(0) + f(1) * v(1) + f(2) * v(2))) * dx;
00088     }
00089     
00090   private:    
00091     ElementFunction::Vector f; // Source term
00092     ElementFunction::Vector up;        // Displacement value at left end-point
00093     ElementFunction::Vector wp;        // Velocity value at left end-point
00094   };
00095   
00096 }
00097 
00098 #endif


Documentation automatically generated with Doxygen on 10 Sep 2004.