Template:CMI Example get grid values C

From CSDMS
    struct sidl_double__array* vals = NULL;

    {
      struct edu_csdms_models_Sedflux3D__data *this =
        edu_csdms_models_Sedflux3D__get_data (self);

      edu_csdms_tools_Verbose_info (this->log, "Getting values.", _ex);

      if (this && this->state)
      {
        int n_dims;
        int * dimen;
        double* data = BMI_Get_double (this->state, long_var_name, &n_dims,
            &dimen);

        if (data)
        { /* Create an array that borrows these values. */
          int i;
          int * lower = (int*)malloc (sizeof (int)*n_dims);
          int * upper = (int*)malloc (sizeof (int)*n_dims);
          int * stride = (int*)malloc (sizeof (int)*n_dims);

          /* BMI_get_double returns an array that is compact and has
           * unit stride */
          for (i=0; i<n_dims; i++)
          {
            lower[i] = 0;
            upper[i] = dimen[i]-1;
          }
          for (i=n_dims-2, stride[n_dims-1]=1; i>=0; i--)
            stride[i] = stride[i+1]*dimen[i+1];

          {
            const int _n_dims = 1;
            const int _lower[1] = {0};
            const int _upper[1] = {dimen[0]*dimen[1]-1};
            const int _stride[1] = {1};

            vals = sidl_double__array_borrow (data, _n_dims, _lower,
                _upper, _stride);
          }

          free (stride);
          free (upper);
          free (lower);
        }

      }
      edu_csdms_tools_Verbose_info (this->log, "Got values.", _ex);
    }

    return vals;