1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#!/usr/bin/env python
'''
Test program for creating a sample CFMIP site axis.
This program assumes that we want the output netcdf header to look something like this (in CDL):
dimensions:
site = 119;
lev = 38;
time = UNLIMITED;
bnds = 2;
variables:
float cl(time, site, lev);
cl:coordinates = "lat lon";
...
double time(time);
...
int site(site); // integer id values for sites
...
float lat(site); // latitude values for sites
...
float lon(site); // longitude values for sites
...
float orog(site); // orography values for sites
...
float lev(lev); // hybrid_height
lev:formula = "z(k,m) = a(k) + b(k)*orog(m)"; // m = site index
lev:formula_terms = "a: lev b: b orog: orog";
...
'''
from __future__ import print_function
import cmor
import numpy
MIP_TABLE_DIR = 'Tables' # set according to your MIP table location
#-------------------------------------------------------------------------
def setup_cmor():
#-------------------------------------------------------------------------
# Initialise CMOR library
cmor.setup(inpath=MIP_TABLE_DIR, netcdf_file_action=cmor.CMOR_REPLACE_3,
set_verbosity=cmor.CMOR_NORMAL, create_subdirectories=0)
# Create CMOR dataset
cmor.dataset_json("Test/CMOR_input_example.json")
#-------------------------------------------------------------------------
if __name__ == '__main__':
#-------------------------------------------------------------------------
# Initialise CMOR dataset and table
setup_cmor()
# Set dummy site lats and longs.
site_lats = numpy.array([-90.0, 0.0, 90.0], dtype=numpy.float32)
site_lons = numpy.array([0.0, 0.0, 0.0], dtype=numpy.float32)
# Create CMOR axes and grids
table_id = cmor.load_table('CMIP6_CFsubhr.json')
# , length=1, interval='30 minutes')
taxis_id = cmor.axis('time1', units='days since 2000-01-01 00:00:00')
print('ok: created time axis')
saxis_id = cmor.axis('site', units='1', coord_vals=[1, 2, 3])
print('ok: created site axis', saxis_id)
zaxis_id = cmor.axis(
'hybrid_height',
units='m',
coord_vals=[1.0],
cell_bounds=[
0.0,
2.0])
print('ok: created height axis', zaxis_id)
# Create zfactors for b and orog for hybrid height axis.
# Where do these get used, if anywhere?
bfact_id = cmor.zfactor(zaxis_id, 'b', '1', [zaxis_id], 'd', zfactor_values=[1.0],
zfactor_bounds=[0.0, 2.0])
print('ok: created b zfactors')
# Create grid object to link site-dimensioned variables to (lat,long).
# Need to make CMIP6_grids the current MIP table for this to work.
table_id = cmor.load_table('CMIP6_grids.json')
gaxis_id = cmor.grid([saxis_id], site_lats, site_lons)
print('ok: created site grid')
# Create CMOR variable for cloud area fraction: MIP name = 'cl', STASH =
# m01s02i261*100
table_id = cmor.load_table('CMIP6_CFsubhr.json')
var_id = cmor.variable('cl', '%', [taxis_id, gaxis_id, zaxis_id], data_type='f',
missing_value=-99.0, original_name='STASH m01s02i261*100')
print('ok: created variable for "cl"')
ofact_id = cmor.zfactor(zaxis_id, 'orog', 'm', [gaxis_id], 'd',
zfactor_values=[123.0, 123.0, 123.0])
print('ok: created orog zfactors')
# Write some data to this variable. First convert raw data to numpy arrays.
shape = (1, 3, 1)
data = numpy.array([10, 20, 30], dtype=numpy.float32)
data = data.reshape(shape)
cmor.write(var_id, data, time_vals=[1.0])
print('ok: wrote variable data')
# Close CMOR.
cmor.close()
|