00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __EQUA_SOLID_H
00036 #define __EQUA_SOLID_H
00037
00038 #include "Equation.h"
00039
00040 namespace OFELI {
00041
00064 template<class T_, size_t NEN_, size_t NEE_, size_t NSN_, size_t NSE_> class Equa_Solid;
00065
00066 template<class T_, size_t NEN_, size_t NEE_, size_t NSN_, size_t NSE_>
00067 class Equa_Solid : virtual public Equation<T_,NEN_,NEE_,NSN_,NSE_>
00068 {
00069
00070 public:
00071
00072 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::setMaterialProperty;
00073 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_theElement;
00074 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_theSide;
00075
00076 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00077 enum PDE_TERMS {
00078 MASS = 1,
00079 LUMPED_MASS = 2,
00080 STIFFNESS = 4,
00081 DEVIATORIC = 8,
00082 DILATATION = 12,
00083 LOAD = 20,
00084 TRACTION = 32
00085 };
00086 #endif
00087
00090 Equa_Solid() { }
00091
00093 virtual ~Equa_Solid() { }
00094
00097 virtual void LMassToLHS(double coef=1) { _coef = coef; }
00098
00101 virtual void LMassToRHS(double coef=1) { _coef = coef; }
00102
00105 virtual void MassToLHS(double coef=1) { _coef = coef; }
00106
00109 virtual void MassToRHS(double coef=1) { _coef = coef; }
00110
00112 void setLumpedMass()
00113 {
00114 LMassToLHS(1./AbsEqua<T_>::_time_step);
00115 LMassToRHS(1./AbsEqua<T_>::_time_step);
00116 }
00117
00119 void setMass()
00120 {
00121 MassToLHS(1./AbsEqua<T_>::_time_step);
00122 MassToRHS(1./AbsEqua<T_>::_time_step);
00123 }
00124
00126 virtual void Deviator(double coef=1) { coef=1; }
00127
00129 virtual void DeviatorToRHS(double coef=1) { coef=1; }
00130
00132 virtual void Stiffness(double coef=1) { coef=1; }
00133
00135 virtual void StiffnessToRHS(double coef=1) { coef=1; }
00136
00138 void setDeviator()
00139 {
00140 if (AbsEqua<T_>::time_scheme_==AbsEqua<T_>::STEADY_STATE ||
00141 AbsEqua<T_>::time_scheme_==AbsEqua<T_>::FORWARD_EULER ||
00142 AbsEqua<T_>::time_scheme_==AbsEqua<T_>::BACKWARD_EULER)
00143 Deviator(1.);
00144 else if (AbsEqua<T_>::time_scheme_==AbsEqua<T_>::CRANK_NICOLSON)
00145 Deviator(0.5);
00146 if (AbsEqua<T_>::time_scheme_==AbsEqua<T_>::CRANK_NICOLSON)
00147 DeviatorToRHS(0.5);
00148 }
00149
00151 void setStiffness()
00152 {
00153 if (AbsEqua<T_>::_time_scheme==STEADY_STATE || AbsEqua<T_>::_time_scheme==BACKWARD_EULER)
00154 Stiffness(1.);
00155 else if (AbsEqua<T_>::_time_scheme==FORWARD_EULER)
00156 StiffnessToRHS();
00157 else;
00158 }
00159
00160
00161 protected:
00162
00164 void Young(const double &E) { _E = E; }
00165
00167 void Poisson(const double &nu) { _nu = nu; }
00168
00170 void Density(const double &rho) { _rho = rho; }
00171
00173 void Young(const char *exp) { _E = setMaterialProperty(exp,"Young Modulus"); }
00174
00176 void Poisson(const char *exp) { _nu = setMaterialProperty(exp,"Poisson Coefficient"); }
00177
00179 void Density(const char *exp) { _rho = setMaterialProperty(exp,"Density"); }
00180
00182 void setMaterial()
00183 {
00184 _rho = _theElement->getMaterial()->Density();
00185 _nu = _theElement->getMaterial()->PoissonRatio();
00186 _E = _theElement->getMaterial()->YoungModulus();
00187 }
00188 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00189 double _E, _nu, _lambda, _G, _rho, _coef;
00190 #endif
00191 };
00192
00193
00194 }
00195
00196 #endif