commit 283f82b38a7b3c867accf2f0a3a1b2e2132ebd11
parent ed1549d80066aabc1b21e3dc5818e66331019651
Author: Eduardo Fontana Lazzari <edufonlaz@gmail.com>
Date: Mon, 8 Sep 2025 14:08:57 +0200
Add interp method to interpolation function
Although only linear interpolation is currently supported, it is very
likely that in the future developers may want to test different
interpolation methods. Adding the interpolation method as a function
argument anticipates the use of other methods and prevents future API
breaks due to changes in the function prototype when a new method is
added.
Diffstat:
4 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/sphin.h b/src/sphin.h
@@ -75,6 +75,11 @@ enum sphin_prop_rad_type {
SPHIN_PROP_RAD_NONE__
};
+enum sphin_interpolation_type {
+ SPHIN_INTERPOLATION_LINEAR,
+ SPHIN_INTERPOLATION_NONE__
+};
+
struct sphin_create_args {
struct logger* logger; /* May be NULL <=> default logger */
struct mem_allocator* allocator; /* NULL <=> use default allocator */
@@ -516,6 +521,7 @@ SPHIN_API res_T
sphin_spectral_property_interpolate_at_wavelength
(const struct sphin_spectral_property* property,
double wavelength,
+ enum sphin_interpolation_type type,
double* value);
END_DECLS
diff --git a/src/sphin_spectral_property.c b/src/sphin_spectral_property.c
@@ -304,6 +304,7 @@ res_T
sphin_spectral_property_interpolate_at_wavelength
(const struct sphin_spectral_property* property,
double wavelength,
+ enum sphin_interpolation_type interpolation_type,
double* value)
{
double wl_min, wl_max; /* Min and max wl values in the whole table */
@@ -319,6 +320,10 @@ sphin_spectral_property_interpolate_at_wavelength
return RES_BAD_ARG;
}
+ if ((unsigned) interpolation_type >= SPHIN_INTERPOLATION_NONE__) {
+ return RES_BAD_ARG;
+ }
+
data_count = darray_double_size_get(&property->wavelengths);
wavelengths = darray_double_cdata_get(&property->wavelengths);
values = darray_double_cdata_get(&property->values);
diff --git a/src/test_sphin_load_prop_rad.c b/src/test_sphin_load_prop_rad.c
@@ -154,13 +154,13 @@ test_prop_rad_api
CHK(sphin_spectral_property_get_desc(NULL, &abs_cs_desc) == RES_BAD_ARG);
CHK(sphin_spectral_property_get_desc(abs_cross_sec, &abs_cs_desc) == RES_OK);
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 100, &value) == RES_OK);
+ (abs_cross_sec, 100, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1., 1e-15));
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 175, &value) == RES_OK);
+ (abs_cross_sec, 175, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1.75, 1e-15));
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 400, &value) == RES_OK);
+ (abs_cross_sec, 400, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 4., 1e-15));
CHK(eq_eps(abs_cs_desc.wavelengths[0], 100, 1e-15));
CHK(eq_eps(abs_cs_desc.wavelengths[2], 300, 1e-15));
@@ -200,13 +200,13 @@ test_prop_rad_api_units
CHK(sphin_scatterer_get_abs_cross_sec(scatterer, &abs_cross_sec) == RES_OK);
CHK(sphin_spectral_property_get_desc(abs_cross_sec, &abs_cs_desc) == RES_OK);
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 100e7, &value) == RES_OK);
+ (abs_cross_sec, 100e7, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1., 1e-15));
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 175e7, &value) == RES_OK);
+ (abs_cross_sec, 175e7, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1.75, 1e-15));
CHK(sphin_spectral_property_interpolate_at_wavelength
- (abs_cross_sec, 400e7, &value) == RES_OK);
+ (abs_cross_sec, 400e7, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 4., 1e-15));
CHK(eq_eps(abs_cs_desc.wavelengths[0], 100e7, 1e-15));
CHK(eq_eps(abs_cs_desc.wavelengths[2], 300e7, 1e-15));
diff --git a/src/test_sphin_load_source.c b/src/test_sphin_load_source.c
@@ -150,10 +150,10 @@ test_source_api
CHK(sphin_spectral_property_ref_put(flux_density.emission_spectrum) == RES_OK);
CHK(sphin_spectral_property_get_desc(flux_density.emission_spectrum, &emission_desc) == RES_OK);
CHK(sphin_spectral_property_interpolate_at_wavelength
- (flux_density.emission_spectrum, 100, &value) == RES_OK);
+ (flux_density.emission_spectrum, 100, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1., 1e-15));
CHK(sphin_spectral_property_interpolate_at_wavelength
- (flux_density.emission_spectrum, 175, &value) == RES_OK);
+ (flux_density.emission_spectrum, 175, SPHIN_INTERPOLATION_LINEAR, &value) == RES_OK);
CHK(eq_eps(value, 1.75, 1e-15));
CHK(eq_eps(emission_desc.wavelengths[2], 300, 1e-15));
CHK(eq_eps(emission_desc.values[2], 3, 1e-15));