Example 1: Create a simple fixed size 3-D dataspace in memory and on disk and
    copy the entire dataset to disk.

{
    hid_t file;                     /* File ID */
    hid_t dataset;                  /* Dataset ID */
    hid_t mem_space, file_space;    /* Dataspaces for memory and the file */
    uint8 *buf;                     /* Buffer for data */
    hsize_t curr_dims[3]={3,4,5};   /* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace for dataset in the file */
    /* Selection for dataspace defaults to entire space */
    file_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the dataset's dataspace */
    H5Sset_extent_simple(file_space,3,curr_dims,curr_dims);

    /* Create the dataspace for the dataset in memory */
    /* Selection for dataspace defaults to entire space */
    mem_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the memory dataspace */
    H5Sset_extent_simple(mem_space,3,curr_dims,curr_dims);

    /* Create the dataset on disk */
    dataset=H5Dcreate(file,"Dataset",H5T_NATIVE_UINT8,file_space,H5P_DEFAULT);

    /* Write the dataset to the file */
    H5Dwrite(dataset,H5T_NATIVE_UINT8,mem_space,file_space,H5P_DEFAULT,buf);

    /* Close dataspaces */
    H5Sclose(mem_space);
    H5Sclose(file_space);

    /* Close dataset & file */
    H5Dclose(dataset);
    H5Fclose(file);
}


Example 2: Create a simple fixed size 3-D dataspace in memory and on disk and
    copy a hyperslab to disk.  The hyperslab blocks are packed and
    contiguous in memory, but are scattered when written to the dataset
    on disk.

{
    hid_t file;                     /* File ID */
    hid_t dataset;                  /* Dataset ID */
    hid_t mem_space, file_space;    /* Dataspaces for memory and the file */
    uint8 *buf;                     /* Buffer for data */
    hssize_t start[3]={3,4,5};      /* Start of hyperslab */
    hsize_t stride[3]={1,2,2};      /* Stride for hyperslab */
    hsize_t count[3]={3,3,3};       /* Hyperslab block count in each dimension */
    hsize_t block[3]={2,2,2};       /* Hyperslab block size in each dimension */
    hsize_t curr_dims[3]={13,14,15};   /* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example2.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace for dataset in the file */
    /* Selection for dataspace defaults to entire space */
    file_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the dataset's dataspace */
    H5Sset_extent_simple(file_space,3,curr_dims,curr_dims);

    /* Set the hyperslab selection for a file dataspace */
    H5Sselect_hyperslab(file_space,H5S_SELECT_SET,start,stride,count,block);

    /* Create the dataspace for the dataset in memory */
    /* Selection for dataspace defaults to entire space */
    mem_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the memory dataspace */
    /* Compute the memory dimensions based on the hyperslab blocks to write */
    for(i=0; i<3; i++)
        curr_dims[i]=count[i]*block[i];
    H5Sset_extent_simple(mem_space,3,curr_dims,curr_dims);

    /* Create the dataset on disk */
    dataset=H5Dcreate(file,"Dataset",H5T_NATIVE_UINT8,file_space,H5P_DEFAULT);

    /* Write the hyperslab to the file */
    H5Dwrite(dataset,H5T_NATIVE_UINT8,mem_space,file_space,H5P_DEFAULT,buf);

    /* Close dataspaces */
    H5Sclose(mem_space);
    H5Sclose(file_space);

    /* Close dataset & file */
    H5Dclose(dataset);
    H5Fclose(file);
}


Example 3: Create a simple fixed size 3-D dataspace in memory and on disk and
    copy a specific selection of points (with a particular order) to
    disk.  The memory and file dataspaces are different sizes, but the number
    of points selected are the same.

