69 double r2 = r[0]*r[0]+r[1]*r[1]+r[2]*r[2];
71 if(r2<minimumR*minimumR)
78 return IMF[component];
87 const double r1 =
sqrt(r2);
88 const double r5 = (r2*r2*r1);
89 const double rdotq=
q[0]*r[0] +
q[1]*r[1] +
q[2]*r[2];
90 const double B=( 3*r[component]*rdotq-
q[component]*r2)/r5;
92 if((derivative == 0) && (r[0] <=
xlimit[0])) {
97 if((derivative == 1) && (r[0] <=
xlimit[0])){
99 unsigned int sameComponent;
100 if(dcomponent==component) {
108 return -5*B*r[dcomponent]/r2+
109 (3*
q[dcomponent]*r[component] -
110 2*
q[component]*r[dcomponent] +
111 3*rdotq*sameComponent)/r5;
120 A[0] = (
q[1]*r[2]-
q[2]*r[1]) / (r2*r1);
121 A[1] = (
q[2]*r[0]-
q[0]*r[2]) / (r2*r1);
122 A[2] = (
q[0]*r[1]-
q[1]*r[0]) / (r2*r1);
125 IMFA[0] = 0.5*(
IMF[1]*r[2] -
IMF[2]*r[1]);
126 IMFA[1] = 0.5*(
IMF[2]*r[0] -
IMF[0]*r[2]);
127 IMFA[2] = 0.5*(
IMF[0]*r[1] -
IMF[1]*r[0]);
128 const double IMFB =
IMF[component];
132 const double ss = s*s;
134 const double S2 = 6.*ss*ss*s - 15.*ss*ss + 10.*ss*s;
135 const double dS2dx = -(30.*ss*ss - 60.*ss*s + 30.*ss)/(
xlimit[1]-
xlimit[0]);
139 const double IMFss = IMFs*IMFs;
141 const double IMFS2 = 6.*IMFss*IMFss*IMFs - 15.*IMFss*IMFss + 10.*IMFss*IMFs;
142 const double IMFdS2dx = (30.*IMFss*IMFss - 60.*IMFss*IMFs + 30.*IMFss)/(
xlimit[1]-
xlimit[0]);
151 double IMFdS2cart[3];
152 IMFdS2cart[0] = IMFdS2dx;
156 if(derivative == 0) {
189 double delS2crossA[3];
195 delS2crossA[1] = -dS2cart[0]*A[2];
196 delS2crossA[2] = dS2cart[0]*A[1];
198 double IMFdelS2crossA[3];
200 IMFdelS2crossA[0] = 0;
201 IMFdelS2crossA[1] = -IMFdS2cart[0]*IMFA[2];
202 IMFdelS2crossA[2] = IMFdS2cart[0]*IMFA[1];
205 return S2*B + delS2crossA[component] + IMFS2*IMFB + IMFdelS2crossA[component];
208 else if(derivative == 1) {
233 unsigned int sameComponent;
234 if(dcomponent==component) {
241 const double delB = -5*B*r[dcomponent]/r2+
242 (3*
q[dcomponent]*r[component] -
243 2*
q[component]*r[dcomponent] +
244 3*rdotq*sameComponent)/r5;
247 const double IMFdelB = 0.;
252 delAy[0] = (-3./(r2*r2*r1))*(
q[2]*r[0]-
q[0]*r[2])*r[0] +
q[2]/(r2*r1);
253 delAy[1] = (-3./(r2*r2*r1))*(
q[2]*r[0]-
q[0]*r[2])*r[1];
254 delAy[2] = (-3./(r2*r2*r1))*(
q[2]*r[0]-
q[0]*r[2])*r[2] -
q[0]/(r2*r1);
255 delAz[0] = (-3./(r2*r2*r1))*(
q[0]*r[1]-
q[1]*r[0])*r[0] -
q[1]/(r2*r1);
256 delAz[1] = (-3./(r2*r2*r1))*(
q[0]*r[1]-
q[1]*r[0])*r[1] +
q[0]/(r2*r1);
257 delAz[2] = (-3./(r2*r2*r1))*(
q[0]*r[1]-
q[1]*r[0])*r[2];
270 IMFdelAy[0] = 0.5*
IMF[2];
272 IMFdelAy[2] = -0.5*
IMF[0];
274 IMFdelAz[0] = -0.5*
IMF[1];
275 IMFdelAz[1] = 0.5*
IMF[0];
286 deldS2dx[0] = ddidS2dx;
318 double ddS2crossA[3][3];
320 ddS2crossA[0][0] = 0;
321 ddS2crossA[0][1] = 0;
322 ddS2crossA[0][2] = 0;
324 ddS2crossA[1][0] = - deldS2dx[0]*A[2] - dS2cart[0]*delAz[0];
325 ddS2crossA[1][1] = - deldS2dx[1]*A[2] - dS2cart[0]*delAz[1];
326 ddS2crossA[1][2] = - deldS2dx[2]*A[2] - dS2cart[0]*delAz[2];
328 ddS2crossA[2][0] = deldS2dx[0]*A[1] + dS2cart[0]*delAy[0];
329 ddS2crossA[2][1] = deldS2dx[1]*A[1] + dS2cart[0]*delAy[1];
330 ddS2crossA[2][2] = deldS2dx[2]*A[1] + dS2cart[0]*delAy[2];
334 double IMFddS2crossA[3][3];
336 IMFddS2crossA[0][0] = 0;
337 IMFddS2crossA[0][1] = 0;
338 IMFddS2crossA[0][2] = 0;
340 IMFddS2crossA[1][0] = - deldS2dx[0]*IMFA[2] - IMFdS2cart[0]*IMFdelAz[0];
341 IMFddS2crossA[1][1] = - deldS2dx[1]*IMFA[2] - IMFdS2cart[0]*IMFdelAz[1];
342 IMFddS2crossA[1][2] = - deldS2dx[2]*IMFA[2] - IMFdS2cart[0]*IMFdelAz[2];
344 IMFddS2crossA[2][0] = deldS2dx[0]*IMFA[1] + IMFdS2cart[0]*IMFdelAy[0];
345 IMFddS2crossA[2][1] = deldS2dx[1]*IMFA[1] + IMFdS2cart[0]*IMFdelAy[1];
346 IMFddS2crossA[2][2] = deldS2dx[2]*IMFA[1] + IMFdS2cart[0]*IMFdelAy[2];
349 return S2*delB + dS2cart[dcomponent]*B + ddS2crossA[component][dcomponent] +
350 IMFS2*IMFdelB + IMFdS2cart[dcomponent]*IMFB + IMFddS2crossA[component][dcomponent];
void initialize(const double moment, const double center_x, const double center_y, const double center_z, const double tilt_angle_phi, const double tilt_angle_theta, const double xlimit_f, const double xlimit_z, const double IMF_Bx, const double IMF_By, const double IMF_Bz)