muMECH  1.0
esuf.cpp
Go to the documentation of this file.
1 //********************************************************************************************************
2 // code: ### ### ##### #### ## ##
3 // ## ## ######## ## ## ## ## ##
4 // ## ## ## ## ## ### ## ######
5 // ## ## ## ## ## ## ## ## ##
6 // ##### ## ## ##### #### ## ##
7 // ##
8 //
9 // name: eshelbySoluUniformField.cpp
10 // author(s): Jan Novak
11 // language: C, C++
12 // license: This program is free software; you can redistribute it and/or modify
13 // it under the terms of the GNU Lesser General Public License as published by
14 // the Free Software Foundation; either version 2 of the License, or
15 // (at your option) any later version.
16 //
17 // This program is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 // GNU Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public License
23 // along with this program; if not, write to the Free Software
24 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 //********************************************************************************************************
26 
27 #include <iostream>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <math.h>
31 #include "macros.h"
32 #include "esuf.h"
33 #include "esei.h"
34 #include "eshelbySoluLambda.h"
35 #include "transformTensors.h"
36 #include "elementaryFunctions.h"
37 #include "matrix.h"
38 #include "inclusion.h"
39 #include "problem.h"
40 #include "polynomialRootSolution.h"
41 
42 
43 namespace mumech {
44 
45 //coordinates
46 #define X1 x[0]
47 #define X2 x[1]
48 #define X3 x[2]
49 //elliptic integrals
50 #define __I( component ) eSInt[component]
51 
52 
55 {
56  I = i;
57 
58  this->nu = I->P->matrix->nu();
59  this->_2nu = 2. * nu;
60  this->_1Plus2nu = 1. + this->_2nu;
61  this->_1MinNu = 1. - nu;
62  this->mult = 8. * PI * this->_1MinNu;
63  this->MULT = 1. / ( 8. * PI * ( 1. - nu ) );
64  this->multTRN = 1./this->mult;
65  this->_1Min2nu = 1. - this->_2nu;
66  this->_2nuMin1 = this->_2nu - 1.;
67  this->_3Min4nu = 3. - 2. * this->_2nu;
68 }
69 
70 
80  const double pertDispTens[18],
81  const double unifStrain[6])
82 {
83  //u_1
84  displacement[0] = pertDispTens[0] * unifStrain[0] + pertDispTens[1] * unifStrain[1] +
85  pertDispTens[2] * unifStrain[2] + pertDispTens[3] * unifStrain[3] + pertDispTens[4] * unifStrain[4] +
86  pertDispTens[5] * unifStrain[5];
87  //u_2
88  displacement[1] = pertDispTens[6] * unifStrain[0] + pertDispTens[7] * unifStrain[1] +
89  pertDispTens[8] * unifStrain[2] + pertDispTens[9] * unifStrain[3] + pertDispTens[10] * unifStrain[4] +
90  pertDispTens[11] * unifStrain[5];
91  //u_3
92  displacement[2] = pertDispTens[12] * unifStrain[0] + pertDispTens[13] * unifStrain[1] +
93  pertDispTens[14] * unifStrain[2] + pertDispTens[15] * unifStrain[3] + pertDispTens[16] * unifStrain[4] +
94  pertDispTens[17] * unifStrain[5];
95 
96  return ;
97 }//end of function: giveEshelbyDisplacementUniformField( )
98 
107 void eshelbySoluUniformField :: giveEshelbyStrainUniformField (double strain[6], const double pertTens[36],
108  const double unifStrain[6])
109 {
110  //e_11
111  strain[0] = pertTens[0] * unifStrain[0] + pertTens[1] * unifStrain[1] + pertTens[2] * unifStrain[2] +
112  pertTens[3] * unifStrain[3] + pertTens[4] * unifStrain[4] + pertTens[5] * unifStrain[5];
113  //e_22
114  strain[1] = pertTens[6] * unifStrain[0] + pertTens[7] * unifStrain[1] + pertTens[8] * unifStrain[2] +
115  pertTens[9] * unifStrain[3] + pertTens[10] * unifStrain[4] + pertTens[11] * unifStrain[5];
116  //e_33
117  strain[2] = pertTens[12] * unifStrain[0] + pertTens[13] * unifStrain[1] + pertTens[14] * unifStrain[2] +
118  pertTens[15] * unifStrain[3] + pertTens[16] * unifStrain[4] + pertTens[17] * unifStrain[5];
119  /* !!! FEEP notation !!! e_ij = {e_11, e_22, e_33, e_12, e_32, e_31}^T */
120  //2*e_12
121  strain[3] = pertTens[18] * unifStrain[0] + pertTens[19] * unifStrain[1] + pertTens[20] * unifStrain[2] +
122  pertTens[21] * unifStrain[3] + pertTens[22] * unifStrain[4] + pertTens[23] * unifStrain[5];
123  //2*e_32
124  strain[4] = pertTens[24] * unifStrain[0] + pertTens[25] * unifStrain[1] + pertTens[26] * unifStrain[2] +
125  pertTens[27] * unifStrain[3] + pertTens[28] * unifStrain[4] + pertTens[29] * unifStrain[5];
126  //2*e_31
127  strain[5] = pertTens[30] * unifStrain[0] + pertTens[31] * unifStrain[1] + pertTens[32] * unifStrain[2] +
128  pertTens[33] * unifStrain[3] + pertTens[34] * unifStrain[4] + pertTens[35] * unifStrain[5];
129 
130  return ;
131 }//end of function: giveEshelbyStrainUniformField( )
132 
133 //
135 {
136  //GLOBAL->LOCAL transform of the point coordinates
137  I->transformCoords_G2L(point->x, point->loc_x);
138 
139  // lambda parameter
140  point->la = eshelbySoluLambda::giveLambda( I->a, point->loc_x, I->shape );
141 
142  // Ferers-Dyson's elliptic integrals
143  I->ellInt->giveEllipticIntegrals (point->eInt, point->la, false);
144  // Derivatives of Ferers-Dyson's elliptic integrals
146 
147  // Eshelby tensor
148  this->giveEshelbyTensor( point->S, point->eInt);
149  // stress/strain perturbation tensor
150  this->giveStrainPerturbTensor( point);
151 
152  // strain perturbation
153  this->giveEshelbyStrainUniformField (point->strain[0], point->D, I->locEigStrain);
154  //LOCAL->GLOBAL transformation of resulting fields
155  I->rotateStrain_L2G(point->strain[0], point->strain[0]);
156 
157  return ;
158 }//end of function: giveEshelbyStrainOfOnePoint( )
159 
160 
161 //
163  bool disp, bool strn)
164 {
165  //GLOBAL->LOCAL transform of the point coordinates
166  I->transformCoords_G2L(point->x, point->loc_x);
167 
168  // lambda parameter
169  point->la = eshelbySoluLambda::giveLambda( I->a, point->loc_x, I->shape );
170 
171  // Ferers-Dyson's elliptic integrals
172  I->ellInt->giveEllipticIntegrals (point->eInt, point->la, false);
173  // Derivatives of Ferers-Dyson's elliptic integrals
175 
176  // CALCULATION OF STRAIN PERTURBATION FIELD
177  if (strn) {
178  // Eshelby tensor
179  this->giveEshelbyTensor( point->S, point->eInt);
180  // stress/strain perturbation tensor
181  this->giveStrainPerturbTensor( point);
182 
183  for (int i=0; i<nlc; i++) {
184  // LOCAL FIELDS
185  this->giveEshelbyStrainUniformField (point->strain[i], point->D, I->locEigStrain_LC[i+lc]);
186  // GLOBAL FIELDS
187  I->rotateStrain_L2G(point->strain[i], point->strain[i]);
188  }
189  }
190 
191  // CALCULATION OF DISPLACEMENT PERTURBATION FIELD
192  if (disp) {
193  //displacement perturbation tensor
195 
196  for (int i=0; i<nlc; i++) {
197  // LOCAL FIELDS
198  this->giveEshelbyDisplacementUniformField (point->displacement[i], point->L, I->locEigStrain_LC[i+lc]);
199  // GLOBAL FIELDS
200  I->rotateDisplc_L2G(point->displacement[i], point->displacement[i]);
201  }
202  }
203 
204  return ;
205 }//end of function: giveEshelbyFieldsOfOnePoint( )
206 
207 
208 //
209 void eshelbySoluUniformField :: giveEshelbyDisplacementOfOnePoint (double **globPert_displc, const double *coords, int lc, int nlc)
210 {
211  double loc_coords[3];
212  I->transformCoords_G2L(coords, loc_coords);
213 
214  double L[18];
215  this->giveDisplacementPerturbTensor_INTpoint (L, loc_coords);
216 
217  for (int i=0; i<nlc; i++) {
218  this->giveEshelbyDisplacementUniformField (globPert_displc[i], L, I->locEigStrain_LC[i+lc]);
219  I->rotateDisplc_L2G (globPert_displc[i], globPert_displc[i]);
220  }
221 }
222 
223 
224 //
225 void eshelbySoluUniformField :: giveEshelbyTensor (double S[12], const double eInt[13])
226 {
227  this->eshelbyTensUniformField (S, I->a, eInt);
228 }
229 
230 
231 //********************************************************************************************************
232 // PUBLIC FUNCTIONS
233 //********************************************************************************************************
234 
235 //********************************************************************************************************
236 // description: Function gives a component of the Eshelby tensor
237 // last edit: 16. 10. 2009
238 //-------------------------------------------------------------------------------------------------------
239 // note: Solution adopted from Toshio Mura's book (1982) and Eshelby article (1957)
240 // @sort_a[3] - sorted ellipsoidal semiaxes (a1>a2>a3)
241 // @eSInt[13] - values of elliptical integrals (potentials)
242 // always for lambda = 0. Even for external fields !!!
243 // @nu - Poisson's ratio
244 // @flag - Eshelby tensor component S_ijkl
245 //********************************************************************************************************
247  const double eSInt[13], double nu,
248  EshelbyTensComponent flag )
249 {
250  double a1 = sort_a[0], a2 = sort_a[1], a3 = sort_a[2];
251  double S_ijkl = 0.;
252 
253  switch( flag ){
254  /* 1st row */
255  case _S1111_ :
256  S_ijkl = MULT * ( 3. * SQR( a1 ) * __I(_Int11_) + ( 1. - 2. * nu ) * __I(_Int1_) );
257  break;
258  case _S1122_ :
259  S_ijkl = MULT * ( SQR( a2 ) * __I(_Int12_) - ( 1. - 2. * nu ) * __I(_Int1_) );
260  break;
261  case _S1133_ :
262  S_ijkl = MULT * ( SQR( a3 ) * __I(_Int13_) - ( 1. - 2. * nu ) * __I(_Int1_) );
263  break;
264  /* 2nd row */
265  case _S2211_ :
266  S_ijkl = MULT * ( SQR( a1 ) * __I(_Int21_) - ( 1. - 2. * nu ) * __I(_Int2_) );
267  break;
268  case _S2222_ :
269  S_ijkl = MULT * ( 3. * SQR( a2 ) * __I(_Int22_) + ( 1. - 2. * nu ) * __I(_Int2_) );
270  break;
271  case _S2233_ :
272  S_ijkl = MULT * ( SQR( a3 ) * __I(_Int23_) - ( 1. - 2. * nu ) * __I(_Int2_) );
273  break;
274  /* 3rd row */
275  case _S3311_ :
276  S_ijkl = MULT * ( SQR( a1 ) * __I(_Int31_) - ( 1. - 2. * nu ) * __I(_Int3_) );
277  break;
278  case _S3322_ :
279  S_ijkl = MULT * ( SQR( a2 ) * __I(_Int32_) - ( 1. - 2. * nu ) * __I(_Int3_) );
280  break;
281  case _S3333_ :
282  S_ijkl = MULT * ( 3. * SQR( a3 ) * __I(_Int33_) + ( 1. - 2. * nu ) * __I(_Int3_) );
283  break;
284  /* !!! FEEP notation !!! e_ij = {e_11, e_22, e_33, e_12, e_32, e_31}^T */
285  /* 4th row */
286  case _S1212_ :
287  S_ijkl = .5 * MULT * ( ( 1. - 2. * nu ) * ( __I(_Int1_) + __I(_Int2_) ) +
288  ( SQR( a1 ) + SQR( a2 ) ) * __I(_Int12_) );
289  break;
290  /* 5th row */
291  case _S2323_ :
292  S_ijkl = .5 * MULT * ( ( 1. - 2. * nu ) * ( __I(_Int2_) + __I(_Int3_) ) +
293  ( SQR( a2 ) + SQR( a3 ) ) * __I(_Int23_) );
294  break;
295  /* 6th row */
296  case _S1313_ :
297  S_ijkl = .5 * MULT * ( ( 1. - 2. * nu ) * ( __I(_Int1_) + __I(_Int3_) ) +
298  ( SQR( a1 ) + SQR( a3 ) ) * __I(_Int13_) );
299  break;
300  default:
301  S_ijkl = 0.;
302  break;
303  }//end of switch: flag
304 
305  return S_ijkl;
306 }//end of function: eshelbyTensCompUniformFieldEllipsoid( )
307 
308 //********************************************************************************************************
309 // description: Function initialize an 1D array by Eshelby tensor components
310 // last edit: 15. 02. 2010
311 //-------------------------------------------------------------------------------------------------------
312 // note: Solution adopted from Toshio Mura's book (1982) and Eshelby article (1957)
313 // @eshTens - pointer to array of Eshelby tensor components S_ijkl
314 // @sort_a[3] - sorted ellipsoidal semiaxes (a1>a2>a3)
315 // @eInt[13] - values of elliptical integrals (potentials)
316 //********************************************************************************************************
318  const double sort_a[3], const double eInt[13])
319 {
320  /* 1st row */
321  eshTens[0] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S1111_ );
322  eshTens[1] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S1122_ );
323  eshTens[2] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S1133_ );
324  /* 2nd row */
325  eshTens[3] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S2211_ );
326  eshTens[4] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S2222_ );
327  eshTens[5] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S2233_ );
328  /* 3rd row */
329  eshTens[6] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S3311_ );
330  eshTens[7] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S3322_ );
331  eshTens[8] = this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S3333_ );
332 
333  /* !!! FEEP - Mandel notation !!! e_ij = {e_11, e_22, e_33, 2e_12, 2e_32, 2e_31}^T */
334  /* 4th row */
335  eshTens[9] = 2. * this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S1212_ );
336 
337  /* 5th row */
338  eshTens[10] = 2. * this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S2323_ );
339 
340  /* 6th row */
341  eshTens[11] = 2. * this->eshelbyTensCompUniformField( sort_a, eInt, nu, _S1313_ );
342 
343  return ;
344 }//end of function: eshelbyTensUniformFieldEllipsoid( )
345 
346 
347 //
348 void eshelbySoluUniformField :: giveEshelbyTensorInverse (double SInv[12], const double S[12])
349 {
350  giveInverseMatrix6x6to12(SInv,S);
351 }
352 
353 //********************************************************************************************************
354 // PROTECTED FUNCTIONS
355 //********************************************************************************************************
356 
357 
367 {
368  this->giveDijkl (point->D, point->S, point->eInt, point->dJi, point->dJij, point->ddJi, point->ddJij, I->a, point->loc_x );
369 }
370 
371 //********************************************************************************************************
372 // description: Function gives S_ijkl(x) position dependent Eshelby's tensor. (This is not
373 // the strain perturbation tensor! Just its part ). The returned members of the
374 // S_ijkl matrix are in tensorial (theoretical) notation!
375 // Function requiers "constructor2"
376 // last edit: 12. 07. 2010
377 //-------------------------------------------------------------------------------------------------------
378 // note: @S[36] - Eshelby position dependent tensor
379 // @J[13] - Ferers-Dysons' elliptic integrals
380 // @sort_a[3] - sorted semiaxes' dimensions
381 // @nu - Poisson's ratio of the matrix material
382 //********************************************************************************************************
383 void eshelbySoluUniformField :: giveSijkl( double S[36], const double J[13], const double sort_a[3], double nu, bool newFormulation )
384 {
385  double mult = this->multTRN;
386 
387  if (!newFormulation)
388  {
389  // Original formulation of S tensor.
390  // Differs from Mura book Eq.(11.16), but Eshelby tensor is OK when compared to HELP results.
391  //1st row
392  S[_1111_] = mult * ( this->_1Min2nu * J1 + 3. * SQR( sort_a[0] ) * J11 );
393  S[_1122_] = mult * ( this->_2nu * J1 - J2 + SQR( sort_a[0] ) * J21 );
394  S[_1133_] = mult * ( this->_2nu * J1 - J3 + SQR( sort_a[0] ) * J31 );
395  S[_1123_] = S[_1113_] = S[_1112_] = 0.;
396  //2nd row
397  S[_2211_] = mult * ( this->_2nu * J2 - J1 + SQR( sort_a[1] ) * J12 );
398  S[_2222_] = mult * ( this->_1Min2nu * J2 + 3. * SQR( sort_a[1] ) * J22 );
399  S[_2233_] = mult * ( this->_2nu * J2 - J3 + SQR( sort_a[1] ) * J32 );
400  S[_2223_] = S[_2213_] = S[_2212_] = 0.;
401  //3rd row
402  S[_3311_] = mult * ( this->_2nu * J3 - J1 + SQR( sort_a[2] ) * J13 );
403  S[_3322_] = mult * ( this->_2nu * J3 - J2 + SQR( sort_a[2] ) * J23 );
404  S[_3333_] = mult * ( this->_1Min2nu * J3 + 3. * SQR( sort_a[2] ) * J33 );
405  S[_3323_] = S[_3313_] = S[_3312_] = 0.;
406  //4th row
407  S[_1211_] = S[_1222_] = S[_1233_] = 0.;
408  S[_1212_] = mult * ( this->_1MinNu * J1 - nu * J2 + SQR( sort_a[0] ) * J12 );
409  S[_1223_] = S[_1213_] = 0.;
410  //5th row
411  S[_2311_] = S[_2322_] = S[_2333_] = S[_2312_] = 0.;
412  S[_2323_] = mult * ( this->_1MinNu * J2 - nu * J3 + SQR( sort_a[1] ) * J23 );
413  S[_2313_] = 0.;
414  //6th row
415  S[_1311_] = S[_1322_] = S[_1333_] = S[_1312_] = S[_1323_] = 0.;
416  S[_1313_] = mult * ( this->_1MinNu * J1 - nu * J3 + SQR( sort_a[0] ) * J13 );
417  }
418  else
419  {
420  // New formulation (15.08.2013), corresponds to Eq.(11.16).
421  //1st row
422  S[_1111_] = mult * ( this->_1Min2nu * J1 + 3. * SQR( sort_a[0] ) * J11 );
423  S[_1122_] = mult * ( this->_2nu * J1 - J1 + SQR( sort_a[1] ) * J12 );
424  S[_1133_] = mult * ( this->_2nu * J1 - J1 + SQR( sort_a[2] ) * J13 );
425  S[_1123_] = S[_1113_] = S[_1112_] = 0.;
426  //2nd row
427  S[_2211_] = mult * ( this->_2nu * J2 - J2 + SQR( sort_a[0] ) * J12 );
428  S[_2222_] = mult * ( this->_1Min2nu * J2 + 3. * SQR( sort_a[1] ) * J22 );
429  S[_2233_] = mult * ( this->_2nu * J2 - J2 + SQR( sort_a[2] ) * J23 );
430  S[_2223_] = S[_2213_] = S[_2212_] = 0.;
431  //3rd row
432  S[_3311_] = mult * ( this->_2nu * J3 - J3 + SQR( sort_a[0] ) * J31 );
433  S[_3322_] = mult * ( this->_2nu * J3 - J3 + SQR( sort_a[1] ) * J23 );
434  S[_3333_] = mult * ( this->_1Min2nu * J3 + 3. * SQR( sort_a[2] ) * J33 );
435  S[_3323_] = S[_3313_] = S[_3312_] = 0.;
436  //4th row
437  S[_1211_] = S[_1222_] = S[_1233_] = 0.;
438  S[_1212_] = mult * ( this->_1Min2nu / 2.0 * (J1 + J2) + ( SQR( sort_a[0] ) + SQR( sort_a[1] ) ) / 2.0 * J12 );
439  S[_1223_] = S[_1213_] = 0.;
440  //5th row
441  S[_2311_] = S[_2322_] = S[_2333_] = S[_2312_] = 0.;
442  S[_2323_] = mult * ( this->_1Min2nu / 2.0 * (J2 + J3) + ( SQR( sort_a[1] ) + SQR( sort_a[2] ) ) / 2.0 * J23 );
443  S[_2313_] = 0.;
444  //6th row
445  S[_1311_] = S[_1322_] = S[_1333_] = S[_1312_] = S[_1323_] = 0.;
446  S[_1313_] = mult * ( this->_1Min2nu / 2.0 * (J1 + J3) + ( SQR( sort_a[0] ) + SQR( sort_a[2] ) ) / 2.0 * J13 );
447  }
448 
449 #ifdef TOM_DEBUG
450  std::cout << "Vypis slozek tenzoru S. (giveSijkl())" << std::endl;
451  for (int i = 0; i < 36; i++)
452  std::cout << "S[" << i << "] = " << S[i] << std::endl;
453  std::cout << std::endl;
454 #endif
455 
456  return ;
457 }//end of function: giveSijkl( )
458 
459 
460 //********************************************************************************************************
461 // description: Function gives S_ijkl(x) position dependent Eshelby's tensor. (This is not
462 // the strain perturbation tensor! Just its part ). The returned members of the
463 // S_ijkl matrix are in tensorial (theoretical) notation!
464 // See:
465 // last edit: 20. 11. 2014
466 //-------------------------------------------------------------------------------------------------------
467 // note: @S[36] - Eshelby position dependent tensor
468 // @sort_a[3] - sorted semiaxes' dimensions
469 // @stiffMat[36] - Full stiffness matrix of the matrix material
470 // @M_partition - number of points in Gauss quadrature
471 // @N_partition - number of points in Gauss quadrature
472 //********************************************************************************************************
473 void eshelbySoluUniformField :: giveSijkl( double S[36], const double sort_a[3], const double stiffMat[36], int M_partition, int N_partition )
474 {
475 
476  if( S == NULL ) _errorr( "Field for Eshelby tensor must be allocated" );
477  if( sort_a == NULL ) _errorr( "Field for sorted semiaxes must be allocated" );
478  if( stiffMat == NULL ) _errorr( "Field for stiffness matrix of the matrix must be allocated" );
479 
480 
481  double xiBar[3], zeta[3], K[3][3], N[3][3];
482  double epsilon[3][3][3] = {};
483  double STen[3][3][3][3] = {};
484  double G[3][3][3][3] = {};
485  int idx[3][3] = {};
486  double mltIdx[6][6] = {};
487  double D;
488 
489  double *x1 = new double[N_partition];
490  double *w1 = new double[N_partition];
491  polynomialRootSolution::GauLegF(x1, w1, N_partition, 0.0, 2.0*PI);
492 
493  double *x2 = new double[M_partition];
494  double *w2 = new double[M_partition];
495  polynomialRootSolution::GauLegF(x2, w2, M_partition, -1.0, 1.0);
496 
497  //initialization of permutation tensor
498  epsilon[0][1][2] = epsilon[1][2][0] = epsilon[2][0][1] = 1.;
499  epsilon[0][2][1] = epsilon[2][1][0] = epsilon[1][0][2] = -1;
500 
501  // idx initialization for 4order tensor transformation
502  idx[0][0] = 0; idx[0][1] = 3; idx[0][2] = 5;
503  idx[1][0] = 3; idx[1][1] = 1; idx[1][2] = 4;
504  idx[2][0] = 5; idx[2][1] = 4; idx[2][2] = 2;
505 
506  // value which for multiplication of stiffness matrix element to get tensorial value
507  mltIdx[0][0] = 1.; mltIdx[0][1] = 1.; mltIdx[0][2] = 1.; mltIdx[0][3] = .5; mltIdx[0][4] = .5; mltIdx[0][5] = .5;
508  mltIdx[1][0] = 1.; mltIdx[1][1] = 1.; mltIdx[1][2] = 1.; mltIdx[1][3] = .5; mltIdx[1][4] = .5; mltIdx[1][5] = .5;
509  mltIdx[2][0] = 1.; mltIdx[2][1] = 1.; mltIdx[2][2] = 1.; mltIdx[2][3] = .5; mltIdx[2][4] = .5; mltIdx[2][5] = .5;
510  mltIdx[3][0] = 1.; mltIdx[3][1] = 1.; mltIdx[3][2] = 1.; mltIdx[3][3] = .5; mltIdx[3][4] = .5; mltIdx[3][5] = .5;
511  mltIdx[4][0] = 1.; mltIdx[4][1] = 1.; mltIdx[4][2] = 1.; mltIdx[4][3] = .5; mltIdx[4][4] = .5; mltIdx[4][5] = .5;
512  mltIdx[5][0] = 1.; mltIdx[5][1] = 1.; mltIdx[5][2] = 1.; mltIdx[5][3] = .5; mltIdx[5][4] = .5; mltIdx[5][5] = .5;
513 
514  int ii, jj;
515  double dum;
516  for (int p = 0; p < M_partition; p++) {
517  for (int q = 0; q < N_partition; q++) {
518  zeta[0] = sqrt(1.0 - x2[p] * x2[p]) * cos(x1[q]);
519  zeta[1] = sqrt(1.0 - x2[p] * x2[p]) * sin(x1[q]);
520  zeta[2] = x2[p];
521 
522  xiBar[0] = zeta[0] / sort_a[0];
523  xiBar[1] = zeta[1] / sort_a[1];
524  xiBar[2] = zeta[2] / sort_a[2];
525 
526  for (int i = 0; i < 3; i++)
527  for (int k = 0; k < 3; k++) {
528  dum = 0.0;
529  for (int j = 0; j < 3; j++) {
530  for (int l = 0; l < 3; l++) {
531  ii = idx[i][j];
532  jj = idx[k][l];
533  dum += mltIdx[ii][jj]*stiffMat[ii*6+jj] * xiBar[j] * xiBar[l];
534  }
535  }
536  K[i][k] = dum;
537  }
538 
539  D = 0.0;
540  for (int i = 0; i < 3; i++)
541  for (int j = 0; j < 3; j++) {
542  dum = 0.0;
543  for (int k = 0; k < 3; k++) {
544  D += epsilon[i][j][k] * K[i][0] * K[j][1] * K[k][2];
545  for (int l = 0; l < 3; l++) {
546  for (int m = 0; m < 3; m++) {
547  for (int n = 0; n < 3; n++) {
548  dum += 0.5 * epsilon[i][k][l] * epsilon[j][m][n] * K[k][m] * K[l][n];
549  }
550  }
551  }
552  }
553  N[i][j] = dum;
554  }
555 
556 
557  for (int i = 0; i < 3; i++)
558  for (int j = 0; j < 3; j++)
559  for (int k = 0; k < 3; k++)
560  for (int l = 0; l < 3; l++) {
561  G[i][j][k][l] = xiBar[k] * xiBar[l] * N[i][j] / D;
562  }
563 
564 
565 
566  for (int i = 0; i < 3; i++)
567  for (int j = 0; j < 3; j++) {
568  N[i][j] = K[i][j] = 0.0; // cleaning
569 
570  for (int k = 0; k < 3; k++)
571  for (int l = 0; l < 3; l++)
572  for (int m = 0; m < 3; m++)
573  for (int n = 0; n < 3; n++) {
574  ii = idx[m][n];
575  jj = idx[k][l];
576  STen[i][j][k][l] += 1.0 / (8.0 * PI) * mltIdx[ii][jj]*stiffMat[ii*6+jj] * (G[i][m][j][n] + G[j][m][i][n]) * w1[q] * w2[p];
577  }
578 
579  }
580  }
581  }
582 
583  S[0] = STen[0][0][0][0];
584  S[1] = STen[0][0][1][1];
585  S[2] = STen[0][0][2][2];
586  S[3] = (STen[0][0][0][1] + STen[0][0][1][0]);
587  S[4] = (STen[0][0][1][2] + STen[0][0][2][1]);
588  S[5] = (STen[0][0][0][2] + STen[0][0][2][0]);
589 
590  S[6] = STen[1][1][0][0];
591  S[7] = STen[1][1][1][1];
592  S[8] = STen[1][1][2][2];
593  S[9] = (STen[1][1][0][1] + STen[1][1][1][0]);
594  S[10] = (STen[1][1][1][2] + STen[1][1][2][1]);
595  S[11] = (STen[1][1][0][2] + STen[1][1][2][0]);
596 
597  S[12] = STen[2][2][0][0];
598  S[13] = STen[2][2][1][1];
599  S[14] = STen[2][2][2][2];
600  S[15] = (STen[2][2][0][1] + STen[2][2][1][0]);
601  S[16] = (STen[2][2][1][2] + STen[2][2][2][1]);
602  S[17] = (STen[2][2][0][2] + STen[2][2][2][0]);
603 
604  S[18] = STen[1][2][0][0];
605  S[19] = STen[1][2][1][1];
606  S[20] = STen[1][2][2][2];
607  S[21] = (STen[0][1][0][1] + STen[0][1][1][0]);
608  S[22] = (STen[0][1][1][2] + STen[0][1][2][1]);
609  S[23] = (STen[0][1][0][2] + STen[0][1][2][0]);
610 
611  S[24] = STen[0][2][0][0];
612  S[25] = STen[0][2][1][1];
613  S[26] = STen[0][2][2][2];
614  S[27] = (STen[1][2][0][1] + STen[1][2][1][0]);
615  S[28] = (STen[1][2][1][2] + STen[1][2][2][1]);
616  S[29] = (STen[1][2][0][2] + STen[1][2][2][0]);
617 
618  S[30] = STen[0][1][0][0];
619  S[31] = STen[0][1][1][1];
620  S[32] = STen[0][1][2][2];
621  S[33] = (STen[0][2][0][1] + STen[0][2][1][0]);
622  S[34] = (STen[0][2][1][2] + STen[0][2][2][1]);
623  S[35] = (STen[0][2][0][2] + STen[0][2][2][0]);
624 
625  delete [] x1;
626  delete [] w1;
627  delete [] x2;
628  delete [] w2;
629 }
630 
631 //********************************************************************************************************
632 // description: Function gives D_ijkl(x) generalized Eshelby's tensor.
633 // Function requiers "constructor2"
634 // D_ijkl is adjusted to mandel notation. The resulting D tensor thus differs from the values in Mura book.
635 // last edit: 12. 07. 2010
636 //-------------------------------------------------------------------------------------------------------
637 // note: @D[36] - Perturbation (generalized Eshelby's) tensor to be evaluated and saved
638 // @S[12] - Eshelby's tensor for internal fields (uniform fields)
639 // @J[13] - Ferers-Dysons' elliptic integrals
640 // @dJi[9] - first derivatives of Ferers-Dysons' elliptic integrals Ii
641 // @dJij[27] - first derivatives of Ferers-Dysons' elliptic integrals Iij
642 // @ddJi[27] - second derivatives of Ferers-Dysons' elliptic integrals Ii
643 // @ddJij[81] - second derivatives of Ferers-Dysons' elliptic integrals Ii
644 // @sort_a[3] - sorted semiaxes' dimensions
645 // @x[3] - coordinates of a point
646 // @pos - position of the pint (_INT_POINT_/_EXT_POINT_)
647 //********************************************************************************************************
648 void eshelbySoluUniformField::giveDijkl( double D[36], const double S[12], const double J[13], const double dJi[9],
649  const double dJij[27], const double ddJi[27], const double ddJij[81],
650  const double sort_a[3], const double x[3])
651 {
652  double auxS[36];//auxiliary array to save Eshelby tensor
653  //Position dependent Eshelby tensor:
654  this->giveSijkl( auxS, J, sort_a, nu, false );
655 
656  // The following components or Dijkl are (probably) obtained by expressing equation (11.41) from Mura book in Maple software.
657 
658  // if and else variants are identical with differen arrangement
659  if (1) {
660  // 11 diagonala
661  D[_1111_] = this->multTRN*(-X1*(this->_1Plus2nu*J1_1 + J1_11*X1 - SQR(sort_a[0])*(5*J11_1 + X1*J11_11))) + auxS[_1111_];
662  D[_2222_] = this->multTRN*(-X2*(this->_1Plus2nu*J2_2 + J2_22*X2 - SQR(sort_a[1])*(5*J22_2 + X2*J22_22))) + auxS[_2222_];
663  D[_3333_] = this->multTRN*(-X3*(this->_1Plus2nu*J3_3 + J3_33*X3 - SQR(sort_a[2])*(5*J33_3 + X3*J33_33))) + auxS[_3333_];
664 
665  // 11
666  D[_1122_] = this->multTRN*( this->_2nu*J1_1*X1 + SQR(X1)*(-J1_22 + SQR(sort_a[0])*J11_22) + X2 *(-J2_2 + SQR(sort_a[0])*J21_2) ) + auxS[_1122_];
667  D[_1133_] = this->multTRN*( this->_2nu*J1_1*X1 + SQR(X1)*(-J1_33 + SQR(sort_a[0])*J11_33) + X3 *(-J3_3 + SQR(sort_a[0])*J31_3) ) + auxS[_1133_];
668  D[_2233_] = this->multTRN*( this->_2nu*J2_2*X2 + SQR(X2)*(-J2_33 + SQR(sort_a[1])*J22_33) + X3 *(-J3_3 + SQR(sort_a[1])*J32_3) ) + auxS[_2233_];
669 
670  D[_2211_] = this->multTRN*( this->_2nu*J2_2*X2 + SQR(X2)*(-J2_11 + SQR(sort_a[1])*J22_11) + X1 *(-J1_1 + SQR(sort_a[1])*J12_1) ) + auxS[_2211_];
671  D[_3311_] = this->multTRN*( this->_2nu*J3_3*X3 + SQR(X3)*(-J3_11 + SQR(sort_a[2])*J33_11) + X1 *(-J1_1 + SQR(sort_a[2])*J13_1) ) + auxS[_3311_];
672  D[_3322_] = this->multTRN*( this->_2nu*J3_3*X3 + SQR(X3)*(-J3_22 + SQR(sort_a[2])*J33_22) + X2 *(-J2_2 + SQR(sort_a[2])*J23_2) ) + auxS[_3322_];
673 
674  // 12
675  D[_1123_] = this->multTRN*( X2 *(-J2_3 + SQR(sort_a[0])*J21_3 ) + SQR(X1)*(-J1_32 + SQR(sort_a[0])*J11_32));
676  D[_2213_] = this->multTRN*( X1 *(-J1_3 + SQR(sort_a[1])*J12_3 ) + SQR(X2)*(-J2_31 + SQR(sort_a[1])*J22_31));
677  D[_3312_] = this->multTRN*( X1 *(-J1_2 + SQR(sort_a[2])*J13_2 ) + SQR(X3)*(-J3_21 + SQR(sort_a[2])*J33_21));
678 
679  D[_1112_] = this->multTRN*( X1 *(-3*J1_2 - J1_21*X1 + SQR(sort_a[0])*(3*J11_2 + X1*J11_21)) + 2*this->_1MinNu*J2_1*X2);
680  D[_1113_] = this->multTRN*( X1 *(-3*J1_3 - J1_31*X1 + SQR(sort_a[0])*(3*J11_3 + X1*J11_31)) + 2*this->_1MinNu*J3_1*X3);
681  D[_2223_] = this->multTRN*( X2 *(-3*J2_3 - J2_32*X2 + SQR(sort_a[1])*(3*J22_3 + X2*J22_32)) + 2*this->_1MinNu*J3_2*X3);
682 
683  D[_2212_] = this->multTRN*(this->_1Min2nu*J1_2*X1 + SQR(sort_a[1])*X1*J12_2 + X2*(-2*J2_1 - J2_21*X2 + SQR(sort_a[1])*(2*J22_1 + X2*J22_21)));
684  D[_3323_] = this->multTRN*(this->_1Min2nu*J2_3*X2 + SQR(sort_a[2])*X2*J23_3 + X3*(-2*J3_2 - J3_32*X3 + SQR(sort_a[2])*(2*J33_2 + X3*J33_32)));
685  D[_3313_] = this->multTRN*(this->_1Min2nu*J1_3*X1 + SQR(sort_a[2])*X1*J13_3 + X3*(-2*J3_1 - J3_31*X3 + SQR(sort_a[2])*(2*J33_1 + X3*J33_31)));
686 
687  // 21
688  D[_1211_] = this->multTRN*(2*J1_2*X1 + X2*(-2*J2_1 - J2_11*X1 + SQR(sort_a[0])*(2*J12_1 + X1*J12_11)));
689  D[_2322_] = this->multTRN*(2*J2_3*X2 + X3*(-2*J3_2 - J3_22*X2 + SQR(sort_a[1])*(2*J23_2 + X2*J23_22)));
690  D[_1311_] = this->multTRN*(2*J1_3*X1 + X3*(-2*J3_1 - J3_11*X1 + SQR(sort_a[0])*(2*J13_1 + X1*J13_11)));
691 
692  D[_1222_] = this->multTRN*(this->_2nu*J1_2*X1 + X1*(-2*J2_2 - J2_22*X2 + SQR(sort_a[0])*(2*J12_2 + X2*J12_22)) + 2*this->_1MinNu*J2_1*X2);
693  D[_2333_] = this->multTRN*(this->_2nu*J2_3*X2 + X2*(-2*J3_3 - J3_33*X3 + SQR(sort_a[1])*(2*J23_3 + X3*J23_33)) + 2*this->_1MinNu*J3_2*X3);
694  D[_1333_] = this->multTRN*(this->_2nu*J1_3*X1 + X1*(-2*J3_3 - J3_33*X3 + SQR(sort_a[0])*(2*J13_3 + X3*J13_33)) + 2*this->_1MinNu*J3_1*X3);
695 
696  D[_1233_] = this->multTRN*(X1*(this->_2nu*J1_2 + X2*(-J2_33 + SQR(sort_a[0])*J12_33)));
697  D[_2311_] = this->multTRN*(X2*(this->_2nu*J2_3 + X3*(-J3_11 + SQR(sort_a[1])*J23_11)));
698  D[_1322_] = this->multTRN*(X1*(this->_2nu*J1_3 + X3*(-J3_22 + SQR(sort_a[0])*J13_22)));
699 
700  // 22 diagonala
701  D[_1212_] = this->multTRN*(this->_1MinNu*J1_1*X1 - J2_1*X1 - nu*J2_2*X2 - J2_21*X1*X2 + SQR(sort_a[0])*X1*J12_1 + SQR(sort_a[0])*X2*J12_2 + SQR(sort_a[0])*X1*X2*J12_21) + auxS[_1212_];
702  D[_2323_] = this->multTRN*(this->_1MinNu*J2_2*X2 - J3_2*X2 - nu*J3_3*X3 - J3_32*X2*X3 + SQR(sort_a[1])*X2*J23_2 + SQR(sort_a[1])*X3*J23_3 + SQR(sort_a[1])*X2*X3*J23_32) + auxS[_2323_];
703  D[_1313_] = this->multTRN*(this->_1MinNu*J1_1*X1 - J3_1*X1 - nu*J3_3*X3 - J3_31*X1*X3 + SQR(sort_a[0])*X1*J13_1 + SQR(sort_a[0])*X3*J13_3 + SQR(sort_a[0])*X1*X3*J13_31) + auxS[_1313_];
704 
705  // 22 zbytek
706  D[_2312_] = this->multTRN*( this->_1MinNu*J1_3*X1 + X3*(-J3_1 - J3_21*X2 + SQR(sort_a[1])*(J23_1 + X2*J23_21)));
707  D[_2313_] = this->multTRN*( this->_1MinNu*J1_2*X1 + X2*(-J3_1 - J3_31*X3 + SQR(sort_a[1])*(J23_1 + X3*J23_31)));
708  D[_1312_] = this->multTRN*( this->_1MinNu*J2_3*X2 + X3*(-J3_2 - J3_21*X1 + SQR(sort_a[0])*(J13_2 + X1*J13_21)));
709 
710  D[_1323_] = this->multTRN*( this->_1MinNu*J2_1*X2 + X1*(-J3_2 - J3_32*X3 + SQR(sort_a[0])*(J13_2 + X3*J13_32)));
711  D[_1223_] = this->multTRN*( this->_1MinNu*J3_1*X3 + X1*(-J2_3 - J2_32*X2 + SQR(sort_a[0])*(J12_3 + X2*J12_32)));
712  D[_1213_] = this->multTRN*( this->_1MinNu*J3_2*X3 + X2*(-J2_3 - J2_31*X1 + SQR(sort_a[0])*(J12_3 + X1*J12_31)));
713  }
714  else {
715  /*1st row*/
716  D[_1111_] = this->multTRN*(-(X1*(this->_1Plus2nu*J1_1 + J1_11*X1 - SQR(sort_a[0])*(5*J11_1 + X1*J11_11)))) + auxS[_1111_];
717 
718  D[_1122_] = this->multTRN*(this->_2nu*J1_1*X1 + SQR(X1)*(-J1_22 + SQR(sort_a[0])*J11_22) + X2*(-J2_2 + SQR(sort_a[0])*J21_2)) + auxS[_1122_];
719 
720  D[_1133_] = this->multTRN*(this->_2nu*J1_1*X1 + SQR(X1)*(-J1_33 + SQR(sort_a[0])*J11_33) + X3*(-J3_3 + SQR(sort_a[0])*J31_3)) + auxS[_1133_];
721 
722  D[_1112_] = this->multTRN*(X1*(-3*J1_2 - J1_21*X1 + SQR(sort_a[0])*(3*J11_2 + X1*J11_21)) + 2*this->_1MinNu*J2_1*X2);
723 
724  D[_1123_] = this->multTRN*(SQR(X1)*(-J1_32 + SQR(sort_a[0])*J11_32) + X2*(-J2_3 + SQR(sort_a[0])*J21_3));
725 
726  D[_1113_] = this->multTRN*(X1*(-3*J1_3 - J1_31*X1 + SQR(sort_a[0])*(3*J11_3 + X1*J11_31)) +
727  2*this->_1MinNu*J3_1*X3);
728 
729  /*2nd row*/
730  D[_2211_] = this->multTRN*(this->_2nu*J2_2*X2 + X1*(-J1_1 + SQR(sort_a[1])*J12_1) +
731  SQR(X2)*(-J2_11 + SQR(sort_a[1])*J22_11)) + auxS[_2211_];
732 
733  D[_2222_] = this->multTRN*(-(X2*(this->_1Plus2nu*J2_2 + J2_22*X2 - SQR(sort_a[1])*(5*J22_2 + X2*J22_22)))) +
734  auxS[_2222_];
735 
736  D[_2233_] = this->multTRN*(this->_2nu*J2_2*X2 + SQR(X2)*(-J2_33 + SQR(sort_a[1])*J22_33) +
737  X3*(-J3_3 + SQR(sort_a[1])*J32_3)) + auxS[_2233_];
738 
739  D[_2212_] = this->multTRN*(this->_1Min2nu*J1_2*X1 + SQR(sort_a[1])*X1*J12_2 +
740  X2*(-2*J2_1 - J2_21*X2 + SQR(sort_a[1])*(2*J22_1 + X2*J22_21)));
741 
742  D[_2223_] = this->multTRN*(X2*(-3*J2_3 - J2_32*X2 + SQR(sort_a[1])*(3*J22_3 + X2*J22_32)) +
743  2*this->_1MinNu*J3_2*X3);
744 
745  D[_2213_] = this->multTRN*(X1*(-J1_3 + SQR(sort_a[1])*J12_3) + SQR(X2)*(-J2_31 + SQR(sort_a[1])*J22_31));
746 
747 
748  /*3rd row*/
749  D[_3311_] = this->multTRN*(this->_2nu*J3_3*X3 + X1*(-J1_1 + SQR(sort_a[2])*J13_1) +
750  SQR(X3)*(-J3_11 + SQR(sort_a[2])*J33_11)) + auxS[_3311_];
751 
752  D[_3322_] = this->multTRN*(this->_2nu*J3_3*X3 + X2*(-J2_2 + SQR(sort_a[2])*J23_2) +
753  SQR(X3)*(-J3_22 + SQR(sort_a[2])*J33_22)) + auxS[_3322_];
754 
755  D[_3333_] = this->multTRN*(-(X3*(this->_1Plus2nu*J3_3 + J3_33*X3 - SQR(sort_a[2])*(5*J33_3 + X3*J33_33)))) +
756  auxS[_3333_];
757 
758  D[_3312_] = this->multTRN*(X1*(-J1_2 + SQR(sort_a[2])*J13_2) + SQR(X3)*(-J3_21 + SQR(sort_a[2])*J33_21));
759 
760  D[_3323_] = this->multTRN*(this->_1Min2nu*J2_3*X2 + SQR(sort_a[2])*X2*J23_3 +
761  X3*(-2*J3_2 - J3_32*X3 + SQR(sort_a[2])*(2*J33_2 + X3*J33_32)));
762 
763  D[_3313_] = this->multTRN*(this->_1Min2nu*J1_3*X1 + SQR(sort_a[2])*X1*J13_3 +
764  X3*(-2*J3_1 - J3_31*X3 + SQR(sort_a[2])*(2*J33_1 + X3*J33_31)));
765 
766  /*4th row*/
767  D[_1211_] = this->multTRN*(2*J1_2*X1 + X2*(-2*J2_1 - J2_11*X1 + SQR(sort_a[0])*(2*J12_1 + X1*J12_11)));
768 
769  D[_1222_] = this->multTRN*(this->_2nu*J1_2*X1 + X1*(-2*J2_2 - J2_22*X2 + SQR(sort_a[0])*(2*J12_2 + X2*J12_22)) +
770  2*this->_1MinNu*J2_1*X2);
771 
772  D[_1233_] = this->multTRN*(X1*(this->_2nu*J1_2 + X2*(-J2_33 + SQR(sort_a[0])*J12_33)));
773 
774  D[_1212_] = this->multTRN*(this->_1MinNu*J1_1*X1 - J2_1*X1 - nu*J2_2*X2 - J2_21*X1*X2 + SQR(sort_a[0])*X1*J12_1 +
775  SQR(sort_a[0])*X2*J12_2 + SQR(sort_a[0])*X1*X2*J12_21) + auxS[_1212_];
776 
777  D[_1223_] = this->multTRN*(X1*(-J2_3 - J2_32*X2 + SQR(sort_a[0])*(J12_3 + X2*J12_32)) +
778  this->_1MinNu*J3_1*X3);
779 
780  D[_1213_] = this->multTRN*(X2*(-J2_3 - J2_31*X1 + SQR(sort_a[0])*(J12_3 + X1*J12_31)) +
781  this->_1MinNu*J3_2*X3);
782 
783  /*5th row*/
784  D[_2311_] = this->multTRN*(X2*(this->_2nu*J2_3 + X3*(-J3_11 + SQR(sort_a[1])*J23_11)));
785 
786  D[_2322_] = this->multTRN*(2*J2_3*X2 + X3*(-2*J3_2 - J3_22*X2 + SQR(sort_a[1])*(2*J23_2 + X2*J23_22)));
787 
788  D[_2333_] = this->multTRN*(this->_2nu*J2_3*X2 + X2*(-2*J3_3 - J3_33*X3 + SQR(sort_a[1])*(2*J23_3 + X3*J23_33)) +
789  2*this->_1MinNu*J3_2*X3);
790 
791  D[_2312_] = this->multTRN*(this->_1MinNu*J1_3*X1 + X3*(-J3_1 - J3_21*X2 + SQR(sort_a[1])*(J23_1 + X2*J23_21)));
792 
793  D[_2323_] = this->multTRN*(this->_1MinNu*J2_2*X2 - J3_2*X2 - nu*J3_3*X3 - J3_32*X2*X3 + SQR(sort_a[1])*X2*J23_2 +
794  SQR(sort_a[1])*X3*J23_3 + SQR(sort_a[1])*X2*X3*J23_32) + auxS[_2323_];
795 
796  D[_2313_] = this->multTRN*(this->_1MinNu*J1_2*X1 + X2*(-J3_1 - J3_31*X3 + SQR(sort_a[1])*(J23_1 + X3*J23_31)));
797 
798  /*6th row*/
799  D[_1311_] = this->multTRN*(2*J1_3*X1 + X3*(-2*J3_1 - J3_11*X1 + SQR(sort_a[0])*(2*J13_1 + X1*J13_11)));
800 
801  D[_1322_] = this->multTRN*(X1*(this->_2nu*J1_3 + X3* (-J3_22 + SQR(sort_a[0])*J13_22)));
802 
803  D[_1333_] = this->multTRN*(this->_2nu*J1_3*X1 + X1*(-2*J3_3 - J3_33*X3 + SQR(sort_a[0])*(2*J13_3 + X3*J13_33)) +
804  2*this->_1MinNu*J3_1*X3);
805 
806  D[_1312_] = this->multTRN*(this->_1MinNu*J2_3*X2 + X3*(-J3_2 - J3_21*X1 + SQR(sort_a[0])*(J13_2 + X1*J13_21)));
807 
808  D[_1323_] = this->multTRN*(X1*(-J3_2 - J3_32*X3 + SQR(sort_a[0])*(J13_2 + X3*J13_32)) +
809  this->_1MinNu*J2_1*X2);
810 
811  D[_1313_] = this->multTRN*(this->_1MinNu*J1_1*X1 - J3_1*X1 - nu*J3_3*X3 - J3_31*X1*X3 + SQR(sort_a[0])*X1*J13_1 +
812  SQR(sort_a[0])*X3*J13_3 + SQR(sort_a[0])*X1*X3*J13_31) + auxS[_1313_];
813  }
814 
815  // TomTag:
816  // No Mandel notation.
817  // eps_star_ij = D_ijkl * eps_tau_kl
818  // e.g. eps_11 = ... + D_1112 eps_tau_12 + ... + D_1121 eps_tau_21
819  // Therefore thre right half of matrix D is multiplied by two.
820 
821  D[_1112_] *= 2.0;
822  D[_1123_] *= 2.0;
823  D[_1113_] *= 2.0;
825  D[_2212_] *= 2.0;
826  D[_2223_] *= 2.0;
827  D[_2213_] *= 2.0;
829  D[_3312_] *= 2.0;
830  D[_3323_] *= 2.0;
831  D[_3313_] *= 2.0;
833  D[_1212_] *= 2.0;
834  D[_1223_] *= 2.0;
835  D[_1213_] *= 2.0;
837  D[_2312_] *= 2.0;
838  D[_2323_] *= 2.0;
839  D[_2313_] *= 2.0;
841  D[_1312_] *= 2.0;
842  D[_1323_] *= 2.0;
843  D[_1313_] *= 2.0;
844 
847  //D[_1112_] *= SQRT_2;
848  //D[_1123_] *= SQRT_2;
849  //D[_1113_] *= SQRT_2;
851  //D[_2212_] *= SQRT_2;
852  //D[_2223_] *= SQRT_2;
853  //D[_2213_] *= SQRT_2;
855  //D[_3312_] *= SQRT_2;
856  //D[_3323_] *= SQRT_2;
857  //D[_3313_] *= SQRT_2;
859  //D[_1211_] *= SQRT_2;
860  //D[_1222_] *= SQRT_2;
861  //D[_1233_] *= SQRT_2;
862  //D[_1212_] *= 2.;
863  //D[_1223_] *= 2.;
864  //D[_1213_] *= 2.;
866  //D[_2311_] *= SQRT_2;
867  //D[_2322_] *= SQRT_2;
868  //D[_2333_] *= SQRT_2;
869  //D[_2312_] *= 2.;
870  //D[_2323_] *= 2.;
871  //D[_2313_] *= 2.;
873  //D[_1311_] *= SQRT_2;
874  //D[_1322_] *= SQRT_2;
875  //D[_1333_] *= SQRT_2;
876  //D[_1312_] *= 2.;
877  //D[_1323_] *= 2.;
878  //D[_1313_] *= 2.;
879 
880 #ifdef TOM_DEBUG
881  // Temporary test of giveSijkl () implementation.
882  const int length = 36;
883  double S1[length];
884  double S2[length];
885  this->giveSijkl( S1, J, sort_a, nu, false );
886  this->giveSijkl( S2, J, sort_a, nu, true );
887  double err = 0.0;
888  for (int i=0; i < length; i++)
889  err += (S2[i] - S1[i]) * (S2[i] - S1[i]);
890 
891  std::cout << "Vypis slozek tenzoru S. (ve funkci giveDijkl())" << std::endl;
892  for (int i = 0; i < 12; i++)
893  std::cout << "S[" << i << "] = " << S[i] << std::endl;
894  std::cout << std::endl;
895  std::cout << "Vypis slozek tenzoru D. (giveDijkl())" << std::endl;
896  for (int i = 0; i < 36; i++)
897  std::cout << "D[" << i << "] = " << D[i] << std::endl;
898  std::cout << std::endl;
899 #endif
900 
901  return ;
902 }//end of function: giveDijkl( )
903 
904 
911 {
912  this->giveLijkINT (point->L, point->eInt, I->a, point->loc_x );
913  this->giveLijkEXT (point->L, point->L, point->dJi, point->dJij, I->a, point->loc_x);
914 }
915 
923 {
924  this->giveLijkINT (L, I->eInt, I->a, x);
925 }
926 
927 
938 void eshelbySoluUniformField :: giveLijkEXT (double Lext[18], const double Lint[18], const double dJi[9],
939  const double dJij[27], const double sort_a[3], const double x[3])
940 {
941  double xx1 = SQR( X1 );
942  double xx2 = SQR( X2 );
943  double xx3 = SQR( X3 );
944  double x1x2 = X1 * X2;
945  double x2x3 = X2 * X3;
946  double x1x3 = X1 * X3;
947 
948  CopyVector(Lint, Lext, 18);
949 
950  /* 1st row */
951  Lext[_111_] += this->multTRN * xx1 * ( -J1_1 + SQR( sort_a[0] ) * J11_1 );
952  Lext[_122_] += this->multTRN * x1x2 * ( -J2_2 + SQR( sort_a[0] ) * J12_2 );
953  Lext[_133_] += this->multTRN * x1x3 * ( -J3_3 + SQR( sort_a[0] ) * J13_3 );
954  Lext[_112_] += 2 * this->multTRN * xx1 * ( -J1_2 + SQR( sort_a[0] ) * J11_2 );
955  Lext[_123_] += 2 * this->multTRN * x1x2 * ( -J2_3 + SQR( sort_a[0] ) * J12_3 );
956  Lext[_113_] += 2 * this->multTRN * xx1 * ( -J1_3 + SQR( sort_a[0] ) * J11_3 );
957  /* 2nd row */
958  Lext[_211_] += this->multTRN * x1x2 * ( -J1_1 + SQR( sort_a[1] ) * J21_1 );
959  Lext[_222_] += this->multTRN * xx2 * ( -J2_2 + SQR( sort_a[1] ) * J22_2 );
960  Lext[_233_] += this->multTRN * x2x3 * ( -J3_3 + SQR( sort_a[1] ) * J23_3 );
961  Lext[_212_] += 2 * this->multTRN * x1x2 * ( -J1_2 + SQR( sort_a[1] ) * J21_2 );
962  Lext[_223_] += 2 * this->multTRN * xx2 * ( -J2_3 + SQR( sort_a[1] ) * J22_3 );
963  Lext[_213_] += 2 * this->multTRN * x1x2 * ( -J1_3 + SQR( sort_a[1] ) * J21_3 );
964  /* 3rd row */
965  Lext[_311_] += this->multTRN * x1x3 * ( -J1_1 + SQR( sort_a[2] ) * J31_1 );
966  Lext[_322_] += this->multTRN * x2x3 * ( -J2_2 + SQR( sort_a[2] ) * J32_2 );
967  Lext[_333_] += this->multTRN * xx3 * ( -J3_3 + SQR( sort_a[2] ) * J33_3 );
968  Lext[_312_] += 2 * this->multTRN * x1x3 * ( -J1_2 + SQR( sort_a[2] ) * J31_2 );
969  Lext[_323_] += 2 * this->multTRN * x2x3 * ( -J2_3 + SQR( sort_a[2] ) * J32_3 );
970  Lext[_313_] += 2 * this->multTRN * x1x3 * ( -J1_3 + SQR( sort_a[2] ) * J31_3 );
971 
972  return ;
973 }//end of function: giveLijkEXT( )
974 
982 void eshelbySoluUniformField :: giveLijkINT (double Lint[18], const double J[13], const double sort_a[3],
983  const double x[3] )
984 {
985  /* 1st row */
986  Lint[_111_] = this->multTRN * ( X1 * ( this->_1Min2nu * J1 + 3. * SQR( sort_a[0] ) * J11 ) );
987  Lint[_122_] = this->multTRN * ( X1 * ( this->_2nu * J1 - J2 + SQR( sort_a[0] ) * J12 ) );
988  Lint[_133_] = this->multTRN * ( X1 * ( this->_2nu * J1 - J3 + SQR( sort_a[0] ) * J13 ) );
989  Lint[_112_] = this->multTRN * ( X2 * ( this->_1Min2nu * J2 + SQR( sort_a[0] ) * J12 ) );
990  Lint[_123_] = 0.;
991  Lint[_113_] = this->multTRN * ( X3 * ( this->_1Min2nu * J3 + SQR( sort_a[0] ) * J13 ) );
992  /* 2nd row */
993  Lint[_211_] = this->multTRN * ( X2 * ( this->_2nu * J2 - J1 + SQR( sort_a[1] ) * J21 ) );
994  Lint[_222_] = this->multTRN * ( X2 * ( this->_1Min2nu * J2 + 3. * SQR( sort_a[1] ) * J22 ) );
995  Lint[_233_] = this->multTRN * ( X2 * ( this->_2nu * J2 - J3 + SQR( sort_a[1] ) * J23 ) );
996  Lint[_212_] = this->multTRN * ( X1 * ( this->_1Min2nu * J1 + SQR( sort_a[1] ) * J21 ) );
997  Lint[_223_] = this->multTRN * ( X3 * ( this->_1Min2nu * J3 + SQR( sort_a[1] ) * J23 ) );
998  Lint[_213_] = 0.;
999  /* 3rd row */
1000  Lint[_311_] = this->multTRN * ( X3 * ( this->_2nu * J3 - J1 + SQR( sort_a[2] ) * J31 ) );
1001  Lint[_322_] = this->multTRN * ( X3 * ( this->_2nu * J3 - J2 + SQR( sort_a[2] ) * J32 ) );
1002  Lint[_333_] = this->multTRN * ( X3 * ( this->_1Min2nu * J3 + 3. * SQR( sort_a[2] ) * J33 ) );
1003  Lint[_312_] = 0.;
1004  Lint[_323_] = this->multTRN * ( X2 * ( this->_1Min2nu * J2 + SQR( sort_a[2] ) * J32 ) );
1005  Lint[_313_] = this->multTRN * ( X1 * ( this->_1Min2nu * J1 + SQR( sort_a[2] ) * J31 ) );
1006 
1007  //Mandel notation adjusting
1008  /* 1nd row */
1009  Lint[_112_] *= 2;
1010  Lint[_123_] *= 2;
1011  Lint[_113_] *= 2;
1012  /* 2nd row */
1013  Lint[_212_] *= 2;
1014  Lint[_223_] *= 2;
1015  Lint[_213_] *= 2;
1016  /* 3rd row */
1017  Lint[_312_] *= 2;
1018  Lint[_323_] *= 2;
1019  Lint[_313_] *= 2;
1020 
1021  return ;
1022 }//end of function: giveLijkINT( )
1023 
1024 } // end of namespace mumech
1025 
1026 /*end of file*/
#define J11_3
Definition: types.h:490
#define J1_1
Definition: types.h:451
Class eshelbySoluUniformField.
Class polynomialRootSolution collects functions calculating the roots of polynomial functions...
#define J31_2
Definition: types.h:485
#define J2_3
Definition: types.h:457
void giveDisplacementPerturbTensor_INTpoint(double L[18], const double x[3])
Function gives the Displacement perturbation tensor of a INTERNAL point with respect to owner inclusi...
Definition: esuf.cpp:922
#define J11_32
Definition: types.h:553
#define J12_2
Definition: types.h:478
double D[36]
Perturbation tensor of a point (strains/stresses).
Definition: matrix.h:147
#define _2223_
Definition: types.h:326
virtual void eshelbyTensUniformField(double eshTens[12], const double sort_a[3], const double eInt[13])
Definition: esuf.cpp:317
#define _2311_
Definition: types.h:343
#define J12_33
Definition: types.h:567
#define _1323_
Definition: types.h:354
double loc_x[3]
Local coordinates of a point.
Definition: matrix.h:137
#define J33_11
Definition: types.h:648
#define _Int3_
Definition: types.h:404
#define __I(component)
Definition: esuf.cpp:50
#define J13_2
Definition: types.h:479
#define J2_33
Definition: types.h:528
virtual void giveDerivativesOfEllipticIntegrals(Point *point, bool intpoint)=0
Function gives the values of Ferers-Dyson&#39;s elliptic integral derivatives of the inclusion this->I...
#define J12_32
Definition: types.h:566
#define J23_33
Definition: types.h:619
#define _1222_
Definition: types.h:337
#define J1_2
Definition: types.h:452
#define J3_3
Definition: types.h:461
virtual void giveSijkl(double S[36], const double sort_a[3], const double stiffMat[36], int M_partition, int N_partition)
Definition: esuf.cpp:473
#define J12_11
Definition: types.h:557
#define _212_
Definition: types.h:371
#define _3322_
Definition: types.h:330
void giveEshelbyStrainOfOnePoint(Point *point)
Function gives the &#39;Eshelby&#39; STRAIN field in an arbitrary EXTERNAL point.
Definition: esuf.cpp:134
#define J3_2
Definition: types.h:460
#define J33
Definition: types.h:444
#define J13_22
Definition: types.h:575
#define J2_31
Definition: types.h:526
#define _233_
Definition: types.h:370
void giveStrainPerturbTensor(Point *point)
Function gives the strain perturbation tensor of a point with respect to an inclusion of arbitrary sh...
Definition: esuf.cpp:366
#define J11_22
Definition: types.h:549
#define J21_1
Definition: types.h:468
#define J12_22
Definition: types.h:562
#define J31
Definition: types.h:442
#define J1_31
Definition: types.h:513
const Problem * P
problem description
Definition: inclusion.h:69
#define J12_3
Definition: types.h:491
#define J13_11
Definition: types.h:570
#define _Int23_
Definition: types.h:412
#define _1123_
Definition: types.h:319
#define _2212_
Definition: types.h:325
double ** displacement
Calculated value - global displacement field.
Definition: matrix.h:153
void giveLijkINT(double Lint[18], const double J[13], const double sort_a[3], const double x[3])
Function gives the displacement perturbation tensor of internal fields.
Definition: esuf.cpp:982
double x[3]
Global coordinates of a point.
Definition: matrix.h:136
#define J2_11
Definition: types.h:518
#define J22_21
Definition: types.h:600
#define PI
Definition: macros.h:71
#define J33_22
Definition: types.h:653
#define _Int32_
Definition: types.h:415
double nu
nu of matrix
Definition: esuf.h:51
#define J2_21
Definition: types.h:522
void CopyVector(const double *src, double *dest, long n)
Function copy given number of components from vector, &#39;a&#39; to vector &#39;b&#39;.
#define _3313_
Definition: types.h:334
#define _Int22_
Definition: types.h:411
#define J22_32
Definition: types.h:605
#define J3_32
Definition: types.h:540
void giveEshelbyStrainUniformField(double strain[6], const double pertTens[36], const double unifStrain[6])
Function gives the &#39;Eshelby&#39; perturbation strain tensor of an arbitrary point of an ellipsoidal inclu...
Definition: esuf.cpp:107
double L[18]
Perturbation tensor of a point (displacements).
Definition: matrix.h:148
void giveInverseMatrix6x6to12(double *answer, const double *m)
Function computes inverse of the eshelby-like 3x3 matrix &#39;m&#39; saved in reduced 6x6to12 form...
void giveEshelbyTensor(double S[12], const double eInt[13])
Function gives the Eshelby tensor of an inclusion of arbitrary shape.
Definition: esuf.cpp:225
#define _2213_
Definition: types.h:327
#define J11_2
Definition: types.h:477
#define J23_22
Definition: types.h:614
#define _122_
Definition: types.h:362
#define J13_33
Definition: types.h:580
#define _1322_
Definition: types.h:351
#define _312_
Definition: types.h:378
double S[12]
Eshelby tensor of internal points.
Definition: matrix.h:146
#define _1212_
Definition: types.h:339
#define J11_33
Definition: types.h:554
#define _2322_
Definition: types.h:344
void giveEshelbyDisplacementOfOnePoint(double **globPert_displc, const double *coords, int lc, int nlc)
Function gives the &#39;Eshelby&#39; DISPLACEMENT field in an arbitrary INTERNAL point for given load cases...
Definition: esuf.cpp:209
#define _113_
Definition: types.h:366
#define J3
Definition: types.h:432
#define J33_2
Definition: types.h:487
Class eshelbySoluEllipticIntegrals.
#define _1223_
Definition: types.h:340
The header file of usefull macros.
3D inclusion record.
Definition: inclusion.h:278
#define J3_31
Definition: types.h:539
virtual void giveDijkl(double D[36], const double S[12], const double J[13], const double dJi[9], const double dJij[27], const double ddJi[27], const double ddJij[81], const double sort_a[3], const double x[3])
Definition: esuf.cpp:648
#define X1
Definition: esuf.cpp:46
Collection of the functions of basic manipulations, some of them can be used instead of their counter...
void giveLijkEXT(double Lext[18], const double Lint[18], const double dJi[9], const double dJij[27], const double sort_a[3], const double x[3])
Function gives the displacement perturbation tensor of external fields.
Definition: esuf.cpp:938
#define _Int1_
Definition: types.h:402
void rotateStrain_L2G(const double *loc, double *glob) const
Function rotate local strain to global.
Definition: inclusion.cpp:405
#define _Int2_
Definition: types.h:403
#define J2
Definition: types.h:431
#define _Int12_
Definition: types.h:407
#define J3_11
Definition: types.h:531
void giveEshelbyDisplacementUniformField(double displacement[3], const double pertDispTens[18], const double unifStrain[6])
Function gives the &#39;Eshelby&#39; perturbation displacement vector of an arbitrary point of an ellipsoidal...
Definition: esuf.cpp:79
#define _Int13_
Definition: types.h:408
#define J1_32
Definition: types.h:514
#define _133_
Definition: types.h:363
#define J23_2
Definition: types.h:483
double ddJij[81]
Second derivatives of elliptic integral Iij.
Definition: matrix.h:145
#define J2_1
Definition: types.h:455
#define _1113_
Definition: types.h:320
#define J33_33
Definition: types.h:658
#define _123_
Definition: types.h:365
#define _2333_
Definition: types.h:345
#define _2233_
Definition: types.h:324
#define _1213_
Definition: types.h:341
#define _2222_
Definition: types.h:323
static void GauLegF(double *x, double *w, const int nPoints, const double minLim, const double maxLim)
#define J31_3
Definition: types.h:498
double ** locEigStrain_LC
predchazejici arrays slouzi vsude v balancingu pro vypocet v danem lc, tyto pole schovavaji vysledky ...
Definition: inclusion.h:299
#define J31_1
Definition: types.h:472
Single Point data structure - contribution from Single inclusion.
Definition: matrix.h:133
#define J32
Definition: types.h:443
double ** strain
Calculated value - global strain fields.
Definition: matrix.h:154
#define X2
Definition: esuf.cpp:47
eshelbySoluEllipticIntegrals * ellInt
Definition: inclusion.h:284
#define J12_21
Definition: types.h:561
#define J13
Definition: types.h:436
double eInt[13]
elliptic potentials of an internal point (position independent)
Definition: inclusion.h:290
#define J23_21
Definition: types.h:613
#define J3_33
Definition: types.h:541
#define _1111_
Definition: types.h:315
#define J11
Definition: types.h:434
#define J13_21
Definition: types.h:574
static double giveLambda(const double a[3], const double x[3], InclusionGeometry shape)
#define J12_1
Definition: types.h:465
#define _1122_
Definition: types.h:316
#define J12_31
Definition: types.h:565
#define _112_
Definition: types.h:364
#define J21_3
Definition: types.h:494
Class inclusion contains and handles all inclusion data.
double locEigStrain[6]
actual local eigenstrain used during &#39;self_balance&#39; algorithm
Definition: inclusion.h:295
#define J1_11
Definition: types.h:505
void rotateDisplc_L2G(const double *loc, double *glob) const
Definition: inclusion.cpp:387
Class MatrixRecord.
#define J22_22
Definition: types.h:601
#define J33_1
Definition: types.h:474
#define J23_3
Definition: types.h:496
#define J13_32
Definition: types.h:579
eshelbySoluUniformField(const InclusionRecord3D *i)
Constructor.
Definition: esuf.cpp:54
#define _222_
Definition: types.h:369
#define J22_3
Definition: types.h:495
EshelbyTensComponent
Definition: types.h:221
#define SQR(a)
Definition: macros.h:97
double dJi[9]
First derivatives of elliptic integral Ii.
Definition: matrix.h:142
#define J22
Definition: types.h:439
#define J33_21
Definition: types.h:652
double * a
Inclusion semiaxes&#39; dimensions in global arrangement.
Definition: inclusion.h:76
double ddJi[27]
Second derivatives of elliptic integral Ii.
Definition: matrix.h:144
#define _1211_
Definition: types.h:336
#define _3323_
Definition: types.h:333
#define J21_2
Definition: types.h:481
#define _errorr(_1)
Definition: gelib.h:160
double la
Lambda parameter of a point (this is not the Lame lambda !!!).
Definition: matrix.h:140
#define _2312_
Definition: types.h:346
#define J22_33
Definition: types.h:606
#define J22_31
Definition: types.h:604
void giveEshelbyFieldsOfOnePoint(Point *point, int lc, int nlc, bool disp, bool strn)
Function gives the &#39;Eshelby&#39; STRAIN and DISPLACEMENT field in an arbitrary EXTERNAL point for given l...
Definition: esuf.cpp:162
static double epsilon
Definition: meso2d.cpp:172
#define _2211_
Definition: types.h:322
#define J22_1
Definition: types.h:469
#define J13_3
Definition: types.h:492
#define J1
Definition: types.h:430
#define J23_32
Definition: types.h:618
#define _1333_
Definition: types.h:352
double dJij[27]
First derivatives of elliptic integral Iij.
Definition: matrix.h:143
#define J33_32
Definition: types.h:657
#define J32_3
Definition: types.h:499
void giveDisplacementPerturbTensor_EXTpoint(Point *point)
Function gives the Displacement perturbation tensor of a EXTERNAL point with respect to owner inclusi...
Definition: esuf.cpp:910
#define J11_31
Definition: types.h:552
#define _1312_
Definition: types.h:353
#define J11_1
Definition: types.h:464
#define _322_
Definition: types.h:376
virtual void giveEllipticIntegrals(double integrArray[13], double lambda, bool intpoint)=0
Function gives the values of Ferers-Dyson&#39;s elliptic integrals of the inclusion this->I.
#define _3311_
Definition: types.h:329
#define J21
Definition: types.h:438
#define J23_31
Definition: types.h:617
InclusionGeometry shape
inclusion shape
Definition: inclusion.h:71
#define _211_
Definition: types.h:368
#define J22_11
Definition: types.h:596
#define J2_2
Definition: types.h:456
#define J33_31
Definition: types.h:656
#define J1_33
Definition: types.h:515
#define J3_21
Definition: types.h:535
#define J2_22
Definition: types.h:523
#define J32_2
Definition: types.h:486
#define J12
Definition: types.h:435
#define _213_
Definition: types.h:373
double eInt[13]
Elliptic potentials of a point.
Definition: matrix.h:141
#define _Int21_
Definition: types.h:410
double multTRN
1./mult
Definition: esuf.h:57
#define _Int31_
Definition: types.h:414
#define _Int33_
Definition: types.h:416
#define _2313_
Definition: types.h:348
#define J11_21
Definition: types.h:548
#define _3333_
Definition: types.h:331
#define J1_21
Definition: types.h:509
#define J13_1
Definition: types.h:466
#define J2_32
Definition: types.h:527
#define J3_22
Definition: types.h:536
#define J13_31
Definition: types.h:578
#define _1311_
Definition: types.h:350
double nu(void) const
Definition: matrix.h:107
#define _1133_
Definition: types.h:317
#define J3_1
Definition: types.h:459
#define J22_2
Definition: types.h:482
#define _Int11_
Definition: types.h:406
#define _111_
Definition: types.h:361
#define J1_3
Definition: types.h:453
#define _323_
Definition: types.h:379
#define J23_1
Definition: types.h:470
#define _311_
Definition: types.h:375
#define _313_
Definition: types.h:380
#define J33_3
Definition: types.h:500
#define _333_
Definition: types.h:377
virtual double eshelbyTensCompUniformField(const double sort_a[3], const double eSInt[13], double nu, EshelbyTensComponent flag)
Definition: esuf.cpp:246
#define X3
Definition: esuf.cpp:48
#define _1313_
Definition: types.h:355
virtual void giveEshelbyTensorInverse(double SInv[12], const double S[12])
Function gives the inverse of the Eshelby tensor of an inclusion of arbitrary shape.
Definition: esuf.cpp:348
#define J11_11
Definition: types.h:544
#define J23
Definition: types.h:440
Class Problem.
#define J23_11
Definition: types.h:609
#define _1233_
Definition: types.h:338
void transformCoords_G2L(const double *glob, double *loc) const
Function transforms (shift according to origin and rotate) global coordinates to local.
Definition: inclusion.cpp:358
const InclusionRecord3D * I
Definition: esuf.h:49
#define _223_
Definition: types.h:372
MatrixRecord * matrix
matrix record
Definition: problem.h:187
#define _2323_
Definition: types.h:347
Namespace TransformTensors.
#define _1112_
Definition: types.h:318
#define _3312_
Definition: types.h:332
#define J1_22
Definition: types.h:510