tijtensor.h

00001 /*************************************************************************************
00002  * MechSys - A C++ library to simulate (Continuum) Mechanical Systems                *
00003  * Copyright (C) 2005 Dorival de Moraes Pedroso <dorival.pedroso at gmail.com>       *
00004  * Copyright (C) 2005 Raul Dario Durand Farfan  <raul.durand at gmail.com>           *
00005  *                                                                                   *
00006  * This file is part of MechSys.                                                     *
00007  *                                                                                   *
00008  * MechSys is free software; you can redistribute it and/or modify it under the      *
00009  * terms of the GNU General Public License as published by the Free Software         *
00010  * Foundation; either version 2 of the License, or (at your option) any later        *
00011  * version.                                                                          *
00012  *                                                                                   *
00013  * MechSys is distributed in the hope that it will be useful, but WITHOUT ANY        *
00014  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A   *
00015  * PARTICULAR PURPOSE. See the GNU General Public License for more details.          *
00016  *                                                                                   *
00017  * You should have received a copy of the GNU General Public License along with      *
00018  * MechSys; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, *
00019  * Fifth Floor, Boston, MA 02110-1301, USA                                           *
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,       // In: Stress tensor
00072                 REAL          & tn,        // Out: Mean stress invariant
00073                 REAL          & ts,        // Out: Deviatoric stress invariant
00074                 REAL            Is[3],     // Out: Characterist invariants of stress (Sig)
00075                 REAL          & sqrt_rz,   // Out: Sqrt of I3/I2
00076                 Tensor2       & Tau,       // Out: Tensor Sqrt of Sig
00077                 Tensor2       & inv_Tau,   // Out: Inverse of tensor Tau
00078                 Tensor2       & a,         // Out: "normal-to-SMP" tensor == Derivative of tn w.r.t tij tensor
00079                 Tensor2       & t,         // Out: Modified tij tensor
00080                 Tensor2       & dtn_ds,    // Out: Derivative of tn w.r.t Sig
00081                 Tensor2       & dts_ds,    // Out: Derivative of ts w.r.t Sig
00082                 Tensor2       & dts_dt     // Out: Derivative of ts w.r.t tij tensor
00083     );
00084 private:
00085     REAL _ts_min; 
00086 }; // class TijTensor
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     // ---------------------------------------------------------------------- tij calculation
00108     
00109     // Characteristic invariants:  I1=Is[0], I2=Is[1], I3=Is[2]
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     // Square root of I3/I2
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); // sqrt_rz = sqrt(I3/I2)
00121 
00122     // Professr Nakai's stress invariants
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     // Tau = square root of Sig
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     // inverse of Tau
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     // a tensor
00138     a = inv_Tau * sqrt_rz;
00139 
00140     // tij tensor
00141     Mult(a,Sig, t);
00142     
00143     // -------------------------------------------------------------- derivatives calculation
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     // Check ts
00154     if (fabs(ts)<_ts_min)
00155     {
00156         dts_ds = 0.0; // In fact, it is undetermined
00157         dts_dt = 0.0; // In fact, it is undetermined
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 }; // namespace Tensors
00171 
00172 #endif // MECHSYS_TIJTENSOR_H
00173 
00174 // vim:fdm=marker

Generated on Wed Jan 24 15:56:27 2007 for MechSys by  doxygen 1.4.7