Optimize memory allocation in JFD_times_dv

This should reduce the pressure on the memory allocator, indirectly improving caching behavior.

Co-authored-by: copilot-swe-agent[bot] <198982749+copilot@users.noreply.github.com>
This commit is contained in:
2026-02-07 15:55:45 +08:00
committed by jaunatisblue
parent c5f8a18ba4
commit 32ed7ec5bd

View File

@@ -2111,10 +2111,19 @@ void TwoPunctures::JFD_times_dv(int i, int j, int k, int nvar, int n1, int n2,
double sin_be, sin_be_i1, sin_be_i2, sin_be_i3, cos_be; double sin_be, sin_be_i1, sin_be_i2, sin_be_i3, cos_be;
double dV0, dV1, dV2, dV3, dV11, dV12, dV13, dV22, dV23, dV33, double dV0, dV1, dV2, dV3, dV11, dV12, dV13, dV22, dV23, dV33,
ha, ga, ga2, hb, gb, gb2, hp, gp, gp2, gagb, gagp, gbgp; ha, ga, ga2, hb, gb, gb2, hp, gp, gp2, gagb, gagp, gbgp;
derivs dU, U;
allocate_derivs(&dU, nvar); // Stack-allocated derivs (nvar=1) — no malloc/free!
allocate_derivs(&U, nvar); double dU_d0[1], dU_d1[1], dU_d2[1], dU_d3[1];
double dU_d11[1], dU_d12[1], dU_d13[1], dU_d22[1], dU_d23[1], dU_d33[1];
double U_d0[1], U_d1[1], U_d2[1], U_d3[1];
double U_d11[1], U_d12[1], U_d13[1], U_d22[1], U_d23[1], U_d33[1];
derivs dU, U;
dU.d0=dU_d0; dU.d1=dU_d1; dU.d2=dU_d2; dU.d3=dU_d3;
dU.d11=dU_d11; dU.d12=dU_d12; dU.d13=dU_d13;
dU.d22=dU_d22; dU.d23=dU_d23; dU.d33=dU_d33;
U.d0=U_d0; U.d1=U_d1; U.d2=U_d2; U.d3=U_d3;
U.d11=U_d11; U.d12=U_d12; U.d13=U_d13;
U.d22=U_d22; U.d23=U_d23; U.d33=U_d33;
if (k < 0) if (k < 0)
k = k + n3; k = k + n3;
@@ -2182,12 +2191,9 @@ void TwoPunctures::JFD_times_dv(int i, int j, int k, int nvar, int n1, int n2,
dV11 = ga2 * (dv.d0[ipcc] + dv.d0[imcc] - 2 * dv.d0[iccc]); dV11 = ga2 * (dv.d0[ipcc] + dv.d0[imcc] - 2 * dv.d0[iccc]);
dV22 = gb2 * (dv.d0[icpc] + dv.d0[icmc] - 2 * dv.d0[iccc]); dV22 = gb2 * (dv.d0[icpc] + dv.d0[icmc] - 2 * dv.d0[iccc]);
dV33 = gp2 * (dv.d0[iccp] + dv.d0[iccm] - 2 * dv.d0[iccc]); dV33 = gp2 * (dv.d0[iccp] + dv.d0[iccm] - 2 * dv.d0[iccc]);
dV12 = dV12 = 0.25 * gagb * (dv.d0[ippc] - dv.d0[ipmc] + dv.d0[immc] - dv.d0[impc]);
0.25 * gagb * (dv.d0[ippc] - dv.d0[ipmc] + dv.d0[immc] - dv.d0[impc]); dV13 = 0.25 * gagp * (dv.d0[ipcp] - dv.d0[imcp] + dv.d0[imcm] - dv.d0[ipcm]);
dV13 = dV23 = 0.25 * gbgp * (dv.d0[icpp] - dv.d0[icpm] + dv.d0[icmm] - dv.d0[icmp]);
0.25 * gagp * (dv.d0[ipcp] - dv.d0[imcp] + dv.d0[imcm] - dv.d0[ipcm]);
dV23 =
0.25 * gbgp * (dv.d0[icpp] - dv.d0[icpm] + dv.d0[icmm] - dv.d0[icmp]);
/* Derivatives of (dv) w.r.t. (A,B,phi):*/ /* Derivatives of (dv) w.r.t. (A,B,phi):*/
dV11 = sin_al_i3 * (sin_al * dV11 - cos_al * dV1); dV11 = sin_al_i3 * (sin_al * dV11 - cos_al * dV1);
dV12 = sin_al_i1 * sin_be_i1 * dV12; dV12 = sin_al_i1 * sin_be_i1 * dV12;
@@ -2230,11 +2236,12 @@ void TwoPunctures::JFD_times_dv(int i, int j, int k, int nvar, int n1, int n2,
/* (dU, dU_x, dU_y, dU_z, dU_xx, dU_xy, dU_xz, dU_yy, dU_yz, dU_zz)*/ /* (dU, dU_x, dU_y, dU_z, dU_xx, dU_xy, dU_xz, dU_yy, dU_yz, dU_zz)*/
rx3_To_xyz(nvar, x, r, phi, &y, &z, dU); rx3_To_xyz(nvar, x, r, phi, &y, &z, dU);
LinEquations(A, B, X, R, x, r, phi, y, z, dU, U, values); LinEquations(A, B, X, R, x, r, phi, y, z, dU, U, values);
for (ivar = 0; ivar < nvar; ivar++)
values[ivar] *= FAC;
free_derivs(&dU, nvar); double FAC_val = sin_al * sin_be * sin_al * sin_be * sin_al * sin_be;
free_derivs(&U, nvar); for (ivar = 0; ivar < nvar; ivar++)
values[ivar] *= FAC_val;
// No free_derivs needed — everything is on the stack
} }
#undef FAC #undef FAC
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/