55 J[1] = J[2] = J[3] = 4.0 *
PI / 3.0;
56 J[4] = J[5] = J[6] = J[7] = J[8] = J[9] = J[10] = J[11] = J[12] = 4.0 *
PI / 5.0 /
SQR(a0);
60 J[1] = J[2] = J[3] = 4.0 *
PI * a0*a0*a0 / 3.0 / pow(a0*a0 + lambda, 3.0 / 2.0);
61 J[4] = J[5] = J[6] = J[7] = J[8] = J[9] = J[10] = J[11] = J[12] = 4.0 *
PI * a0*a0*a0 / 5.0 / pow(a0*a0 + lambda, 5.0 / 2.0);
179 if (intpoint)
_errorr(
"derivatives are 0, this function should not be called");
185 double aa =
SQR( a0 ), mult = 4. *
PI * aa * a0, xx = 0., aux_x = 0.,
186 n_x[5] = { 0., 0., 0., 0., 0. };
193 n_x[0] = aux_x; n_x[1] = n_x[0] * xx; n_x[2] = n_x[1] * xx; n_x[3] = n_x[2] * xx; n_x[4] = n_x[3] * xx;
202 std::complex<double> cdJi[13], cdJij[27];
214 for(
int i = 0; i < 13; i++ ) point->
dJi[i] = real( cdJi[i] );
215 for(
int i = 0; i < 27; i++ ) point->
dJij[i] = real( cdJij[i] );
224 const int NUM_ELLIP_INT = 13;
230 for (
int i = 0; i < 3; i++)
234 point->
dJi[3*i] = (J_pert[
_Xp_][i+1] - J_pert[
_Xm_][i+1]) / (2.0 * ndiff);
235 point->
dJi[3*i+1] = (J_pert[
_Yp_][i+1] - J_pert[
_Ym_][i+1]) / (2.0 * ndiff);
236 point->
dJi[3*i+2] = (J_pert[
_Zp_][i+1] - J_pert[
_Zm_][i+1]) / (2.0 * ndiff);
240 point->
ddJi[9*i] = (J_pert[
_Xp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Xm_][i+1]) / (ndiff * ndiff);
244 point->
ddJi[9*i+3] = point->
ddJi[9*i+1];
245 point->
ddJi[9*i+4] = (J_pert[
_Yp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Ym_][i+1]) / (ndiff * ndiff);
248 point->
ddJi[9*i+6] = point->
ddJi[9*i+2];
249 point->
ddJi[9*i+7] = point->
ddJi[9*i+5];
250 point->
ddJi[9*i+8] = (J_pert[
_Zp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Zm_][i+1]) / (ndiff * ndiff);
254 for (
int i = 0; i < 9; i++)
258 point->
dJij[i] = (J_pert[
_Xp_][i+4] - J_pert[
_Xm_][i+4]) / (2.0 * ndiff);
259 point->
dJij[i+9] = (J_pert[
_Yp_][i+4] - J_pert[
_Ym_][i+4]) / (2.0 * ndiff);
260 point->
dJij[i+18] = (J_pert[
_Zp_][i+4] - J_pert[
_Zm_][i+4]) / (2.0 * ndiff);
264 point->
ddJij[9*i] = (J_pert[
_Xp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Xm_][i+4]) / (ndiff * ndiff);
269 point->
ddJij[9*i+4] = (J_pert[
_Yp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Ym_][i+4]) / (ndiff * ndiff);
274 point->
ddJij[9*i+8] = (J_pert[
_Zp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Zm_][i+4]) / (ndiff * ndiff);
291 _errorr(
"Invalid type of differentiation.\n");
321 int dir = direction - 1;
323 return( -mult * x[dir]/norm_x[2] );
340 int dir_1 = direction_1 - 1, dir_2 = direction_2 - 1;
341 double aux = 5. * mult * x[dir_1] * x[dir_2]/norm_x[3];
343 return ( dir_1 != dir_2 )? aux : ( aux - mult/norm_x[2] );
358 int dir = direction - 1;
360 return( -mult * x[dir]/norm_x[3] );
376 int dir_1 = direction_1 - 1, dir_2 = direction_2 - 1;
377 double aux = 7. * mult * x[dir_1] * x[dir_2]/norm_x[4];
379 return ( dir_1 != dir_2 )? aux : ( aux - mult/norm_x[3] );
396 dJi[0] = dJi[3] = dJi[6] = this->
Ii_i( mult, norm_x, x,
_x1_ );
398 dJi[1] = dJi[4] = dJi[7] = this->
Ii_i( mult, norm_x, x,
_x2_ );
400 dJi[2] = dJi[5] = dJi[8] = this->
Ii_i( mult, norm_x, x,
_x3_ );
418 dJij[0] = dJij[1] = dJij[2] = this->
Iij_i( mult, norm_x, x,
_x1_ );
419 dJij[3] = dJij[4] = dJij[5] = dJij[0];
420 dJij[6] = dJij[7] = dJij[8] = dJij[0];
422 dJij[9] = dJij[10] = dJij[11] = this->
Iij_i( mult, norm_x, x,
_x2_ );
423 dJij[12] = dJij[13] = dJij[14] = dJij[9];
424 dJij[15] = dJij[16] = dJij[17] = dJij[9];
426 dJij[18] = dJij[19] = dJij[20] = this->
Iij_i( mult, norm_x, x,
_x3_ );
427 dJij[21] = dJij[22] = dJij[23] = dJij[18];
428 dJij[24] = dJij[25] = dJij[26] = dJij[18];
459 ddJi[9] = ddJi[18] = ddJi[0];
460 ddJi[10] = ddJi[19] = ddJi[1];
461 ddJi[11] = ddJi[20] = ddJi[2];
463 ddJi[12] = ddJi[21] = ddJi[3];
464 ddJi[13] = ddJi[22] = ddJi[4];
465 ddJi[14] = ddJi[23] = ddJi[5];
467 ddJi[15] = ddJi[24] = ddJi[6];
468 ddJi[16] = ddJi[25] = ddJi[7];
469 ddJi[17] = ddJi[26] = ddJi[8];
502 for(
int i = 1; i < 9; i++ ){
505 ddJij[j + 1] = ddJij[1];
506 ddJij[j + 2] = ddJij[2];
508 ddJij[j + 3] = ddJij[3];
509 ddJij[j + 4] = ddJij[4];
510 ddJij[j + 5] = ddJij[5];
512 ddJij[j + 6] = ddJij[6];
513 ddJij[j + 7] = ddJij[7];
514 ddJij[j + 8] = ddJij[8];
536 int dir = direction - 1;
537 std::complex<double> cn2 =
SQR(x[0]) +
SQR(x[1]) +
SQR(x[2]);
539 return( -mult * x[dir]/pow( cn2, 2.5 ) );
554 int dir = direction - 1;
555 std::complex<double> cn2 =
SQR(x[0]) +
SQR(x[1]) +
SQR(x[2]);
557 return( -mult * x[dir]/pow( cn2, 3.5 ) );
571 std::complex<double> cx[3] = { x[0], x[1], x[2] };
578 dJi[1] = dJi[4] = this->
cIi_i( mult, cx,
_x2_ );
583 dJi[2] = dJi[5] = dJi[8] = this->
cIi_i( mult, cx,
_x3_ );
599 std::complex<double> cx[3] = { x[0], x[1], x[2] };
612 dJij[3] = dJij[4] = dJij[5] = dJij[0];
613 dJij[6] = dJij[7] = dJij[8] = dJij[0];
616 dJij[12] = dJij[13] = dJij[14] = dJij[9];
617 dJij[15] = dJij[16] = dJij[17] = dJij[9];
619 dJij[19] = dJij[20] = dJij[18];
620 dJij[21] = dJij[22] = dJij[23] = dJij[18];
621 dJij[24] = dJij[25] = dJij[26] = dJij[18];
635 if( direction ==
_x1_ ){
640 else if( direction ==
_x2_ ){
645 else if( direction ==
_x3_ ){
651 _errorr(
"update_cx: Invalid derivative direction");
668 ddJi[0] = std::imag( dJi[0] ) /
_DIFF_H_;
669 ddJi[1] = std::imag( dJi[3] ) /
_DIFF_H_;
670 ddJi[2] = std::imag( dJi[6] ) /
_DIFF_H_;
673 ddJi[4] = std::imag( dJi[4] ) /
_DIFF_H_;
674 ddJi[5] = std::imag( dJi[7] ) /
_DIFF_H_;
678 ddJi[8] = std::imag( dJi[8] ) /
_DIFF_H_;
681 ddJi[9] = ddJi[18] = ddJi[0];
682 ddJi[10] = ddJi[19] = ddJi[1];
683 ddJi[11] = ddJi[20] = ddJi[2];
685 ddJi[12] = ddJi[21] = ddJi[3];
686 ddJi[13] = ddJi[22] = ddJi[4];
687 ddJi[14] = ddJi[23] = ddJi[5];
689 ddJi[15] = ddJi[24] = ddJi[6];
690 ddJi[16] = ddJi[25] = ddJi[7];
691 ddJi[17] = ddJi[26] = ddJi[8];
709 ddJij[0] = std::imag( dJij[0] ) /
_DIFF_H_;
710 ddJij[1] = std::imag( dJij[1] ) /
_DIFF_H_;
711 ddJij[2] = std::imag( dJij[2] ) /
_DIFF_H_;
714 ddJij[4] = std::imag( dJij[9] ) /
_DIFF_H_;
715 ddJij[5] = std::imag( dJij[10] ) /
_DIFF_H_;
719 ddJij[8] = std::imag( dJij[18] ) /
_DIFF_H_;;
722 for(
int i = 1; i < 9; i++ ){
725 ddJij[j + 1] = ddJij[1];
726 ddJij[j + 2] = ddJij[2];
728 ddJij[j + 3] = ddJij[3];
729 ddJij[j + 4] = ddJij[4];
730 ddJij[j + 5] = ddJij[5];
732 ddJij[j + 6] = ddJij[6];
733 ddJij[j + 7] = ddJij[7];
734 ddJij[j + 8] = ddJij[8];
std::complex< double > cIij_i(double mult, std::complex< double > x[3], derivativeDirection direction)
double loc_x[3]
Local coordinates of a point.
void give_cdIij(std::complex< double > dJij[13], double mult, double x[3])
const Problem * P
problem description
double Iij_i(double mult, double norm_x[5], double x[3], derivativeDirection direction)
const InclusionRecord3D * I
double Iij_ij(double mult, double norm_x[5], double x[3], derivativeDirection direction_1, derivativeDirection direction_2)
void give_cddIi(double ddJi[27], std::complex< double > dJi[13])
void giveDerivativesOfEllipticIntegrals(Point *point, bool intpoint)
Function gives the values of Ferers-Dyson's elliptic integral derivatives of the inclusion this->I...
Class eshelbySoluEllipticIntegrals.
The header file of usefull macros.
void getPerturbatedLambdas(double *lambdas, const double loc_x[3])
Helper function.
Collection of the functions of basic manipulations, some of them can be used instead of their counter...
double ddJij[81]
Second derivatives of elliptic integral Iij.
DiffTypes give_diffType(void) const
Give type of ...
Single Point data structure - contribution from Single inclusion.
double ndiff_1
derivative step for the first derivations
std::complex< double > cIi_i(double mult, std::complex< double > x[3], derivativeDirection direction)
void giveEllipticIntegrals(double J[13], double lambda, bool intpoint)
Function gives the values of Ferers-Dyson's elliptic integrals of the inclusion this->I.
double Ii_i(double mult, double norm_x[5], double x[3], derivativeDirection direction)
double dJi[9]
First derivatives of elliptic integral Ii.
void give_cdIi(std::complex< double > dJi[13], double mult, double x[3])
double * a
Inclusion semiaxes' dimensions in global arrangement.
double ddJi[27]
Second derivatives of elliptic integral Ii.
void give_cddIij(double ddJij[81], std::complex< double > dJij[27])
void give_dIij(double dJij[27], double mult, double norm_x[5], double x[3])
double getLambda(const double a[3], double x1, double x2, double x3)
Returns lambda for a given point (x1, x2, x3)
double dJij[27]
First derivatives of elliptic integral Iij.
void give_ddIi(double ddJi[27], double mult, double norm_x[5], double x[3])
double Ii_ij(double mult, double norm_x[5], double x[3], derivativeDirection direction_1, derivativeDirection direction_2)
void give_dIi(double dJi[13], double mult, double norm_x[5], double x[3])
Class eshelbySoluEllipticIntegralsSphere.
void give_ddIij(double ddJij[81], double mult, double norm_x[5], double x[3])
void update_cx(std::complex< double > cx[3], derivativeDirection direction)