Fix shell C kernel symbol names for Fortran linkage (fderivs_sh_ etc.)

Shell C functions must export Fortran-compatible symbols with trailing
underscore so bssn_rhs_ss.f90 and getnp4.f90 can link when WithShell is
active and USE_CXX_SHELL_KERNELS=1 replaces Fortran diff_new_sh.o.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-14 14:09:16 +08:00
parent 80fac463c6
commit 72e02f160d
5 changed files with 24 additions and 33 deletions

View File

@@ -5,7 +5,7 @@
* fdderivs_sh — second derivatives on shell patch in (rho, sigma, R) coords. * fdderivs_sh — second derivatives on shell patch in (rho, sigma, R) coords.
* Same stencil coefficients as Cartesian fdderivs. Uses symmetry_stbd. * Same stencil coefficients as Cartesian fdderivs. Uses symmetry_stbd.
*/ */
void fdderivs_sh(const int ex[3], extern "C" void fdderivs_sh_(const int ex[3],
const double *f, const double *f,
double *fxx, double *fxy, double *fxz, double *fxx, double *fxy, double *fxz,
double *fyy, double *fyz, double *fzz, double *fyy, double *fyz, double *fzz,

View File

@@ -2,30 +2,22 @@
#include "share_func.h" #include "share_func.h"
#include <cstddef> #include <cstddef>
/* Forward declarations */ /* Forward declarations — Fortran-mangled names from shell C kernels */
void fderivs_sh(const int ex[3], const double *f, extern "C" {
double *fx, double *fy, double *fz, void fderivs_sh_(const int ex[3], const double *f,
const double *X, const double *Y, const double *Z, double *fx, double *fy, double *fz,
double SYM1, double SYM2, double SYM3,
int Symmetry, int onoff, int sst);
void fdderivs_sh(const int ex[3], const double *f,
double *fxx, double *fxy, double *fxz,
double *fyy, double *fyz, double *fzz,
const double *X, const double *Y, const double *Z, const double *X, const double *Y, const double *Z,
double SYM1, double SYM2, double SYM3, double SYM1, double SYM2, double SYM3,
int Symmetry, int onoff, int sst); int Symmetry, int onoff, int sst);
/* void fdderivs_sh_(const int ex[3], const double *f,
* fdderivs_shc — shell second derivatives converted to Cartesian via chain rule. double *fxx, double *fxy, double *fxz,
* double *fyy, double *fyz, double *fzz,
* Calls fderivs_sh and fdderivs_sh internally, then applies: const double *X, const double *Y, const double *Z,
* f_{,ij} = sum_{a,b} (dx^a/dx^i)(dx^b/dx^j) f_{,ab} + sum_a (d^2 x^a/dx^i dx^j) f_{,a} double SYM1, double SYM2, double SYM3,
* where a,b ∈ {rho, sigma, R}. int Symmetry, int onoff, int sst);
*/
extern "C" {
void f_fdderivs_shc(int *ex, void fdderivs_shc_(int *ex,
double *f, double *f,
double *fxx, double *fxy, double *fxz, double *fxx, double *fxy, double *fxz,
double *fyy, double *fyz, double *fzz, double *fyy, double *fyz, double *fzz,
@@ -60,8 +52,8 @@ void f_fdderivs_shc(int *ex,
return; return;
} }
fderivs_sh(ex3, f, gx, gy, gz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst); fderivs_sh_(ex3, f, gx, gy, gz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst);
fdderivs_sh(ex3, f, gxx, gxy, gxz, gyy, gyz, gzz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst); fdderivs_sh_(ex3, f, gxx, gxy, gxz, gyy, gyz, gzz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst);
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
const double rx=drhodx[i], ry=drhody[i], rz=drhodz[i]; const double rx=drhodx[i], ry=drhody[i], rz=drhodz[i];

View File

@@ -10,7 +10,7 @@
* - SoA is 2-element only (x/y), no z-symmetry * - SoA is 2-element only (x/y), no z-symmetry
* - sst parameter (shell surface type, not used in stencil computation) * - sst parameter (shell surface type, not used in stencil computation)
*/ */
void fderivs_sh(const int ex[3], extern "C" void fderivs_sh_(const int ex[3],
const double *f, const double *f,
double *fx, double *fy, double *fz, double *fx, double *fy, double *fz,
const double *X, const double *Y, const double *Z, const double *X, const double *Y, const double *Z,

View File

@@ -11,16 +11,15 @@
* fz = drhodz * df/drho + dsigmadz * df/dsigma + dRdz * df/dR * fz = drhodz * df/drho + dsigmadz * df/dsigma + dRdz * df/dR
*/ */
// Forward declaration (defined in fderivs_sh_c.C) // Forward declaration (defined in fderivs_sh_c.C with extern "C" name fderivs_sh_)
void fderivs_sh(const int ex[3], const double *f,
double *fx, double *fy, double *fz,
const double *X, const double *Y, const double *Z,
double SYM1, double SYM2, double SYM3,
int Symmetry, int onoff, int sst);
extern "C" { extern "C" {
void fderivs_sh_(const int ex[3], const double *f,
double *fx, double *fy, double *fz,
const double *X, const double *Y, const double *Z,
double SYM1, double SYM2, double SYM3,
int Symmetry, int onoff, int sst);
void f_fderivs_shc(int *ex, void fderivs_shc_(int *ex,
double *f, double *f,
double *fx, double *fy, double *fz, double *fx, double *fy, double *fz,
double *crho, double *sigma, double *R, double *crho, double *sigma, double *R,
@@ -40,7 +39,7 @@ void f_fderivs_shc(int *ex,
if (!gx || !gy || !gz) { free(gx); free(gy); free(gz); return; } if (!gx || !gy || !gz) { free(gx); free(gy); free(gz); return; }
// Compute shell-coordinate derivatives // Compute shell-coordinate derivatives
fderivs_sh(ex3, f, gx, gy, gz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst); fderivs_sh_(ex3, f, gx, gy, gz, crho, sigma, R, SYM1, SYM2, SYM3, Symmetry, Lev, sst);
// Chain rule to Cartesian // Chain rule to Cartesian
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {

View File

@@ -5,7 +5,7 @@
* kodis_sh — Kreiss-Oliger dissipation on shell patches. * kodis_sh — Kreiss-Oliger dissipation on shell patches.
* Same stencil coefficients as Cartesian kodis. Uses symmetry_stbd. * Same stencil coefficients as Cartesian kodis. Uses symmetry_stbd.
*/ */
void kodis_sh(const int ex[3], extern "C" void kodis_sh_(const int ex[3],
const double *X, const double *Y, const double *Z, const double *X, const double *Y, const double *Z,
const double *f, double *f_rhs, const double *f, double *f_rhs,
const double SoAi[2], const double SoAi[2],