NeoPZ
TPZYCModifiedMohrCoulomb.h
Go to the documentation of this file.
1 /* Generated by Together */// $Id: TPZYCModifiedMohrCoulomb.h,v 1.9 2010-12-13 19:34:58 diogo Exp $
2 
3 #ifndef TPZYCModifiedMohrCoulomb_H
4 #define TPZYCModifiedMohrCoulomb_H
5 
6 #include "TPZTensor.h"
7 #include "pzlog.h"
8 #include "TPZPlasticCriterion.h"
9 #ifndef WIN32
10 #include <fenv.h>//NAN DETECTOR
11 #endif
12 
13 #ifdef LOG4CXX_PLASTICITY
14 //static LoggerPtr logMohr(Logger::getLogger("TPZYCMohrOriginal"));
15 #endif
16 
18 
19 public:
20 
21  enum {NYield = 1};
22 
23  virtual int ClassId() const override;
24 
25 
26  const char * Name() const
27  {
28  return "TPZYCModifiedMohrCoulomb";
29  }
30 
31  void Print(std::ostream & out) const override
32  {
33  out << Name();
34  }
35 
37  {
38  return 0; // nothing to be done in this yield criterium
39  }
40 
41  void SetForceYield(const int forceYield)
42  {
43  // nothing to be done in this yield criterium
44  }
45 
46  void Write(TPZStream& buf, int withclassid) const override{
47  buf.Write(&fPhi);
48  buf.Write(&fCoesion);
49  buf.Write(&fPi);
50  }
51 
52  void Read(TPZStream& buf, void* context) override{
53  buf.Read(&fPhi);
54  buf.Read(&fCoesion);
55  buf.Read(&fPi);
56  }
57 
65  void SetYieldStatusMode(const TPZTensor<REAL> & sigma, const REAL & A)
66  {
67  // nothing to be done in this yield criterium
68  }
69 
70 
78  void SetUp(const REAL & phi)
79  {
80  fPhi = phi;
81  fPi = M_PI;
82  fCoesion = 9.2376;
83  }
84 
85 
93  template < class T>
94  void Compute(const TPZTensor<T> & sigma, const T & A, TPZVec<T> &result, int checkForcedYield = 0) const;
95 
103  template <class T>
104  void N(const TPZTensor<T> & sigma,const T & A, TPZVec<TPZTensor<T> > & Ndir, int checkForcedYield = 0) const;
105 
113  template <class T>
114  void H(const TPZTensor<T> & sigma,const T & A, TPZVec<T> & h, int checkForcedYield = 0) const;
115 
119  template <class T>
120  void AlphaMultiplier(const T &A, T &multiplier) const
121  {
122  multiplier = T(1.);
123  }
124 
125  void YieldFunction(const TPZVec<STATE>& sigma, STATE kprev, TPZVec<STATE>& yield) const override{
126  TPZTensor<STATE> sigmaTensor;
127  sigmaTensor.XX() = sigma[0];
128  sigmaTensor.YY() = sigma[1];
129  sigmaTensor.ZZ() = sigma[2];
130  Compute(sigmaTensor, kprev, yield, 0);
131  }
132 
133  virtual int GetNYield() const override{
134  return as_integer(NYield);
135  }
136 
137 public:
138 
139  REAL fPhi;
140 
141 
142 protected:
143 
144  REAL fCoesion,fPi;
145 public:
146 
147 
148 };
149 
150 static bool fFlag,fFlag1,fFlag2;
151 
152 template < class T>
153 void TPZYCModifiedMohrCoulomb::Compute(const TPZTensor<T> & sigma, const T & A,TPZVec<T> &res, int checkForcedYield) const
154 {
155 
156  TPZTensor<T> eigenval,dSigma1,dSigma2,dSigma3;
157  sigma.Eigenvalue(eigenval, dSigma1, dSigma2, dSigma3);
158  T sigma1,sigma2,sigma3;
159  sigma1 = eigenval.XX();
160  sigma2 = eigenval.YY();
161  sigma3 = eigenval.ZZ();
162  T res0,res1,res2;
163  //
164  // T debug = T(2.)*A*cos(fPhi);
165  res0=(sigma1 - sigma3) + (sigma1 + sigma3)*sin(fPhi) - T(2.)*A*cos(fPhi);
166  res1=(sigma2 - sigma3) + (sigma2 + sigma3)*sin(fPhi) - T(2.)*A*cos(fPhi);
167  res2=(sigma1 - sigma2) + (sigma1 + sigma2)*sin(fPhi) - T(2.)*A*cos(fPhi);
168  // cout << " res0 " <<res0 << endl;
169 
170  fFlag=false;
171  fFlag1=false;
172  fFlag2=false;
173 
174  if(TPZExtractVal::val(res0) >= 0. && TPZExtractVal::val(res1) < 0. && TPZExtractVal::val(res2) < 0.)
175  {
176  res[0]=(sigma1 - sigma3) + (sigma1 + sigma3)*sin(fPhi) - T(2.)*A*cos(fPhi);
177  fFlag =true;
178  return;
179  }
180  if(TPZExtractVal::val(res0) >=0. && TPZExtractVal::val(res1) < 0. && TPZExtractVal::val(res2) > -1.)
181  {
182  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.+sin(fPhi))));//INNER
183  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.+sin(fPhi))));//INNER
184  T I1,J2,p;
185  I1 = sigma.I1();
186  J2 = sigma.J2();
187  p = I1 / T(3.);
188  res[0] = sqrt( J2 ) + p * T(Eta) - A * T(Ksi);
189  fFlag1 =true;
190  return;
191  }
192 
193  if(TPZExtractVal::val(res0) >=0. && TPZExtractVal::val(res1) > -1. && TPZExtractVal::val(res2)< 0.)
194  {
195  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.-sin(fPhi))));//OUTER
196  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.-sin(fPhi))));//OUTER
197  T I1,J2,p;
198  I1 = sigma.I1();
199  J2 = sigma.J2();
200  p = I1 / T(3.);
201  res[0] = sqrt( J2 ) + p * T(Eta) - A * T(Ksi);
202  fFlag2 =true;
203  return;
204  }
205 
207  {
208  res[0]=res0;
209  fFlag =true;
210  return;
211  }
212 
214  {
215  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.+sin(fPhi))));//INNER
216  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.+sin(fPhi))));//INNER
217  T I1,J2,p;
218  I1 = sigma.I1();
219  J2 = sigma.J2();
220  p = I1 / T(3.);
221  res[0] = sqrt( J2 ) + p * T(Eta) - A * T(Ksi);
222  fFlag1 =true;
223  return;
224  }
226  {
227  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.-sin(fPhi))));//OUTER
228  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.-sin(fPhi))));//OUTER
229  T I1,J2,p;
230  I1 = sigma.I1();
231  J2 = sigma.J2();
232  p = I1 / T(3.);
233  res[0] = sqrt( J2 ) + p * T(Eta) - A * T(Ksi);
234  fFlag2 =true;
235  return;
236 
237  }
238 
239  //res[0]=res0;
240  //fFlag =true;
241 #ifdef MACOS
242  feclearexcept(FE_ALL_EXCEPT);
243  int Res = fetestexcept(FE_ALL_EXCEPT);
244  if(Res)
245  {
246  std::cout << " \n " << __PRETTY_FUNCTION__ <<"\n NAN DETECTED \n";
247  DebugStop();
248  }
249 
250  Res = fetestexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW);
251  if(Res)
252  {
253  std::cout << " \n " << __PRETTY_FUNCTION__ <<"\n NAN DETECTED \n";
254  DebugStop();
255  }
256 #endif
257 }
258 
259 template <class T>
260 void TPZYCModifiedMohrCoulomb::N(const TPZTensor<T> & sigma,const T & A, TPZVec<TPZTensor<T> > & Ndir, int checkForcedYield) const
261 {
262  //Flow vectors feitos no mathematica baseados nas yield functions do chen
263  TPZTensor<T> eigenval,dSigma1,dSigma2,dSigma3;
264  sigma.Eigenvalue(eigenval, dSigma1, dSigma2, dSigma3);
265  // Ndir.Resize(3);
266 
267  // TPZTensor<T> dSigma1Copy(dSigma1);
268  // TPZTensor<T> dSigma2Copy(dSigma2);
269  // TPZTensor<T> dSigma3Copy(dSigma3);
270  // dSigma1.Add(dSigma3,-1);
271  // dSigma1Copy.Add(dSigma3Copy,1);
272  // dSigma1Copy.Multiply(sin(fPhi),1);
273  // dSigma1.Add(dSigma1Copy,1);
274  //
275  // Ndir[0]=dSigma1;
276  //
277  // sigma.Eigenvalue(eigenval, dSigma1, dSigma2, dSigma3);
278  // dSigma1Copy = dSigma1;
279  // dSigma2Copy = dSigma2;
280  // dSigma3Copy = dSigma3;
281  // dSigma2.Add(dSigma3,-1);
282  // dSigma2Copy.Add(dSigma3Copy,1);
283  // dSigma2Copy.Multiply(sin(fPhi),1);
284  // dSigma2.Add(dSigma2Copy,1);
285  //
286  // Ndir[1]=dSigma2;
287  //
288  // sigma.Eigenvalue(eigenval, dSigma1, dSigma2, dSigma3);
289  // dSigma1Copy = dSigma1;
290  // dSigma2Copy = dSigma2;
291  // dSigma3Copy = dSigma3;
292  // dSigma1.Add(dSigma2,-1);
293  // dSigma1Copy.Add(dSigma2Copy,1);
294  // dSigma1Copy.Multiply(sin(fPhi),1);
295  // dSigma1.Add(dSigma1Copy,1);
296  //
297  // Ndir[2]=dSigma1;
298 
299  if(fFlag == true)
300  {
301  // TPZTensor<T> dSigma1Copy(dSigma1);
302  // TPZTensor<T> dSigma2Copy(dSigma2);
303  // TPZTensor<T> dSigma3Copy(dSigma3);
304  // dSigma1.Add(dSigma3,-1);
305  // dSigma1Copy.Add(dSigma3Copy,1);
306  // dSigma1Copy.Multiply(sin(fPhi),1);
307  // dSigma1.Add(dSigma1Copy,1);
308  // Ndir[0]=dSigma1;
309  TPZTensor<T> e1e1,e2e2,e3e3;
310  e1e1.XX()=1.;
311  e3e3.ZZ()=1.;
312 
313  e1e1*=T(1.)+T(sin(fPhi));
314  e3e3*=T(1.)-T(sin(fPhi));
315  e1e1.Add(e3e3,-1.);
316 
317  Ndir[0]=e1e1;
318 
319  }
320 
321 
322  if(fFlag1 == true)
323  {
324  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.+sin(fPhi))));//INNER
325  T J2 = sigma.J2();
326  TPZTensor<T> s;
327  sigma.S(s);
328  s *= T(0.5) / sqrt(J2);
329  //Hydrostatic part
330  T EtaOver3 = Eta/T(3.);
331  s.XX() += EtaOver3;
332  s.YY() += EtaOver3;
333  s.ZZ() += EtaOver3;
334  Ndir[0] = s;
335  }
336 
337  if(fFlag2 == true)
338  {
339  T Eta = T(6. * sin(fPhi)/(sqrt(3.)*(3.-sin(fPhi))));//OUTER
340  T J2 = sigma.J2();
341  TPZTensor<T> s;
342  sigma.S(s);
343  s *= T(0.5) / sqrt(J2);
344  //Hydrostatic part
345  T EtaOver3 = Eta/T(3.);
346  s.XX() += EtaOver3;
347  s.YY() += EtaOver3;
348  s.ZZ() += EtaOver3;
349  Ndir[0] = s;
350  }
351 }
352 
353 template <class T>
354 void TPZYCModifiedMohrCoulomb::H(const TPZTensor<T> & sigma,const T & A, TPZVec<T> & h, int checkForcedYield) const
355 {
356  //h.Resize(3);
357  if(fFlag == true)
358  {
359  h[0] = 2.* cos(fPhi);
360  }
361  if(fFlag1 == true)
362  {
363  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.+sin(fPhi))));//INNER
364  h[0] = Ksi;
365  }
366  if(fFlag2 == true)
367  {
368  T Ksi = T(6. * cos(fPhi)/(sqrt(3.) * (3.-sin(fPhi))));//OUTER
369  h[0] = Ksi;
370  }
371  //h[1] = 2.* cos(fPhi);
372  //h[2] = 2.* cos(fPhi);
373 }
374 
375 #endif
void N(const TPZTensor< T > &sigma, const T &A, TPZVec< TPZTensor< T > > &Ndir, int checkForcedYield=0) const
virtual int ClassId() const override
Define the class id associated with the class.
void Add(const TPZTensor< T1 > &tensor, const T2 &constant)
Definition: TPZTensor.h:757
Contains definitions to LOGPZ_DEBUG, LOGPZ_INFO, LOGPZ_WARN, LOGPZ_ERROR and LOGPZ_FATAL, and the implementation of the inline InitializePZLOG(string) function using log4cxx library or not. It must to be called out of "#ifdef LOG4CXX" scope.
T I1() const
Definition: TPZTensor.h:903
void YieldFunction(const TPZVec< STATE > &sigma, STATE kprev, TPZVec< STATE > &yield) const override
std::underlying_type< Enumeration >::type as_integer(const Enumeration value)
Definition: pzreal.h:37
T & YY() const
Definition: TPZTensor.h:578
void H(const TPZTensor< T > &sigma, const T &A, TPZVec< T > &h, int checkForcedYield=0) const
clarg::argBool h("-h", "help message", false)
This class implements a simple vector storage scheme for a templated class T. Utility.
Definition: pzgeopoint.h:19
void Print(std::ostream &out) const override
void AlphaMultiplier(const T &A, T &multiplier) const
sin
Definition: fadfunc.h:63
virtual void Write(const bool val)
Definition: TPZStream.cpp:8
#define DebugStop()
Returns a message to user put a breakpoint in.
Definition: pzerror.h:20
static bool fFlag2
void Write(TPZStream &buf, int withclassid) const override
Writes this object to the TPZStream buffer. Include the classid if withclassid = true.
void SetForceYield(const int forceYield)
expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ sqrt
Definition: tfadfunc.h:120
string res
Definition: test.py:151
T J2() const
Definition: TPZTensor.h:927
void Compute(const TPZTensor< T > &sigma, const T &A, TPZVec< T > &result, int checkForcedYield=0) const
static REAL val(const int number)
Definition: pzextractval.h:21
static bool fFlag
void SetYieldStatusMode(const TPZTensor< REAL > &sigma, const REAL &A)
void Eigenvalue(TPZTensor< T > &eigenval, TPZTensor< T > &dSigma1, TPZTensor< T > &dSigma2, TPZTensor< T > &dSigma3) const
Definition: TPZTensor.h:1744
virtual int GetNYield() const override
void Read(TPZStream &buf, void *context) override
read objects from the stream
T & XX() const
Definition: TPZTensor.h:566
T & ZZ() const
Definition: TPZTensor.h:586
Defines the interface for saving and reading data. Persistency.
Definition: TPZStream.h:50
static bool fFlag1
TPZFlopCounter cos(const TPZFlopCounter &orig)
Returns the cosine in radians and increments the counter of the Cosine.
Definition: pzreal.h:514
void S(TPZTensor< T > &s) const
Definition: TPZTensor.h:894
virtual void Read(bool &val)
Definition: TPZStream.cpp:91