![]() |
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.