Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test [DO NOT MERGE] #756

Closed
wants to merge 35 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
af44acb
Access NetCDF zstandard compression and quantization functions
mauzey1 Jun 5, 2024
5620960
Add Python functions for set_zstandard and set_quantize
mauzey1 Jun 11, 2024
0ac855b
Only apply quantization and zstandard compression to the data
mauzey1 Jun 26, 2024
81b97c6
Merge branch 'main' into 725_expose_netcdf_quantize_and_zstandard
mauzey1 Jun 26, 2024
14ed749
Merge branch 'main' into 725_expose_netcdf_quantize_and_zstandard
mauzey1 Jul 15, 2024
3f40a05
Have zstandard compression only be applied if deflate is disabled, an…
mauzey1 Jul 29, 2024
c8a5289
Add zstandard compression test
mauzey1 Jul 29, 2024
f1550d7
Add quantization test
mauzey1 Jul 30, 2024
9dfbb96
Add zstandard and quantize functions to Fortran interface
mauzey1 Jul 30, 2024
f0d7c59
Check if zstandard and quantize functions are supported in the NetCDF…
mauzey1 Aug 8, 2024
739c4b0
Apply zstandard and quantize to dimensions, grids, and zfactors
mauzey1 Aug 8, 2024
17a784f
Just test python 3.10
mauzey1 Aug 8, 2024
f1a335f
Remove zstandard and quantize from variables other than data
mauzey1 Aug 8, 2024
07034bf
Remove zstandard and quantize function checks
mauzey1 Aug 9, 2024
4114845
Remove quantize and zstandard functions from cmor.c
mauzey1 Aug 9, 2024
256375b
Remove setting of zstandard and quantize values in variables
mauzey1 Aug 9, 2024
3463ac0
Remove setting of zstandard and quantize values in cmor_variables.c
mauzey1 Aug 12, 2024
c6ad126
Remove zstandard and quantize values from variable structs
mauzey1 Aug 12, 2024
2ac1b13
Add zstandard and quantize back to cmor_variable_def_
mauzey1 Aug 12, 2024
b126cd6
Add zstandard and quantize back to cmor_var_
mauzey1 Aug 12, 2024
7785b0b
Remove zstandard and quantize from cmor_variable_def_ again
mauzey1 Aug 12, 2024
6bacd6f
Disable singleton test
mauzey1 Aug 12, 2024
d14fb94
Check values of singleton id check
mauzey1 Aug 14, 2024
381a43d
Enable singleton test
mauzey1 Aug 14, 2024
62d9c3f
Check all axis ids
mauzey1 Aug 14, 2024
6e7e8b6
Uses num_axes instead of ndims
mauzey1 Aug 14, 2024
46656e9
Remove quantize value
mauzey1 Aug 14, 2024
784dd68
Remove zstandard value
mauzey1 Aug 14, 2024
22b004f
move zstandard and quantize values to be above ndims and singleton_id…
mauzey1 Aug 15, 2024
68db917
Add osx-arm64 build to circleci
mauzey1 Aug 19, 2024
300eb6f
Move zstandard and quantize values in cmor_var_t struct
mauzey1 Aug 19, 2024
483d969
Add back zstandard and quantize functionality
mauzey1 Aug 19, 2024
1516b28
Add back zstandard and quantize code
mauzey1 Aug 19, 2024
619f0a7
Reorganize cmor_var_t in descending order of data type size to improv…
mauzey1 Aug 21, 2024
060d664
See how axes are set in cmor_variable
mauzey1 Aug 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ aliases:
name: setup_miniconda
command: |
source $BASH_ENV
if [[ $OS == 'osx-64' ]]; then
curl -L https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -o miniconda.sh
if [[ $OS == 'osx-arm64' ]]; then
curl -L https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o miniconda.sh
else
curl -L https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -o miniconda.sh
fi
Expand Down Expand Up @@ -75,8 +75,8 @@ aliases:
export ARTIFACT_DIR=`pwd`/artifacts/$OS
mkdir -p $ARTIFACT_DIR

