commit 44782765b105af190474897a3f9e37ba0168ac65
parent 016c42a6cf3932cc591fc683636d30bd8dd1ab31
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 20 Jan 2017 15:31:51 +0100
Update the ssol_spectrum_setup API
Use a callback to retrieve the spectrum data rather than relying
directly onto lists of floating points.
Diffstat:
11 files changed, 187 insertions(+), 71 deletions(-)
diff --git a/src/ssol.h b/src/ssol.h
@@ -107,6 +107,14 @@ struct ssol_vertex_data {
void* ctx); /* Pointer toward user data */
};
+struct ssol_spectrum_desc {
+ double (*get)
+ (const unsigned iwavelength,
+ double* wavelength,
+ double* data,
+ void* ctx); /* Pointer toward user data */
+};
+
/* Invalid vertex data */
#define SSOL_VERTEX_DATA_NULL__ { SSOL_ATTRIBS_COUNT__, NULL }
static const struct ssol_vertex_data SSOL_VERTEX_DATA_NULL =
@@ -643,9 +651,9 @@ ssol_spectrum_ref_put
SSOL_API res_T
ssol_spectrum_setup
(struct ssol_spectrum* spectrum,
- const double* wavelengths,
- const double* data, /* Per wavelength data */
- const size_t nwavelength);
+ void (*get)(const size_t iwlen, double* wlen, double* data, void* ctx),
+ const size_t nwlens,
+ void* ctx);
/*******************************************************************************
* Sun API - Describe a sun model.
diff --git a/src/ssol_spectrum.c b/src/ssol_spectrum.c
@@ -169,27 +169,28 @@ ssol_spectrum_ref_put(struct ssol_spectrum* spectrum)
SSOL_API res_T
ssol_spectrum_setup
(struct ssol_spectrum* spectrum,
- const double* wavelengths,
- const double* data,
- const size_t nwavelength)
+ void (*get)(const size_t iwlen, double* wlen, double* data, void* ctx),
+ const size_t nwlens,
+ void* ctx)
{
- res_T res = RES_OK;
+ double* wavelengths;
+ double* intensities;
size_t i;
- if(!spectrum || !nwavelength || !wavelengths || !data) {
+ res_T res = RES_OK;
+
+ if(!spectrum || !nwlens || !get) {
res = RES_BAD_ARG;
goto error;
}
- res = darray_double_resize(&spectrum->wavelengths, nwavelength);
+ res = darray_double_resize(&spectrum->wavelengths, nwlens);
if(res != RES_OK) goto error;
-
- res = darray_double_resize(&spectrum->intensities, nwavelength);
+ res = darray_double_resize(&spectrum->intensities, nwlens);
if(res != RES_OK) goto error;
- FOR_EACH(i, 0, nwavelength) {
- spectrum->wavelengths.data[i] = wavelengths[i];
- spectrum->intensities.data[i] = data[i];
- }
+ wavelengths = darray_double_data_get(&spectrum->wavelengths);
+ intensities = darray_double_data_get(&spectrum->intensities);
+ FOR_EACH(i, 0, nwlens) get(i, wavelengths+i, intensities+i, ctx);
exit:
return res;
diff --git a/src/test_ssol_scene.c b/src/test_ssol_scene.c
@@ -18,6 +18,17 @@
#include <rsys/logger.h>
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 10, 20, 30 };
+ double intensities[3] = { 1, 2.1, 1.5 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -35,8 +46,6 @@ main(int argc, char** argv)
struct ssol_spectrum* spectrum;
struct ssol_atmosphere* atm;
struct ssol_atmosphere* atm2;
- double wavelengths[3] = { 10, 20, 30 };
- double data[3] = { 1, 2.1, 1.5 };
double transform[12];
(void) argc, (void) argv;
@@ -110,7 +119,7 @@ main(int argc, char** argv)
CHECK(ssol_scene_detach_sun(scene2, sun), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_atmosphere_create_uniform(dev, &atm), RES_OK);
CHECK(ssol_atmosphere_set_uniform_absorption(atm, spectrum), RES_OK);
CHECK(ssol_atmosphere_create_uniform(dev, &atm2), RES_OK);
diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c
@@ -28,12 +28,25 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+struct spectrum_desc {
+ const double* wavelengths;
+ const double* intensities;
+ size_t count;
+};
+
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ const struct spectrum_desc* desc = ctx;
+ CHECK(i < desc->count, 1);
+ *wlen = desc->wavelengths[i];
+ *data = desc->intensities[i];
+}
+
int
main(int argc, char** argv)
{
+ struct spectrum_desc desc = {0};
struct logger logger;
struct mem_allocator allocator;
struct ssol_device* dev;
@@ -58,8 +71,8 @@ main(int argc, char** argv)
struct ssol_estimator_status status;
double dir[3];
double wavelengths[3] = { 1, 2, 3 };
- double mismatch[3] = { 1.5, 3.5 };
double intensities[3] = { 1, 0.8, 1 };
+ double mismatch[3] = { 1.5, 3.5, 0 };
double ka[3] = { 0, 0, 0 };
double mono = 1.21;
double transform1[12]; /* 3x4 column major matrix */
@@ -93,8 +106,12 @@ main(int argc, char** argv)
(&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK);
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+
+ desc.wavelengths = wavelengths;
+ desc.intensities = intensities;
+ desc.count = 3;
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 1, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
@@ -189,8 +206,11 @@ main(int argc, char** argv)
CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK);
/* Spectra mismatch */
+ desc.wavelengths = mismatch;
+ desc.wavelengths = ka;
+ desc.count = 2;
CHECK(ssol_spectrum_create(dev, &abs), RES_OK);
- CHECK(ssol_spectrum_setup(abs, mismatch, ka, 2), RES_OK);
+ CHECK(ssol_spectrum_setup(abs, get_wlen, 2, &desc), RES_OK);
CHECK(ssol_atmosphere_create_uniform(dev, &atm), RES_OK);
CHECK(ssol_atmosphere_set_uniform_absorption(atm, abs), RES_OK);
CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK);
@@ -252,8 +272,11 @@ main(int argc, char** argv)
CHECK(eq_eps(status.E, 0, 1e-4), 1);
/* Check atmosphere model; with no absorption result is unchanged */
+ desc.wavelengths = wavelengths;
+ desc.intensities = ka;
+ desc.count = 3;
CHECK(ssol_spectrum_create(dev, &abs), RES_OK);
- CHECK(ssol_spectrum_setup(abs, wavelengths, ka, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(abs, get_wlen, 3, &desc), RES_OK);
CHECK(ssol_atmosphere_create_uniform(dev, &atm), RES_OK);
CHECK(ssol_atmosphere_set_uniform_absorption(atm, abs), RES_OK);
CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK);
@@ -281,7 +304,7 @@ main(int argc, char** argv)
/* Check atmosphere model; with absorption power decreases */
ka[0] = ka[1] = ka[2] = 0.1;
CHECK(ssol_spectrum_create(dev, &abs), RES_OK);
- CHECK(ssol_spectrum_setup(abs, wavelengths, ka, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(abs, get_wlen, 3, &desc), RES_OK);
CHECK(ssol_atmosphere_create_uniform(dev, &atm), RES_OK);
CHECK(ssol_atmosphere_set_uniform_absorption(atm, abs), RES_OK);
CHECK(ssol_scene_attach_atmosphere(scene, atm), RES_OK);
@@ -305,7 +328,10 @@ main(int argc, char** argv)
CHECK(eq_eps(status.E, 0, 1e-4), 1);
/* Check a monochromatic sun */
- CHECK(ssol_spectrum_setup(spectrum, &mono, intensities, 1), RES_OK);
+ desc.wavelengths = &mono;
+ desc.intensities = intensities;
+ desc.count = 1;
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 1, &desc), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun_mono), RES_OK);
CHECK(ssol_sun_set_direction(sun_mono, d3(dir, 1, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun_mono, spectrum), RES_OK);
@@ -313,7 +339,10 @@ main(int argc, char** argv)
CHECK(ssol_scene_detach_sun(scene, sun), RES_OK);
CHECK(ssol_scene_attach_sun(scene, sun_mono), RES_OK);
ka[1] = 0.2;
- CHECK(ssol_spectrum_setup(abs, wavelengths, ka, 2), RES_OK);
+ desc.wavelengths = wavelengths;
+ desc.intensities = ka;
+ desc.count = 2;
+ CHECK(ssol_spectrum_setup(abs, get_wlen, 2, &desc), RES_OK);
NCHECK(tmp = tmpfile(), 0);
CHECK(ssol_estimator_clear(estimator), RES_OK);
CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK);
diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c
@@ -38,9 +38,17 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -71,8 +79,6 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_estimator_status status;
double dir[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform1[12]; /* 3x4 column major matrix */
double transform2[12]; /* 3x4 column major matrix */
double transform3[12]; /* 3x4 column major matrix */
@@ -108,7 +114,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 1, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c
@@ -38,9 +38,17 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -71,8 +79,6 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_estimator_status status;
double dir[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform1[12]; /* 3x4 column major matrix */
double transform2[12]; /* 3x4 column major matrix */
double transform3[12]; /* 3x4 column major matrix */
@@ -108,7 +114,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 1, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
@@ -124,7 +130,7 @@ main(int argc, char** argv)
attribs[0].get = get_position;
CHECK(ssol_mesh_setup(rect, RECT_NTRIS__, get_ids,
RECT_NVERTS__, attribs, 1, (void*) &RECT_DESC__), RES_OK);
-
+
CHECK(ssol_shape_create_punched_surface(dev, &quad_rect), RES_OK);
carving.get = get_polygon_vertices;
carving.operation = SSOL_AND;
@@ -182,7 +188,7 @@ main(int argc, char** argv)
CHECK(ssol_instance_set_receiver(target, SSOL_FRONT), RES_OK);
CHECK(ssol_instance_sample(target, 0), RES_OK);
CHECK(ssol_scene_attach_instance(scene, target), RES_OK);
-
+
NCHECK(tmp = tmpfile(), 0);
#define N__ 50000
CHECK(ssol_solve(scene, rng, N__, tmp, estimator), RES_OK);
diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c
@@ -33,9 +33,17 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -62,8 +70,6 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_estimator_status status;
double dir[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform[12]; /* 3x4 column major matrix */
size_t count;
FILE* tmp;
@@ -88,7 +94,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 1, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c
@@ -75,6 +75,17 @@ set_1(struct common* common, const double pos[3])
SSOL(instance_ref_put(heliostat));
}
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
/*******************************************************************************
* Test main program
******************************************************************************/
@@ -105,8 +116,6 @@ main(int argc, char** argv)
struct ssol_estimator_status status;
double sun_dir[3];
double target_pos[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform[12]; /* 3x4 column major matrix */
size_t count;
FILE* tmp;
@@ -127,7 +136,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
d3(sun_dir, 1, 0, -1);
d3_normalize(sun_dir, sun_dir);
diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c
@@ -33,9 +33,17 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -63,8 +71,6 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_estimator_status status;
double dir[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform[12]; /* 3x4 column major matrix */
size_t count;
FILE* tmp;
@@ -89,7 +95,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 0, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c
@@ -33,9 +33,17 @@
#include <star/s3d.h>
#include <star/ssp.h>
-/*******************************************************************************
- * Test main program
- ******************************************************************************/
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ double wavelengths[3] = { 1, 2, 3 };
+ double intensities[3] = { 1, 0.8, 1 };
+ CHECK(i < 3, 1);
+ (void)ctx;
+ *wlen = wavelengths[i];
+ *data = intensities[i];
+}
+
int
main(int argc, char** argv)
{
@@ -62,8 +70,6 @@ main(int argc, char** argv)
struct ssol_estimator* estimator;
struct ssol_estimator_status status;
double dir[3];
- double wavelengths[3] = { 1, 2, 3 };
- double intensities[3] = { 1, 0.8, 1 };
double transform[12]; /* 3x4 column major matrix */
size_t count;
FILE* tmp;
@@ -88,7 +94,7 @@ main(int argc, char** argv)
CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, intensities, 3), RES_OK);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, NULL), RES_OK);
CHECK(ssol_sun_create_directional(dev, &sun), RES_OK);
CHECK(ssol_sun_set_direction(sun, d3(dir, 0, 0, -1)), RES_OK);
CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK);
diff --git a/src/test_ssol_spectrum.c b/src/test_ssol_spectrum.c
@@ -18,6 +18,26 @@
#include <rsys/logger.h>
+struct spectrum_desc {
+ double wavelengths[3];
+ double data[3];
+};
+
+static int wlens_count = 0;
+
+static void
+get_wlen(const size_t i, double* wlen, double* data, void* ctx)
+{
+ struct spectrum_desc* desc = ctx;
+ CHECK(i < 3, 1);
+ NCHECK(wlen, NULL);
+ NCHECK(data, NULL);
+ NCHECK(ctx, NULL);
+ *wlen = desc->wavelengths[i];
+ *data = desc->data[i];
+ ++wlens_count;
+}
+
int
main(int argc, char** argv)
{
@@ -25,8 +45,7 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct ssol_device* dev;
struct ssol_spectrum* spectrum;
- double wavelengths[3] = { 10, 20, 30 };
- double data[3] = { 1, 2.1, 1.5 };
+ struct spectrum_desc desc;
(void) argc, (void) argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
@@ -49,12 +68,23 @@ main(int argc, char** argv)
CHECK(ssol_spectrum_ref_put(NULL), RES_BAD_ARG);
CHECK(ssol_spectrum_ref_put(spectrum), RES_OK);
- CHECK(ssol_spectrum_setup(NULL, wavelengths, data, 3), RES_BAD_ARG);
- CHECK(ssol_spectrum_setup(spectrum, NULL, data, 3), RES_BAD_ARG);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, NULL, 3), RES_BAD_ARG);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 0), RES_BAD_ARG);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK);
- CHECK(ssol_spectrum_setup(spectrum, wavelengths, data, 3), RES_OK);
+ desc.wavelengths[0] = 10;
+ desc.wavelengths[1] = 20;
+ desc.wavelengths[2] = 30;
+ desc.data[0] = 1;
+ desc.data[1] = 2.1;
+ desc.data[2] = 1.5;
+
+ CHECK(ssol_spectrum_setup(NULL, NULL, 0, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(spectrum, NULL, 0, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(NULL, get_wlen, 0, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 0, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(NULL, NULL, 3, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(spectrum, NULL, 3, &desc), RES_BAD_ARG);
+ CHECK(ssol_spectrum_setup(NULL, get_wlen, 3, &desc), RES_BAD_ARG);
+ CHECK(wlens_count, 0);
+ CHECK(ssol_spectrum_setup(spectrum, get_wlen, 3, &desc), RES_OK);
+ CHECK(wlens_count, 3);
CHECK(ssol_spectrum_ref_put(spectrum), RES_OK);