Skip to content

Commit 66ee23d

Browse files
committed
add template for include and exclude aero_state calls
1 parent dead37c commit 66ee23d

1 file changed

Lines changed: 48 additions & 69 deletions

File tree

src/aero_state.hpp

Lines changed: 48 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,39 @@ auto pointer_vec_magic(arr_t &data_vec, const arg_t &arg) {
234234
return pointer_vec;
235235
}
236236

237+
// Retrieves an array from a Fortran routine with include/exclude species filters.
238+
template <typename Func, typename LenF>
239+
auto get_array_values_filtered(
240+
const void *self_ptr,
241+
const void *aero_data_ptr,
242+
Func f,
243+
LenF len_fn,
244+
const tl::optional<std::vector<std::string>> &include,
245+
const tl::optional<std::vector<std::string>> &exclude
246+
) {
247+
int len;
248+
len_fn(self_ptr, &len);
249+
std::valarray<double> arr(len);
250+
251+
const int include_size = include.has_value() ? include.value().size() : 0;
252+
const int exclude_size = exclude.has_value() ? exclude.value().size() : 0;
253+
254+
std::vector<std::array<char, AERO_NAME_LEN>>
255+
include_arr(include_size),
256+
exclude_arr(exclude_size);
257+
258+
f(self_ptr,
259+
aero_data_ptr,
260+
begin(arr),
261+
&len,
262+
&include_size,
263+
&exclude_size,
264+
pointer_vec_magic(include_arr, include).data(),
265+
pointer_vec_magic(exclude_arr, exclude).data());
266+
267+
return arr;
268+
}
269+
237270
static const std::map<bpstd::string_view, char> weight_c{
238271
//{"none", '-'},
239272
{"flat", 'f'},
@@ -346,32 +379,14 @@ struct AeroState {
346379
const tl::optional<std::vector<std::string>> &include,
347380
const tl::optional<std::vector<std::string>> &exclude
348381
) {
349-
int len;
350-
f_aero_state_len(
351-
self.ptr.f_arg(),
352-
&len
353-
);
354-
std::valarray<double> masses(len);
355-
356-
const int include_size = (include.has_value()) ? include.value().size() : 0;
357-
const int exclude_size = (exclude.has_value()) ? exclude.value().size() : 0;
358-
359-
std::vector<std::array<char, AERO_NAME_LEN>>
360-
include_arr(include_size),
361-
exclude_arr(exclude_size);
362-
363-
f_aero_state_masses(
382+
return get_array_values_filtered(
364383
self.ptr.f_arg(),
365384
self.aero_data->ptr.f_arg(),
366-
begin(masses),
367-
&len,
368-
&include_size,
369-
&exclude_size,
370-
pointer_vec_magic(include_arr, include).data(),
371-
pointer_vec_magic(exclude_arr, exclude).data()
385+
f_aero_state_masses,
386+
f_aero_state_len,
387+
include,
388+
exclude
372389
);
373-
374-
return masses;
375390
}
376391

377392
static auto frozen_fraction(const AeroState &self) {
@@ -404,65 +419,29 @@ struct AeroState {
404419
const tl::optional<std::vector<std::string>> &include,
405420
const tl::optional<std::vector<std::string>> &exclude
406421
) {
407-
int len;
408-
f_aero_state_len(
409-
self.ptr.f_arg(),
410-
&len
411-
);
412-
std::valarray<double> diameters(len);
413-
414-
const int include_size = (include.has_value()) ? include.value().size() : 0;
415-
const int exclude_size = (exclude.has_value()) ? exclude.value().size() : 0;
416-
417-
std::vector<std::array<char, AERO_NAME_LEN>>
418-
include_arr(include_size),
419-
exclude_arr(exclude_size);
420-
421-
f_aero_state_diameters(
422+
return get_array_values_filtered(
422423
self.ptr.f_arg(),
423424
self.aero_data->ptr.f_arg(),
424-
begin(diameters),
425-
&len,
426-
&include_size,
427-
&exclude_size,
428-
pointer_vec_magic(include_arr, include).data(),
429-
pointer_vec_magic(exclude_arr, exclude).data()
425+
f_aero_state_diameters,
426+
f_aero_state_len,
427+
include,
428+
exclude
430429
);
431-
432-
return diameters;
433430
}
434431

435432
static auto volumes(
436433
const AeroState &self,
437434
const tl::optional<std::vector<std::string>> &include,
438435
const tl::optional<std::vector<std::string>> &exclude
439436
) {
440-
int len;
441-
f_aero_state_len(
442-
self.ptr.f_arg(),
443-
&len
444-
);
445-
std::valarray<double> volumes(len);
446-
447-
const int include_size = (include.has_value()) ? include.value().size() : 0;
448-
const int exclude_size = (exclude.has_value()) ? exclude.value().size() : 0;
449-
450-
std::vector<std::array<char, AERO_NAME_LEN>>
451-
include_arr(include_size),
452-
exclude_arr(exclude_size);
453-
454-
f_aero_state_volumes(
437+
return get_array_values_filtered(
455438
self.ptr.f_arg(),
456439
self.aero_data->ptr.f_arg(),
457-
begin(volumes),
458-
&len,
459-
&include_size,
460-
&exclude_size,
461-
pointer_vec_magic(include_arr, include).data(),
462-
pointer_vec_magic(exclude_arr, exclude).data()
440+
f_aero_state_volumes,
441+
f_aero_state_len,
442+
include,
443+
exclude
463444
);
464-
465-
return volumes;
466445
}
467446

468447
static auto crit_rel_humids(

0 commit comments

Comments
 (0)