if [[ $OS == 'osx-64' ]]; then
export OS_NAME="osx_64"
if [[ $OS == 'osx-arm64' ]]; then
export OS_NAME="osx_arm64"
else
export OS_NAME="linux_64"
fi
Expand Down Expand Up @@ -123,12 +123,12 @@ executors:
CONDA_COMPILERS: "gcc_linux-64 gfortran_linux-64"
macos:
macos:
xcode: "13.4.1"
resource_class: macos.x86.medium.gen2
xcode: "15.4.0"
resource_class: macos.m1.medium.gen1
environment:
OS: "osx-64"
OS: "osx-arm64"
PROJECT_DIR: "workdir/macos"
CONDA_COMPILERS: "clang_osx-64 gfortran_osx-64"
CONDA_COMPILERS: "clang_osx-arm64 gfortran_osx-arm64"

jobs:
build:
Expand Down Expand Up @@ -196,8 +196,8 @@ workflows:
- build:
matrix:
parameters:
os: [ linux ]
python_version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
os: [ linux, macos ]
python_version: [ "3.10" ]
name: build-<< matrix.os >>-<< matrix.python_version >>

- upload:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/nightly-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
C_COMPILER: clang_osx-64
FORTRAN_COMPILER: gfortran_osx-64
PROJECT_DIR: workdir/macos_64
python_version: ['3.8', '3.9', '3.10', '3.11', '3.12']
python_version: ['3.10']
runs-on: ${{ matrix.runner.RUNNER_OS }}
env:
PACKAGE_NAME: cmor
Expand Down
5 changes: 3 additions & 2 deletions Lib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
close, grid, set_grid_mapping, time_varying_grid_coordinate, dataset_json,
set_cur_dataset_attribute, get_cur_dataset_attribute,
has_cur_dataset_attribute, set_variable_attribute, get_variable_attribute,
has_variable_attribute, get_final_filename, set_deflate, set_furtherinfourl,
set_climatology, get_climatology, set_terminate_signal, get_terminate_signal)
has_variable_attribute, get_final_filename, set_deflate, set_zstandard,
set_quantize, set_furtherinfourl, set_climatology, get_climatology,
set_terminate_signal, get_terminate_signal)

try:
from check_CMOR_compliant import checkCMOR
Expand Down
35 changes: 35 additions & 0 deletions Lib/pywrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,41 @@ def set_deflate(var_id, shuffle, deflate, deflate_level):
return _cmor.set_deflate(var_id, shuffle, deflate, deflate_level)


def set_zstandard(var_id, zstandar_level):
"""Sets Zstandard compression on a cmor variable
Usage:
cmor.set_zstandard(var_id, szstandar_level)
Where:
var_id: is cmor variable id
zstandar_level: Compression level. Must be set from -131072 to 22

"""

return _cmor.set_zstandard(var_id, zstandar_level)


def set_quantize(var_id, quantize_mode, quantize_nsd):
"""Sets quantization on a cmor variable
Usage:
cmor.set_quantize(var_id, quantize_mode, quantize_nsd)
Where:
var_id: is cmor variable id
quantize_mode: Quantization mode. Can be set to the following.
0: No quantization mode
1: BitGroom
2: Granular BitRound
3: BitRound
quantize_nsd: Number of significant digits. If quantize_mode is set to
1 or 2, then the value can be set from 1 to 7 for floats
and 1 to 23 for doubles. If quantize_mode is set to 3, then
the value can be set from 1 to 15 for floats and 1 to 52
for doubles. The value is ignore if quantize_mode is 0.

"""

return _cmor.set_quantize(var_id, quantize_mode, quantize_nsd)


