53 if (
I->
a[0] !=
I->
a[1])
_errorr(
"Values of semiaxes do not fit the condition for oblate spheroid (a1 = a2). " );
54 if (
I->
a[0] <=
I->
a[2])
_errorr(
"Values of semiaxes do not fit the condition for oblate spheroid (a1 > a3)." );
62 J[1] = this->
I1(a1, a3, lambda, intpoint);
63 J[2] = this->
I2(J[1]);
64 J[3] = this->
I3(a1, a3, J[1], lambda, intpoint);
67 J[6] = this->
I13(a1, a3, J[1], J[3]);
68 J[5] = this->
I12(a1, a3, J[6], lambda, intpoint);
69 J[4] = this->
I11(J[5]);
72 J[8] = this->
I22(J[5]);
73 J[9] = this->
I23(J[6]);
77 J[12] = this->
I33(a1, a3, J[6], lambda, intpoint);
91 if (intpoint)
_errorr(
"derivatives are 0, this function should not be called");
102 const int NUM_ELLIP_INT = 13;
108 for (
int i = 0; i < 3; i++)
112 point->
dJi[3*i] = (J_pert[
_Xp_][i+1] - J_pert[
_Xm_][i+1]) / (2.0 * ndiff);
113 point->
dJi[3*i+1] = (J_pert[
_Yp_][i+1] - J_pert[
_Ym_][i+1]) / (2.0 * ndiff);
114 point->
dJi[3*i+2] = (J_pert[
_Zp_][i+1] - J_pert[
_Zm_][i+1]) / (2.0 * ndiff);
118 point->
ddJi[9*i] = (J_pert[
_Xp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Xm_][i+1]) / (ndiff * ndiff);
122 point->
ddJi[9*i+3] = point->
ddJi[9*i+1];
123 point->
ddJi[9*i+4] = (J_pert[
_Yp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Ym_][i+1]) / (ndiff * ndiff);
126 point->
ddJi[9*i+6] = point->
ddJi[9*i+2];
127 point->
ddJi[9*i+7] = point->
ddJi[9*i+5];
128 point->
ddJi[9*i+8] = (J_pert[
_Zp_][i+1] - 2.0 * J_pert[
_CENTER_][i+1] + J_pert[
_Zm_][i+1]) / (ndiff * ndiff);
132 for (
int i = 0; i < 9; i++)
136 point->
dJij[i] = (J_pert[
_Xp_][i+4] - J_pert[
_Xm_][i+4]) / (2.0 * ndiff);
137 point->
dJij[i+9] = (J_pert[
_Yp_][i+4] - J_pert[
_Ym_][i+4]) / (2.0 * ndiff);
138 point->
dJij[i+18] = (J_pert[
_Zp_][i+4] - J_pert[
_Zm_][i+4]) / (2.0 * ndiff);
142 point->
ddJij[9*i] = (J_pert[
_Xp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Xm_][i+4]) / (ndiff * ndiff);
147 point->
ddJij[9*i+4] = (J_pert[
_Yp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Ym_][i+4]) / (ndiff * ndiff);
152 point->
ddJij[9*i+8] = (J_pert[
_Zp_][i+4] - 2.0 * J_pert[
_CENTER_][i+4] + J_pert[
_Zm_][i+4]) / (ndiff * ndiff);
164 double a1 = a[0], a3 = a[2];
167 return( mult * ellInt.
ellf( Theta, k ) / sqrt(
SQR( a1 ) -
SQR( a3 ) ) );
177 return 2.0 *
PI *
SQR(a1) * a3 / pow(
SQR(a1) -
SQR(a3), 3.0 / 2.0) * (acos(a3 / a1) - a3 / a1 * sqrt(1.0 -
SQR(a3 / a1)));
182 double b =
get_b(a1, a3, lambda);
183 double d =
get_d(a1, a3, lambda);
184 return 2.0 *
PI *
SQR(a1) * a3 / pow(
SQR(a1) -
SQR(a3), 3.0 / 2.0) * (acos(b) - b * d);
208 double b =
get_b(a1, a3, lambda);
209 double d =
get_d(a1, a3, lambda);
210 return _4PI_ *
SQR(a1) * a3 * (d / b - acos(b)) / pow(
SQR(a1) -
SQR(a3), 3.0 / 2.0);
229 return PI /
SQR(a1) - I13 / 4.0;
235 return 1.0 / 4.0 * (
_4PI_ *
SQR(a1) * a3 / (
SQR(a1) + lambda) / delta_lambda - I13);
244 return (I1 - I3)/(
SQR(a3) -
SQR(a1));
275 return 1.0 / 3.0 * (
_4PI_ *
SQR(a1) * a3 / (
SQR(a3) + lambda) / delta_lambda - 2.0 * I13);
282 return sqrt((
SQR(a3) + lambda) / (
SQR(a1) + lambda));
288 return sqrt((
SQR(a1) -
SQR(a3)) / (
SQR(a1) + lambda));
294 return sqrt((
SQR(a1) + lambda) * (
SQR(a1) + lambda) * (
SQR(a3) + lambda));
308 return (-b + sqrt(
SQR(b) - 4.0 * c)) / 2.0;
void giveDerivativesOfEllipticIntegrals(Point *point, bool intpoint)
Function gives the values of Ferers-Dyson's elliptic integral derivatives of the inclusion this->I...
double loc_x[3]
Local coordinates of a point.
double I1(double a1, double a3, double lambda, bool intpoint)
double I13(double a1, double a3, double I1, double I3)
Class legendreIntegrals provides functions calculating values of elliptical integrals.
const InclusionRecord3D * I
static double ellf(double phi, double ak)
Function calculating the Legendre's integral of the first kind - numerical recepies.
double I12(double a1, double a3, double I13, double lambda, bool intpoint)
The header file of usefull macros.
double get_b(double a1, double a3, double lambda)
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...
Class eshelbySoluEllipticIntegralsOblateSpheroid.
double ddJij[81]
Second derivatives of elliptic integral Iij.
Single Point data structure - contribution from Single inclusion.
double I3(double a1, double a3, double I1, double lambda, bool intpoint)
double get_d(double a1, double a3, double lambda)
double get_delta_lambda(double a1, double a3, double lambda)
double ndiff_1
derivative step for the first derivations
Class inclusion contains and handles all inclusion data.
double dJi[9]
First derivatives of elliptic integral Ii.
double * a
Inclusion semiaxes' dimensions in global arrangement.
double ddJi[27]
Second derivatives of elliptic integral Ii.
double dJij[27]
First derivatives of elliptic integral Iij.
double getLambda(const double a[3], double x1, double x2, double x3)
Returns lambda for a given point (x1, x2, x3)
double eI(double a[3], double k, double Theta, double mult)
double I33(double a1, double a3, double I13, double lambda, bool intpoint)
void giveEllipticIntegrals(double J[13], double lambda, bool intpoint)
Function gives the values of Ferers-Dyson's elliptic integrals of the inclusion this->I.