26 const int CCZ4LapseType,
34 const double CCZ4itau,
42 const double CCZ4helper = (CCZ4SO==1)? 0.0 : 1.0;
45 const double alpha = std::fmax(1e-4,Q[16]);
56 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
57 const double det = Q[0]*Q[3]*Q[5] - Q[0]*Q[4]*Q[4] - Q[1]*Q[1]*Q[5] + 2*Q[1]*Q[2]*Q[4] -Q[2]*Q[2]*Q[3];
58 const double invdet = 1./det;
60 const double g_contr[3][3] = {
61 { ( Q[3]*Q[5]-Q[4]*Q[4])*invdet, -( Q[1]*Q[5]-Q[2]*Q[4])*invdet, -(-Q[1]*Q[4]+Q[2]*Q[3])*invdet},
62 {-( Q[1]*Q[5]-Q[4]*Q[2])*invdet, ( Q[0]*Q[5]-Q[2]*Q[2])*invdet, -( Q[0]*Q[4]-Q[2]*Q[1])*invdet},
63 {-(-Q[1]*Q[4]+Q[3]*Q[2])*invdet, -( Q[0]*Q[4]-Q[1]*Q[2])*invdet, ( Q[0]*Q[3]-Q[1]*Q[1])*invdet}
67 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
71 for (
int j=0;j<3;j++) traceA += g_contr[i][j]*Aex[i][j];
74 for (
int j=0;j<3;j++) Aex[i][j] -= 1./3. * traceA * g_cov[i][j];
77 double Amix[3][3]={0,0,0,0,0,0,0,0,0};
78 for (
int i = 0; i < 3; i++)
79 for (
int j = 0; j < 3; j++)
80 for (
int u = 0;
u < 3;
u++) Amix[i][j] += g_contr[i][
u] * Aex[
u][j];
81 double Aup[3][3]={0,0,0,0,0,0,0,0,0};
82 for (
int i = 0; i < 3; i++)
83 for (
int j = 0; j < 3; j++)
84 for (
int u = 0;
u < 3;
u++) Aup[i][j] += g_contr[i][
u] * Amix[j][
u];
86 const double Theta = Q[12];
88 const double DD[3][3][3] = {
89 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
90 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
91 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
94 double dgup[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
95 for (
int k = 0; k < 3; k++)
96 for (
int m = 0;
m < 3;
m++)
97 for (
int l = 0; l < 3; l++)
98 for (
int n = 0; n < 3; n++)
99 for (
int j = 0; j < 3; j++) dgup[k][
m][l] -= 2.0*g_contr[
m][n]*g_contr[j][l]*DD[k][n][j];
104 const double np = 1.0;
105 const double phi = std::fmax(1e-2,pow(Q[54],(1.0/np)));
106 const double phi2 = phi*phi;
107 const double chi = pow(phi,np);
109 const double PP[3] = {Q[55], Q[56], Q[57]};
194 double Christoffel_tilde[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
195 for (
int j = 0; j < 3; j++)
196 for (
int i = 0; i < 3; i++)
197 for (
int k = 0; k < 3; k++)
198 for (
int l = 0; l < 3; l++) Christoffel_tilde[i][j][k] += g_contr[k][l] * ( DD[i][j][l] + DD[j][i][l] - DD[l][i][j] );
200 double Christoffel_tilde_down[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
201 for (
int i = 0; i < 3; i++)
202 for (
int j = 0; j < 3; j++)
203 for (
int k = 0; k < 3; k++)
204 for (
int l = 0; l < 3; l++) Christoffel_tilde_down[i][j][k] += g_cov[i][l]*Christoffel_tilde[j][k][l];
206 double Gtilde[3] = {0,0,0};
207 for (
int l = 0; l < 3; l++)
208 for (
int j = 0; j < 3; j++)
209 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[j][l] * Christoffel_tilde[j][l][i];
211 const double Ghat[3] = {Q[13], Q[14], Q[15]};
213 double Z[3] = {0,0,0};
214 for (
int i=0;i<3;i++)
215 for (
int j=0;j<3;j++) Z[i] += 0.5*CCZ4ds*( g_cov[i][j]* (Ghat[j] - Gtilde[j]));
216 double Zup[3] = {0,0,0};
217 for (
int i=0;i<3;i++)
218 for (
int j=0;j<3;j++) Zup[i] += phi2 * g_contr[i][j] * Z[j];
220 double RicciPlusNablaZSrc[3][3] = {0,0,0,0,0,0,0,0,0};
221 #pragma clang loop unroll(disable)
222 for (
int i = 0; i < 3; i++)
223 #pragma clang loop unroll(disable)
224 for (
int j = 0; j < 3; j++)
226 RicciPlusNablaZSrc[i][j] -= (np-1.0)*PP[i]*PP[j]/(np*np*chi*chi);
227 for (
int k = 0; k < 3; k++)
229 RicciPlusNablaZSrc[i][j] += Ghat[k]*DD[k][i][j];
230 RicciPlusNablaZSrc[i][j] -= PP[k]*Christoffel_tilde[i][j][k]/(np*chi);
231 RicciPlusNablaZSrc[i][j] += 2.0*Zup[k]/(np*chi*phi2)*(g_cov[i][k]*PP[j]+g_cov[j][k]*PP[i]-g_cov[i][j]*PP[k]);
232 for (
int l = 0; l < 3; l++)
234 RicciPlusNablaZSrc[i][j] -= (np+1.0)*g_cov[i][j]*g_contr[k][l]*PP[k]*PP[l]/(np*np*chi*chi);
235 for (
int m = 0;
m < 3;
m++)
237 RicciPlusNablaZSrc[i][j] += g_contr[l][
m]*( Christoffel_tilde[l][i][k] * Christoffel_tilde_down[j][k][
m] +
238 Christoffel_tilde[l][j][k] * Christoffel_tilde_down[i][k][
m] +
239 Christoffel_tilde[i][
m][k] * Christoffel_tilde_down[k][l][j] );
240 RicciPlusNablaZSrc[i][j] -= g_cov[i][j]*g_contr[l][
m]*Christoffel_tilde[l][
m][k]*PP[k]/(np*chi);
249 double RPlusTwoNablaZSrc = 0;
250 for (
int i = 0; i < 3; i++)
251 for (
int j = 0; j < 3; j++) RPlusTwoNablaZSrc += g_contr[i][j]*RicciPlusNablaZSrc[i][j];
252 RPlusTwoNablaZSrc*=phi2;
254 const double AA[3] = {Q[23], Q[24], Q[25]};
256 double nablaijalphaSrc[3][3] = {0,0,0,0,0,0,0,0,0};
257 #pragma clang loop unroll(disable)
258 for (
int j = 0; j < 3; j++)
259 #pragma clang loop unroll(disable)
260 for (
int i = 0; i < 3; i++)
266 nablaijalphaSrc[i][j] += (PP[i]*AA[j] + PP[j]*AA[i])/(np*chi);
267 for (
int k = 0; k < 3; k++)
269 nablaijalphaSrc[i][j] -= Christoffel_tilde[i][j][k]*AA[k];
270 for (
int l = 0; l < 3; l++)
272 nablaijalphaSrc[i][j] -= g_cov[i][j]*g_contr[k][l]*PP[k]*AA[l]/(np*chi);
280 double nablanablaalphaSrc=0;
281 #pragma clang loop unroll(disable)
282 for (
int i = 0; i < 3; i++)
283 for (
int j = 0; j < 3; j++) nablanablaalphaSrc += g_contr[i][j]*nablaijalphaSrc[i][j];
284 nablanablaalphaSrc *= phi2;
300 double SecondOrderTermsSrc[3][3];
301 #pragma clang loop unroll(disable)
302 for (
int i = 0; i < 3; i++)
303 for (
int j = 0; j < 3; j++) SecondOrderTermsSrc[i][j] = -nablaijalphaSrc[i][j] + alpha*RicciPlusNablaZSrc[i][j];
306#pragma clang loop unroll(disable)
307 for (
int i = 0; i < 3; i++)
308 for (
int j = 0; j < 3; j++) traceSrc += g_contr[i][j]*SecondOrderTermsSrc[i][j];
310#pragma clang loop unroll(disable)
311 for (
int i = 0; i < 3; i++)
312 for (
int j = 0; j < 3; j++) SecondOrderTermsSrc[i][j] -= 1./3 * traceSrc * g_cov[i][j];
314 double dtgamma[3][3];
315#pragma clang loop unroll(disable)
316 for (
int i = 0; i < 3; i++)
317 for (
int j = 0; j < 3; j++) dtgamma[i][j] = -2.0 * alpha * Aex[i][j] - CCZ4itau*(det -1.0)*g_cov[i][j];
319 const double BB[3][3] = {
320 {Q[26], Q[27], Q[28]}, {Q[29], Q[30], Q[31]}, {Q[32], Q[33], Q[34]}
323 double traceB = BB[0][0] + BB[1][1] + BB[2][2];
324 const double beta[3] = {Q[17], Q[18], Q[19]};
326#pragma clang loop unroll(disable)
327 for (
int k = 0; k < 3; k++)
328 for (
int j = 0; j < 3; j++)
329 for (
int i = 0; i < 3; i++) dtgamma[i][j] += g_cov[k][i]*BB[j][k] + g_cov[k][j]*BB[i][k] - 2./3. *g_cov[i][j]*BB[k][k] + 2.*
beta[k]*DD[k][i][j];
332 double Atemp[3][3]={0,0,0,0,0,0,0,0,0};
333#pragma clang loop unroll(disable)
334 for (
int i = 0; i < 3; i++)
335 for (
int j = 0; j < 3; j++)
336 for (
int u = 0;
u < 3;
u++) Atemp[i][j] += Aex[i][
u] * Amix[
u][j];
338 const double traceK = Q[53];
342 #pragma clang loop unroll(disable)
343 for (
int i = 0; i < 3; i++)
344 for (
int j = 0; j < 3; j++) dtK[i][j] = phi2*SecondOrderTermsSrc[i][j] + alpha*Aex[i][j]*(traceK-2.*Theta*CCZ4c) - 2.*alpha*Atemp[i][j];
346#pragma clang loop unroll(disable)
347 for (
int j = 0; j < 3; j++)
348 for (
int i = 0; i < 3; i++)
349 for (
int k = 0; k < 3; k++) dtK[i][j] += Aex[k][i]*BB[j][k] + Aex[k][j]*BB[i][k] - 2./3.*Aex[i][j]*BB[k][k];
351 const double K0 = Q[58];
354 double dtTraceK = -nablanablaalphaSrc + alpha*(RPlusTwoNablaZSrc + traceK*traceK - 2.0*CCZ4c*Theta*traceK) - 3.0*alpha*CCZ4k1*(1.+CCZ4k2)*Theta/alpha;
357 double dtchi =
beta[0]*PP[0] +
beta[1]*PP[1] +
beta[2]*PP[2] + np/3.*(alpha*traceK-traceB)*chi;
360 double dtalpha = -alpha*alpha*fa*(traceK-K0-2.*CCZ4c*Theta)+
beta[0]*AA[0]+
beta[1]*AA[1]+
beta[2]*AA[2];
363 #pragma clang loop unroll(disable)
364 for (
int i = 0; i < 3; i++)
365 for (
int j = 0; j < 3; j++) Aupdown += Aex[i][j]*Aup[i][j];
367 double sumzupaa = 0.0;
368 for (
int i = 0; i < 3; i++) sumzupaa += Zup[i]*AA[i];
370 double dtTheta = 0.5*alpha*CCZ4e*CCZ4e*(RPlusTwoNablaZSrc - Aupdown + 2./3.*traceK*traceK) - alpha*(CCZ4c*Theta*traceK + sumzupaa/alpha + CCZ4k1*(2.+CCZ4k2)*Theta/alpha);
372 double dtGhat[3] = {0,0,0};
373 #pragma clang loop unroll(disable)
374 for (
int i = 0; i < 3; i++)
376 double temp1=0, temp2=0, temp3=0, temp4=0, temp5=0, temp6=0;
377 #pragma clang loop unroll(disable)
378 for (
int m = 0;
m < 3;
m++)
380 temp1 += Aup[i][
m]*PP[
m]/(np*chi);
381 temp3 += Aup[i][
m]*AA[
m]/alpha;
382 temp2 += g_contr[
m][i]*(-Theta*AA[
m]/alpha -2./3.*traceK*Z[
m]);
383 temp4 += g_contr[i][
m]*Z[
m];
384 temp5 += Gtilde[
m]*BB[
m][i];
385 for (
int n = 0; n < 3; n++) temp6 += Christoffel_tilde[
m][n][i]*Aup[
m][n];
387 dtGhat[i] += 2.*alpha*(temp6 - 3.*temp1 + temp2 - temp3 - CCZ4k1*temp4/alpha) - temp5 + 2./3.*Gtilde[i]*traceB;
389 for (
int l = 0; l < 3; l++)
390 for (
int k = 0; k < 3; k++) dtGhat[i] += 2.*CCZ4k3*(2./3.*g_contr[i][l]*Z[l]*BB[k][k] - g_contr[l][k]*Z[l]*BB[k][i]);
394 #pragma clang loop unroll(disable)
395 for (
int k = 0; k < 3; k++)
398 for (
int i = 0; i < 3; i++)
399 for (
int j = 0; j < 3; j++)
temp += dgup[k][i][j]*Aex[i][j];
400 ov[k] = 2*alpha*
temp;
404 #pragma clang loop unroll(disable)
405 for (
int i = 0; i < 3; i++)
406 for (
int j = 0; j < 3; j++) dtGhat[i] += CCZ4helper*CCZ4sk*g_contr[i][j]*ov[j];
408 const double myb[3] = {Q[20], Q[21], Q[22]};
411 for (
int i = 0; i < 3; i++) dtbb[i] = CCZ4sk*(CCZ4xi*dtGhat[i] - CCZ4eta*myb[i]);
414#pragma clang loop unroll(disable)
415 for (
int i = 0; i < 3; i++) dtbeta[i] = CCZ4f*myb[i];
416 for (
int i = 0; i < 3; i++) dtbeta[i] += CCZ4bs*(
beta[0]*BB[0][i] +
beta[1]*BB[1][i] +
beta[2]*BB[2][i]);
417 for (
int i = 0; i < 3; i++) dtbeta[i] *= CCZ4sk;
420 double dtA[3] ={0,0,0};
421#pragma clang loop unroll(disable)
422 for (
int i = 0; i < 3; i++)
425 dtA[i] = -alpha*AA[i]*(2.*fa+alpha*faa)*(traceK - K0 - 2.*CCZ4c*Theta);
426 for (
int j = 0; j < 3; j++) dtA[i] += BB[i][j]*AA[j];
429 for (
int k = 0; k < 3; k++)
432 for (
int i = 0; i < 3; i++)
433 for (
int j = 0; j < 3; j++)
temp+= dgup[k][i][j]*Aex[i][j];
434 dtA[k] += -CCZ4helper*CCZ4sk*alpha*alpha*fa*
temp;
437 double dtB[3][3] = {0,0,0,0,0,0,0,0,0};
438 #pragma clang loop unroll(disable)
439 for (
int i = 0; i < 3; i++)
440 for (
int j = 0; j < 3; j++)
441 for (
int u = 0;
u < 3;
u++) dtB[i][j] += CCZ4sk*(BB[i][
u] * BB[
u][j]);
443 double dtD[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
444#pragma clang loop unroll(disable)
445 for (
int m = 0;
m < 3;
m++)
446 for (
int j = 0; j < 3; j++)
447 for (
int i = 0; i < 3; i++)
448 for (
int k = 0; k < 3; k++)
449 for (
int n = 0; n < 3; n++) dtD[k][i][j] += 1./3*CCZ4helper*alpha*g_cov[i][j]*dgup[k][n][
m]*Aex[n][
m];
451#pragma clang loop unroll(disable)
452 for (
int j = 0; j < 3; j++)
453 for (
int i = 0; i < 3; i++)
454 for (
int k = 0; k < 3; k++)
456 dtD[k][i][j] -= AA[k]*Aex[i][j];
457 for (
int l = 0; l < 3; l++) dtD[k][i][j] += BB[k][l]*DD[l][i][j] + BB[j][l]*DD[k][l][i] + BB[i][l]*DD[k][l][j] - 2./3.*BB[l][l]*DD[k][i][j];
460 double dtP[3] = {0,0,0};
461 #pragma clang loop unroll(disable)
462 for (
int i = 0; i < 3; i++)
463 for (
int j = 0; j < 3; j++) dtP[i] += BB[i][j]*PP[j];
465#pragma clang loop unroll(disable)
466 for (
int k = 0; k < 3; k++)
469 for (
int i = 0; i < 3; i++)
470 for (
int j = 0; j < 3; j++)
temp += dgup[k][i][j]*Aex[i][j];
471 dtP[k] += np/3.*AA[k]*traceK*chi;
472 dtP[k] += np/3.*(alpha*traceK-traceB)*PP[k];
473 dtP[k] += np/3.*CCZ4helper*alpha*CCZ4sk*
temp*chi;
477 S[0] = dtgamma[0][0];
478 S[1] = dtgamma[0][1];
479 S[2] = dtgamma[0][2];
480 S[3] = dtgamma[1][1];
481 S[4] = dtgamma[1][2];
482 S[5] = dtgamma[2][2];
491 for (
int i = 0; i < 3; i++) S[13+i] = dtGhat[i];
493 for (
int i = 0; i < 3; i++) S[17+i] = dtbeta[i];
494 for (
int i = 0; i < 3; i++) S[20+i] = dtbb[i];
495 for (
int i = 0; i < 3; i++) S[23+i] = dtA[i];
505 S[35] = dtD[0][0][0];
506 S[36] = dtD[0][0][1];
507 S[37] = dtD[0][0][2];
508 S[38] = dtD[0][1][1];
509 S[39] = dtD[0][1][2];
510 S[40] = dtD[0][2][2];
511 S[41] = dtD[1][0][0];
512 S[42] = dtD[1][0][1];
513 S[43] = dtD[1][0][2];
514 S[44] = dtD[1][1][1];
515 S[45] = dtD[1][1][2];
516 S[46] = dtD[1][2][2];
517 S[47] = dtD[2][0][0];
518 S[48] = dtD[2][0][1];
519 S[49] = dtD[2][0][2];
520 S[50] = dtD[2][1][1];
521 S[51] = dtD[2][1][2];
522 S[52] = dtD[2][2][2];
525 for (
int i = 0; i < 3; i++) S[55+i] = dtP[i];
529 for (
int i = 23; i < 53; i++) S[i] = 0.0;
530 for (
int i = 0; i < 3; i++) S[55+i] = 0.0;
536 const int CCZ4LapseType,
548 const double CCZ4helper = (CCZ4SO==1)? 0.0 : 1.0;
550 const double advec=0.0;
551 const double advec_aux=0.0;
554 const double alpha = std::fmax(1e-4,Q[16]);
557 const double alpha2 = alpha*alpha;
560 if (CCZ4LapseType==1)
566 constexpr int nVar(59);
568 double gradQin[59][3] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
572 for (
int i=0; i<nVar; i++) gradQin[i][normal] = gradQSerialised[i+normal*nVar];
575 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
576 const double invdet = 1./( Q[0]*Q[3]*Q[5] - Q[0]*Q[4]*Q[4] - Q[1]*Q[1]*Q[5] + 2*Q[1]*Q[2]*Q[4] -Q[2]*Q[2]*Q[3]);
578 const double g_contr[3][3] = {
579 { ( Q[3]*Q[5]-Q[4]*Q[4])*invdet, -( Q[1]*Q[5]-Q[2]*Q[4])*invdet, -(-Q[1]*Q[4]+Q[2]*Q[3])*invdet},
580 {-( Q[1]*Q[5]-Q[4]*Q[2])*invdet, ( Q[0]*Q[5]-Q[2]*Q[2])*invdet, -( Q[0]*Q[4]-Q[2]*Q[1])*invdet},
581 {-(-Q[1]*Q[4]+Q[3]*Q[2])*invdet, -( Q[0]*Q[4]-Q[1]*Q[2])*invdet, ( Q[0]*Q[3]-Q[1]*Q[1])*invdet}
585 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
588 for (
int i=0;i<3;i++)
589 for (
int j=0;j<3;j++) traceA+=g_contr[i][j]*Aex[i][j];
592 for (
int i=0;i<3;i++)
593 for (
int j=0;j<3;j++) Aex[i][j] -= 1./3. * traceA * g_cov[i][j];
596 double Amix[3][3]={0,0,0,0,0,0,0,0,0};
597 for (
int i = 0; i < 3; i++)
598 for (
int j = 0; j < 3; j++)
599 for (
int u = 0;
u < 3;
u++) Amix[i][j] += g_contr[i][
u] * Aex[
u][j];
600 double Aup[3][3]={0,0,0,0,0,0,0,0,0};
601 for (
int i = 0; i < 3; i++)
602 for (
int j = 0; j < 3; j++)
603 for (
int u = 0;
u < 3;
u++) Aup[i][j] += g_contr[i][
u] * Amix[j][
u];
605 const double DD[3][3][3] = {
606 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
607 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
608 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
610 double dgup[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
611 for (
int k = 0; k < 3; k++)
612 for (
int m = 0;
m < 3;
m++)
613 for (
int l = 0; l < 3; l++)
614 for (
int n = 0; n < 3; n++)
615 for (
int j = 0; j < 3; j++) dgup[k][
m][l] -= g_contr[
m][n]*g_contr[j][l]*2*DD[k][n][j];
619 const double np = 1.0;
620 const double phi = std::fmax(1e-2,pow(Q[54],1.0/np));
621 const double chi = pow(phi,np);
622 const double phi2 = phi*phi;
624 const double PP[3] = {Q[55], Q[56], Q[57]};
626 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
627 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
628 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
631 const double AA[3] = {Q[23], Q[24], Q[25]};
633 {gradQin[23][0],gradQin[24][0],gradQin[25][0]},
634 {gradQin[23][1],gradQin[24][1],gradQin[25][1]},
635 {gradQin[23][2],gradQin[24][2],gradQin[25][2]}
639 double Christoffel_tilde[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
642 for (
int j = 0; j < 3; j++)
643 for (
int i = 0; i < 3; i++)
644 for (
int k = 0; k < 3; k++)
647 for (
int l = 0; l < 3; l++)
649 Christoffel_tilde[i][j][k] += g_contr[k][l] * ( DD[i][j][l] + DD[j][i][l] - DD[l][i][j] );
654 double Gtilde[3] = {0,0,0};
655 for (
int l = 0; l < 3; l++)
656 for (
int j = 0; j < 3; j++)
657 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[j][l] * Christoffel_tilde[j][l][i];
659 const double Ghat[3] = {Q[13], Q[14], Q[15]};
661 double Z[3] = {0,0,0};
662 for (
int i=0;i<3;i++)
663 for (
int j=0;j<3;j++) Z[i] += 0.5*( g_cov[i][j]* (Ghat[j] - Gtilde[j]));
664 double Zup[3] = {0,0,0};
665 for (
int i=0;i<3;i++)
666 for (
int j=0;j<3;j++) Zup[i] += phi2 * g_contr[i][j] * Z[j];
668 const double dDD[3][3][3][3] = {
671 {gradQin[35][0],gradQin[36][0],gradQin[37][0]}, {gradQin[36][0],gradQin[38][0],gradQin[39][0]}, {gradQin[37][0],gradQin[39][0],gradQin[40][0]},
674 {gradQin[41][0],gradQin[42][0],gradQin[43][0]}, {gradQin[42][0],gradQin[44][0],gradQin[45][0]}, {gradQin[43][0],gradQin[45][0],gradQin[46][0]},
677 {gradQin[47][0],gradQin[48][0],gradQin[49][0]}, {gradQin[48][0],gradQin[50][0],gradQin[51][0]}, {gradQin[49][0],gradQin[51][0],gradQin[52][0]}
682 {gradQin[35][1],gradQin[36][1],gradQin[37][1]}, {gradQin[36][1],gradQin[38][1],gradQin[39][1]}, {gradQin[37][1],gradQin[39][1],gradQin[40][1]},
685 {gradQin[41][1],gradQin[42][1],gradQin[43][1]}, {gradQin[42][1],gradQin[44][1],gradQin[45][1]}, {gradQin[43][1],gradQin[45][1],gradQin[46][1]},
688 {gradQin[47][1],gradQin[48][1],gradQin[49][1]}, {gradQin[48][1],gradQin[50][1],gradQin[51][1]}, {gradQin[49][1],gradQin[51][1],gradQin[52][1]}
693 {gradQin[35][2],gradQin[36][2],gradQin[37][2]}, {gradQin[36][2],gradQin[38][2],gradQin[39][2]}, {gradQin[37][2],gradQin[39][2],gradQin[40][2]},
696 {gradQin[41][2],gradQin[42][2],gradQin[43][2]}, {gradQin[42][2],gradQin[44][2],gradQin[45][2]}, {gradQin[43][2],gradQin[45][2],gradQin[46][2]},
699 {gradQin[47][2],gradQin[48][2],gradQin[49][2]}, {gradQin[48][2],gradQin[50][2],gradQin[51][2]}, {gradQin[49][2],gradQin[51][2],gradQin[52][2]}
759 const double dGhat[3][3] = {
760 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
761 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
762 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
768 double RicciPlusNablaZNCP[3][3] = {0,0,0,0,0,0,0,0,0};
769 for (
int i = 0; i < 3; i++)
770 for (
int j = 0; j < 3; j++)
772 RicciPlusNablaZNCP[i][j] += 0.5*(dPP[i][j] + dPP[j][i])/(np*chi);
773 for (
int k = 0; k < 3; k++)
775 RicciPlusNablaZNCP[i][j] += 0.5*( g_cov[k][i]*dGhat[j][k] + g_cov[k][j]*dGhat[i][k] );
776 for (
int l = 0; l < 3; l++)
778 RicciPlusNablaZNCP[i][j] -= 0.5*g_contr[k][l]*( dDD[k][l][i][j] + dDD[l][k][i][j] );
779 RicciPlusNablaZNCP[i][j] += 0.5*g_cov[i][j]*g_contr[k][l]*( dPP[k][l] + dPP[l][k] )/(np*chi);
787 double RPlusTwoNablaZNCP = 0;
788 for (
int i = 0; i < 3; i++)
789 for (
int j = 0; j < 3; j++) RPlusTwoNablaZNCP += g_contr[i][j]*RicciPlusNablaZNCP[i][j];
790 RPlusTwoNablaZNCP*=phi2;
792 double nablaijalphaNCP[3][3];
793 for (
int i = 0; i < 3; i++)
794 for (
int j = 0; j < 3; j++) nablaijalphaNCP[i][j] = 0.5*( dAA[i][j] + dAA[j][i] );
796 double nablanablaalphaNCP = 0;
797 for (
int i = 0; i < 3; i++)
798 for (
int j = 0; j < 3; j++) nablanablaalphaNCP += g_contr[i][j]*nablaijalphaNCP[i][j];
799 nablanablaalphaNCP*=phi2;
801 double SecondOrderTermsNCP[3][3];
802 for (
int i = 0; i < 3; i++)
803 for (
int j = 0; j < 3; j++) SecondOrderTermsNCP[i][j] = -nablaijalphaNCP[i][j] + alpha*RicciPlusNablaZNCP[i][j];
806 for (
int i = 0; i < 3; i++)
807 for (
int j = 0; j < 3; j++) traceNCP += g_contr[i][j]*SecondOrderTermsNCP[i][j];
809 for (
int i = 0; i < 3; i++)
810 for (
int j = 0; j < 3; j++) SecondOrderTermsNCP[i][j] -= 1./3 * traceNCP * g_cov[i][j];
812 const double beta[3] = {Q[17], Q[18], Q[19]};
814 const double dAex[3][3][3] = {
815 {{gradQin[6][0],gradQin[7][0],gradQin[8][0]}, {gradQin[7][0], gradQin[9][0], gradQin[10][0]}, {gradQin[8][0], gradQin[10][0], gradQin[11][0]}},
816 {{gradQin[6][1],gradQin[7][1],gradQin[8][1]}, {gradQin[7][1], gradQin[9][1], gradQin[10][1]}, {gradQin[8][1], gradQin[10][1], gradQin[11][1]}},
817 {{gradQin[6][2],gradQin[7][2],gradQin[8][2]}, {gradQin[7][2], gradQin[9][2], gradQin[10][2]}, {gradQin[8][2], gradQin[10][2], gradQin[11][2]}}
821 for (
int i = 0; i < 3; i++)
822 for (
int j = 0; j < 3; j++) dtK[i][j] = phi2*SecondOrderTermsNCP[i][j] + advec*(
beta[0]*dAex[0][i][j] +
beta[1]*dAex[1][i][j] +
beta[2]*dAex[2][i][j]);
824 const double dtraceK[3] = {gradQin[53][0], gradQin[53][1], gradQin[53][2]};
826 double dtTraceK = -nablanablaalphaNCP + alpha*RPlusTwoNablaZNCP + advec*(
beta[0]*dtraceK[0] +
beta[1]*dtraceK[1] +
beta[2]*dtraceK[2]);
828 const double BB[3][3] = {
829 {Q[26], Q[27], Q[28]}, {Q[29], Q[30], Q[31]}, {Q[32], Q[33], Q[34]}
832 double traceB = BB[0][0] + BB[1][1] + BB[2][2];
835 for (
int i = 0; i < 3; i++)
836 for (
int j = 0; j < 3; j++) Aupdown += Aex[i][j]*Aup[i][j];
838 const double dTheta[3] = {gradQin[12][0],gradQin[12][1],gradQin[12][2]};
839 double dtTheta = 0.5*alpha*CCZ4e*CCZ4e*RPlusTwoNablaZNCP + advec*(
beta[0]*dTheta[0] +
beta[1]*dTheta[1] +
beta[2]*dTheta[2]);
847 const double dBB[3][3][3] = {
849 {CCZ4sk*gradQin[26][0],CCZ4sk*gradQin[27][0],CCZ4sk*gradQin[28][0]}, {CCZ4sk*gradQin[29][0],CCZ4sk*gradQin[30][0],CCZ4sk*gradQin[31][0]}, {CCZ4sk*gradQin[32][0],CCZ4sk*gradQin[33][0],CCZ4sk*gradQin[34][0]}
852 {CCZ4sk*gradQin[26][1],CCZ4sk*gradQin[27][1],CCZ4sk*gradQin[28][1]}, {CCZ4sk*gradQin[29][1],CCZ4sk*gradQin[30][1],CCZ4sk*gradQin[31][1]}, {CCZ4sk*gradQin[32][1],CCZ4sk*gradQin[33][1],CCZ4sk*gradQin[34][1]}
855 {CCZ4sk*gradQin[26][2],CCZ4sk*gradQin[27][2],CCZ4sk*gradQin[28][2]}, {CCZ4sk*gradQin[29][2],CCZ4sk*gradQin[30][2],CCZ4sk*gradQin[31][2]}, {CCZ4sk*gradQin[32][2],CCZ4sk*gradQin[33][2],CCZ4sk*gradQin[34][2]}
859 double dtGhat[3] = {0,0,0};
860 for (
int i = 0; i < 3; i++)
862 double temp=0, temp2=0;
863 for (
int j = 0; j < 3; j++)
865 temp +=g_contr[i][j]*dtraceK[j];
866 temp2 +=g_contr[j][i]*dTheta[j];
868 dtGhat[i] = -4./3.*alpha*
temp + 2*alpha*temp2 + advec*(
beta[0]*dGhat[0][i] +
beta[1]*dGhat[1][i] +
beta[2]*dGhat[2][i]);
869 for (
int l = 0; l < 3; l++)
870 for (
int k = 0; k < 3; k++) dtGhat[i] += g_contr[k][l]*0.5*(dBB[k][l][i] + dBB[l][k][i]) + 1./3.*g_contr[i][k]*0.5*(dBB[k][l][l] + dBB[l][k][l]);
874 for (
int k = 0; k < 3; k++)
877 for (
int i = 0; i < 3; i++)
878 for (
int j = 0; j < 3; j++)
temp += g_contr[i][j]*dAex[k][i][j];
879 ov[k] = 2*alpha*
temp;
881 for (
int i = 0; i < 3; i++)
882 for (
int j = 0; j < 3; j++) dtGhat[i] += CCZ4helper*CCZ4sk*g_contr[i][j]*ov[j];
885 for (
int i = 0; i < 3; i++)
887 dtbb[i] = CCZ4xi*dtGhat[i] + CCZ4bs*advec*(
beta[0]*gradQin[20+i][0] +
beta[1]*gradQin[20+i][1] +
beta[2]*gradQin[20+i][2] -
beta[0]*gradQin[13+i][0] -
beta[1]*gradQin[13+i][1] -
beta[2]*gradQin[13+i][2]);
891 double dtA[3] = {0,0,0};
892 double dK0[3] = {0,0,0};
893 for (
int i = 0; i < 3; i++)
895 dtA[i] = -alpha*alpha*fa*(dtraceK[i] - dK0[i] - CCZ4c*2*dTheta[i]) + advec_aux*(
beta[0]*dAA[0][i] +
beta[1]*dAA[1][i] +
beta[2]*dAA[2][i]);
897 for (
int k = 0; k < 3; k++)
900 for (
int i = 0; i < 3; i++)
901 for (
int j = 0; j < 3; j++)
temp += g_contr[i][j]*dAex[k][i][j];
902 dtA[k] -= CCZ4helper*CCZ4sk*alpha*alpha*fa*
temp;
906 {CCZ4f*gradQin[20][0],CCZ4f*gradQin[21][0],CCZ4f*gradQin[22][0]},
907 {CCZ4f*gradQin[20][1],CCZ4f*gradQin[21][1],CCZ4f*gradQin[22][1]},
908 {CCZ4f*gradQin[20][2],CCZ4f*gradQin[21][2],CCZ4f*gradQin[22][2]}
910 for (
int i = 0; i < 3; i++)
911 for (
int k = 0; k < 3; k++)
912 for (
int j = 0; j < 3; j++)
915 dtB[k][i] += CCZ4helper*CCZ4mu*alpha2 * g_contr[i][j]*( dPP[k][j] - dPP[j][k])/(np*chi);
916 for (
int n = 0; n < 3; n++)
917 for (
int l = 0; l < 3; l++) dtB[k][i] -= CCZ4helper*CCZ4mu*alpha2 * g_contr[i][j]*g_contr[n][l]*(dDD[k][l][j][n] - dDD[l][k][j][n]);
919 for (
int i = 0; i < 3; i++)
920 for (
int j = 0; j < 3; j++) dtB[i][j] += CCZ4bs*advec_aux*(
beta[0]*dBB[0][i][j] +
beta[1]*dBB[1][i][j] +
beta[2]*dBB[2][i][j]);
921 for (
int i = 0; i < 3; i++)
922 for (
int j = 0; j < 3; j++) dtB[i][j] *= CCZ4sk;
924 double dtD[3][3][3] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
925 for (
int i = 0; i < 3; i++)
926 for (
int j = 0; j < 3; j++)
927 for (
int k = 0; k < 3; k++) dtD[i][j][k] = -alpha*dAex[i][j][k];
928 for (
int i = 0; i < 3; i++)
929 for (
int j = 0; j < 3; j++)
930 for (
int k = 0; k < 3; k++)
931 for (
int m = 0;
m < 3;
m++)
933 dtD[k][i][j] += 0.25*(g_cov[
m][i]*(dBB[k][j][
m] + dBB[j][k][
m]) + g_cov[
m][j]*(dBB[k][i][
m]+dBB[i][k][
m])) - 1./6.*g_cov[i][j]*(dBB[k][
m][
m]+dBB[
m][k][
m]);
934 for (
int n = 0; n < 3; n++)
936 dtD[k][i][j] += 1./3*CCZ4helper*alpha*g_cov[i][j]*g_contr[n][
m]*dAex[k][n][
m];
939 for (
int i = 0; i < 3; i++)
940 for (
int j = 0; j < 3; j++)
941 for (
int k = 0; k < 3; k++) dtD[i][j][k] += advec_aux*(
beta[0]*dDD[0][i][j][k] +
beta[1]*dDD[1][i][j][k] +
beta[2]*dDD[2][i][j][k]);
943 double dtP[3] = {0,0,0};
944 for (
int i = 0; i < 3; i++) dtP[i] = advec_aux*(
beta[0]*dPP[0][i] +
beta[1]*dPP[1][i] +
beta[2]*dPP[2][i]);
945 for (
int k = 0; k < 3; k++)
948 for (
int m = 0;
m < 3;
m++)
949 for (
int n = 0; n < 3; n++)
temp += g_contr[
m][n]*dAex[k][
m][n];
950 dtP[k] += np/3.*chi*alpha*dtraceK[k];
951 dtP[k] += np/3.*CCZ4helper*chi*alpha*CCZ4sk*
temp;
953 for (
int i = 0; i < 3; i++) dtP[k] -= np/6.*chi*(dBB[k][i][i] + dBB[i][k][i]);
956 double dtgamma[3][3] = {0,0,0,0,0,0,0,0,0};
958 double dtbeta[3] = {0,0,0};
961 BgradQ[0] = -dtgamma[0][0];
962 BgradQ[1] = -dtgamma[0][1];
963 BgradQ[2] = -dtgamma[0][2];
964 BgradQ[3] = -dtgamma[1][1];
965 BgradQ[4] = -dtgamma[1][2];
966 BgradQ[5] = -dtgamma[2][2];
967 BgradQ[6] = -dtK[0][0];
968 BgradQ[7] = -dtK[0][1];
969 BgradQ[8] = -dtK[0][2];
970 BgradQ[9] = -dtK[1][1];
971 BgradQ[10] = -dtK[1][2];
972 BgradQ[11] = -dtK[2][2];
974 BgradQ[12] = -dtTheta;
975 for (
int i = 0; i < 3; i++) BgradQ[13+i] = -dtGhat[i];
976 BgradQ[16] = -dtalpha;
977 for (
int i = 0; i < 3; i++) BgradQ[17+i] = -dtbeta[i];
978 for (
int i = 0; i < 3; i++) BgradQ[20+i] = -dtbb[i];
979 for (
int i = 0; i < 3; i++) BgradQ[23+i] = -dtA[i];
980 BgradQ[26] = -dtB[0][0];
981 BgradQ[27] = -dtB[0][1];
982 BgradQ[28] = -dtB[0][2];
983 BgradQ[29] = -dtB[1][0];
984 BgradQ[30] = -dtB[1][1];
985 BgradQ[31] = -dtB[1][2];
986 BgradQ[32] = -dtB[2][0];
987 BgradQ[33] = -dtB[2][1];
988 BgradQ[34] = -dtB[2][2];
990 BgradQ[35] = -dtD[0][0][0];
991 BgradQ[36] = -dtD[0][0][1];
992 BgradQ[37] = -dtD[0][0][2];
993 BgradQ[38] = -dtD[0][1][1];
994 BgradQ[39] = -dtD[0][1][2];
995 BgradQ[40] = -dtD[0][2][2];
997 BgradQ[41] = -dtD[1][0][0];
998 BgradQ[42] = -dtD[1][0][1];
999 BgradQ[43] = -dtD[1][0][2];
1000 BgradQ[44] = -dtD[1][1][1];
1001 BgradQ[45] = -dtD[1][1][2];
1002 BgradQ[46] = -dtD[1][2][2];
1004 BgradQ[47] = -dtD[2][0][0];
1005 BgradQ[48] = -dtD[2][0][1];
1006 BgradQ[49] = -dtD[2][0][2];
1007 BgradQ[50] = -dtD[2][1][1];
1008 BgradQ[51] = -dtD[2][1][2];
1009 BgradQ[52] = -dtD[2][2][2];
1010 BgradQ[53] = -dtTraceK;
1011 BgradQ[54] = -dtchi;
1012 for (
int i = 0; i < 3; i++) BgradQ[55+i] = -dtP[i];
1017 for (
int i = 23; i < 53; i++) BgradQ[i] = 0.0;
1018 for (
int i = 0; i < 3; i++) BgradQ[55+i] = 0.0;