00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef MECHSYS_TIJTENSOR_H
00023 #define MECHSYS_TIJTENSOR_H
00024
00025 #ifdef HAVE_CONFIG_H
00026 #include "config.h"
00027 #else
00028 #ifndef REAL
00029 #define REAL double
00030 #endif
00031 #endif
00032
00033 #include "tensors/tensors.h"
00034 #include "tensors/functions.h"
00035 #include "util/exception.h"
00036
00037 using Tensors::Tensor2;
00038 using Tensors::CharInvs;
00039 using Tensors::Stress_tn_ts;
00040 using Tensors::Sqrt;
00041 using Tensors::Inv;
00042 using Tensors::Mult;
00043 using Tensors::I;
00044
00045 namespace Tensors
00046 {
00047
00049 class TijTensor
00050 {
00051 static REAL ZERO;
00052 public:
00054
00055 TijTensor(REAL TsMin) : _ts_min(TsMin) {}
00057
00071 void Derivs(const Tensor2 & Sig,
00072 REAL & tn,
00073 REAL & ts,
00074 REAL Is[3],
00075 REAL & sqrt_rz,
00076 Tensor2 & Tau,
00077 Tensor2 & inv_Tau,
00078 Tensor2 & a,
00079 Tensor2 & t,
00080 Tensor2 & dtn_ds,
00081 Tensor2 & dts_ds,
00082 Tensor2 & dts_dt
00083 );
00084 private:
00085 REAL _ts_min;
00086 };
00087
00088 REAL TijTensor::ZERO = 1.0e-10;
00089
00090
00092
00093
00094 inline void TijTensor::Derivs(const Tensor2 & Sig,
00095 REAL & tn,
00096 REAL & ts,
00097 REAL Is[3],
00098 REAL & sqrt_rz,
00099 Tensor2 & Tau,
00100 Tensor2 & inv_Tau,
00101 Tensor2 & a,
00102 Tensor2 & t,
00103 Tensor2 & dtn_ds,
00104 Tensor2 & dts_ds,
00105 Tensor2 & dts_dt)
00106 {
00107
00108
00109
00110 CharInvs(Sig, Is);
00111 if (fabs(Is[1])<ZERO)
00112 throw new Fatal(_("TijTensor::Derivs: assert(I2>0.0) failed (I2=%.6f). Sig=<%.6f; %.6f; %.6f; %.6f; %.6f; %.6f>"), Is[1],
00113 Sig(0), Sig(1), Sig(2), Sig(3)/sqrt(2.0), Sig(4)/sqrt(2.0), Sig(5)/sqrt(2.0));
00114
00115
00116 sqrt_rz = Is[2]/Is[1];
00117 if (fabs(sqrt_rz)<ZERO)
00118 throw new Fatal(_("TijTensor::Derivs: assert(I3/I2>0) failed (I3/I2=%.6f). Sig=<%.6f; %.6f; %.6f; %.6f; %.6f; %.6f>"), sqrt_rz,
00119 Sig(0), Sig(1), Sig(2), Sig(3)/sqrt(2.0), Sig(4)/sqrt(2.0), Sig(5)/sqrt(2.0));
00120 sqrt_rz = sqrt(sqrt_rz);
00121
00122
00123 if (!Stress_tn_ts(Sig, tn,ts))
00124 throw new Fatal(_("TijTensor::Derivs: tn and ts calculation failed. Sig=<%.6f; %.6f; %.6f; %.6f; %.6f; %.6f>"),
00125 Sig(0), Sig(1), Sig(2), Sig(3)/sqrt(2.0), Sig(4)/sqrt(2.0), Sig(5)/sqrt(2.0));
00126
00127
00128 if (!Sqrt(Sig, Tau))
00129 throw new Fatal(_("TijTensor::Derivs: Tau = Sqrt(Sig) failed. Sig=<%.6f; %.6f; %.6f; %.6f; %.6f; %.6f>"),
00130 Sig(0), Sig(1), Sig(2), Sig(3)/sqrt(2.0), Sig(4)/sqrt(2.0), Sig(5)/sqrt(2.0));
00131
00132
00133 if (!Inv(Tau, inv_Tau))
00134 throw new Fatal(_("TijTensor::Derivs: inverse of Tau failed. Sig=<%.6f; %.6f; %.6f; %.6f; %.6f; %.6f>"),
00135 Sig(0), Sig(1), Sig(2), Sig(3)/sqrt(2.0), Sig(4)/sqrt(2.0), Sig(5)/sqrt(2.0));
00136
00137
00138 a = inv_Tau * sqrt_rz;
00139
00140
00141 Mult(a,Sig, t);
00142
00143
00144
00145 Tensor2 SigSig;
00146 Mult(Sig,Sig, SigSig);
00147
00148 Tensor2 dI1_ds; dI1_ds = I*Is[0] - Sig;
00149 Tensor2 dI2_ds; dI2_ds = SigSig - Sig*Is[0] + I*Is[1];
00150
00151 dtn_ds = dI2_ds*(3.0/Is[1]) - dI1_ds*(tn/Is[1]);
00152
00153
00154 if (fabs(ts)<_ts_min)
00155 {
00156 dts_ds = 0.0;
00157 dts_dt = 0.0;
00158 }
00159 else
00160 {
00161 REAL alp = tn/(6.0*ts);
00162 REAL bet = tn*(6.0*tn-Is[0])/(6.0*ts*Is[1]);
00163 REAL gam = (Is[0]-6.0*tn)/(2.0*ts*Is[1]);
00164 dts_ds = I*alp + dI1_ds*bet + dI2_ds*gam;
00165 dts_dt = t*(1.0/ts) - a*(tn/ts);
00166 }
00167
00168 }
00169
00170 };
00171
00172 #endif // MECHSYS_TIJTENSOR_H
00173
00174