/*
 * Demonstration of using the netCDF module from another C module.
 *
 * Written by Konrad Hinsen
 * last revision: 2001-1-3
 */

#include "Python.h"
#include "Numeric/arrayobject.h"
#include "Scientific/netcdfmodule.h"


/*
 * Create a file with two dimensions and one variable.
 *
 * Attention: there is no error checking in this code! All return
 * values ought to be tested.
 */
static PyObject *
create_file(self, args)
     PyObject *self; /* Not used */
     PyObject *args; /* Not used either */
{
  /* Pointer to file object */
  PyNetCDFFileObject *file;
  /* Dimension names for variable foo */
  char *dimensions[] = {"n", "xyz", "string_length"};
  /* Pointer to variable object */
  PyNetCDFVariableObject *foo, *bar;
  /* Pointer to indices */
  PyNetCDFIndex *indices;

  /* Open file */
  file = PyNetCDFFile_Open("demo.nc", "w");
  /* Add file attribute */
  PyNetCDFFile_SetAttributeString(file, "title", "useless data");
  /* Add history line */
  PyNetCDFFile_AddHistoryLine(file, "Created some day");
  /* Create two dimensions */
  PyNetCDFFile_CreateDimension(file, dimensions[0], 10);
  PyNetCDFFile_CreateDimension(file, dimensions[1], 3);
  PyNetCDFFile_CreateDimension(file, dimensions[2], 100);
  /* Create variable */
  foo = PyNetCDFFile_CreateVariable(file, "foo", 'l', dimensions, 2);
  /* Add variable attribute */
  PyNetCDFVariable_SetAttributeString(foo, "units", "arbitrary");
  /* Create index array */
  indices = PyNetCDFVariable_Indices(foo);
  /* Write zeros everywhere */
  PyNetCDFVariable_WriteArray(foo, indices, PyInt_FromLong(0));
  /* Create variable */
  bar = PyNetCDFFile_CreateVariable(file, "bar", 'c', dimensions+2, 1);
  /* Write string */
  PyNetCDFVariable_WriteString(bar,
                (PyStringObject *)PyString_FromString("nothing important"));
  /* Close file */
  PyNetCDFFile_Close(file);

  /* Return None */
  Py_INCREF(Py_None);
  return Py_None;
}

/* Table of functions defined in the module */

static PyMethodDef demo_methods[] = {
  {"createDemoFile",	create_file, 1},
  {NULL,		NULL}		/* sentinel */
};


/* Module initialization */

void
initdemo()
{
  PyObject *module;
  PyObject *netcdf, *netcdf_dict;
  PyObject *c_api_object;

  /* Create the module and add the functions */
  module = Py_InitModule("demo", demo_methods);

  /* Import the array module */
  import_array();

  /* Import netcdf and retrieve its C API address array */
  netcdf = PyImport_ImportModule("Scientific.IO.NetCDF");
  if (netcdf != NULL) {
    netcdf_dict = PyModule_GetDict(netcdf);
    c_api_object = PyDict_GetItemString(netcdf_dict, "_C_API");
    if (PyCObject_Check(c_api_object)) {
      PyNetCDF_API = (void **)PyCObject_AsVoidPtr(c_api_object);
    }
  }

  /* Check for errors */
  if (PyErr_Occurred())
    Py_FatalError("can't initialize module demo");
}
