@@ -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+
237270static 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