C API

Include the header cosmosis/datablock/c_datablock.h (relative to the include directory ${COSMOSIS_SRC_DIR}) to write cosmosis modules in C.

The following functions are available to write modules in C. The return type DATABLOCK_STATUS is an enum; 0 represents success.

C Module Structure

Here is an example of a module structure in C.

#include "cosmosis/datablock/c_datablock.h"
#include "cosmosis/datablock/section_names.h"


void * setup(c_datablock * options)
{


    // Read options from the CosmoSIS configuration ini file,
    // passed via the "options" argument
    int status = 0;
    status |= c_datablock_get_double(options, OPTION_SECTION, "mode", &mode);

    if (status){
        fprintf(stderr, "Please specify a mode in the CosmoSIS configuration ini file.\n");
        exit(status);
    }
    // Record any configuration information required
    struct my_config * config = malloc(sizeof(struct my_config));
    config->mode = mode;
    // Pass back any object you like
    return config
}

int execute(c_datablock * block, void * config)
{

    // Config is whatever you returned from setup above
    // Block is the collection of parameters and calculations for
    // this set of cosmological parameters
    int status = 0;
    int mode = config->mode;

    double w,omega_m;
    status |= c_datablock_get_double(block, cosmo, "w", &w);
    status |= c_datablock_get_double(block, cosmo, "omega_m", &omega_m);

    result = my_function(omega_m,w);
    //save to datablock
    status |= c_datablock_put_double(block, like, "MY_FUNCTION_LIKE", result);

    return status;
}

Getters

DATABLOCK_STATUS
c_datablock_get_int(c_datablock* s, const char* section, const char* name, int* val);

DATABLOCK_STATUS
c_datablock_get_bool(c_datablock* s, const char* section, const char* name, bool* val);

DATABLOCK_STATUS
c_datablock_get_double(c_datablock* s, const char* section, const char* name, double* val);

DATABLOCK_STATUS
c_datablock_get_complex(c_datablock* s, const char* section, const char* name, double _Complex* val);

DATABLOCK_STATUS
c_datablock_get_string(c_datablock* s, const char* section, const char* name, char** val);

Getters with defaults

DATABLOCK_STATUS
c_datablock_get_int_default(c_datablock* s, const char* section, const char* name, int def, int* val);

DATABLOCK_STATUS
c_datablock_get_bool_default(c_datablock* s, const char* section, const char* name, bool def, bool* val);

DATABLOCK_STATUS
c_datablock_get_double_default(c_datablock* s, const char* section, const char* name, double def, double* val);

DATABLOCK_STATUS
c_datablock_get_string_default(c_datablock* s, const char* section, const char* name, const char* def, char** val);

DATABLOCK_STATUS
c_datablock_get_complex_default(c_datablock* s, const char* section, const char* name, double _Complex def,double _Complex* val);

Array getters

If you want CosmoSIS to malloc the array for you and also return the size:

DATABLOCK_STATUS
c_datablock_get_int_array_1d(c_datablock* s, const char* section, const char* name, int** val, int* size);

DATABLOCK_STATUS
c_datablock_get_double_array_1d(c_datablock* s, const char* section, const char* name, double** val, int* size);

DATABLOCK_STATUS
c_datablock_get_complex_array_1d(c_datablock* s, const char* section, const char* name, double _Complex** val, int* size);

Or if you already know the size:

DATABLOCK_STATUS
c_datablock_get_int_array_1d_preallocated(c_datablock* s, const char* section, const char* name, int* array, int* size, int maxsize);

DATABLOCK_STATUS
c_datablock_get_double_array_1d_preallocated(c_datablock* s, const char* section, const char* name, double* array, int* size, int maxsize);

DATABLOCK_STATUS
c_datablock_get_complex_array_1d_preallocated(c_datablock* s, const char* section, const char* name, double _Complex* array, int* size, int maxsize);

Setters

In C you don’t use setter functions to modify existing values, just to add new ones. See Replacers below for the former.

DATABLOCK_STATUS
c_datablock_put_int(c_datablock* s, const char* section, const char* name, int val);

DATABLOCK_STATUS
c_datablock_put_bool(c_datablock* s, const char* section, const char* name, bool val);

DATABLOCK_STATUS
c_datablock_put_double(c_datablock* s, const char* section, const char* name, double val);

DATABLOCK_STATUS
c_datablock_put_complex(c_datablock* s, const char* section, const char* name, double _Complex val);

DATABLOCK_STATUS
c_datablock_put_string(c_datablock* s, const char* section, const char* name, const char* val);

Array Setters

DATABLOCK_STATUS
c_datablock_put_int_array_1d(c_datablock* s, const char* section, const char* name, int const*  val, int sz);

DATABLOCK_STATUS
c_datablock_put_double_array_1d(c_datablock* s, const char* section, const char* name, double const*  val, int sz);

DATABLOCK_STATUS
c_datablock_put_complex_array_1d(c_datablock* s, const char* section, const char* name, double _Complex const*  val, int sz);

Replacers

These replace an existing value. Must be the same type.

DATABLOCK_STATUS
c_datablock_replace_int(c_datablock* s, const char* section, const char* name, int val);

DATABLOCK_STATUS
c_datablock_replace_bool(c_datablock* s, const char* section, const char* name, bool val);

DATABLOCK_STATUS
c_datablock_replace_double(c_datablock* s, const char* section, const char* name, double val);

DATABLOCK_STATUS
c_datablock_replace_complex(c_datablock* s, const char* section, const char* name, double _Complex val);

DATABLOCK_STATUS
c_datablock_replace_string(c_datablock* s, const char* section, const char* name, const char* val);

Array Replacers

DATABLOCK_STATUS
c_datablock_replace_int_array_1d(c_datablock* s, const char* section, const char* name, int const* val, int sz);

DATABLOCK_STATUS
c_datablock_replace_double_array_1d(c_datablock* s, const char* section, const char* name, double const* val, int sz);

DATABLOCK_STATUS
c_datablock_replace_complex_array_1d(c_datablock* s, const char* section, const char* name, double _Complex const* val, int sz);