1 #include "tarch/multicore/multicore.h"
10 #include "CCZ4Kernels.h"
14 const double* NOALIAS oldQ,
19 for (
int i=0; i<59; i++) {
23 for (
int i=0; i<59; i++) {
29 #if defined(WITH_GPU_OMP_TARGET)
30 #pragma omp declare target
34 double g_cov[3][3] = { {luh[0], luh[1], luh[2]}, {luh[1], luh[3], luh[4]}, {luh[2], luh[4], luh[5]} };
35 const double det = luh[0]*luh[3]*luh[5] - luh[0]*luh[4]*luh[4] - luh[1]*luh[1]*luh[5] + 2*luh[1]*luh[2]*luh[4] -luh[2]*luh[2]*luh[3];
37 const double phisq = 1./std::cbrt(det);
38 for (
int i = 0; i < 3; i++)
39 for (
int j = 0;
j < 3;
j++) g_cov[i][
j] *= phisq;
41 const double det2 = g_cov[0][0]*g_cov[1][1]*g_cov[2][2] -
42 g_cov[0][0]*g_cov[1][2]*g_cov[2][1] - g_cov[1][0]*g_cov[0][1]*g_cov[2][2] +
43 g_cov[1][0]*g_cov[0][2]*g_cov[2][1] + g_cov[2][0]*g_cov[0][1]*g_cov[1][2] -
44 g_cov[2][0]*g_cov[0][2]*g_cov[1][1];
47 const double invdet = 1./det2;
48 const double g_contr[3][3] = {
49 { ( g_cov[1][1]*g_cov[2][2]-g_cov[1][2]*g_cov[2][1])*invdet, -(g_cov[0][1]*g_cov[2][2]-g_cov[0][2]*g_cov[2][1])*invdet, -(-g_cov[0][1]*g_cov[1][2]+g_cov[0][2]*g_cov[1][1])*invdet},
50 {-( g_cov[1][0]*g_cov[2][2]-g_cov[1][2]*g_cov[2][0])*invdet, (g_cov[0][0]*g_cov[2][2]-g_cov[0][2]*g_cov[2][0])*invdet, -( g_cov[0][0]*g_cov[1][2]-g_cov[0][2]*g_cov[1][0])*invdet},
51 {-(-g_cov[1][0]*g_cov[2][1]+g_cov[1][1]*g_cov[2][0])*invdet, -(g_cov[0][0]*g_cov[2][1]-g_cov[0][1]*g_cov[2][0])*invdet, ( g_cov[0][0]*g_cov[1][1]-g_cov[0][1]*g_cov[1][0])*invdet}
53 double Aex[3][3] = { {luh[6], luh[7], luh[8]}, {luh[7], luh[9], luh[10]}, {luh[8], luh[10], luh[11]} };
57 for (
int j=0;
j<3;
j++) traceA += g_contr[i][
j]*Aex[i][
j];
60 for (
int j=0;
j<3;
j++) Aex[i][
j] -= 1./3. * traceA * g_cov[i][
j];
62 luh[ 0] = g_cov[0][0];
63 luh[ 1] = g_cov[0][1];
64 luh[ 2] = g_cov[0][2];
65 luh[ 3] = g_cov[1][1];
66 luh[ 4] = g_cov[1][2];
67 luh[ 5] = g_cov[2][2];
77 luh[16]=std::fmax(1e-16,luh[16]);
78 luh[54]=std::fmax(1e-16,luh[54]);
89 double DD[3][3][3] = {
90 {{luh[35], luh[36], luh[37]}, {luh[36], luh[38], luh[39]}, {luh[37], luh[39], luh[40]}},
91 {{luh[41], luh[42], luh[43]}, {luh[42], luh[44], luh[45]}, {luh[43], luh[45], luh[46]}},
92 {{luh[47], luh[48], luh[49]}, {luh[48], luh[50], luh[51]}, {luh[49], luh[51], luh[52]}}
99 for (
int j=0;
j<3;
j++) traceDk += g_contr[i][
j]*DD[l][i][
j];
101 for (
int i=0;i<3;i++)
102 for (
int j=0;
j<3;
j++) DD[l][i][
j] -= 1./3 * g_cov[i][
j]*traceDk;
105 luh[35] = DD[0][0][0];
106 luh[36] = DD[0][0][1];
107 luh[37] = DD[0][0][2];
108 luh[38] = DD[0][1][1];
109 luh[39] = DD[0][1][2];
110 luh[40] = DD[0][2][2];
112 luh[41] = DD[1][0][0];
113 luh[42] = DD[1][0][1];
114 luh[43] = DD[1][0][2];
115 luh[44] = DD[1][1][1];
116 luh[45] = DD[1][1][2];
117 luh[46] = DD[1][2][2];
119 luh[47] = DD[2][0][0];
120 luh[48] = DD[2][0][1];
121 luh[49] = DD[2][0][2];
122 luh[50] = DD[2][1][1];
123 luh[51] = DD[2][1][2];
124 luh[52] = DD[2][2][2];
126 #if defined(WITH_GPU_OMP_TARGET)
127 #pragma omp end declare target
130 #if defined(WITH_GPU_OMP_TARGET)
131 #pragma omp declare target
135 constexpr
int nVar(59);
136 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};
139 for (
int normal=0; normal<3; normal++)
140 for (
int i=0; i<nVar; i++) gradQin[i][normal] = gradQSerialised[i+normal*nVar];
143 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
144 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]);
146 const double g_contr[3][3] = {
147 { ( 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},
148 {-( 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},
149 {-(-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}
153 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
156 for (
int i=0;i<3;i++)
157 for (
int j=0;
j<3;
j++) traceA+=g_contr[i][
j]*Aex[i][
j];
160 for (
int i=0;i<3;i++)
161 for (
int j=0;
j<3;
j++) Aex[i][
j] -= traceA * g_cov[i][
j];
163 const double dAex[3][3][3] = {
164 {{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]}},
165 {{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]}},
166 {{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]}}
169 const double traceK = Q[53];
170 const double dtraceK[3] = {gradQin[53][0], gradQin[53][1], gradQin[53][2]};
172 const double phi = std::fmax(1e-2,Q[54]);
173 const double phi2 = phi*phi;
174 const double PP[3] = {Q[55], Q[56], Q[57]};
176 const double dPP[3][3] = {
177 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
178 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
179 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
182 const double DD[3][3][3] = {
183 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
184 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
185 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
187 const double dDD[3][3][3][3] = {
190 {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]},
193 {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]},
196 {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]}
201 {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]},
204 {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]},
207 {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]}
212 {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]},
215 {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]},
218 {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]}
223 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};
224 for (
int k = 0; k < 3; k++)
225 for (
int m = 0; m < 3; m++)
226 for (
int l = 0; l < 3; l++)
227 for (
int n = 0; n < 3; n++)
228 for (
int j = 0;
j < 3;
j++) dgup[k][m][l] -= g_contr[m][n]*g_contr[
j][l]*2*DD[k][n][
j];
230 double Kex[3][3]={ 0 };
231 for (
int i=0;i<3;i++)
232 for (
int j=0;
j<3;
j++) Kex[i][
j]=Aex[i][
j]/phi2 + (1./3)*traceK*g_cov[i][
j]/phi2;
233 double Kmix[3][3]={0,0,0,0,0,0,0,0,0};
234 for (
int i = 0; i < 3; i++)
235 for (
int j = 0;
j < 3;
j++)
236 for (
int u = 0;
u < 3;
u++) Kmix[i][
j] += phi2*g_contr[i][
u] * Kex[
u][
j];
237 double Kup[3][3]={0,0,0,0,0,0,0,0,0};
238 for (
int i = 0; i < 3; i++)
239 for (
int j = 0;
j < 3;
j++)
240 for (
int u = 0;
u < 3;
u++) Kup[i][
j] += phi2*g_contr[i][
u] * Kmix[
j][
u];
242 double Christoffel[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};
243 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};
244 for (
int j = 0;
j < 3;
j++)
245 for (
int i = 0; i < 3; i++)
246 for (
int k = 0; k < 3; k++)
247 for (
int l = 0; l < 3; l++) {
248 Christoffel_tilde[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] );
249 Christoffel[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] ) - g_contr[k][l]/phi * ( g_cov[
j][l] * PP[i] + g_cov[i][l] * PP[
j] - g_cov[i][
j] * PP[l] );
252 double dChristoffel[3][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,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};
253 double dChristoffel_tilde[3][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,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};
255 for (
int i = 0; i < 3; i++)
256 for (
int j = 0;
j < 3;
j++)
257 for (
int m = 0; m < 3; m++)
258 for (
int k = 0; k < 3; k++)
259 for (
int l = 0; l < 3; l++)
261 dChristoffel[k][i][
j][m] += 0.5*g_contr[m][l] * (
262 dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]
263 - g_cov[
j][l]*(dPP[k][i] + dPP[i][k])/phi - g_cov[i][l]*(dPP[k][
j]+dPP[
j][k])/phi + g_cov[i][
j]*(dPP[k][l]+dPP[l][k])/phi )
264 +dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
265 -dgup[k][m][l]*(g_cov[
j][l]*PP[i]+g_cov[i][l]*PP[
j]-g_cov[i][
j]*PP[l])/phi
266 -2*g_contr[m][l]*(DD[k][
j][l]*PP[i]+DD[k][i][l]*PP[
j]-DD[k][i][
j]*PP[l])/phi
267 +g_contr[m][l]*(g_cov[
j][l]*PP[i]*PP[k]+g_cov[i][l]*PP[
j]*PP[k]-g_cov[i][
j]*PP[k]*PP[l])/phi2;
269 dChristoffel_tilde[k][i][
j][m] += dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
270 +0.5*g_contr[m][l]*(dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]);
273 double Riemann[3][3][3][3] = {0};
274 for (
int i = 0; i < 3; i++)
275 for (
int j = 0;
j < 3;
j++)
276 for (
int m = 0; m < 3; m++)
277 for (
int k = 0; k < 3; k++){
278 Riemann[i][k][
j][m] = dChristoffel[k][i][
j][m] - dChristoffel[
j][i][k][m];
279 for (
int l = 0; l < 3; l++){
280 Riemann[i][k][
j][m] += Christoffel[i][
j][l]*Christoffel[l][k][m]-Christoffel[i][k][l]*Christoffel[l][
j][m];
284 double Ricci[3][3] = {0,0,0,0,0,0,0,0,0};
285 for (
int m = 0; m < 3; m++)
286 for (
int n = 0; n < 3; n++)
287 for (
int l = 0; l < 3; l++) Ricci[m][n] += Riemann[m][l][n][l];
290 for (
int i = 0; i < 3; i++)
291 for (
int j = 0;
j < 3;
j++) R += phi2*g_contr[i][
j]*Ricci[i][
j];
293 for (
int i = 0; i < 3; i++)
294 for (
int j = 0;
j < 3;
j++) Kupdown += Kex[i][
j]*Kup[i][
j];
297 double Gtilde[3] = {0,0,0};
298 for (
int l = 0; l < 3; l++)
299 for (
int j = 0;
j < 3;
j++)
300 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[
j][l] * Christoffel_tilde[
j][l][i];
302 const double Ghat[3] = {Q[13], Q[14], Q[15]};
304 const double dGhat[3][3] = {
305 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
306 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
307 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
310 double dGtilde[3][3] = {0,0,0,0,0,0,0,0,0};
311 for (
int i = 0; i < 3; i++)
312 for (
int k = 0; k < 3; k++)
313 for (
int j = 0;
j < 3;
j++)
314 for (
int l = 0; l < 3; l++) dGtilde[k][i] += dgup[k][
j][l]*Christoffel_tilde[
j][l][i]+g_contr[
j][l]*dChristoffel_tilde[k][
j][l][i];
316 double Z[3] = {0,0,0};
317 for (
int i=0;i<3;i++)
318 for (
int j=0;
j<3;
j++) Z[i] += 0.5* g_cov[i][
j]* (Ghat[
j] - Gtilde[
j]);
320 double dZ[3][3] = {0,0,0,0,0,0,0,0,0};
321 for (
int j = 0;
j < 3;
j++)
322 for (
int i = 0; i < 3; i++)
323 for (
int k = 0; k < 3; k++) dZ[k][i] += DD[k][i][
j]*(Ghat[
j]-Gtilde[
j])+0.5*g_cov[i][
j]*(dGhat[k][
j]-dGtilde[k][
j]);
325 double nablaZ[3][3] = {0,0,0,0,0,0,0,0,0};
326 for (
int j = 0;
j < 3;
j++)
327 for (
int i = 0; i < 3; i++)
329 nablaZ[i][
j] = dZ[i][
j];
330 for (
int k = 0; k < 3; k++) nablaZ[i][
j] -= Christoffel[i][
j][k]*Z[k];
333 double nablaZcontracted=0;
334 for (
int i = 0; i < 3; i++)
335 for (
int j = 0;
j < 3;
j++) nablaZcontracted += g_contr[i][
j]*nablaZ[i][
j];
336 nablaZcontracted*=phi2;
341 Ham = R-Kupdown+traceK*traceK;
343 double dKex[3][3][3]={0};
344 for (
int i = 0; i < 3; i++)
345 for (
int j = 0;
j < 3;
j++)
346 for (
int k = 0; k < 3; k++) dKex[k][i][
j] = (1.0/phi2)*(dAex[k][i][
j]+(1./3)*g_cov[i][
j]*dtraceK[k]+(2./3)*traceK*DD[k][i][
j])-2*Kex[i][
j]*PP[k]/phi;
348 double Mom[3]={0,0,0};
349 for (
int i = 0; i < 3; i++)
350 for (
int j = 0;
j < 3;
j++)
351 for (
int l = 0; l < 3; l++){
352 Mom[i] += phi2*g_contr[
j][l]*(dKex[l][i][
j]-dKex[i][
j][l]);
353 for (
int m = 0; m < 3; m++){
354 Mom[i] += phi2*g_contr[
j][l]*(-Christoffel[
j][l][m]*Kex[m][i]+Christoffel[
j][i][m]*Kex[m][l]);
358 std::memset(constraints, 0, 4*
sizeof(
double));
360 constraints[0] = Ham;
361 constraints[1] = Mom[0];
362 constraints[2] = Mom[1];
363 constraints[3] = Mom[2];
370 #if defined(WITH_GPU_OMP_TARGET)
371 #pragma omp end declare target
374 #if defined(WITH_GPU_OMP_TARGET)
375 #pragma omp declare target
379 constexpr
int nVar(59);
380 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};
383 for (
int normal=0; normal<3; normal++)
384 for (
int i=0; i<nVar; i++) gradQin[i][normal] = gradQSerialised[i+normal*nVar];
387 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
388 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]);
390 const double g_contr[3][3] = {
391 { ( 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},
392 {-( 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},
393 {-(-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}
397 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
400 for (
int i=0;i<3;i++)
401 for (
int j=0;
j<3;
j++) traceA+=g_contr[i][
j]*Aex[i][
j];
404 for (
int i=0;i<3;i++)
405 for (
int j=0;
j<3;
j++) Aex[i][
j] -= traceA * g_cov[i][
j];
407 const double dAex[3][3][3] = {
408 {{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]}},
409 {{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]}},
410 {{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]}}
413 const double traceK = Q[53];
414 const double dtraceK[3] = {gradQin[53][0], gradQin[53][1], gradQin[53][2]};
416 const double phi = std::fmax(1e-2,Q[54]); ;
417 const double phi2 = phi*phi;
418 const double PP[3] = {Q[55], Q[56], Q[57]};
420 const double dPP[3][3] = {
421 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
422 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
423 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
426 const double DD[3][3][3] = {
427 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
428 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
429 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
431 const double dDD[3][3][3][3] = {
434 {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]},
437 {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]},
440 {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]}
445 {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]},
448 {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]},
451 {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]}
456 {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]},
459 {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]},
462 {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]}
467 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};
468 for (
int k = 0; k < 3; k++)
469 for (
int m = 0; m < 3; m++)
470 for (
int l = 0; l < 3; l++)
471 for (
int n = 0; n < 3; n++)
472 for (
int j = 0;
j < 3;
j++) dgup[k][m][l] -= g_contr[m][n]*g_contr[
j][l]*2*DD[k][n][
j];
474 double Kex[3][3]={ 0 };
475 for (
int i=0;i<3;i++)
476 for (
int j=0;
j<3;
j++) Kex[i][
j]=Aex[i][
j]/phi2 + (1./3)*traceK*g_cov[i][
j]/phi2;
478 double Christoffel[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};
479 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};
480 for (
int j = 0;
j < 3;
j++)
481 for (
int i = 0; i < 3; i++)
482 for (
int k = 0; k < 3; k++)
483 for (
int l = 0; l < 3; l++) {
484 Christoffel_tilde[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] );
485 Christoffel[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] ) - g_contr[k][l]/phi * ( g_cov[
j][l] * PP[i] + g_cov[i][l] * PP[
j] - g_cov[i][
j] * PP[l] );
488 double dChristoffel[3][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,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};
489 double dChristoffel_tilde[3][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,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};
491 for (
int i = 0; i < 3; i++)
492 for (
int j = 0;
j < 3;
j++)
493 for (
int m = 0; m < 3; m++)
494 for (
int k = 0; k < 3; k++)
495 for (
int l = 0; l < 3; l++)
497 dChristoffel[k][i][
j][m] += 0.5*g_contr[m][l] * (
498 dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]
499 - g_cov[
j][l]*(dPP[k][i] + dPP[i][k])/phi - g_cov[i][l]*(dPP[k][
j]+dPP[
j][k])/phi + g_cov[i][
j]*(dPP[k][l]+dPP[l][k])/phi )
500 +dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
501 -dgup[k][m][l]*(g_cov[
j][l]*PP[i]+g_cov[i][l]*PP[
j]-g_cov[i][
j]*PP[l])/phi
502 -2*g_contr[m][l]*(DD[k][
j][l]*PP[i]+DD[k][i][l]*PP[
j]-DD[k][i][
j]*PP[l])/phi
503 +g_contr[m][l]*(g_cov[
j][l]*PP[i]*PP[k]+g_cov[i][l]*PP[
j]*PP[k]-g_cov[i][
j]*PP[k]*PP[l])/phi2;
505 dChristoffel_tilde[k][i][
j][m] += dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
506 +0.5*g_contr[m][l]*(dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]);
509 double Gtilde[3] = {0,0,0};
510 for (
int l = 0; l < 3; l++)
511 for (
int j = 0;
j < 3;
j++)
512 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[
j][l] * Christoffel_tilde[
j][l][i];
514 const double Theta = Q[12];
515 const double Ghat[3] = {Q[13], Q[14], Q[15]};
517 double Z[3] = {0,0,0};
518 for (
int i=0;i<3;i++)
519 for (
int j=0;
j<3;
j++) Z[i] += 0.5* g_cov[i][
j]* (Ghat[
j] - Gtilde[
j]);
521 const double dGhat[3][3] = {
522 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
523 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
524 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
527 double dGtilde[3][3] = {0,0,0,0,0,0,0,0,0};
528 for (
int i = 0; i < 3; i++)
529 for (
int k = 0; k < 3; k++)
530 for (
int j = 0;
j < 3;
j++)
531 for (
int l = 0; l < 3; l++) dGtilde[k][i] += dgup[k][
j][l]*Christoffel_tilde[
j][l][i]+g_contr[
j][l]*dChristoffel_tilde[k][
j][l][i];
533 double dZ[3][3] = {0,0,0,0,0,0,0,0,0};
534 for (
int j = 0;
j < 3;
j++)
535 for (
int i = 0; i < 3; i++)
536 for (
int k = 0; k < 3; k++) dZ[k][i] += DD[k][i][
j]*(Ghat[
j]-Gtilde[
j])+0.5*g_cov[i][
j]*(dGhat[k][
j]-dGtilde[k][
j]);
538 double nablaZ[3][3] = {0,0,0,0,0,0,0,0,0};
539 for (
int j = 0;
j < 3;
j++)
540 for (
int i = 0; i < 3; i++)
542 nablaZ[i][
j] = dZ[i][
j];
543 for (
int k = 0; k < 3; k++) nablaZ[i][
j] -= Christoffel[i][
j][k]*Z[k];
547 double Riemann[3][3][3][3] = {0};
548 for (
int i = 0; i < 3; i++)
549 for (
int j = 0;
j < 3;
j++)
550 for (
int m = 0; m < 3; m++)
551 for (
int k = 0; k < 3; k++){
552 Riemann[i][k][
j][m] = dChristoffel[k][i][
j][m] - dChristoffel[
j][i][k][m];
553 for (
int l = 0; l < 3; l++){
554 Riemann[i][k][
j][m] += Christoffel[i][
j][l]*Christoffel[l][k][m]-Christoffel[i][k][l]*Christoffel[l][
j][m];
558 double Ricci[3][3] = {0,0,0,0,0,0,0,0,0};
559 for (
int m = 0; m < 3; m++)
560 for (
int n = 0; n < 3; n++)
561 for (
int l = 0; l < 3; l++) Ricci[m][n] += Riemann[m][l][n][l];
563 double dKex[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};
564 for (
int j = 0;
j < 3;
j++)
565 for (
int i = 0; i < 3; i++)
566 for (
int k = 0; k < 3; k++) dKex[k][i][
j] = (1.0/phi2)*(dAex[k][i][
j]+(1./3)*g_cov[i][
j]*dtraceK[k]+(2./3)*traceK*DD[k][i][
j])-2*Kex[i][
j]*PP[k]/phi;
568 double Cov_dKex[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};
569 for (
int j = 0;
j < 3;
j++)
570 for (
int i = 0; i < 3; i++)
571 for (
int k = 0; k < 3; k++)
572 for (
int m = 0; m < 3; m++) Cov_dKex[i][
j][k] += dKex[i][
j][k]-Christoffel[i][k][m]*Kex[
j][m]-Christoffel[i][
j][m]*Kex[m][k];
574 const double detgd=(1.0/(phi2*phi2*phi2))*( 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]);
576 double eps_lc_u[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};
577 double eps_lc_symbol[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};
578 eps_lc_u[0][1][2] = 1/pow(detgd,0.5); eps_lc_u[1][2][0] = 1/pow(detgd,0.5); eps_lc_u[2][0][1] = 1/pow(detgd,0.5);
579 eps_lc_u[2][1][0] =-1/pow(detgd,0.5); eps_lc_u[0][2][1] =-1/pow(detgd,0.5); eps_lc_u[1][0][2] =-1/pow(detgd,0.5);
580 for (
int j = 0;
j < 3;
j++)
581 for (
int i = 0; i < 3; i++)
582 for (
int k = 0; k < 3; k++) {
583 eps_lc_symbol[i][
j][k] = eps_lc_u[i][
j][k] * pow(detgd,0.5);
584 if (detgd<0){ eps_lc_u[i][
j][k]= - eps_lc_u[i][
j][k]; }
592 double v_vec[3]={-
coor[2],
coor[1], 0.0};
594 double w_vec[3]={0,0,0};
595 for (
int j = 0;
j < 3;
j++)
596 for (
int i = 0; i < 3; i++)
597 for (
int k = 0; k < 3; k++)
598 for (
int l = 0; l < 3; l++) w_vec[i] += phi2*g_contr[i][
j]*eps_lc_symbol[
j][k][l]*v_vec[k]*u_vec[l];
602 for (
int j = 0;
j < 3;
j++)
603 for (
int i = 0; i < 3; i++) dotp1 += g_cov[i][
j]*v_vec[i]*v_vec[
j]/phi2;
604 for (
int a = 0; a < 3; a++) v_vec[a] = v_vec[a] / pow(dotp1,0.5);
607 for (
int j = 0;
j < 3;
j++)
608 for (
int i = 0; i < 3; i++) dotp1 += g_cov[i][
j]*v_vec[i]*u_vec[
j]/phi2;
609 for (
int a = 0; a < 3; a++) u_vec[a] = u_vec[a] - dotp1* v_vec[a];
612 for (
int j = 0;
j < 3;
j++)
613 for (
int i = 0; i < 3; i++) dotp1 += g_cov[i][
j]*u_vec[i]*u_vec[
j]/phi2;
614 for (
int a = 0; a < 3; a++) u_vec[a] = u_vec[a] / pow(dotp1,0.5);
617 for (
int j = 0;
j < 3;
j++)
618 for (
int i = 0; i < 3; i++) dotp1 += g_cov[i][
j]*v_vec[i]*w_vec[
j]/phi2;
620 for (
int j = 0;
j < 3;
j++)
621 for (
int i = 0; i < 3; i++) dotp2 += g_cov[i][
j]*u_vec[i]*w_vec[
j]/phi2;
623 for (
int a = 0; a < 3; a++) w_vec[a] = u_vec[a] - dotp1 * v_vec[a] - dotp2 * u_vec[a];
626 for (
int j = 0;
j < 3;
j++)
627 for (
int i = 0; i < 3; i++) dotp1 += g_cov[i][
j]*w_vec[i]*w_vec[
j]/phi2;
628 for (
int a = 0; a < 3; a++) w_vec[a] = w_vec[a] / pow(dotp1,0.5);
633 double elec[3][3] = {0,0,0,0,0,0,0,0,0};
634 double mag[3][3] = {0,0,0,0,0,0,0,0,0};
635 for (
int i = 0; i < 3; i++)
636 for (
int j = 0;
j < 3;
j++){
637 elec[i][
j]=Ricci[i][
j];
638 for (
int m = 0; m < 3; m++)
639 for (
int k = 0; k < 3; k++){
640 elec[i][
j] += phi2*g_contr[m][k]*(Kex[i][
j]*Kex[m][k]-Kex[i][m]*Kex[k][
j])-Kex[i][
j]*
Theta + 0.5*(nablaZ[i][
j]+nablaZ[
j][i]);
641 for (
int l = 0; l < 3; l++){
642 mag[i][
j] += g_cov[i][l] * eps_lc_u[l][k][m] * Cov_dKex[k][m][
j] + g_cov[
j][l] * eps_lc_u[l][k][m] * Cov_dKex[k][m][i];
645 mag[i][
j]=mag[i][
j]/(2*phi2);
648 double electr=0, magtr=0;
649 for (
int i = 0; i < 3; i++)
650 for (
int j = 0;
j < 3;
j++){
651 electr += phi2*g_contr[i][
j]*elec[i][
j];
652 magtr += phi2*g_contr[i][
j]*mag[i][
j];
654 for (
int i = 0; i < 3; i++)
655 for (
int j = 0;
j < 3;
j++){
656 elec[i][
j] = elec[i][
j] - g_cov[i][
j]*electr / (3*phi2);
657 mag[i][
j] = mag[i][
j] - g_cov[i][
j]*magtr / (3*phi2);
662 Psi4[0]=0.0; Psi4[1]=0.0;
663 for (
int i = 0; i < 3; i++)
664 for (
int j = 0;
j < 3;
j++){
666 Psi4[0] += 0.5*elec[i][
j]*(w_vec[i]*w_vec[
j]-v_vec[i]*v_vec[
j])-0.5*mag[i][
j]*(v_vec[i]*w_vec[
j]+v_vec[
j]*w_vec[i]);
668 Psi4[1] += - 0.5*elec[i][
j]*(v_vec[i]*w_vec[
j]+v_vec[
j]*w_vec[i])-0.5*mag[i][
j]*(w_vec[i]*w_vec[
j]-v_vec[i]*v_vec[
j]);
672 #if defined(WITH_GPU_OMP_TARGET)
673 #pragma omp end declare target
676 #if defined(WITH_GPU_OMP_TARGET)
677 #pragma omp declare target
681 constexpr
int nVar(59);
682 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};
685 for (
int normal=0; normal<3; normal++)
686 for (
int i=0; i<nVar; i++) gradQin[i][normal] = gradQSerialised[i+normal*nVar];
689 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
690 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]);
692 const double g_contr[3][3] = {
693 { ( 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},
694 {-( 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},
695 {-(-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}
699 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
702 for (
int i=0;i<3;i++)
703 for (
int j=0;
j<3;
j++) traceA+=g_contr[i][
j]*Aex[i][
j];
706 for (
int i=0;i<3;i++)
707 for (
int j=0;
j<3;
j++) Aex[i][
j] -= traceA * g_cov[i][
j];
709 const double dAex[3][3][3] = {
710 {{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]}},
711 {{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]}},
712 {{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]}}
715 const double traceK = Q[53];
716 const double dtraceK[3] = {gradQin[53][0], gradQin[53][1], gradQin[53][2]};
718 const double phi = std::fmax(1e-2,Q[54]);
719 const double phi2 = phi*phi;
720 const double PP[3] = {Q[55], Q[56], Q[57]};
722 const double dPP[3][3] = {
723 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
724 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
725 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
728 const double DD[3][3][3] = {
729 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
730 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
731 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
733 const double dDD[3][3][3][3] = {
736 {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]},
739 {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]},
742 {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]}
747 {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]},
750 {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]},
753 {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]}
758 {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]},
761 {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]},
764 {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]}
769 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};
770 for (
int k = 0; k < 3; k++)
771 for (
int m = 0; m < 3; m++)
772 for (
int l = 0; l < 3; l++)
773 for (
int n = 0; n < 3; n++)
774 for (
int j = 0;
j < 3;
j++) dgup[k][m][l] -= g_contr[m][n]*g_contr[
j][l]*2*DD[k][n][
j];
776 double Kex[3][3]={ 0 };
777 for (
int i=0;i<3;i++)
778 for (
int j=0;
j<3;
j++) Kex[i][
j]=Aex[i][
j]/phi2 + (1./3)*traceK*g_cov[i][
j]/phi2;
779 double Kmix[3][3]={0,0,0,0,0,0,0,0,0};
780 for (
int i = 0; i < 3; i++)
781 for (
int j = 0;
j < 3;
j++)
782 for (
int u = 0;
u < 3;
u++) Kmix[i][
j] += phi2*g_contr[i][
u] * Kex[
u][
j];
783 double Kup[3][3]={0,0,0,0,0,0,0,0,0};
784 for (
int i = 0; i < 3; i++)
785 for (
int j = 0;
j < 3;
j++)
786 for (
int u = 0;
u < 3;
u++) Kup[i][
j] += phi2*g_contr[i][
u] * Kmix[
j][
u];
788 double Christoffel[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};
789 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};
790 for (
int j = 0;
j < 3;
j++)
791 for (
int i = 0; i < 3; i++)
792 for (
int k = 0; k < 3; k++)
793 for (
int l = 0; l < 3; l++) {
794 Christoffel_tilde[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] );
795 Christoffel[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] ) - g_contr[k][l]/phi * ( g_cov[
j][l] * PP[i] + g_cov[i][l] * PP[
j] - g_cov[i][
j] * PP[l] );
798 double dChristoffel[3][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,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};
799 double dChristoffel_tilde[3][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,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};
801 for (
int i = 0; i < 3; i++)
802 for (
int j = 0;
j < 3;
j++)
803 for (
int m = 0; m < 3; m++)
804 for (
int k = 0; k < 3; k++)
805 for (
int l = 0; l < 3; l++)
807 dChristoffel[k][i][
j][m] += 0.5*g_contr[m][l] * (
808 dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]
809 - g_cov[
j][l]*(dPP[k][i] + dPP[i][k])/phi - g_cov[i][l]*(dPP[k][
j]+dPP[
j][k])/phi + g_cov[i][
j]*(dPP[k][l]+dPP[l][k])/phi )
810 +dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
811 -dgup[k][m][l]*(g_cov[
j][l]*PP[i]+g_cov[i][l]*PP[
j]-g_cov[i][
j]*PP[l])/phi
812 -2*g_contr[m][l]*(DD[k][
j][l]*PP[i]+DD[k][i][l]*PP[
j]-DD[k][i][
j]*PP[l])/phi
813 +g_contr[m][l]*(g_cov[
j][l]*PP[i]*PP[k]+g_cov[i][l]*PP[
j]*PP[k]-g_cov[i][
j]*PP[k]*PP[l])/phi2;
815 dChristoffel_tilde[k][i][
j][m] += dgup[k][m][l]*(DD[i][
j][l]+DD[
j][i][l]-DD[l][i][
j])
816 +0.5*g_contr[m][l]*(dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]);
819 double Riemann[3][3][3][3] = {0};
820 for (
int i = 0; i < 3; i++)
821 for (
int j = 0;
j < 3;
j++)
822 for (
int m = 0; m < 3; m++)
823 for (
int k = 0; k < 3; k++){
824 Riemann[i][k][
j][m] = dChristoffel[k][i][
j][m] - dChristoffel[
j][i][k][m];
825 for (
int l = 0; l < 3; l++){
826 Riemann[i][k][
j][m] += Christoffel[i][
j][l]*Christoffel[l][k][m]-Christoffel[i][k][l]*Christoffel[l][
j][m];
830 double Ricci[3][3] = {0,0,0,0,0,0,0,0,0};
831 for (
int m = 0; m < 3; m++)
832 for (
int n = 0; n < 3; n++)
833 for (
int l = 0; l < 3; l++) Ricci[m][n] += Riemann[m][l][n][l];
836 for (
int i = 0; i < 3; i++)
837 for (
int j = 0;
j < 3;
j++) R += phi2*g_contr[i][
j]*Ricci[i][
j];
839 for (
int i = 0; i < 3; i++)
840 for (
int j = 0;
j < 3;
j++) Kupdown += Kex[i][
j]*Kup[i][
j];
843 double Gtilde[3] = {0,0,0};
844 for (
int l = 0; l < 3; l++)
845 for (
int j = 0;
j < 3;
j++)
846 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[
j][l] * Christoffel_tilde[
j][l][i];
848 const double Ghat[3] = {Q[13], Q[14], Q[15]};
850 const double dGhat[3][3] = {
851 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
852 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
853 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
856 double dGtilde[3][3] = {0,0,0,0,0,0,0,0,0};
857 for (
int i = 0; i < 3; i++)
858 for (
int k = 0; k < 3; k++)
859 for (
int j = 0;
j < 3;
j++)
860 for (
int l = 0; l < 3; l++) dGtilde[k][i] += dgup[k][
j][l]*Christoffel_tilde[
j][l][i]+g_contr[
j][l]*dChristoffel_tilde[k][
j][l][i];
862 double Z[3] = {0,0,0};
863 for (
int i=0;i<3;i++)
864 for (
int j=0;
j<3;
j++) Z[i] += 0.5* g_cov[i][
j]* (Ghat[
j] - Gtilde[
j]);
866 double dZ[3][3] = {0,0,0,0,0,0,0,0,0};
867 for (
int j = 0;
j < 3;
j++)
868 for (
int i = 0; i < 3; i++)
869 for (
int k = 0; k < 3; k++) dZ[k][i] += DD[k][i][
j]*(Ghat[
j]-Gtilde[
j])+0.5*g_cov[i][
j]*(dGhat[k][
j]-dGtilde[k][
j]);
871 double nablaZ[3][3] = {0,0,0,0,0,0,0,0,0};
872 for (
int j = 0;
j < 3;
j++)
873 for (
int i = 0; i < 3; i++)
875 nablaZ[i][
j] = dZ[i][
j];
876 for (
int k = 0; k < 3; k++) nablaZ[i][
j] -= Christoffel[i][
j][k]*Z[k];
879 double nablaZcontracted=0;
880 for (
int i = 0; i < 3; i++)
881 for (
int j = 0;
j < 3;
j++) nablaZcontracted += g_contr[i][
j]*nablaZ[i][
j];
882 nablaZcontracted*=phi2;
887 Ham = R-Kupdown+traceK*traceK;
889 double dKex[3][3][3]={0};
890 for (
int i = 0; i < 3; i++)
891 for (
int j = 0;
j < 3;
j++)
892 for (
int k = 0; k < 3; k++) dKex[k][i][
j] = (1.0/phi2)*(dAex[k][i][
j]+(1./3)*g_cov[i][
j]*dtraceK[k]+(2./3)*traceK*DD[k][i][
j])-2*Kex[i][
j]*PP[k]/phi;
894 double Mom[3]={0,0,0};
895 for (
int i = 0; i < 3; i++)
896 for (
int j = 0;
j < 3;
j++)
897 for (
int l = 0; l < 3; l++){
898 Mom[i] += phi2*g_contr[
j][l]*(dKex[l][i][
j]-dKex[i][
j][l]);
899 for (
int m = 0; m < 3; m++){
900 Mom[i] += phi2*g_contr[
j][l]*(-Christoffel[
j][l][m]*Kex[m][i]+Christoffel[
j][i][m]*Kex[m][l]);
904 std::memset(terms, 0, 15*
sizeof(
double));
911 terms[6] = nablaZcontracted;
913 const double alpha = std::fmax(1e-4,Q[16]);
914 const double dBB[3][3][3] = {
916 { gradQin[26][0], gradQin[27][0], gradQin[28][0]}, { gradQin[29][0], gradQin[30][0], gradQin[31][0]}, { gradQin[32][0], gradQin[33][0], gradQin[34][0]}
919 { gradQin[26][1], gradQin[27][1], gradQin[28][1]}, { gradQin[29][1], gradQin[30][1], gradQin[31][1]}, { gradQin[32][1], gradQin[33][1], gradQin[34][1]}
922 { gradQin[26][2], gradQin[27][2], gradQin[28][2]}, { gradQin[29][2], gradQin[30][2], gradQin[31][2]}, { gradQin[32][2], gradQin[33][2], gradQin[34][2]}
925 const double BB[3][3] = {
926 {Q[26], Q[27], Q[28]}, {Q[29], Q[30], Q[31]}, {Q[32], Q[33], Q[34]}
928 double traceB = BB[0][0] + BB[1][1] + BB[2][2];
929 const double AA[3] = {Q[23], Q[24], Q[25]};
931 for (
int l = 0; l < 3; l++) terms[7]+=BB[0][l]*PP[l];
932 terms[8] = (1.0/3.0)*alpha*traceK*PP[0];
933 terms[9] = -(1.0/3.0)*traceB*PP[0];
934 terms[10]= (1.0/3.0)*phi*alpha*dtraceK[0];
935 terms[11]= (1.0/3.0)*phi*traceK*AA[0];
936 for (
int l = 0; l < 3; l++) terms[12] -= 1./6.*phi*(dBB[0][l][l] + dBB[l][0][l]);
938 for (
int m = 0; m < 3; m++)
939 for (
int n = 0; n < 3; n++) temp += g_contr[m][n]*dAex[0][m][n];
940 terms[13] += 1./3.*alpha*temp;
942 for (
int i = 0; i < 3; i++)
943 for (
int j = 0;
j < 3;
j++) temp += dgup[0][i][
j]*Aex[i][
j];
944 terms[14] += 1./3.*alpha*temp;
949 #if defined(WITH_GPU_OMP_TARGET)
950 #pragma omp end declare target
953 #if defined(WITH_GPU_OMP_TARGET)
954 #pragma omp declare target
958 const double alpha = std::exp(std::fmax(-20., std::fmin(20.,Q[16])));
960 const double alpha2 = alpha*alpha;
965 const double traceK = Q[53];
967 constexpr
int nVar(59);
969 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};
971 for (
int i=0; i<nVar; i++) {
972 gradQin[i][normal] = gradQSerialised[i];
977 const double g_cov[3][3] = { {Q[0], Q[1], Q[2]}, {Q[1], Q[3], Q[4]}, {Q[2], Q[4], Q[5]} };
978 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]);
980 const double g_contr[3][3] = {
981 { ( 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},
982 {-( 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},
983 {-(-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}
985 const double dPP[3][3] = {
986 {gradQin[55][0],gradQin[56][0],gradQin[57][0]},
987 {gradQin[55][1],gradQin[56][1],gradQin[57][1]},
988 {gradQin[55][2],gradQin[56][2],gradQin[57][2]}
992 double Aex[3][3] = { {Q[6], Q[7], Q[8]}, {Q[7], Q[9], Q[10]}, {Q[8], Q[10], Q[11]} };
995 for (
int i=0;i<3;i++)
996 for (
int j=0;
j<3;
j++) traceA+=g_contr[i][
j]*Aex[i][
j];
999 for (
int i=0;i<3;i++)
1000 for (
int j=0;
j<3;
j++) Aex[i][
j] -= 1./3. * traceA * g_cov[i][
j];
1003 double Amix[3][3]={0,0,0,0,0,0,0,0,0};
1004 for (
int i = 0; i < 3; i++)
1005 for (
int j = 0;
j < 3;
j++)
1006 for (
int u = 0;
u < 3;
u++) Amix[i][
j] += g_contr[i][
u] * Aex[
u][
j];
1007 double Aup[3][3]={0,0,0,0,0,0,0,0,0};
1008 for (
int i = 0; i < 3; i++)
1009 for (
int j = 0;
j < 3;
j++)
1010 for (
int u = 0;
u < 3;
u++) Aup[i][
j] += g_contr[i][
u] * Amix[
j][
u];
1012 const double DD[3][3][3] = {
1013 {{Q[35], Q[36], Q[37]}, {Q[36], Q[38], Q[39]}, {Q[37], Q[39], Q[40]}},
1014 {{Q[41], Q[42], Q[43]}, {Q[42], Q[44], Q[45]}, {Q[43], Q[45], Q[46]}},
1015 {{Q[47], Q[48], Q[49]}, {Q[48], Q[50], Q[51]}, {Q[49], Q[51], Q[52]}}
1017 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};
1018 for (
int k = 0; k < 3; k++)
1019 for (
int m = 0; m < 3; m++)
1020 for (
int l = 0; l < 3; l++)
1021 for (
int n = 0; n < 3; n++)
1022 for (
int j = 0;
j < 3;
j++) dgup[k][m][l] -= g_contr[m][n]*g_contr[
j][l]*2*DD[k][n][
j];
1024 const double PP[3] = {Q[55], Q[56], Q[57]};
1026 double Christoffel[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};
1027 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};
1030 for (
int j = 0;
j < 3;
j++)
1031 for (
int i = 0; i < 3; i++)
1032 for (
int k = 0; k < 3; k++)
1035 for (
int l = 0; l < 3; l++)
1037 Christoffel_tilde[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] );
1038 Christoffel[i][
j][k] += g_contr[k][l] * ( DD[i][
j][l] + DD[
j][i][l] - DD[l][i][
j] ) - g_contr[k][l] * ( g_cov[
j][l] * PP[i] + g_cov[i][l] * PP[
j] - g_cov[i][
j] * PP[l] );
1042 double Gtilde[3] = {0,0,0};
1043 for (
int l = 0; l < 3; l++)
1044 for (
int j = 0;
j < 3;
j++)
1045 for (
int i = 0; i < 3; i++) Gtilde[i] += g_contr[
j][l] * Christoffel_tilde[
j][l][i];
1047 const double Ghat[3] = {Q[13], Q[14], Q[15]};
1049 const double phi = std::exp(std::fmax(-20., std::fmin(20.,Q[54])));
1050 const double phi2 = phi*phi;
1052 double Z[3] = {0,0,0};
1053 for (
int i=0;i<3;i++)
1054 for (
int j=0;
j<3;
j++) Z[i] += 0.5*( g_cov[i][
j]* (Ghat[
j] - Gtilde[
j]));
1055 double Zup[3] = {0,0,0};
1056 for (
int i=0;i<3;i++)
1057 for (
int j=0;
j<3;
j++) Zup[i] += phi2 * g_contr[i][
j] * Z[
j];
1060 const double dDD[3][3][3][3] = {
1063 {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]},
1066 {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]},
1069 {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]}
1074 {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]},
1077 {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]},
1080 {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]}
1085 {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]},
1088 {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]},
1091 {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]}
1097 double dChristoffelNCP[3][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,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};
1098 double dChristoffel_tildeNCP[3][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,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};
1099 for (
int i = 0; i < 3; i++)
1100 for (
int j = 0;
j < 3;
j++)
1101 for (
int m = 0; m < 3; m++)
1102 for (
int k = 0; k < 3; k++)
1104 dChristoffelNCP [k][i][
j][m] = 0;
1105 dChristoffel_tildeNCP[k][i][
j][m] = 0;
1106 for (
int l = 0; l < 3; l++)
1108 dChristoffelNCP[k][i][
j][m] += 0.5*g_contr[m][l] * (
1109 dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]
1110 - g_cov[
j][l]*(dPP[k][i] + dPP[i][k]) - g_cov[i][l]*(dPP[k][
j]+dPP[
j][k]) + g_cov[i][
j]*(dPP[k][l]+dPP[l][k]) );
1112 dChristoffel_tildeNCP[k][i][
j][m] += 0.5*g_contr[m][l]*(dDD[k][i][
j][l] + dDD[i][k][
j][l] + dDD[k][
j][i][l] + dDD[
j][k][i][l] - dDD[k][l][i][
j] - dDD[l][k][i][
j]);
1117 double RiemannNCP[3][3][3][3] = {0};
1118 for (
int i = 0; i < 3; i++)
1119 for (
int j = 0;
j < 3;
j++)
1120 for (
int m = 0; m < 3; m++)
1121 for (
int k = 0; k < 3; k++) RiemannNCP[i][k][
j][m] = dChristoffelNCP[k][i][
j][m] - dChristoffelNCP[
j][i][k][m];
1123 double RicciNCP[3][3] = {0,0,0,0,0,0,0,0,0};
1124 for (
int m = 0; m < 3; m++)
1125 for (
int n = 0; n < 3; n++)
1126 for (
int l = 0; l < 3; l++) RicciNCP[m][n] += RiemannNCP[m][l][n][l];
1128 double dGtildeNCP[3][3] = {0,0,0,0,0,0,0,0,0};
1129 for (
int i = 0; i < 3; i++)
1130 for (
int k = 0; k < 3; k++)
1131 for (
int j = 0;
j < 3;
j++)
1132 for (
int l = 0; l < 3; l++) dGtildeNCP[k][i] += g_contr[
j][l]*dChristoffel_tildeNCP[k][
j][l][i];
1135 const double dGhat[3][3] = {
1136 {gradQin[13][0],gradQin[14][0],gradQin[15][0]},
1137 {gradQin[13][1],gradQin[14][1],gradQin[15][1]},
1138 {gradQin[13][2],gradQin[14][2],gradQin[15][2]}
1141 double dZNCP[3][3] = {0,0,0,0,0,0,0,0,0};
1142 for (
int j = 0;
j < 3;
j++)
1143 for (
int i = 0; i < 3; i++)
1144 for (
int k = 0; k < 3; k++) dZNCP[k][i] += 0.5*g_cov[i][
j]*(dGhat[k][
j]-dGtildeNCP[k][
j]);
1146 double RicciPlusNablaZNCP[3][3];
1147 for (
int i = 0; i < 3; i++)
1148 for (
int j = 0;
j < 3;
j++) RicciPlusNablaZNCP[i][
j] = RicciNCP[i][
j] + dZNCP[i][
j] + dZNCP[
j][i];
1150 double RPlusTwoNablaZNCP = 0;
1151 for (
int i = 0; i < 3; i++)
1152 for (
int j = 0;
j < 3;
j++) RPlusTwoNablaZNCP += g_contr[i][
j]*RicciPlusNablaZNCP[i][
j];
1153 RPlusTwoNablaZNCP*=phi2;
1155 NCPterm[0] = RPlusTwoNablaZNCP;
1158 #if defined(WITH_GPU_OMP_TARGET)
1159 #pragma omp end declare target
constexpr double timeStepSize
void enforceCCZ4constraints(double *NOALIAS newQ)
A postprocessing routine which pushes the volume solution back into the area of the CCZ4 constraints.
void admconstraints(double *constraints, const double *const Q, const double *const gradQSerialised)
This is a postprocessing routine to monitor if the physical constraints are fulfilled.
void TestingOutput(double *terms, const double *const Q, const double *const gradQSerialised)
A temporary test function, to output some testing values 0,1 entries: Hamilton constraint related ter...
void Psi4Calc(double *Psi4, const double *const Q, const double *const gradQSerialised, double *coor)
This function is for the calculation of psi4, a quantity related to gravitional wave.
void ThetaOutputNCP(double *NCPterm, const double *const Q, const double *const gradQSerialised, int normal)
A temporary test function, to output Hamilton constraint related term in theta, 1 terms: RPlusTwoNabl...