def has_variable_attribute(var_id, name):
"""determines if the a cmor variable has an attribute
Usage:
Expand Down
1 change: 1 addition & 0 deletions Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ test_python: python
env TEST_NAME=Test/test_cmor_python_not_enough_times_written.py make test_a_python
env TEST_NAME=Test/test_python_forecast_coordinates.py make test_a_python
env TEST_NAME=Test/test_cmor_CMIP6Plus.py make test_a_python
env TEST_NAME=Test/test_cmor_zstandard_and_quantize.py make test_a_python
test_cmip6_cv: python
env TEST_NAME=Test/test_python_CMIP6_CV_sub_experimentnotset.py make test_a_python
env TEST_NAME=Test/test_python_CMIP6_CV_sub_experimentbad.py make test_a_python
Expand Down
48 changes: 48 additions & 0 deletions Src/_cmormodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,52 @@ static PyObject *PyCMOR_set_deflate(PyObject * self, PyObject * args)
return (Py_BuildValue("i", ierr));
}

/************************************************************************/
/* PyCMOR_set_zstandard() */
/************************************************************************/
static PyObject *PyCMOR_set_zstandard(PyObject * self, PyObject * args)
{
signal(signal_to_catch, signal_handler);
int ierr, var_id, zstandard_level;

if (!PyArg_ParseTuple
(args, "ii", &var_id, &zstandard_level))
return NULL;

ierr = cmor_set_zstandard(var_id, zstandard_level);

if (ierr != 0 || raise_exception) {
raise_exception = 0;
PyErr_Format(CMORError, exception_message, "set_zstandard");
return NULL;
}

return (Py_BuildValue("i", ierr));
}

/************************************************************************/
/* PyCMOR_set_quantize() */
/************************************************************************/
static PyObject *PyCMOR_set_quantize(PyObject * self, PyObject * args)
{
signal(signal_to_catch, signal_handler);
int ierr, var_id, quantize_mode, quantize_nsd;

if (!PyArg_ParseTuple
(args, "iii", &var_id, &quantize_mode, &quantize_nsd))
return NULL;

ierr = cmor_set_quantize(var_id, quantize_mode, quantize_nsd);

if (ierr != 0 || raise_exception) {
raise_exception = 0;
PyErr_Format(CMORError, exception_message, "set_quantize");
return NULL;
}

return (Py_BuildValue("i", ierr));
}

/************************************************************************/
/* PyCMOR_set_variable_attribute() */
/************************************************************************/
Expand Down Expand Up @@ -1146,6 +1192,8 @@ static PyMethodDef MyExtractMethods[] = {
{"set_furtherinfourl", PyCMOR_set_furtherinfourl, METH_VARARGS},
{"get_final_filename", PyCMOR_getFinalFilename, METH_VARARGS},
{"set_deflate", PyCMOR_set_deflate, METH_VARARGS},
{"set_zstandard", PyCMOR_set_zstandard, METH_VARARGS},
{"set_quantize", PyCMOR_set_quantize, METH_VARARGS},
{"set_terminate_signal", PyCMOR_set_terminate_signal, METH_VARARGS},
{"get_terminate_signal", PyCMOR_get_terminate_signal, METH_VARARGS},
{NULL, NULL} /*sentinel */
Expand Down
103 changes: 90 additions & 13 deletions Src/cmor.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "cmor.h"
#include "cmor_locale.h"
#include <netcdf.h>
#include <netcdf_filter.h>
#include <udunits2.h>
#include <time.h>
#include <errno.h>
Expand Down Expand Up @@ -41,6 +42,20 @@ int nc_def_var_chunking(int i, int j, int k, size_t * l)
};
#endif

#ifndef H5Z_FILTER_ZSTD
int nc_def_var_zstandard(int i, int j, int k)
{
return (0);
};
#endif

#ifndef NC_QUANTIZE_BITGROOM
int nc_def_var_quantize(int i, int j, int k, int l)
{
return (0);
};
#endif

/* -------------------------------------------------------------------- */
/* function declaration */
/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -720,6 +735,9 @@ void cmor_reset_variable(int var_id)
cmor_vars[var_id].shuffle = 0;
cmor_vars[var_id].deflate = 1;
cmor_vars[var_id].deflate_level = 1;
cmor_vars[var_id].zstandard_level = 3;
cmor_vars[var_id].quantize_mode = 0;
cmor_vars[var_id].quantize_nsd = 1;
cmor_vars[var_id].nomissing = 1;
cmor_vars[var_id].iunits[0] = '\0';
cmor_vars[var_id].ounits[0] = '\0';
Expand Down Expand Up @@ -1869,7 +1887,7 @@ int cmor_define_zfactors_vars(int var_id, int ncid, int *nc_dim,
int ierr = 0, l, m, k, n, j, m2, found, nelts, *int_list = NULL;
int dim_holder[CMOR_MAX_VARIABLES];
int lnzfactors;
int ics, icd, icdl, ia;
int ics, icd, icdl, icz, icqm, icqn, ia;
cmor_add_traceback("cmor_define_zfactors_vars");
cmor_is_setup();
lnzfactors = *nzfactors;
Expand Down Expand Up @@ -2066,8 +2084,24 @@ int cmor_define_zfactors_vars(int var_id, int ncid, int *nc_dim,
icd = cmor_tables[nTableID].vars[nTableID].deflate;
icdl =
cmor_tables[nTableID].vars[nTableID].deflate_level;
ierr = nc_def_var_deflate(ncid, nc_zfactors[lnzfactors],
ics, icd, icdl);
icz =
cmor_tables[nTableID].vars[nTableID].zstandard_level;
icqm =
cmor_tables[nTableID].vars[nTableID].quantize_mode;
icqn =
cmor_tables[nTableID].vars[nTableID].quantize_nsd;

ierr = nc_def_var_quantize(ncid, nc_zfactors[lnzfactors],
icqm, icqn);
if (icd != 0) {
ierr |= nc_def_var_deflate(ncid, nc_zfactors[lnzfactors],
ics, icd, icdl);
} else {
ierr |= nc_def_var_deflate(ncid, nc_zfactors[lnzfactors],
ics, 0, 0);
ierr |= nc_def_var_zstandard(ncid, nc_zfactors[lnzfactors],
icz);
}

if (ierr != NC_NOERR) {
snprintf(msg, CMOR_MAX_STRING,
Expand Down Expand Up @@ -3432,7 +3466,7 @@ void cmor_define_dimensions(int var_id, int ncid,
int tmp_dims[2];
int dims_bnds_ids[2];
int nVarRefTblID = cmor_vars[var_id].ref_table_id;
int ics, icd, icdl;
int ics, icd, icdl, icz, icqm, icqn;
int itmpmsg, itmp2, itmp3;
int maxStrLen;

Expand Down Expand Up @@ -3784,9 +3818,21 @@ void cmor_define_dimensions(int var_id, int ncid,
ics = pVar->shuffle;
icd = pVar->deflate;
icdl = pVar->deflate_level;

ierr = nc_def_var_deflate(ncafid, nc_bnds_vars[i], ics, icd,
icdl);
icz = pVar->zstandard_level;
icqm = pVar->quantize_mode;
icqn = pVar->quantize_nsd;

ierr = nc_def_var_quantize(ncafid, nc_bnds_vars[i], icqm,
icqn);
if (icd != 0) {
ierr |= nc_def_var_deflate(ncafid, nc_bnds_vars[i],
ics, icd, icdl);
} else {
ierr |= nc_def_var_deflate(ncafid, nc_bnds_vars[i],
ics, 0, 0);
ierr |= nc_def_var_zstandard(ncafid, nc_bnds_vars[i],
icz);
}
if (ierr != NC_NOERR) {
snprintf(msg, CMOR_MAX_STRING,
"NCError (%i: %s) defining compression\n! "
Expand Down Expand Up @@ -4039,7 +4085,7 @@ int cmor_grids_def(int var_id, int nGridID, int ncafid, int *nc_dim_af,
int *int_list = NULL;
char mtype;
int nelts;
int ics, icd, icdl;
int ics, icd, icdl, icz, icqm, icqn;

cmor_add_traceback("cmor_grids_def");
/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -4306,9 +4352,29 @@ int cmor_grids_def(int var_id, int nGridID, int ncafid, int *nc_dim_af,
cmor_tables[cmor_vars[j].ref_table_id].vars[cmor_vars[j].
ref_var_id].
deflate_level;

ierr = nc_def_var_deflate(ncafid, nc_associated_vars[i],
ics, icd, icdl);
icz =
cmor_tables[cmor_vars[j].ref_table_id].vars[cmor_vars[j].
ref_var_id].
zstandard_level;
icqm =
cmor_tables[cmor_vars[j].ref_table_id].vars[cmor_vars[j].
ref_var_id].
quantize_mode;
icqn =
cmor_tables[cmor_vars[j].ref_table_id].vars[cmor_vars[j].
ref_var_id].
quantize_nsd;
ierr = nc_def_var_quantize(ncafid, nc_associated_vars[i],
icqm, icqn);
if (icd != 0) {
ierr |= nc_def_var_deflate(ncafid, nc_associated_vars[i],
ics, icd, icdl);
} else {
ierr |= nc_def_var_deflate(ncafid, nc_associated_vars[i],
ics, 0, 0);
ierr |= nc_def_var_zstandard(ncafid, nc_associated_vars[i],
icz);
}
if (ierr != NC_NOERR) {
snprintf(msg, CMOR_MAX_STRING,
"NetCDF Error (%i: %s) defining\n! "
Expand Down Expand Up @@ -5093,7 +5159,7 @@ void cmor_create_var_attributes(int var_id, int ncid, int ncafid,
int nVarRefTblID = cmor_vars[var_id].ref_table_id;
int nelts;
int *int_list = NULL;
int ics, icd, icdl;
int ics, icd, icdl, icz, icqm, icqn;
int bChunk;
cmor_add_traceback("cmor_create_var_attributes");
/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -5167,7 +5233,18 @@ void cmor_create_var_attributes(int var_id, int ncid, int ncafid,
ics = pVar->shuffle;
icd = pVar->deflate;
icdl = pVar->deflate_level;
ierr = nc_def_var_deflate(ncid, pVar->nc_var_id, ics, icd, icdl);
icz = pVar->zstandard_level;
icqm = pVar->quantize_mode;
icqn = pVar->quantize_nsd;
ierr = nc_def_var_quantize(ncid, pVar->nc_var_id, icqm, icqn);

// Only use zstandard compression if deflate is disabled
if (icd != 0) {
ierr |= nc_def_var_deflate(ncid, pVar->nc_var_id, ics, icd, icdl);
} else {
ierr |= nc_def_var_deflate(ncid, pVar->nc_var_id, ics, 0, 0);
ierr |= nc_def_var_zstandard(ncid, pVar->nc_var_id, icz);
}

if (ierr != NC_NOERR) {
snprintf(msg, CMOR_MAX_STRING,
Expand Down
3 changes: 3 additions & 0 deletions Src/cmor_CV.c
Original file line number Diff line number Diff line change
Expand Up @@ -2539,6 +2539,9 @@ int cmor_CV_variable(int *var_id, char *name, char *units,
cmor_vars[vrid].shuffle = refvar.shuffle;
cmor_vars[vrid].deflate = refvar.deflate;
cmor_vars[vrid].deflate_level = refvar.deflate_level;
cmor_vars[vrid].zstandard_level = refvar.zstandard_level;
cmor_vars[vrid].quantize_mode = refvar.quantize_mode;
cmor_vars[vrid].quantize_nsd = refvar.quantize_nsd;
cmor_vars[vrid].first_bound = startimebnds;
cmor_vars[vrid].last_bound = endtimebnds;
cmor_vars[vrid].first_time = startime;
Expand Down
17 changes: 17 additions & 0 deletions Src/cmor_cfortran_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,23 @@ int cmor_set_deflate_cff_(int *var_id, int *shuffle,
return (cmor_set_deflate(*var_id, *shuffle, *deflate, *deflate_level));
}

/************************************************************************/
/* cmor_set_zstandard_cff_() */
/************************************************************************/
int cmor_set_zstandard_cff_(int *var_id, int *zstandard_level)
{
return (cmor_set_zstandard(*var_id, *zstandard_level));
}

/************************************************************************/
/* cmor_set_quantize_cff_() */
/************************************************************************/
int cmor_set_quantize_cff_(int *var_id, int *quantize_mode,
int *quantize_level)
{
return (cmor_set_quantize(*var_id, *quantize_mode, *quantize_level));
}

/************************************************************************/
/* cmor_get_variable_attribute_cff_() */
/************************************************************************/
Expand Down
Loading
Loading