{
    hid_t file;                     /* File ID */
    hid_t dataset;                  /* Dataset ID */
    hid_t mem_space, file_space;    /* Dataspaces for memory and the file */
    uint8 *buf;                     /* Buffer for data */
    hsize_t elements[5][3];         /* Dataspace elements selected */
    hsize_t curr_dims[3]={13,14,15};   /* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace for dataset in the file */
    /* Selection for dataspace defaults to entire space */
    file_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the dataset's dataspace */
    H5Sset_extent_simple(file_space,3,curr_dims,curr_dims);

    /* Set the elements for the selection in the file dataspace */
    elements[0]={0,2,4};            /* Yes, I know this won't compile.. :-) */
    elements[1]={3,4,1};
    elements[2]={9,8,3};
    elements[3]={7,2,0};
    elements[4]={6,5,8};
    H5Sselect_elements(file_space,H5S_SELECT_SET,5,elements);

    /* Create the dataspace for the dataset in memory */
    /* Selection for dataspace defaults to entire space */
    mem_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the memory dataspace */
    curr_dims={23,15,18};           /* This won't compile either :-) */
    H5Sset_extent_simple(mem_space,3,curr_dims,curr_dims);

    /* Set the elements for the selection in the file dataspace */
    elements[0]={9,2,1};
    elements[1]={13,1,12};
    elements[2]={4,1,7};
    elements[3]={0,12,0};
    elements[4]={20,10,17};
    H5Sselect_elements(mem_space,H5S_SELECT_SET,5,elements);

    /* Create the dataset on disk */
    dataset=H5Dcreate(file,"Dataset",H5T_NATIVE_UINT8,file_space,H5P_DEFAULT);

    /* Write the hyperslab to the file */
    H5Dwrite(dataset,H5T_NATIVE_UINT8,mem_space,file_space,H5P_DEFAULT,buf);

    /* Close dataspaces */
    H5Sclose(mem_space);
    H5Sclose(file_space);

    /* Close dataset & file */
    H5Dclose(dataset);
    H5Fclose(file);
}


Example 4: Create a simple fixed size 3-D dataspace in memory and on disk and
    build up selection hyperslab selections to copy from memory to disk.  The
    selection is the same for both dataspaces, but a different offset is used,
    to illustrate the selection offsets.  

{
    hid_t file;                     /* File ID */
    hid_t dataset;                  /* Dataset ID */
    hid_t mem_space, file_space;    /* Dataspaces for memory and the file */
    uint8 *buf;                     /* Buffer for data */
    hssize_t start[3];              /* Start of hyperslab */
    hsize_t stride[3];              /* Stride for hyperslab */
    hsize_t count[3];               /* Hyperslab block count in each dimension */
    hsize_t block[3];               /* Hyperslab block size in each dimension */
    hssize_t offset[3];             /* Selection offset */
    hsize_t curr_dims[3]={13,14,15};   /* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example4.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace for dataset in the file */
    /* Selection for dataspace defaults to entire space */
    file_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the dataset's dataspace */
    H5Sset_extent_simple(file_space,3,curr_dims,curr_dims);

    /* Build up the selection with a series of hyperslab selections */
    start={0,2,4};            /* Again, this won't compile.. :-) */
    stride={1,1,1};
    count={6,5,8};
    block={1,1,1};
    
    /* Set the first selection, union the rest in */
    H5Sselect_hyperslab(file_space,H5S_SELECT_SET,start,stride,count,block);

    /* initialize the second hyperslab */
    start={10,9,1};            /* Again, this won't compile.. :-) */
    stride={1,1,1};
    count={2,3,10};
    block={1,1,1};

    /* Union the second hyperslab into the file dataspace's selection */
    H5Sselect_hyperslab(file_space,H5S_SELECT_UNION,start,stride,count,block);

    /* initialize the third hyperslab */
    start={3,10,5};            /* Again, this won't compile.. :-) */
    stride={1,1,1};
    count={8,2,6};
    block={1,1,1};

    /* Union the final hyperslab into the file dataspace's selection */
    H5Sselect_hyperslab(file_space,H5S_SELECT_UNION,start,stride,count,block);

    /* Create the dataspace for the dataset in memory */
    /* Selection for dataspace defaults to entire space */
    mem_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the memory dataspace */
    curr_dims={23,15,18};           /* This won't compile either :-) */
    H5Sset_extent_simple(mem_space,3,curr_dims,curr_dims);

    /* Copy the selection from the file dataspace */
    H5Sselect_op(mem_space,H5S_SELECT_COPY,file_space);

    /* Adjust the offset of the selection in the memory dataspace */
    offset={1,1,1};
    H5Soffset_simple(mem_space,offset);

    /* Create the dataset on disk */
    dataset=H5Dcreate(file,"Dataset",H5T_NATIVE_UINT8,file_space,H5P_DEFAULT);

    /* Write the hyperslab to the file */
    H5Dwrite(dataset,H5T_NATIVE_UINT8,mem_space,file_space,H5P_DEFAULT,buf);

    /* Close dataspaces */
    H5Sclose(mem_space);
    H5Sclose(file_space);

    /* Close dataset & file */
    H5Dclose(dataset);
    H5Fclose(file);
}


