Wiki

Clone wiki

cosmosis / modules_c

Writing a module in C

#!C

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

const char * cosmo = COSMOLOGICAL_PARAMETERS_SECTION;
const char * like  = LIKELIHOODS_SECTION;

void * setup(c_datablock * options)
{
    // Read options from the CosmoSIS configuration ini file,
    // passed via the "options" argument

    // Set any global variables required

    // Record any configuration information required

    // Pass back any object you like
         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);
         }


}

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;
        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;
}


int cleanup(void * config)
{
    // Config is whatever you returned from setup above
    // Free it 

    return 0;
}

DESCRIBE WHAT ALL THIS MEANS.

Listing of cosmosis C functions for modules

GET scalar functions

You use these functions to load scalar values from the cosmosis datablock:

#!C
  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);

You can also specify a default to be used if the value is not found:

#!C

  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);

GET array functions

These functions load a 1D array of data from the block. The val argument should not be allocated beforehand; cosmosis will allocate space for it. You must free the array you get back after you have finished with it, for example:

#!C
double * x;
int nx;
int status = c_datablock_get_int_array_1d(block,"section", "name", &x, &nx);
// Do what you need to with x ...
free(x);

Full listing:

#!C

  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);

If you have allocated an array or are using static arrays you can get data into this preallocated array. The maxsize integer tells cosmosis how much space you allocated for it; the returned size value tells you how much was actually used. If maxsize is not large enough for the array you ask for then this is an error; a non-zero status is returned.

#!C
  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);

PUT scalar functions

You use these functions to save scalar values in the cosmosis datablock:

#!C

  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);

#PUT arrays functions

These functions save 1D arrays to the cosmosis datablock.

#!C

  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);

REPLACE scalar functions

You use these functions to replace existing scalar values in the cosmosis datablock:

#!C
  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);

REPLACE array functions

These functions replace 1D array data in the cosmosis data block.

#!C
  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);

TODO: Document n-dimensional array functions

Updated