Skip to content

Commit aab1bb9

Browse files
committed
Fix symbol visibility so shared libs export Fortran wrappers consistently
Resolved inconsistent symbol exports for Fortran wrapper entry points and test helpers across Windows and macOS. Adjusted default visibility in the makefile, added FINUFFT_EXPORT_TEST for test-only APIs, and linked FFT backends via a new finufft_fftlibs interface target. It also adds the LTO option to makefile to achieve parity with cmake. Co-authored-by: Marco Barbone [email protected] Co-authored-by: Martin Reinecke [email protected]
1 parent b684876 commit aab1bb9

File tree

14 files changed

+127
-55
lines changed

14 files changed

+127
-55
lines changed

CHANGELOG

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ Master (working towards v2.5.0), 8/13/25
2424
* cmake: cache query and result for supported compiler flags to speed up
2525
configuration (Stanimirov #725).
2626
* move include/common to include/finufft_common (Stanimirov #734)
27-
27+
* Fixed symbol visibility issues so shared libraries export the Fortran wrapper
28+
entry points and test helpers consistently on Windows and macOS. This
29+
included tightening default visibility in the makefile, introducing
30+
`FINUFFT_EXPORT_TEST` for test-only APIs, and ensuring FFT backends are linked
31+
through a dedicated `finufft_fftlibs` interface target. (Barbone, Reinecke #737)
2832

2933
V 2.4.1 7/8/25
3034

cmake/setupDUCC.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ if(ducc0_ADDED)
3737
target_link_libraries(ducc0 PRIVATE Threads::Threads)
3838
endif()
3939
enable_asan(ducc0)
40+
set_target_properties(ducc0 PROPERTIES CXX_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN YES)
41+
42+
add_library(finufft_fftlibs INTERFACE)
43+
target_link_libraries(finufft_fftlibs INTERFACE ducc0)
4044
endif()

cmake/setupFFTW.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,6 @@ if(FINUFFT_FFTW_LIBRARIES STREQUAL DEFAULT OR FINUFFT_FFTW_LIBRARIES STREQUAL DO
8989
endif()
9090
endif()
9191
endif()
92+
93+
add_library(finufft_fftlibs INTERFACE)
94+
target_link_libraries(finufft_fftlibs INTERFACE ${FINUFFT_FFTW_LIBRARIES})

cmake/toolchain.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(FINUFFT_CXX_FLAGS_RELEASE
2121
-ftree-vectorize
2222
-fimplicit-constexpr
2323
-fcx-limited-range
24+
-fno-semantic-interposition
2425
-O3
2526
/Ox
2627
/fp:contract

cmake/utils.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ include(CheckCXXCompilerFlag)
44
function(filter_supported_compiler_flags input_flags_var output_flags_var)
55
string(MD5 input_hash "${${input_flags_var}}")
66
if(DEFINED SUPPORTED_FLAGS_${input_hash})
7-
message(STATUS "Using cached flags for ${input_flags_var}: ${SUPPORTED_FLAGS_${input_hash}}")
7+
message(STATUS "Using cached flags for ${input_flags_var}: ${SUPPORTED_FLAGS_${input_hash}}")
88
set(${output_flags_var} ${SUPPORTED_FLAGS_${input_hash}} PARENT_SCOPE)
99
return()
1010
endif()
@@ -113,4 +113,5 @@ function(finufft_link_test target)
113113
if(FINUFFT_HAS_NO_DEPRECATED_DECLARATIONS)
114114
target_compile_options(${target} PRIVATE -Wno-deprecated-declarations)
115115
endif()
116+
target_link_libraries(${target} PRIVATE finufft_fftlibs)
116117
endfunction()

fortran/finufftfort.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ extern "C" {
3232
#endif
3333

3434
// --------------------- guru interface from fortran ------------------------
35+
FINUFFT_EXPORT
3536
void finufft_makeplan_(int *type, int *n_dims, i64 *n_modes, int *iflag, int *n_transf,
3637
f64 *tol, finufft_plan *plan, finufft_opts *o, int *ier) {
3738
if (!plan)
@@ -45,6 +46,7 @@ void finufft_makeplan_(int *type, int *n_dims, i64 *n_modes, int *iflag, int *n_
4546
}
4647
}
4748

49+
FINUFFT_EXPORT
4850
void finufft_setpts_(finufft_plan *plan, i64 *M, f64 *xj, f64 *yj, f64 *zj, i64 *nk,
4951
f64 *s, f64 *t, f64 *u, int *ier) {
5052
if (!*plan) {
@@ -56,20 +58,23 @@ void finufft_setpts_(finufft_plan *plan, i64 *M, f64 *xj, f64 *yj, f64 *zj, i64
5658
*ier = finufft_setpts(*plan, *M, xj, yj, zj, nk_safe, s, t, u);
5759
}
5860

61+
FINUFFT_EXPORT
5962
void finufft_execute_(finufft_plan *plan, c128 *weights, c128 *result, int *ier) {
6063
if (!plan)
6164
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
6265
else
6366
*ier = finufft_execute(*plan, weights, result);
6467
}
6568

69+
FINUFFT_EXPORT
6670
void finufft_execute_adjoint_(finufft_plan *plan, c128 *weights, c128 *result, int *ier) {
6771
if (!plan)
6872
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
6973
else
7074
*ier = finufft_execute_adjoint(*plan, weights, result);
7175
}
7276

77+
FINUFFT_EXPORT
7378
void finufft_destroy_(finufft_plan *plan, int *ier) {
7479
if (!plan)
7580
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
@@ -79,6 +84,7 @@ void finufft_destroy_(finufft_plan *plan, int *ier) {
7984

8085
// ------------ use FINUFFT to set the default options ---------------------
8186
// (Note the finufft_opts is created in f90-style derived types, not here)
87+
FINUFFT_EXPORT
8288
void finufft_default_opts_(finufft_opts *o) {
8389
if (!o)
8490
fprintf(stderr, "%s fortran: opts must be allocated!\n", __func__);
@@ -89,102 +95,121 @@ void finufft_default_opts_(finufft_opts *o) {
8995

9096
// -------------- simple and many-vector interfaces --------------------
9197
// --- 1D ---
98+
FINUFFT_EXPORT
9299
void finufft1d1_(i64 *nj, f64 *xj, c128 *cj, int *iflag, f64 *eps, i64 *ms, c128 *fk,
93100
finufft_opts *o, int *ier) {
94101
*ier = finufft1d1(*nj, xj, cj, *iflag, *eps, *ms, fk, o);
95102
}
96103

104+
FINUFFT_EXPORT
97105
void finufft1d1many_(int *ntransf, i64 *nj, f64 *xj, c128 *cj, int *iflag, f64 *eps,
98106
i64 *ms, c128 *fk, finufft_opts *o, int *ier) {
99107
*ier = finufft1d1many(*ntransf, *nj, xj, cj, *iflag, *eps, *ms, fk, o);
100108
}
101109

110+
FINUFFT_EXPORT
102111
void finufft1d2_(i64 *nj, f64 *xj, c128 *cj, int *iflag, f64 *eps, i64 *ms, c128 *fk,
103112
finufft_opts *o, int *ier) {
104113
*ier = finufft1d2(*nj, xj, cj, *iflag, *eps, *ms, fk, o);
105114
}
106115

116+
FINUFFT_EXPORT
107117
void finufft1d2many_(int *ntransf, i64 *nj, f64 *xj, c128 *cj, int *iflag, f64 *eps,
108118
i64 *ms, c128 *fk, finufft_opts *o, int *ier) {
109119
*ier = finufft1d2many(*ntransf, *nj, xj, cj, *iflag, *eps, *ms, fk, o);
110120
}
111121

122+
FINUFFT_EXPORT
112123
void finufft1d3_(i64 *nj, f64 *x, c128 *c, int *iflag, f64 *eps, i64 *nk, f64 *s, c128 *f,
113124
finufft_opts *o, int *ier) {
114125
*ier = finufft1d3(*nj, x, c, *iflag, *eps, *nk, s, f, o);
115126
}
116127

128+
FINUFFT_EXPORT
117129
void finufft1d3many_(int *ntransf, i64 *nj, f64 *x, c128 *c, int *iflag, f64 *eps,
118130
i64 *nk, f64 *s, c128 *f, finufft_opts *o, int *ier) {
119131
*ier = finufft1d3many(*ntransf, *nj, x, c, *iflag, *eps, *nk, s, f, o);
120132
}
121133

122134
// --- 2D ---
135+
FINUFFT_EXPORT
123136
void finufft2d1_(i64 *nj, f64 *xj, f64 *yj, c128 *cj, int *iflag, f64 *eps, i64 *ms,
124137
i64 *mt, c128 *fk, finufft_opts *o, int *ier) {
125138
*ier = finufft2d1(*nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
126139
}
140+
FINUFFT_EXPORT
127141
void finufft2d1many_(int *ntransf, i64 *nj, f64 *xj, f64 *yj, c128 *cj, int *iflag,
128142
f64 *eps, i64 *ms, i64 *mt, c128 *fk, finufft_opts *o, int *ier) {
129143
*ier = finufft2d1many(*ntransf, *nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
130144
}
131145

146+
FINUFFT_EXPORT
132147
void finufft2d2_(i64 *nj, f64 *xj, f64 *yj, c128 *cj, int *iflag, f64 *eps, i64 *ms,
133148
i64 *mt, c128 *fk, finufft_opts *o, int *ier) {
134149
*ier = finufft2d2(*nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
135150
}
151+
FINUFFT_EXPORT
136152
void finufft2d2many_(int *ntransf, i64 *nj, f64 *xj, f64 *yj, c128 *cj, int *iflag,
137153
f64 *eps, i64 *ms, i64 *mt, c128 *fk, finufft_opts *o, int *ier) {
138154
*ier = finufft2d2many(*ntransf, *nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
139155
}
140156

157+
FINUFFT_EXPORT
141158
void finufft2d3_(i64 *nj, f64 *x, f64 *y, c128 *c, int *iflag, f64 *eps, i64 *nk, f64 *s,
142159
f64 *t, c128 *f, finufft_opts *o, int *ier) {
143160
*ier = finufft2d3(*nj, x, y, c, *iflag, *eps, *nk, s, t, f, o);
144161
}
145162

163+
FINUFFT_EXPORT
146164
void finufft2d3many_(int *ntransf, i64 *nj, f64 *x, f64 *y, c128 *c, int *iflag, f64 *eps,
147165
i64 *nk, f64 *s, f64 *t, c128 *f, finufft_opts *o, int *ier) {
148166
*ier = finufft2d3many(*ntransf, *nj, x, y, c, *iflag, *eps, *nk, s, t, f, o);
149167
}
150168

151169
// --- 3D ---
170+
FINUFFT_EXPORT
152171
void finufft3d1_(i64 *nj, f64 *xj, f64 *yj, f64 *zj, c128 *cj, int *iflag, f64 *eps,
153172
i64 *ms, i64 *mt, i64 *mu, c128 *fk, finufft_opts *o, int *ier) {
154173
*ier = finufft3d1(*nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
155174
}
156175

176+
FINUFFT_EXPORT
157177
void finufft3d1many_(int *ntransf, i64 *nj, f64 *xj, f64 *yj, f64 *zj, c128 *cj,
158178
int *iflag, f64 *eps, i64 *ms, i64 *mt, i64 *mu, c128 *fk,
159179
finufft_opts *o, int *ier) {
160180
*ier =
161181
finufft3d1many(*ntransf, *nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
162182
}
163183

184+
FINUFFT_EXPORT
164185
void finufft3d2_(i64 *nj, f64 *xj, f64 *yj, f64 *zj, c128 *cj, int *iflag, f64 *eps,
165186
i64 *ms, i64 *mt, i64 *mu, c128 *fk, finufft_opts *o, int *ier) {
166187
*ier = finufft3d2(*nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
167188
}
168189

190+
FINUFFT_EXPORT
169191
void finufft3d2many_(int *ntransf, i64 *nj, f64 *xj, f64 *yj, f64 *zj, c128 *cj,
170192
int *iflag, f64 *eps, i64 *ms, i64 *mt, i64 *mu, c128 *fk,
171193
finufft_opts *o, int *ier) {
172194
*ier =
173195
finufft3d2many(*ntransf, *nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
174196
}
175197

198+
FINUFFT_EXPORT
176199
void finufft3d3_(i64 *nj, f64 *x, f64 *y, f64 *z, c128 *c, int *iflag, f64 *eps, i64 *nk,
177200
f64 *s, f64 *t, f64 *u, c128 *f, finufft_opts *o, int *ier) {
178201
*ier = finufft3d3(*nj, x, y, z, c, *iflag, *eps, *nk, s, t, u, f, o);
179202
}
180203

204+
FINUFFT_EXPORT
181205
void finufft3d3many_(int *ntransf, i64 *nj, f64 *x, f64 *y, f64 *z, c128 *c, int *iflag,
182206
f64 *eps, i64 *nk, f64 *s, f64 *t, f64 *u, c128 *f, finufft_opts *o,
183207
int *ier) {
184208
*ier = finufft3d3many(*ntransf, *nj, x, y, z, c, *iflag, *eps, *nk, s, t, u, f, o);
185209
}
186210

187211
// --------------------- guru interface from fortran ------------------------
212+
FINUFFT_EXPORT
188213
void finufftf_makeplan_(int *type, int *n_dims, i64 *n_modes, int *iflag, int *n_transf,
189214
f32 *tol, finufftf_plan *plan, finufft_opts *o, int *ier) {
190215
if (!plan)
@@ -198,6 +223,7 @@ void finufftf_makeplan_(int *type, int *n_dims, i64 *n_modes, int *iflag, int *n
198223
}
199224
}
200225

226+
FINUFFT_EXPORT
201227
void finufftf_setpts_(finufftf_plan *plan, i64 *M, f32 *xj, f32 *yj, f32 *zj, i64 *nk,
202228
f32 *s, f32 *t, f32 *u, int *ier) {
203229
if (!*plan) {
@@ -209,20 +235,23 @@ void finufftf_setpts_(finufftf_plan *plan, i64 *M, f32 *xj, f32 *yj, f32 *zj, i6
209235
*ier = finufftf_setpts(*plan, *M, xj, yj, zj, nk_safe, s, t, u);
210236
}
211237

238+
FINUFFT_EXPORT
212239
void finufftf_execute_(finufftf_plan *plan, c64 *weights, c64 *result, int *ier) {
213240
if (!plan)
214241
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
215242
else
216243
*ier = finufftf_execute(*plan, weights, result);
217244
}
218245

246+
FINUFFT_EXPORT
219247
void finufftf_execute_adjoint_(finufftf_plan *plan, c64 *weights, c64 *result, int *ier) {
220248
if (!plan)
221249
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
222250
else
223251
*ier = finufftf_execute_adjoint(*plan, weights, result);
224252
}
225253

254+
FINUFFT_EXPORT
226255
void finufftf_destroy_(finufftf_plan *plan, int *ier) {
227256
if (!plan)
228257
fprintf(stderr, "%s fortran: finufft_plan unallocated!", __func__);
@@ -232,6 +261,7 @@ void finufftf_destroy_(finufftf_plan *plan, int *ier) {
232261

233262
// ------------ use FINUFFT to set the default options ---------------------
234263
// (Note the finufft_opts is created in f90-style derived types, not here)
264+
FINUFFT_EXPORT
235265
void finufftf_default_opts_(finufft_opts *o) {
236266
if (!o)
237267
fprintf(stderr, "%s fortran: opts must be allocated!\n", __func__);
@@ -242,95 +272,113 @@ void finufftf_default_opts_(finufft_opts *o) {
242272

243273
// -------------- simple and many-vector interfaces --------------------
244274
// --- 1D ---
275+
FINUFFT_EXPORT
245276
void finufftf1d1_(i64 *nj, f32 *xj, c64 *cj, int *iflag, f32 *eps, i64 *ms, c64 *fk,
246277
finufft_opts *o, int *ier) {
247278
*ier = finufftf1d1(*nj, xj, cj, *iflag, *eps, *ms, fk, o);
248279
}
249280

281+
FINUFFT_EXPORT
250282
void finufftf1d1many_(int *ntransf, i64 *nj, f32 *xj, c64 *cj, int *iflag, f32 *eps,
251283
i64 *ms, c64 *fk, finufft_opts *o, int *ier) {
252284
*ier = finufftf1d1many(*ntransf, *nj, xj, cj, *iflag, *eps, *ms, fk, o);
253285
}
254286

287+
FINUFFT_EXPORT
255288
void finufftf1d2_(i64 *nj, f32 *xj, c64 *cj, int *iflag, f32 *eps, i64 *ms, c64 *fk,
256289
finufft_opts *o, int *ier) {
257290
*ier = finufftf1d2(*nj, xj, cj, *iflag, *eps, *ms, fk, o);
258291
}
259292

293+
FINUFFT_EXPORT
260294
void finufftf1d2many_(int *ntransf, i64 *nj, f32 *xj, c64 *cj, int *iflag, f32 *eps,
261295
i64 *ms, c64 *fk, finufft_opts *o, int *ier) {
262296
*ier = finufftf1d2many(*ntransf, *nj, xj, cj, *iflag, *eps, *ms, fk, o);
263297
}
264298

299+
FINUFFT_EXPORT
265300
void finufftf1d3_(i64 *nj, f32 *x, c64 *c, int *iflag, f32 *eps, i64 *nk, f32 *s, c64 *f,
266301
finufft_opts *o, int *ier) {
267302
*ier = finufftf1d3(*nj, x, c, *iflag, *eps, *nk, s, f, o);
268303
}
269304

305+
FINUFFT_EXPORT
270306
void finufftf1d3many_(int *ntransf, i64 *nj, f32 *x, c64 *c, int *iflag, f32 *eps,
271307
i64 *nk, f32 *s, c64 *f, finufft_opts *o, int *ier) {
272308
*ier = finufftf1d3many(*ntransf, *nj, x, c, *iflag, *eps, *nk, s, f, o);
273309
}
274310

275311
// --- 2D ---
312+
FINUFFT_EXPORT
276313
void finufftf2d1_(i64 *nj, f32 *xj, f32 *yj, c64 *cj, int *iflag, f32 *eps, i64 *ms,
277314
i64 *mt, c64 *fk, finufft_opts *o, int *ier) {
278315
*ier = finufftf2d1(*nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
279316
}
317+
FINUFFT_EXPORT
280318
void finufftf2d1many_(int *ntransf, i64 *nj, f32 *xj, f32 *yj, c64 *cj, int *iflag,
281319
f32 *eps, i64 *ms, i64 *mt, c64 *fk, finufft_opts *o, int *ier) {
282320
*ier = finufftf2d1many(*ntransf, *nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
283321
}
284322

323+
FINUFFT_EXPORT
285324
void finufftf2d2_(i64 *nj, f32 *xj, f32 *yj, c64 *cj, int *iflag, f32 *eps, i64 *ms,
286325
i64 *mt, c64 *fk, finufft_opts *o, int *ier) {
287326
*ier = finufftf2d2(*nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
288327
}
328+
FINUFFT_EXPORT
289329
void finufftf2d2many_(int *ntransf, i64 *nj, f32 *xj, f32 *yj, c64 *cj, int *iflag,
290330
f32 *eps, i64 *ms, i64 *mt, c64 *fk, finufft_opts *o, int *ier) {
291331
*ier = finufftf2d2many(*ntransf, *nj, xj, yj, cj, *iflag, *eps, *ms, *mt, fk, o);
292332
}
293333

334+
FINUFFT_EXPORT
294335
void finufftf2d3_(i64 *nj, f32 *x, f32 *y, c64 *c, int *iflag, f32 *eps, i64 *nk, f32 *s,
295336
f32 *t, c64 *f, finufft_opts *o, int *ier) {
296337
*ier = finufftf2d3(*nj, x, y, c, *iflag, *eps, *nk, s, t, f, o);
297338
}
298339

340+
FINUFFT_EXPORT
299341
void finufftf2d3many_(int *ntransf, i64 *nj, f32 *x, f32 *y, c64 *c, int *iflag, f32 *eps,
300342
i64 *nk, f32 *s, f32 *t, c64 *f, finufft_opts *o, int *ier) {
301343
*ier = finufftf2d3many(*ntransf, *nj, x, y, c, *iflag, *eps, *nk, s, t, f, o);
302344
}
303345

304346
// --- 3D ---
347+
FINUFFT_EXPORT
305348
void finufftf3d1_(i64 *nj, f32 *xj, f32 *yj, f32 *zj, c64 *cj, int *iflag, f32 *eps,
306349
i64 *ms, i64 *mt, i64 *mu, c64 *fk, finufft_opts *o, int *ier) {
307350
*ier = finufftf3d1(*nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
308351
}
309352

353+
FINUFFT_EXPORT
310354
void finufftf3d1many_(int *ntransf, i64 *nj, f32 *xj, f32 *yj, f32 *zj, c64 *cj,
311355
int *iflag, f32 *eps, i64 *ms, i64 *mt, i64 *mu, c64 *fk,
312356
finufft_opts *o, int *ier) {
313357
*ier =
314358
finufftf3d1many(*ntransf, *nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
315359
}
316360

361+
FINUFFT_EXPORT
317362
void finufftf3d2_(i64 *nj, f32 *xj, f32 *yj, f32 *zj, c64 *cj, int *iflag, f32 *eps,
318363
i64 *ms, i64 *mt, i64 *mu, c64 *fk, finufft_opts *o, int *ier) {
319364
*ier = finufftf3d2(*nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
320365
}
321366

367+
FINUFFT_EXPORT
322368
void finufftf3d2many_(int *ntransf, i64 *nj, f32 *xj, f32 *yj, f32 *zj, c64 *cj,
323369
int *iflag, f32 *eps, i64 *ms, i64 *mt, i64 *mu, c64 *fk,
324370
finufft_opts *o, int *ier) {
325371
*ier =
326372
finufftf3d2many(*ntransf, *nj, xj, yj, zj, cj, *iflag, *eps, *ms, *mt, *mu, fk, o);
327373
}
328374

375+
FINUFFT_EXPORT
329376
void finufftf3d3_(i64 *nj, f32 *x, f32 *y, f32 *z, c64 *c, int *iflag, f32 *eps, i64 *nk,
330377
f32 *s, f32 *t, f32 *u, c64 *f, finufft_opts *o, int *ier) {
331378
*ier = finufftf3d3(*nj, x, y, z, c, *iflag, *eps, *nk, s, t, u, f, o);
332379
}
333380

381+
FINUFFT_EXPORT
334382
void finufftf3d3many_(int *ntransf, i64 *nj, f32 *x, f32 *y, f32 *z, c64 *c, int *iflag,
335383
f32 *eps, i64 *nk, f32 *s, f32 *t, f32 *u, c64 *f, finufft_opts *o,
336384
int *ier) {

0 commit comments

Comments
 (0)