solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

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:
Msrc/ssol.h | 14+++++++++++---
Msrc/ssol_spectrum.c | 25+++++++++++++------------
Msrc/test_ssol_scene.c | 15++++++++++++---
Msrc/test_ssol_solver1.c | 49+++++++++++++++++++++++++++++++++++++++----------
Msrc/test_ssol_solver2.c | 18++++++++++++------
Msrc/test_ssol_solver2b.c | 22++++++++++++++--------
Msrc/test_ssol_solver3.c | 18++++++++++++------
Msrc/test_ssol_solver3N.c | 15++++++++++++---
Msrc/test_ssol_solver4.c | 18++++++++++++------
Msrc/test_ssol_solver5.c | 18++++++++++++------
Msrc/test_ssol_spectrum.c | 46++++++++++++++++++++++++++++++++++++++--------
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);