11 const double CCZ4GLMc,
14 const double np = 1.0;
15 const double qmin =
std::min({Q[0],Q[3],Q[5]});
16 const double alpha = std::max({1.0, Q[16]}) * std::max({1.0, pow(Q[54],1.0/np)})/std::sqrt(qmin);
18 constexpr
double sqrtwo = 1.4142135623730951;
19 const double tempA = alpha * std::max({sqrtwo, CCZ4e, CCZ4ds, CCZ4GLMc/alpha, CCZ4GLMd/alpha});
20 const double tempB = Q[17+normal];
21 return std::max({1.0, std::abs(-tempA-tempB), std::abs(tempA-tempB)});
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}};
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}};
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}}};
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}}};
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}}};
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}};
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}};
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] + (1-CCZ4SO)*2.*beta[k]*DD[k][i][
j];
333 double Atemp[3][3]= {{0.0}};
334 #pragma clang loop unroll(disable)
335 for (
int i = 0; i < 3; i++)
336 for (
int j = 0;
j < 3;
j++)
337 for (
int u = 0;
u < 3;
u++) Atemp[i][
j] += Aex[i][
u] * Amix[
u][
j];
339 const double traceK = Q[53];
343 #pragma clang loop unroll(disable)
344 for (
int i = 0; i < 3; i++)
345 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];
347 #pragma clang loop unroll(disable)
348 for (
int j = 0;
j < 3;
j++)
349 for (
int i = 0; i < 3; i++)
350 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];
352 const double K0 = Q[58];
355 double dtTraceK = -nablanablaalphaSrc + alpha*(RPlusTwoNablaZSrc + traceK*traceK - 2.0*CCZ4c*
Theta*traceK) - 3.0*alpha*CCZ4k1*(1.+CCZ4k2)*
Theta/alpha;
358 double dtchi = (1-CCZ4SO)*(beta[0]*PP[0] + beta[1]*PP[1] + beta[2]*PP[2]) + np/3.*(alpha*traceK-traceB)*chi;
362 double dtalpha = -alpha*alpha*fa*(traceK-
K0-2.*CCZ4c*
Theta)+ (1-CCZ4SO)*(beta[0]*AA[0]+beta[1]*AA[1]+beta[2]*AA[2]);
365 #pragma clang loop unroll(disable)
366 for (
int i = 0; i < 3; i++)
367 for (
int j = 0;
j < 3;
j++) Aupdown += Aex[i][
j]*Aup[i][
j];
369 double sumzupaa = 0.0;
370 for (
int i = 0; i < 3; i++) sumzupaa += Zup[i]*AA[i];
372 double dtTheta = 0.5*alpha*CCZ4e*CCZ4e*(RPlusTwoNablaZSrc - Aupdown + 2./3.*traceK*traceK) - alpha*(CCZ4c*
Theta*traceK + sumzupaa/alpha + CCZ4k1*(2.+CCZ4k2)*
Theta/alpha);
374 double dtGhat[3] = {0,0,0};
375 #pragma clang loop unroll(disable)
376 for (
int i = 0; i < 3; i++)
378 double temp1=0, temp2=0, temp3=0, temp4=0, temp5=0, temp6=0;
379 #pragma clang loop unroll(disable)
380 for (
int m = 0; m < 3; m++)
382 temp1 += Aup[i][m]*PP[m]/(np*chi);
383 temp3 += Aup[i][m]*AA[m]/alpha;
384 temp2 += g_contr[m][i]*(-
Theta*AA[m]/alpha -2./3.*traceK*Z[m]);
385 temp4 += g_contr[i][m]*Z[m];
386 temp5 += Gtilde[m]*BB[m][i];
387 for (
int n = 0; n < 3; n++) temp6 += Christoffel_tilde[m][n][i]*Aup[m][n];
389 dtGhat[i] += 2.*alpha*(temp6 - 3.*temp1 + temp2 - temp3 - CCZ4k1*temp4/alpha) - temp5 + 2./3.*Gtilde[i]*traceB;
391 for (
int l = 0; l < 3; l++)
392 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]);
396 #pragma clang loop unroll(disable)
397 for (
int k = 0; k < 3; k++)
400 for (
int i = 0; i < 3; i++)
401 for (
int j = 0;
j < 3;
j++) temp += dgup[k][i][
j]*Aex[i][
j];
402 ov[k] = 2*alpha*temp;
406 #pragma clang loop unroll(disable)
407 for (
int i = 0; i < 3; i++)
408 for (
int j = 0;
j < 3;
j++) dtGhat[i] += CCZ4helper*CCZ4sk*g_contr[i][
j]*ov[
j];
410 const double myb[3] = {Q[20], Q[21], Q[22]};
413 for (
int i = 0; i < 3; i++) dtbb[i] = CCZ4sk*(CCZ4xi*dtGhat[i] - CCZ4eta*myb[i]);
416 #pragma clang loop unroll(disable)
417 for (
int i = 0; i < 3; i++) dtbeta[i] = CCZ4f*myb[i];
418 for (
int i = 0; i < 3; i++) dtbeta[i] += CCZ4bs*(1-CCZ4SO)*(beta[0]*BB[0][i] + beta[1]*BB[1][i] + beta[2]*BB[2][i]);
419 for (
int i = 0; i < 3; i++) dtbeta[i] *= CCZ4sk;
422 double dtA[3] ={0,0,0};
423 #pragma clang loop unroll(disable)
424 for (
int i = 0; i < 3; i++)
427 dtA[i] = -alpha*AA[i]*(2.*fa+alpha*faa)*(traceK -
K0 - 2.*CCZ4c*
Theta);
428 for (
int j = 0;
j < 3;
j++) dtA[i] += BB[i][
j]*AA[
j];
431 for (
int k = 0; k < 3; k++)
434 for (
int i = 0; i < 3; i++)
435 for (
int j = 0;
j < 3;
j++) temp+= dgup[k][i][
j]*Aex[i][
j];
436 dtA[k] += -CCZ4helper*CCZ4sk*alpha*alpha*fa*temp;
439 double dtB[3][3] = {{0.0}};
440 #pragma clang loop unroll(disable)
441 for (
int i = 0; i < 3; i++)
442 for (
int j = 0;
j < 3;
j++)
443 for (
int u = 0;
u < 3;
u++) dtB[i][
j] += CCZ4sk*(BB[i][
u] * BB[
u][
j]);
445 double dtD[3][3][3] = {{{0.0}}};
446 #pragma clang loop unroll(disable)
447 for (
int m = 0; m < 3; m++)
448 for (
int j = 0;
j < 3;
j++)
449 for (
int i = 0; i < 3; i++)
450 for (
int k = 0; k < 3; k++)
451 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];
453 #pragma clang loop unroll(disable)
454 for (
int j = 0;
j < 3;
j++)
455 for (
int i = 0; i < 3; i++)
456 for (
int k = 0; k < 3; k++)
458 dtD[k][i][
j] -= AA[k]*Aex[i][
j];
459 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];
462 double dtP[3] = {0,0,0};
463 #pragma clang loop unroll(disable)
464 for (
int i = 0; i < 3; i++)
465 for (
int j = 0;
j < 3;
j++) dtP[i] += BB[i][
j]*PP[
j];
467 #pragma clang loop unroll(disable)
468 for (
int k = 0; k < 3; k++)
471 for (
int i = 0; i < 3; i++)
472 for (
int j = 0;
j < 3;
j++) temp += dgup[k][i][
j]*Aex[i][
j];
473 dtP[k] += np/3.*AA[k]*traceK*chi;
474 dtP[k] += np/3.*(alpha*traceK-traceB)*PP[k];
475 dtP[k] += np/3.*CCZ4helper*alpha*CCZ4sk*temp*chi;
479 S[0] = dtgamma[0][0];
480 S[1] = dtgamma[0][1];
481 S[2] = dtgamma[0][2];
482 S[3] = dtgamma[1][1];
483 S[4] = dtgamma[1][2];
484 S[5] = dtgamma[2][2];
493 for (
int i = 0; i < 3; i++) S[13+i] = dtGhat[i];
495 for (
int i = 0; i < 3; i++) S[17+i] = dtbeta[i];
496 for (
int i = 0; i < 3; i++) S[20+i] = dtbb[i];
497 for (
int i = 0; i < 3; i++) S[23+i] = dtA[i];
507 S[35] = dtD[0][0][0];
508 S[36] = dtD[0][0][1];
509 S[37] = dtD[0][0][2];
510 S[38] = dtD[0][1][1];
511 S[39] = dtD[0][1][2];
512 S[40] = dtD[0][2][2];
513 S[41] = dtD[1][0][0];
514 S[42] = dtD[1][0][1];
515 S[43] = dtD[1][0][2];
516 S[44] = dtD[1][1][1];
517 S[45] = dtD[1][1][2];
518 S[46] = dtD[1][2][2];
519 S[47] = dtD[2][0][0];
520 S[48] = dtD[2][0][1];
521 S[49] = dtD[2][0][2];
522 S[50] = dtD[2][1][1];
523 S[51] = dtD[2][1][2];
524 S[52] = dtD[2][2][2];
527 for (
int i = 0; i < 3; i++) S[55+i] = dtP[i];
531 for (
int i = 23; i < 53; i++) S[i] = 0.0;
532 for (
int i = 0; i < 3; i++) S[55+i] = 0.0;
538 const int CCZ4LapseType,
550 const double CCZ4helper = (CCZ4SO==1)? 0.0 : 1.0;
552 const double advec=0.0;
553 const double advec_aux=0.0;
556 const double alpha = std::fmax(1e-4,Q[16]);
559 const double alpha2 = alpha*alpha;
562 if (CCZ4LapseType==1)
568 constexpr
int nVar(59);
570 double gradQin[59][3] = {{0}};
574 for (
int i=0; i<nVar; i++) gradQin[i][normal] = gradQSerialised[i+normal*nVar];
577 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
578 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]);
580 const double g_contr[3][3] = {
581 { ( 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},
582 {-( 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},
583 {-(-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}
587 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
590 for (
int i=0;i<3;i++)
591 for (
int j=0;
j<3;
j++) traceA+=g_contr[i][
j]*Aex[i][
j];
594 for (
int i=0;i<3;i++)
595 for (
int j=0;
j<3;
j++) Aex[i][
j] -= 1./3. * traceA * g_cov[i][
j];
598 double Amix[3][3]={{0.0}};
599 for (
int i = 0; i < 3; i++)
600 for (
int j = 0;
j < 3;
j++)
601 for (
int u = 0;
u < 3;
u++) Amix[i][
j] += g_contr[i][
u] * Aex[
u][
j];
602 double Aup[3][3]={{0.0}};
603 for (
int i = 0; i < 3; i++)
604 for (
int j = 0;
j < 3;
j++)
605 for (
int u = 0;
u < 3;
u++) Aup[i][
j] += g_contr[i][
u] * Amix[
j][
u];
607 const double DD[3][3][3] = {
608 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
609 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
610 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
612 double dgup[3][3][3] = {{{0.0}}};
613 for (
int k = 0; k < 3; k++)
614 for (
int m = 0; m < 3; m++)
615 for (
int l = 0; l < 3; l++)
616 for (
int n = 0; n < 3; n++)
617 for (
int j = 0;
j < 3;
j++) dgup[k][m][l] -= g_contr[m][n]*g_contr[
j][l]*2*DD[k][n][
j];
621 const double np = 1.0;
622 const double phi = std::fmax(1e-2,pow(Q[54],1.0/np));
623 const double chi = pow(phi,np);
624 const double phi2 = phi*phi;
628 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
629 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
630 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
635 {gradQin[23][0],gradQin[24][0],gradQin[25][0]},
636 {gradQin[23][1],gradQin[24][1],gradQin[25][1]},
637 {gradQin[23][2],gradQin[24][2],gradQin[25][2]}
641 double Christoffel_tilde[3][3][3] = {{{0.0}}};
644 for (
int j = 0;
j < 3;
j++)
645 for (
int i = 0; i < 3; i++)
646 for (
int k = 0; k < 3; k++)
649 for (
int l = 0; l < 3; l++)
651 Christoffel_tilde[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] );
656 double Gtilde[3] = {0,0,0};
657 for (
int l = 0; l < 3; l++)
658 for (
int j = 0;
j < 3;
j++)
659 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[
j][l] * Christoffel_tilde[
j][l][i];
661 const double Ghat[3] = {Q[13], Q[14], Q[15]};
663 double Z[3] = {0,0,0};
664 for (
int i=0;i<3;i++)
665 for (
int j=0;
j<3;
j++) Z[i] += 0.5*( g_cov[i][
j]* (Ghat[
j] - Gtilde[
j]));
666 double Zup[3] = {0,0,0};
667 for (
int i=0;i<3;i++)
668 for (
int j=0;
j<3;
j++) Zup[i] += phi2 * g_contr[i][
j] * Z[
j];
670 const double dDD[3][3][3][3] = {
673 {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]},
676 {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]},
679 {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]}
684 {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]},
687 {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]},
690 {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]}
695 {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]},
698 {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]},
701 {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]}
761 const double dGhat[3][3] = {
762 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
763 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
764 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
770 double RicciPlusNablaZNCP[3][3] = {{0.0}};
771 for (
int i = 0; i < 3; i++)
772 for (
int j = 0;
j < 3;
j++)
774 RicciPlusNablaZNCP[i][
j] += 0.5*(dPP[i][
j] + dPP[
j][i])/(np*chi);
775 for (
int k = 0; k < 3; k++)
777 RicciPlusNablaZNCP[i][
j] += 0.5*( g_cov[k][i]*dGhat[
j][k] + g_cov[k][
j]*dGhat[i][k] );
778 for (
int l = 0; l < 3; l++)
780 RicciPlusNablaZNCP[i][
j] -= 0.5*g_contr[k][l]*( dDD[k][l][i][
j] + dDD[l][k][i][
j] );
781 RicciPlusNablaZNCP[i][
j] += 0.5*g_cov[i][
j]*g_contr[k][l]*( dPP[k][l] + dPP[l][k] )/(np*chi);
789 double RPlusTwoNablaZNCP = 0;
790 for (
int i = 0; i < 3; i++)
791 for (
int j = 0;
j < 3;
j++) RPlusTwoNablaZNCP += g_contr[i][
j]*RicciPlusNablaZNCP[i][
j];
792 RPlusTwoNablaZNCP*=phi2;
794 double nablaijalphaNCP[3][3];
795 for (
int i = 0; i < 3; i++)
796 for (
int j = 0;
j < 3;
j++) nablaijalphaNCP[i][
j] = 0.5*( dAA[i][
j] + dAA[
j][i] );
798 double nablanablaalphaNCP = 0;
799 for (
int i = 0; i < 3; i++)
800 for (
int j = 0;
j < 3;
j++) nablanablaalphaNCP += g_contr[i][
j]*nablaijalphaNCP[i][
j];
801 nablanablaalphaNCP*=phi2;
803 double SecondOrderTermsNCP[3][3];
804 for (
int i = 0; i < 3; i++)
805 for (
int j = 0;
j < 3;
j++) SecondOrderTermsNCP[i][
j] = -nablaijalphaNCP[i][
j] + alpha*RicciPlusNablaZNCP[i][
j];
808 for (
int i = 0; i < 3; i++)
809 for (
int j = 0;
j < 3;
j++) traceNCP += g_contr[i][
j]*SecondOrderTermsNCP[i][
j];
811 for (
int i = 0; i < 3; i++)
812 for (
int j = 0;
j < 3;
j++) SecondOrderTermsNCP[i][
j] -= 1./3 * traceNCP * g_cov[i][
j];
814 const double beta[3] = {Q[17], Q[18], Q[19]};
816 const double dAex[3][3][3] = {
817 {{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]}},
818 {{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]}},
819 {{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]}}
823 for (
int i = 0; i < 3; i++)
824 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]);
826 const double dtraceK[3] = {gradQin[53][0], gradQin[53][1], gradQin[53][2]};
828 double dtTraceK = -nablanablaalphaNCP + alpha*RPlusTwoNablaZNCP + advec*(beta[0]*dtraceK[0] + beta[1]*dtraceK[1] + beta[2]*dtraceK[2]);
830 const double BB[3][3] = {
831 {Q[26], Q[27], Q[28]}, {Q[29], Q[30], Q[31]}, {Q[32], Q[33], Q[34]}
834 double traceB = BB[0][0] + BB[1][1] + BB[2][2];
837 for (
int i = 0; i < 3; i++)
838 for (
int j = 0;
j < 3;
j++) Aupdown += Aex[i][
j]*Aup[i][
j];
840 const double dTheta[3] = {gradQin[12][0],gradQin[12][1],gradQin[12][2]};
841 double dtTheta = 0.5*alpha*CCZ4e*CCZ4e*RPlusTwoNablaZNCP + advec*(beta[0]*dTheta[0] + beta[1]*dTheta[1] + beta[2]*dTheta[2]);
849 const double dBB[3][3][3] = {
851 {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]}
854 {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]}
857 {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]}
861 double dtGhat[3] = {0,0,0};
862 for (
int i = 0; i < 3; i++)
864 double temp=0, temp2=0;
865 for (
int j = 0;
j < 3;
j++)
867 temp +=g_contr[i][
j]*dtraceK[
j];
868 temp2 +=g_contr[
j][i]*dTheta[
j];
870 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]);
871 for (
int l = 0; l < 3; l++)
872 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]);
876 for (
int k = 0; k < 3; k++)
879 for (
int i = 0; i < 3; i++)
880 for (
int j = 0;
j < 3;
j++) temp += g_contr[i][
j]*dAex[k][i][
j];
881 ov[k] = 2*alpha*temp;
883 for (
int i = 0; i < 3; i++)
884 for (
int j = 0;
j < 3;
j++) dtGhat[i] += CCZ4helper*CCZ4sk*g_contr[i][
j]*ov[
j];
887 for (
int i = 0; i < 3; i++)
889 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]);
893 double dtA[3] = {0,0,0};
894 double dK0[3] = {0,0,0};
895 for (
int i = 0; i < 3; i++)
897 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]);
899 for (
int k = 0; k < 3; k++)
902 for (
int i = 0; i < 3; i++)
903 for (
int j = 0;
j < 3;
j++) temp += g_contr[i][
j]*dAex[k][i][
j];
904 dtA[k] -= CCZ4helper*CCZ4sk*alpha*alpha*fa*temp;
908 {CCZ4f*gradQin[20][0],CCZ4f*gradQin[21][0],CCZ4f*gradQin[22][0]},
909 {CCZ4f*gradQin[20][1],CCZ4f*gradQin[21][1],CCZ4f*gradQin[22][1]},
910 {CCZ4f*gradQin[20][2],CCZ4f*gradQin[21][2],CCZ4f*gradQin[22][2]}
912 for (
int i = 0; i < 3; i++)
913 for (
int k = 0; k < 3; k++)
914 for (
int j = 0;
j < 3;
j++)
917 dtB[k][i] += CCZ4helper*CCZ4mu*alpha2 * g_contr[i][
j]*( dPP[k][
j] - dPP[
j][k])/(np*chi);
918 for (
int n = 0; n < 3; n++)
919 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]);
921 for (
int i = 0; i < 3; i++)
922 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]);
923 for (
int i = 0; i < 3; i++)
924 for (
int j = 0;
j < 3;
j++) dtB[i][
j] *= CCZ4sk;
926 double dtD[3][3][3] = {{{0.0}}};
927 for (
int i = 0; i < 3; i++)
928 for (
int j = 0;
j < 3;
j++)
929 for (
int k = 0; k < 3; k++) dtD[i][
j][k] = -alpha*dAex[i][
j][k];
930 for (
int i = 0; i < 3; i++)
931 for (
int j = 0;
j < 3;
j++)
932 for (
int k = 0; k < 3; k++)
933 for (
int m = 0; m < 3; m++)
935 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]);
936 for (
int n = 0; n < 3; n++)
938 dtD[k][i][
j] += 1./3*CCZ4helper*alpha*g_cov[i][
j]*g_contr[n][m]*dAex[k][n][m];
941 for (
int i = 0; i < 3; i++)
942 for (
int j = 0;
j < 3;
j++)
943 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]);
945 double dtP[3] = {0,0,0};
946 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]);
947 for (
int k = 0; k < 3; k++)
950 for (
int m = 0; m < 3; m++)
951 for (
int n = 0; n < 3; n++) temp += g_contr[m][n]*dAex[k][m][n];
952 dtP[k] += np/3.*chi*alpha*dtraceK[k];
953 dtP[k] += np/3.*CCZ4helper*chi*alpha*CCZ4sk*temp;
955 for (
int i = 0; i < 3; i++) dtP[k] -= np/6.*chi*(dBB[k][i][i] + dBB[i][k][i]);
958 double dtgamma[3][3] = {{0.0}};
960 double dtbeta[3] = {0.0};
963 BgradQ[0] = -dtgamma[0][0];
964 BgradQ[1] = -dtgamma[0][1];
965 BgradQ[2] = -dtgamma[0][2];
966 BgradQ[3] = -dtgamma[1][1];
967 BgradQ[4] = -dtgamma[1][2];
968 BgradQ[5] = -dtgamma[2][2];
969 BgradQ[6] = -dtK[0][0];
970 BgradQ[7] = -dtK[0][1];
971 BgradQ[8] = -dtK[0][2];
972 BgradQ[9] = -dtK[1][1];
973 BgradQ[10] = -dtK[1][2];
974 BgradQ[11] = -dtK[2][2];
976 BgradQ[12] = -dtTheta;
977 for (
int i = 0; i < 3; i++) BgradQ[13+i] = -dtGhat[i];
978 BgradQ[16] = -dtalpha;
979 for (
int i = 0; i < 3; i++) BgradQ[17+i] = -dtbeta[i];
980 for (
int i = 0; i < 3; i++) BgradQ[20+i] = -dtbb[i];
981 for (
int i = 0; i < 3; i++) BgradQ[23+i] = -dtA[i];
982 BgradQ[26] = -dtB[0][0];
983 BgradQ[27] = -dtB[0][1];
984 BgradQ[28] = -dtB[0][2];
985 BgradQ[29] = -dtB[1][0];
986 BgradQ[30] = -dtB[1][1];
987 BgradQ[31] = -dtB[1][2];
988 BgradQ[32] = -dtB[2][0];
989 BgradQ[33] = -dtB[2][1];
990 BgradQ[34] = -dtB[2][2];
992 BgradQ[35] = -dtD[0][0][0];
993 BgradQ[36] = -dtD[0][0][1];
994 BgradQ[37] = -dtD[0][0][2];
995 BgradQ[38] = -dtD[0][1][1];
996 BgradQ[39] = -dtD[0][1][2];
997 BgradQ[40] = -dtD[0][2][2];
999 BgradQ[41] = -dtD[1][0][0];
1000 BgradQ[42] = -dtD[1][0][1];
1001 BgradQ[43] = -dtD[1][0][2];
1002 BgradQ[44] = -dtD[1][1][1];
1003 BgradQ[45] = -dtD[1][1][2];
1004 BgradQ[46] = -dtD[1][2][2];
1006 BgradQ[47] = -dtD[2][0][0];
1007 BgradQ[48] = -dtD[2][0][1];
1008 BgradQ[49] = -dtD[2][0][2];
1009 BgradQ[50] = -dtD[2][1][1];
1010 BgradQ[51] = -dtD[2][1][2];
1011 BgradQ[52] = -dtD[2][2][2];
1012 BgradQ[53] = -dtTraceK;
1013 BgradQ[54] = -dtchi;
1014 for (
int i = 0; i < 3; i++) BgradQ[55+i] = -dtP[i];
1019 for (
int i = 23; i < 53; i++) BgradQ[i] = 0.0;
1020 for (
int i = 0; i < 3; i++) BgradQ[55+i] = 0.0;
static double min(double const x, double const y)
static void source(double *S, const double *const Q, const int CCZ4LapseType, const double CCZ4ds, const double CCZ4c, const double CCZ4e, const double CCZ4f, const double CCZ4bs, const double CCZ4sk, const double CCZ4xi, const double CCZ4itau, const double CCZ4eta, const double CCZ4k1, const double CCZ4k2, const double CCZ4k3, const double CCZ4SO)
The source term is one out of two terms that we use in our CCZ4 formulation.
static void ncp(double *BgradQ, const double *const Q, const double *const gradQSerialised, const int normal, const int CCZ4LapseType, const double CCZ4ds, const double CCZ4c, const double CCZ4e, const double CCZ4f, const double CCZ4bs, const double CCZ4sk, const double CCZ4xi, const double CCZ4mu, const double CCZ4SO)
static double maxEigenvalue(const double *const Q, int normal, const double CCZ4e, const double CCZ4ds, const double CCZ4GLMc, const double CCZ4GLMd)