#include 
#include 
#include 

void
check_err(const int stat, const int line, const char *file) {
    if (stat != NC_NOERR) {
        (void)fprintf(stderr,"line %d of %s: %s\n", line, file, nc_strerror(stat));
        fflush(stderr);
        exit(1);
    }
}

int
main() {/* create regions.nc */

    int  stat;  /* return status */
    int  ncid;  /* netCDF id */

    /* group ids */
    int root_grp;
    int USA_grp;
    int USA_Colorado_grp;
    int USA_Wyoming_grp;
    int USA_Alaska_grp;

    /* dimension ids */
    int USA_time_dim;
    int USA_Colorado_stations_dim;
    int USA_Wyoming_stations_dim;
    int USA_Alaska_stations_dim;

    /* dimension lengths */
    size_t USA_time_len = NC_UNLIMITED;
    size_t USA_Colorado_stations_len = 5;
    size_t USA_Wyoming_stations_len = 4;
    size_t USA_Alaska_stations_len = 3;

    /* variable ids */
    int USA_average_temperature_id;
    int USA_Colorado_temperature_id;
    int USA_Wyoming_temperature_id;
    int USA_Alaska_temperature_id;

    /* rank (number of dimensions) for each variable */
#   define RANK_USA_average_temperature 1
#   define RANK_USA_Colorado_temperature 2
#   define RANK_USA_Wyoming_temperature 2
#   define RANK_USA_Alaska_temperature 2

    /* variable shapes */
    int USA_average_temperature_dims[RANK_USA_average_temperature];
    int USA_Colorado_temperature_dims[RANK_USA_Colorado_temperature];
    int USA_Wyoming_temperature_dims[RANK_USA_Wyoming_temperature];
    int USA_Alaska_temperature_dims[RANK_USA_Alaska_temperature];

    /* enter define mode */
    stat = nc_create("regions.nc", NC_CLOBBER|NC_NETCDF4, &ncid);
    check_err(stat,__LINE__,__FILE__);

    root_grp = ncid;
    stat = nc_def_grp(root_grp, "USA", &USA_grp);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_grp(USA_grp, "Colorado", &USA_Colorado_grp);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_grp(USA_grp, "Wyoming", &USA_Wyoming_grp);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_grp(USA_grp, "Alaska", &USA_Alaska_grp);
    check_err(stat,__LINE__,__FILE__);


    /* define dimensions */
    stat = nc_def_dim(USA_grp, "time", USA_time_len, &USA_time_dim);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_dim(USA_Colorado_grp, "stations", USA_Colorado_stations_len, &USA_Colorado_stations_dim);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_dim(USA_Wyoming_grp, "stations", USA_Wyoming_stations_len, &USA_Wyoming_stations_dim);
    check_err(stat,__LINE__,__FILE__);
    stat = nc_def_dim(USA_Alaska_grp, "stations", USA_Alaska_stations_len, &USA_Alaska_stations_dim);
    check_err(stat,__LINE__,__FILE__);

    /* define variables */

    USA_average_temperature_dims[0] = USA_time_dim;
    stat = nc_def_var(USA_grp, "average_temperature", NC_FLOAT, RANK_USA_average_temperature, USA_average_temperature_dims, &USA_average_temperature_id);
    check_err(stat,__LINE__,__FILE__);

    USA_Colorado_temperature_dims[0] = USA_time_dim;
    USA_Colorado_temperature_dims[1] = USA_Colorado_stations_dim;
    stat = nc_def_var(USA_Colorado_grp, "temperature", NC_FLOAT, RANK_USA_Colorado_temperature, USA_Colorado_temperature_dims, &USA_Colorado_temperature_id);
    check_err(stat,__LINE__,__FILE__);

    USA_Wyoming_temperature_dims[0] = USA_time_dim;
    USA_Wyoming_temperature_dims[1] = USA_Wyoming_stations_dim;
    stat = nc_def_var(USA_Wyoming_grp, "temperature", NC_FLOAT, RANK_USA_Wyoming_temperature, USA_Wyoming_temperature_dims, &USA_Wyoming_temperature_id);
    check_err(stat,__LINE__,__FILE__);

    USA_Alaska_temperature_dims[0] = USA_time_dim;
    USA_Alaska_temperature_dims[1] = USA_Alaska_stations_dim;
    stat = nc_def_var(USA_Alaska_grp, "temperature", NC_FLOAT, RANK_USA_Alaska_temperature, USA_Alaska_temperature_dims, &USA_Alaska_temperature_id);
    check_err(stat,__LINE__,__FILE__);

    /* leave define mode */
    stat = nc_enddef (root_grp);
    check_err(stat,__LINE__,__FILE__);

    /* assign variable data */
    {
    float USA_average_temperature_data[2] = {13.4167, 63.416698} ;
    size_t USA_average_temperature_startset[1] = {0} ;
    size_t USA_average_temperature_countset[1] = {2} ;
    stat = nc_put_vara(USA_grp, USA_average_temperature_id, USA_average_temperature_startset, USA_average_temperature_countset, USA_average_temperature_data);
    stat = nc_put_vara(USA_grp, USA_average_temperature_id, USA_average_temperature_startset, USA_average_temperature_countset, USA_average_temperature_data);
    check_err(stat,__LINE__,__FILE__);
    }

    {
    float USA_Colorado_temperature_data[10] = {11, 12, 13, 14, 15, 61, 62, 63, 64, 65} ;
    size_t USA_Colorado_temperature_startset[2] = {0, 0} ;
    size_t USA_Colorado_temperature_countset[2] = {2, 5} ;
    stat = nc_put_vara(USA_Colorado_grp, USA_Colorado_temperature_id, USA_Colorado_temperature_startset, USA_Colorado_temperature_countset, USA_Colorado_temperature_data);
    stat = nc_put_vara(USA_Colorado_grp, USA_Colorado_temperature_id, USA_Colorado_temperature_startset, USA_Colorado_temperature_countset, USA_Colorado_temperature_data);
    check_err(stat,__LINE__,__FILE__);
    }

    {
    float USA_Wyoming_temperature_data[8] = {12, 13, 14, 15, 62, 63, 64, 65} ;
    size_t USA_Wyoming_temperature_startset[2] = {0, 0} ;
    size_t USA_Wyoming_temperature_countset[2] = {2, 4} ;
    stat = nc_put_vara(USA_Wyoming_grp, USA_Wyoming_temperature_id, USA_Wyoming_temperature_startset, USA_Wyoming_temperature_countset, USA_Wyoming_temperature_data);
    stat = nc_put_vara(USA_Wyoming_grp, USA_Wyoming_temperature_id, USA_Wyoming_temperature_startset, USA_Wyoming_temperature_countset, USA_Wyoming_temperature_data);
    check_err(stat,__LINE__,__FILE__);
    }

    {
    float USA_Alaska_temperature_data[6] = {13, 14, 15, 63, 64, 65} ;
    size_t USA_Alaska_temperature_startset[2] = {0, 0} ;
    size_t USA_Alaska_temperature_countset[2] = {2, 3} ;
    stat = nc_put_vara(USA_Alaska_grp, USA_Alaska_temperature_id, USA_Alaska_temperature_startset, USA_Alaska_temperature_countset, USA_Alaska_temperature_data);
    stat = nc_put_vara(USA_Alaska_grp, USA_Alaska_temperature_id, USA_Alaska_temperature_startset, USA_Alaska_temperature_countset, USA_Alaska_temperature_data);
    check_err(stat,__LINE__,__FILE__);
    }

    stat = nc_close(root_grp);
    check_err(stat,__LINE__,__FILE__);
    return 0;
}