Example 5: Same as example 1 (create a simple fixed size 3-D dataspace in memory and on disk and
    copy the entire dataset to disk), except that the selection order is changed
    for the memory dataspace, to change between FORTRAN and C array ordering.

{
    hid_t file;                     /* File ID */
    hid_t dataset;                  /* Dataset ID */
    hid_t mem_space, file_space;    /* Dataspaces for memory and the file */
    uint8 *buf;                     /* Buffer for data */
    hsize_t order[3];               /* Dimension ordering for selection */
    hsize_t curr_dims[3]={3,4,5};   /* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example5.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace for dataset in the file */
    /* Selection for dataspace defaults to entire space and C array order */
    file_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the dataset's dataspace */
    H5Sset_extent_simple(file_space,3,curr_dims,curr_dims);

    /* Create the dataspace for the dataset in memory */
    /* Selection for dataspace defaults to entire space and C array order */
    mem_space=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of the memory dataspace */
    H5Sset_extent_simple(mem_space,3,curr_dims,curr_dims);

    /* Change selection ordering to FORTRAN order for memory dataspace */
    order={0,1,2};
    H5Sselect_order(mem_space,order);

    /* Create the dataset on disk */
    dataset=H5Dcreate(file,"Dataset",H5T_NATIVE_UINT8,file_space,H5P_DEFAULT);

    /* Write the dataset to the file */
    H5Dwrite(dataset,H5T_NATIVE_UINT8,mem_space,file_space,H5P_DEFAULT,buf);

    /* Close dataspaces */
    H5Sclose(mem_space);
    H5Sclose(file_space);

    /* Close dataset & file */
    H5Dclose(dataset);
    H5Fclose(file);
}


Example 6:  Create a stored dataspace on disk and use the H5Ssubspace function
    create a dataspace located within that space.

{
    hid_t file;                     /* File ID */
    hid_t space1, space2;           /* Dataspace IDs */
    hssize_t start[3];              /* Start of hyperslab */
    hsize_t count[3];               /* Hyperslab block count in each dimension */
    hsize_t curr_dims[3]={13,14,15};/* Dimensions of the dataset */

    /* Create file */
    file = H5Fcreate("example6.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    /* Create dataspace #1 */
    space1=H5Screate(H5S_SIMPLE);

    /* Set the extent & type of dataspace #1 */
    H5Sset_extent_simple(space1,3,curr_dims,curr_dims);

    /* Store dataspace #1 on disk */
    H5Scommit(file,"/Dataspaces/Dataspace #1",space1);

    /* Select a contiguous hyperslab in dataspace #1 to create dataspace #2 with */
    start={0,2,4};
    count={6,5,8};
    
    /* 
     *  Use stride and block set to NULL to get contiguous, single element sized
     * hyperslab.  The stride and block parameters could also be set to all
     * 1's, but this is simpler and easier.
     */
    H5Sselect_hyperslab(space1,H5S_SELECT_SET,start,NULL,count,NULL);

    /* Create dataspace #2 as a dataspace located within dataspace #1 */
    space2=H5Ssubspace(space1);

    /* Store dataspace #2 on disk also */
    H5Scommit(file,"/Dataspaces/Dataspace #2",space2);

    /* 
     * space1 & space2 can be used to create datasets, etc.  Any datasets
     * created with space2 can have their dataspace queried to find the parent
     * dataspace and the location within the parent dataspace
     */

    /* Close dataspaces */
    H5Sclose(space1);
    H5Sclose(space2);

    /* Close file */
    H5Fclose(file);
}
