93void Homogenize :: hashinShtrikmanWalpole(
FloatMatrix &PhaseMatrix)
98 double k, k_min, mu, mu_phase = 0., muMin, muMax;
101 PhaseMatrix1 = PhaseMatrix;
108 for (
int i = 0; i < numRows; i++ ) {
110 for (
int r = 0; r < numRows; r++ ) {
111 if ( PhaseMatrix1(r, 0) > 0. + 1.e-40 ) {
112 ENuToKMu(PhaseMatrix1(r, 1), PhaseMatrix1(r, 2), k, mu);
121 SortedPhaseMatrix(counter, 0) = PhaseMatrix1(phase, 0);
122 SortedPhaseMatrix(counter, 1) = k_min;
123 SortedPhaseMatrix(counter, 2) = mu_phase;
125 PhaseMatrix1(phase, 0) = 0.;
133 for (
int i = 0; i < numRows; i++ ) {
134 if ( SortedPhaseMatrix(i, 2) > muMax ) {
135 muMax = SortedPhaseMatrix(i, 2);
138 if ( SortedPhaseMatrix(i, 2) < muMin ) {
139 muMin = SortedPhaseMatrix(i, 2);
146 for (
int i = 0; i < numRows; i++ ) {
147 k_hmg += SortedPhaseMatrix(i, 0) / ( SortedPhaseMatrix(i, 1) + 4. / 3. * muMin );
148 k_hmg_2 += SortedPhaseMatrix(i, 0) / ( SortedPhaseMatrix(i, 1) + 4. / 3. * muMax );
152 k_hmg -= 4. / 3. * muMin;
157 mu_hmg =
gamma( SortedPhaseMatrix,
zeta(SortedPhaseMatrix(0, 1), muMin) );
158 mu_hmg_2 =
gamma( SortedPhaseMatrix,
zeta(SortedPhaseMatrix(numRows - 1, 1), muMax) );
174void Homogenize :: moriTanaka(
FloatMatrix &PhaseMatrix,
int refRow)
176 double f_r, E_r, nu_r, k_r, mu_r;
177 double E_m, nu_m, k_m, mu_m;
179 double nom_k_MT = 0., denom_k_MT = 0., nom_mu_MT = 0., denom_mu_MT = 0.;
180 double k_S_denom = 0., mu_S_denom = 0.;
181 double alpha_m, beta_m;
188 E_m = PhaseMatrix(refRow, 1);
189 nu_m = PhaseMatrix(refRow, 2);
194 alpha_m = 3. * k_m / ( 3. * k_m + 4 * mu_m );
195 beta_m = 6. * ( k_m + 2. * mu_m ) / ( 5. * ( 3. * k_m + 4. * mu_m ) );
198 for (
int r = 0; r < numRows; r++ ) {
199 f_r = PhaseMatrix(r, 0);
200 E_r = PhaseMatrix(r, 1);
201 nu_r = PhaseMatrix(r, 2);
206 nom_k_MT += f_r * k_r / ( 1. + alpha_m * ( k_r / k_m - 1. ) );
207 denom_k_MT += f_r / ( 1. + alpha_m * ( k_r / k_m - 1. ) );
209 nom_mu_MT += f_r * mu_r / ( 1. + beta_m * ( mu_r / mu_m - 1. ) );
210 denom_mu_MT += f_r / ( 1. + beta_m * ( mu_r / mu_m - 1. ) );
212 k_S [ r ] = 1. / ( 1. + alpha_m * ( k_r / k_m - 1. ) );
213 mu_S [ r ] = 1. / ( 1. + beta_m * ( mu_r / mu_m - 1. ) );
217 k_hmg = nom_k_MT / denom_k_MT;
218 mu_hmg = nom_mu_MT / denom_mu_MT;
223 for (
int r = 0; r < numRows; r++ ) {
224 f_r = PhaseMatrix(r, 0);
225 E_r = PhaseMatrix(r, 1);
226 nu_r = PhaseMatrix(r, 2);
228 k_S_denom += f_r * 1. / ( 1. + alpha_m * ( k_r / k_m - 1. ) );
229 mu_S_denom += f_r * 1. / ( 1. + beta_m * ( mu_r / mu_m - 1. ) );
232 for (
int r = 0; r < numRows; r++ ) {
233 E_r = PhaseMatrix(r, 1);
234 nu_r = PhaseMatrix(r, 2);
237 k_S [ r ] /= k_S_denom;
238 mu_S [ r ] /= mu_S_denom;
245 double f_r, E_r, nu_r, k_r, mu_r;
246 double k_SCS, mu_SCS, nom_k_SCS, denom_k_SCS, nom_mu_SCS, denom_mu_SCS;
248 double alpha_m = 0., beta_m = 0.;
249 double k_S_denom = 0., mu_S_denom = 0.;
260 for (
int i = 1; i < 100; i++ ) {
266 for (
int r = 0; r < numRows; r++ ) {
267 f_r = PhaseMatrix(r, 0);
268 E_r = PhaseMatrix(r, 1);
269 nu_r = PhaseMatrix(r, 2);
275 alpha_m = 3. * k_SCS / ( 3. * k_SCS + 4 * mu_SCS );
276 beta_m = 6. * ( k_SCS + 2. * mu_SCS ) / ( 5. * ( 3. * k_SCS + 4. * mu_SCS ) );
278 nom_k_SCS += f_r * k_r / ( 1 + alpha_m * ( k_r / k_SCS - 1 ) );
279 denom_k_SCS += f_r / ( 1 + alpha_m * ( k_r / k_SCS - 1 ) );
281 nom_mu_SCS += f_r * mu_r / ( 1 + beta_m * ( mu_r / mu_SCS - 1 ) );
282 denom_mu_SCS += f_r / ( 1 + beta_m * ( mu_r / mu_SCS - 1 ) );
285 k_SCS = nom_k_SCS / denom_k_SCS;
286 mu_SCS = nom_mu_SCS / denom_mu_SCS;
295 for (
int r = 0; r < numRows; r++ ) {
296 f_r = PhaseMatrix(r, 0);
297 E_r = PhaseMatrix(r, 1);
298 nu_r = PhaseMatrix(r, 2);
300 k_S [ r ] = 1. / ( 1. + alpha_m * ( k_r /
k_hmg - 1. ) );
301 mu_S [ r ] = 1. / ( 1. + beta_m * ( mu_r /
mu_hmg - 1. ) );
302 k_S_denom += f_r * 1. / ( 1. + alpha_m * ( k_r /
k_hmg - 1. ) );
303 mu_S_denom += f_r * 1. / ( 1. + beta_m * ( mu_r /
mu_hmg - 1. ) );
306 for (
int r = 0; r < numRows; r++ ) {
307 E_r = PhaseMatrix(r, 1);
308 nu_r = PhaseMatrix(r, 2);
310 k_S [ r ] /= k_S_denom;
311 mu_S [ r ] /= mu_S_denom;
348 PhaseMatrix1(NumPhases - 1, 0) = 0.1;
349 PhaseMatrix1(NumPhases - 1, 1) = 10.;
350 PhaseMatrix1(NumPhases - 1, 2) = 0.3;
353 FloatArray r(NumPhases - 1), k(NumPhases), mu(NumPhases);
354 FloatArray Q11(NumPhases - 1), Q21(NumPhases - 1), F(NumPhases), G(NumPhases);
355 FloatMatrix J(2, 2), Jinv(2, 2),
N(2, 2), Nhelp(2, 2), Q(2, 2);
357 double lambda_0 = 0.735;
360 if ( NumPhases < 3 ) {
361 OOFEM_ERROR(
"Number of considered phases must be at least 3 (including hom. medium)");
364 F[NumPhases - 1] = lambda_0 / 3.;
368 for (
int i = 0; i < NumPhases - 1; i++ ) {
369 temp1 += PhaseMatrix1(i, 0);
370 r[i] = 1. *
cbrt(temp1);
374 for (
int i = 0; i < NumPhases; i++ ) {
375 ENuToKMu( PhaseMatrix1(i, 1), PhaseMatrix1(i, 2), k[i], mu[i] );
384 for (
int phi = 0; phi <= NumPhases - 2; phi++ ) {
386 fillJ(J, r[phi], mu, k, phi + 1);
389 fillJ(J, r[phi], mu, k, phi);
391 N.beProductOf(Jinv, J);
402 for (
int phi = 1; phi <= NumPhases - 1; phi++ ) {
403 F[phi] = F[NumPhases - 1] * Q11[phi - 1] / Q11[NumPhases - 2];
404 G[phi] = F[NumPhases - 1] * Q21[phi - 1] / Q11[NumPhases - 2];
410 for (
int phi = 1; phi <= NumPhases - 1; phi++ ) {
411 printf(
"r=%f displ(in)=%f displ(out)=%f\n", r[phi-1], F[phi-1]*r[phi-1]+G[phi-1]/(r[phi-1]*r[phi-1]), F[phi]*r[phi-1]+G[phi]/(r[phi-1]*r[phi-1]));
412 printf(
"r=%f stress(in)=%f stress(out)=%f\n", r[phi-1], 3.*k[phi-1]*F[phi-1]-4.*mu[phi-1]*G[phi-1]/(r[phi-1]*r[phi-1]*r[phi-1]), 3.*k[phi]*F[phi]-4.*mu[phi]*G[phi]/(r[phi-1]*r[phi-1]*r[phi-1]));
419 k_hmg = ( 3. * k[NumPhases - 2] * pow(r[NumPhases - 2], 3.) * Q11[NumPhases - 3] - 4. * mu[NumPhases - 2] * Q21[NumPhases - 3] ) / ( 3. * ( pow(r[NumPhases - 2], 3.) * Q11[NumPhases - 3] + Q21[NumPhases - 3] ) );
424 FloatArray B(NumPhases), C(NumPhases), D(NumPhases), A(NumPhases);
426 FloatMatrix L(4, 4), Linv(4, 4), M(4, 4), Mhelp(4, 4), Z(4, 4), M_test(4, 4);
427 std :: vector< FloatMatrix > P_arr(NumPhases);
430 double a, b, c, nu_n,
sqr = 0.;
434 A[NumPhases - 1] =
gamma;
438 Mhelp.beUnitMatrix();
441 for (
int phi = 0; phi < NumPhases - 1; phi++ ) {
443 fillL(L, r[phi], mu, k, phi + 1);
447 fillL(L, r[phi], mu, k, phi);
449 M.beProductOf(Linv, L);
453 this part calculate inverse of M directly
454 M=M_test so the L, Linv and M assembly are OK
456 double ak, bk, ck, dk, ek, fk, alphak, nuk, nukp1, koef;
458 nuk=PhaseMatrix1(phi,2);
459 nukp1=PhaseMatrix1(phi+1,2);
461 ak=mu[phi]/mu[phi+1]*(7.+5.*nuk)*(7.-10.*nukp1)-(7.-10*nuk)*(7.+5.*nukp1);
462 bk=4.*(7.-10.*nuk)+mu[phi]/mu[phi+1]*(7.+5.*nuk);
463 ck=(7.-5.*nukp1)+2.*mu[phi]/mu[phi+1]*(4.-5.*nukp1);
464 dk=(7.+5.*nukp1)+4.*mu[phi]/mu[phi+1]*(7.-10.*nukp1);
465 ek=2*(4.-5.*nuk)+mu[phi]/mu[phi+1]*(7.-5.*nuk);
466 fk=(4.-5.*nuk)*(7.-5.*nukp1)-mu[phi]/mu[phi+1]*(4.-5.*nukp1)*(7.-5.*nuk);
467 alphak=mu[phi]/mu[phi+1]-1.;
468 koef=1./(5.*(1-nukp1));
470 M_test(0,0)=koef*ck/3.;
471 M_test(0,1)=koef*pow(r[phi],2)*(3*bk-7*ck)/(5.*(1.-2*nuk));
472 M_test(0,2)=koef*(-12.)*alphak/pow(r[phi],5);
473 M_test(0,3)=koef*4.*(fk-27.*alphak)/(15.*(1.-2*nuk)*pow(r[phi],3));
476 M_test(1,1)=koef*(1.-2*nukp1)*bk/(7.*(1.-2.*nuk));
477 M_test(1,2)=koef*(-20.)*(1.-2.*nukp1)*alphak/(7*pow(r[phi],7));
478 M_test(1,3)=koef*(-12.)*alphak*(1.-2.*nukp1)/(7.*(1.-2.*nuk)*(pow(r[phi],5)));
480 M_test(2,0)=koef*pow(r[phi],5)*alphak/2.;
481 M_test(2,1)=koef*(-pow(r[phi],7))*(2*ak+147*alphak)/(70.*(1.-2.*nuk));
482 M_test(2,2)=koef*dk/7.;
483 M_test(2,3)=koef*pow(r[phi],2)*(105*(1.-nukp1)+12.*alphak*(7.-10.*nukp1)-7.*ek)/(35.*(1.-2*nuk));
485 M_test(3,0)=koef*(-5.)/6.*(1.-2*nukp1)*alphak*pow(r[phi],3);
486 M_test(3,1)=koef*7.*(1.-2*nukp1)*alphak*pow(r[phi],5)/(2.*(1.-2.*nuk));
488 M_test(3,3)=koef*ek*(1.-2.*nukp1)/(3.*(1.-2*nuk));
492 P_arr [ phi ].
resize(4, 4);
493 P_arr [ phi ].beProductOf(M, Mhelp);
494 Mhelp = P_arr [ phi ];
501 P_v[0] = P_arr [ NumPhases - 2 ](1, 1);
502 P_v[1] = -P_arr [ NumPhases - 2 ](1, 0);
503 P_v[2] = P_v[3] = 0.;
505 for (
int phi = 1; phi <= NumPhases - 1; phi++ ) {
507 Phelp.
times( A[NumPhases - 1] / sqrt(2.) / ( P_arr [ NumPhases - 2 ](0, 0) * P_arr [ NumPhases - 2 ](1, 1) - P_arr [ NumPhases - 2 ](0, 1) * P_arr [ NumPhases - 2 ](1, 0) ) );
517 for (
int phi = 0; phi <= NumPhases - 2; phi++ ) {
519 fillL(L, r[phi], mu, k, phi);
527 fillL(L, r[phi], mu, k, phi + 1);
528 Phelp[0] = A[phi + 1];
529 Phelp[1] = B[phi + 1];
530 Phelp[2] = C[phi + 1];
531 Phelp[3] = D[phi + 1];
537 for (
int i = 0; i <= 3; i++ ) {
538 for (
int j = 0; j <= 3; j++ ) {
539 Z(i, j) = P_arr [ NumPhases - 3 ](i, 0) * P_arr [ NumPhases - 3 ](j, 1) - P_arr [ NumPhases - 3 ](j, 0) * P_arr [ NumPhases - 3 ](i, 1);
544 nu_n = ( 3. * k[NumPhases - 2] - 2. * mu[NumPhases - 2] ) / ( 6. * k[NumPhases - 2] + 2. * mu[NumPhases - 2] );
546 a = 4. * pow(r[NumPhases - 2], 10.) * ( 1. - 2. * nu_n ) * ( 7. - 10. * nu_n ) * Z(0, 1) +
547 20. * pow(r[NumPhases - 2], 7.) * ( 7. - 12. * nu_n + 8. * nu_n * nu_n ) * Z(3, 1) +
548 12. * pow(r[NumPhases - 2], 5.) * ( 1. - 2. * nu_n ) * ( Z(0, 3) - 7. * Z(1, 2) ) +
549 20. * pow(r[NumPhases - 2], 3.) * ( 1. - 2. * nu_n ) * ( 1. - 2. * nu_n ) * Z(0, 2) +
550 16. * ( 4. - 5. * nu_n ) * ( 1. - 2. * nu_n ) * Z(3, 2);
552 b = 3. * pow(r[NumPhases - 2], 10.) * ( 1. - 2. * nu_n ) * ( 15. * nu_n - 7. ) * Z(0, 1) +
553 60. * pow(r[NumPhases - 2], 7.) * ( nu_n - 3. ) * nu_n * Z(3, 1) -
554 24. * pow(r[NumPhases - 2], 5.) * ( 1. - 2. * nu_n ) * ( Z(0, 3) - 7. * Z(1, 2) ) -
555 40. * pow(r[NumPhases - 2], 3.) * ( 1. - 2. * nu_n ) * ( 1. - 2. * nu_n ) * Z(0, 2) -
556 8. * ( 1. - 5. * nu_n ) * ( 1. - 2. * nu_n ) * Z(3, 2);
558 c = -pow(r[NumPhases - 2], 10.) * ( 1. - 2. * nu_n ) * ( 7. + 5 * nu_n ) * Z(0, 1) +
559 10. * pow(r[NumPhases - 2], 7.) * ( 7. - nu_n * nu_n ) * Z(3, 1) +
560 12. * pow(r[NumPhases - 2], 5.) * ( 1. - 2. * nu_n ) * ( Z(0, 3) - 7. * Z(1, 2) ) +
561 20. * pow(r[NumPhases - 2], 3.) * ( 1. - 2. * nu_n ) * ( 1. - 2. * nu_n ) * Z(0, 2) -
562 8. * ( 7. - 5. * nu_n ) * ( 1. - 2. * nu_n ) * Z(3, 2);
565 sqr = b * b - 4. * a * c;
567 OOFEM_ERROR(
"Shear modulus does not yield a real number");
570 if ( ( -b - pow(
sqr, 0.5) ) >= 0 ) {
571 OOFEM_WARNING(
"Two solutions for the shear modulus were found, continuing with the higher value");
575 mu_hmg = mu[NumPhases - 2] * ( -b + pow(
sqr, 0.5) ) / ( 2. * a );