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 #ifndef __EQUA_THERM_H
00035 #define __EQUA_THERM_H
00036
00037 #include "Equation.h"
00038 #include "therm/PhaseChange.h"
00039
00040 namespace OFELI {
00041
00051 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00052 enum PDE_TERMS {
00053 CAPACITY = 1,
00054 LUMPED_CAPACITY = 2,
00055 DIFFUSION = 4,
00056 CONVECTION = 8,
00057 HEAT_SOURCE = 12,
00058 HEAT_FLUX = 20
00059 };
00060 #endif
00061
00076 template<class T_, size_t NEN_, size_t NEE_, size_t NSN_, size_t NSE_> class Equa_Therm;
00077
00078 template<class T_, size_t NEN_, size_t NEE_, size_t NSN_, size_t NSE_>
00079 class Equa_Therm : virtual public Equation<T_,NEN_,NEE_,NSN_,NSE_>
00080 {
00081
00082 public:
00083
00084 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::setMaterialProperty;
00085 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_theElement;
00086 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_theSide;
00087 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_terms;
00088 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_analysis;
00089 using Equation<T_,NEN_,NEE_,NSN_,NSE_>::_time_scheme;
00090
00093 Equa_Therm()
00094 {
00095 _terms = DIFFUSION;
00096 _analysis = STEADY_STATE;
00097 _time_scheme = STATIONARY;
00098 }
00099
00101 virtual ~Equa_Therm()
00102 {
00103 #ifdef _OFELI_DEBUG
00104 std::clog << "An instance of class Equa_Therm is destructed in\n";
00105 std::clog << "File: " << __FILE__ << ", Line: " << __LINE__ << endl;
00106 #endif
00107 }
00108
00111 virtual void LCapacityToLHS(double coef=1) { _coef = coef; }
00112
00115 virtual void LCapacityToRHS(double coef=1) { _coef = coef; }
00116
00119 virtual void CapacityToLHS(double coef=1) { _coef = coef; }
00120
00123 virtual void CapacityToRHS(double coef=1) { _coef = coef; }
00124
00126 void setLumpedCapacity()
00127 {
00128 LCapacityToLHS(1./AbsEqua<T_>::_time_step);
00129 LCapacityToRHS(1./AbsEqua<T_>::_time_step);
00130 }
00131
00133 void setCapacity()
00134 {
00135 CapacityToLHS(1./AbsEqua<T_>::_time_step);
00136 CapacityToRHS(1./AbsEqua<T_>::_time_step);
00137 }
00138
00140 virtual void Diffusion(double coef=1.) { _coef = coef; }
00141
00143 virtual void DiffusionToRHS(double coef=1.) { _coef = coef; }
00144
00146 void setDiffusion()
00147 {
00148 if (AbsEqua<T_>::_analysis==STEADY_STATE || AbsEqua<T_>::_time_scheme==BACKWARD_EULER)
00149 Diffusion(1.);
00150 else if (AbsEqua<T_>::_time_scheme==CRANK_NICOLSON)
00151 Diffusion(0.5);
00152 if (AbsEqua<T_>::_time_scheme==CRANK_NICOLSON)
00153 DiffusionToRHS(0.5);
00154 else if (AbsEqua<T_>::_time_scheme==FORWARD_EULER)
00155 DiffusionToRHS();
00156 else;
00157 }
00158
00160 virtual void Convection(double coef=1.) { _coef = coef; }
00161
00163 virtual void ConvectionToRHS(double coef=1.) { _coef = coef; }
00164
00166 void setConvection()
00167 {
00168 if (AbsEqua<T_>::_time_scheme==STEADY_STATE ||
00169 AbsEqua<T_>::_time_scheme==BACKWARD_EULER)
00170 Convection(1.);
00171 else if (AbsEqua<T_>::_time_scheme==CRANK_NICOLSON)
00172 Convection(0.5);
00173 if (AbsEqua<T_>::_time_scheme==CRANK_NICOLSON)
00174 ConvectionToRHS(0.5);
00175 else if (AbsEqua<T_>::_time_scheme==FORWARD_EULER)
00176 ConvectionToRHS();
00177 else;
00178 }
00179
00180 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00182 void Build() { }
00183 #endif
00184
00185 protected:
00186
00187 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00188 PhaseChange *_phase;
00189 #endif
00190
00192 void RhoCp(const double &rhocp) { _rhocp = rhocp; }
00193
00195 void Conduc(const double &diff) { _diff = diff; }
00196
00198 void RhoCp(const string &exp) { _rhocp = setMaterialProperty(exp.c_str(),"RhoCp"); }
00199
00201 void Conduc(const string &exp) { _diff = setMaterialProperty(exp.c_str(),"Conductivity"); }
00202
00204 void setMaterial()
00205 {
00206 _rhocp = _theElement->getMaterial()->Density() * _theElement->getMaterial()->SpecificHeat();
00207 _diff = _theElement->getMaterial()->ThermalConductivity();
00208 }
00209
00210
00211 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00212 double _diff, _rhocp, _coef;
00213 NodeVect<T_> *_velocity;
00214 #endif
00215 };
00216
00217 }
00218
00219 #endif