diff --git a/index.md b/index.md index 8a1f879..3b45786 100644 --- a/index.md +++ b/index.md @@ -21,7 +21,7 @@ CMOR output has the following characteristics: * For metadata, different MIPs may have different requirements, but these are accommodated by CMOR, within the constraints of the CF convention and as specified in the MIP tables (e.g. [CMIP6 MIP tables](https://github.com/PCMDI/cmip6-cmor-tables)). -* CMOR can rely on NetCDF4 [See unidata web page](http://www.unidata.ucar.edu/software/netcdf) to write the output files and can take advantage of its compression and chunking capabilities. In that case, compression is controlled with the MIP tables using the shuffle, deflate and deflate_level attributes, default values are respectively 0, 0 and 0(disable). It is worth noting that even when using NetCDF4, CMOR3 still produces NETCDF4 CLASSIC formatted output. This allows the file generated to be readable by any application that can read NetCDF3 provided they are re-linked against NetCDF4. When using the NetCDF4 library it is also still possible to write files that can be read through the NetCDF3 library by adding "_3" to the appropriate cmor_setup argument (see below). Note: CMOR3 **NOW** output NetCDF4 files by default. For CMIP6, the NetCDF4/NC_CLASSIC_Model mode is used (and chunking is **NOW** invoked... shuffle and deflation can be invoke on-demand by setting flags in the table. [example](https://github.com/PCMDI/cmor/blob/master/Test/speed_test_table_A#L1691-L1693)). +* CMOR can rely on NetCDF4 [See unidata web page](http://www.unidata.ucar.edu/software/netcdf) to write the output files and can take advantage of its compression and chunking capabilities. In that case, compression is controlled with the MIP tables using the shuffle, deflate and deflate_level attributes, default values are respectively 0, 0 and 0(disable). It is worth noting that even when using NetCDF4, CMOR3 still produces NETCDF4 CLASSIC formatted output. This allows the file generated to be readable by any application that can read NetCDF3 provided they are re-linked against NetCDF4. When using the NetCDF4 library it is also still possible to write files that can be read through the NetCDF3 library by adding "_3" to the appropriate cmor_setup argument (see below). Note: CMOR3 **NOW** output NetCDF4 files by default. For CMIP6, the NetCDF4/NC_CLASSIC_Model mode is used (and chunking is **NOW** invoked... shuffle and deflation can be invoke on-demand by setting flags in the table. [example](https://github.com/PCMDI/cmor/blob/main/Test/speed_test_table_A#L1691-L1693)). * CMOR also must be linked against the udunits2 library [see http://www.unidata.ucar.edu/software/udunits/](http://www.unidata.ucar.edu/software/udunits/), which enables CMOR to check that the units attribute is correct[\[6\]](#6). Finally CMOR3 must also be linked against the uuid library [see http://www.ossp.org/pkg/lib/uuid](http://www.ossp.org/pkg/lib/uuid) in order to produce a unique tracking number for each file. diff --git a/mydoc/examples/example7.py b/mydoc/examples/example7.py new file mode 100644 index 0000000..f0a88a3 --- /dev/null +++ b/mydoc/examples/example7.py @@ -0,0 +1,78 @@ +import cmor +import numpy +import os + + +var_data = numpy.random.random((3, 4, 2)) + 34. + +x = numpy.arange(4, dtype=float) +x_bnds = numpy.array([[x_ - 0.5, x_ + 0.5] for x_ in x]) +y = numpy.arange(3, dtype=float) +y_bnds = numpy.array([[y_ - 0.5, y_ + 0.5] for y_ in y]) + +lat = numpy.array([10, 20, 30]).reshape((3, 1)) +lat = numpy.tile(lat, (1, 4)) +lon = numpy.array([0, 90, 180, 270]) +lon = numpy.tile(lon, (3, 1)) +lon_bnds = numpy.zeros((3, 4, 4)) +lat_bnds = numpy.zeros((3, 4, 4)) + +for j in range(3): + for i in range(4): + lon_bnds[j, i, 0] = (lon[j, i] - 45) % 360 + lon_bnds[j, i, 1] = lon[j, i] + lon_bnds[j, i, 2] = (lon[j, i] + 45) % 360 + lon_bnds[j, i, 3] = lon[j, i] + lat_bnds[j, i, 0] = lat[j, i] + lat_bnds[j, i, 1] = lat[j, i] - 5 + lat_bnds[j, i, 2] = lat[j, i] + lat_bnds[j, i, 3] = lat[j, i] + 5 + +time = numpy.array([0, 1]) +time_bnds = numpy.array([0, 1, 2]) + +ipth = opth = 'Test' +cmor.setup(inpath=ipth, + set_verbosity=cmor.CMOR_NORMAL, + netcdf_file_action=cmor.CMOR_REPLACE, + exit_control=cmor.CMOR_EXIT_ON_MAJOR) +cmor.dataset_json('CMOR_input_example.json') + +# First, load the grids table to set up x and y axes and the lat-long grid +grid_table_id = cmor.load_table('CMIP6_grids.json') +cmor.set_table(grid_table_id) + +y_axis_id = cmor.axis(table_entry='y_deg', + units='degrees', + coord_vals=y, + cell_bounds=y_bnds) +x_axis_id = cmor.axis(table_entry='x_deg', + units='degrees', + coord_vals=x, + cell_bounds=x_bnds) + +grid_id = cmor.grid(axis_ids=[y_axis_id, x_axis_id], + latitude=lat, + longitude=lon, + latitude_vertices=lat_bnds, + longitude_vertices=lon_bnds) + +# Now, load the Omon table to set up the time axis and variable +omon_table_id = cmor.load_table('CMIP6_Omon.json') +cmor.set_table(omon_table_id) + +time_axis_id = cmor.axis(table_entry='time', + units='months since 1980', + coord_vals=time, + cell_bounds=time_bnds) + +var_id = cmor.variable(table_entry='sos', + units='0.001', + axis_ids=[grid_id, time_axis_id]) + +cmor.write(var_id, var_data, 2) + +filename = cmor.close(var_id, file_name=True) +print("Stored in:", filename) +cmor.close() +os.system("ncdump {}".format(filename)) diff --git a/mydoc/mydoc_cmip6_validator.md b/mydoc/mydoc_cmip6_validator.md index 5403626..605e852 100644 --- a/mydoc/mydoc_cmip6_validator.md +++ b/mydoc/mydoc_cmip6_validator.md @@ -54,14 +54,14 @@ where: PrePARE will verify that all attributes in the input file are present and conform to CMIP6 for publication into ESGF. We also recommand running the python program [cfchecker](https://pypi.python.org/pypi/cfchecker) created by the University of Reading in the UK to confirm that your file is CF-1 compliant. - * In order to validate all CMIP6 required attributes by PrePARE, a [Controlled Vocabulary file](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json) is read by the program where a JSON dictionnary called ["required_global_attributes"](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json#L3) point to a list of strings. Each element of that list corresponds to a global attribute. - * PrePARE can also use regular expressions to validate the value of the some global attributes. Here is an [example](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json#L6343-L6344) used for variant_label. + * In order to validate all CMIP6 required attributes by PrePARE, a [Controlled Vocabulary file](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_CV.json) is read by the program where a JSON dictionnary called ["required_global_attributes"](https://github.com/PCMDI/cmip6-cmor-tables/blob/a46dcbf17ec5e11af23dc2d55107f5e52afbcade/Tables/CMIP6_CV.json#L3) point to a list of strings. Each element of that list corresponds to a global attribute. + * PrePARE can also use regular expressions to validate the value of the some global attributes. Here is an [example](https://github.com/PCMDI/cmip6-cmor-tables/blob/a46dcbf17ec5e11af23dc2d55107f5e52afbcade/Tables/CMIP6_CV.json#L11554-L11555) used for variant_label. - * Institutions and institution_ids need to be registered into a list. PrePARE will only accept institutions which have been pre-registered for CMIP6 publication into ESGF. Click [here](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json#L65) for the list of institutions. If you wish to register your institution write to the [cmor mailing list](mailto:cmor@listserv.llnl.gov). + * Institutions and institution_ids need to be registered into a list. PrePARE will only accept institutions which have been pre-registered for CMIP6 publication into ESGF. Click [here](https://github.com/PCMDI/cmip6-cmor-tables/blob/a46dcbf17ec5e11af23dc2d55107f5e52afbcade/Tables/CMIP6_CV.json#L74) for the list of institutions. If you wish to register your institution write to the [cmor mailing list](mailto:cmor@listserv.llnl.gov). - * Source and Source ID also need to be registered for CMIP6 publication. Here is the [list](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json#L93) of registered sources. + * Source and Source ID also need to be registered for CMIP6 publication. Here is the [list](https://github.com/PCMDI/cmip6-cmor-tables/blob/a46dcbf17ec5e11af23dc2d55107f5e52afbcade/Tables/CMIP6_CV.json#L125) of registered sources. - * Only experiments found in the Controlled Vocabulary files are accepted for CMIP6 publication. A list of [experiment_ids](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json#L548) have been pre-defined including mandatory attributes. A warning will be displayed if one experiment attribute is missing or is not properly set by your program. + * Only experiments found in the Controlled Vocabulary files are accepted for CMIP6 publication. A list of [experiment_ids](https://github.com/PCMDI/cmip6-cmor-tables/blob/a46dcbf17ec5e11af23dc2d55107f5e52afbcade/Tables/CMIP6_CV.json#L3708) have been pre-defined including mandatory attributes. A warning will be displayed if one experiment attribute is missing or is not properly set by your program. * grid and nominal_resolution are mandatory global attributes in CMIP6. PrePARE will make sure that these attributes are conformed to one of the following syntax: diff --git a/mydoc/mydoc_cmor3_CV.md b/mydoc/mydoc_cmor3_CV.md index 0464fff..2fe2767 100644 --- a/mydoc/mydoc_cmor3_CV.md +++ b/mydoc/mydoc_cmor3_CV.md @@ -35,7 +35,7 @@ permalink: /mydoc_cmor3_CV/ ### CMIP6 required global attributes -* [CMIP6_CV.json](https://github.com/PCMDI/cmor/blob/master/TestTables/CMIP6_CV.json) +* [CMIP6_CV.json](https://github.com/PCMDI/cmor/blob/main/TestTables/CMIP6_CV.json)
Click to expand example JSON section diff --git a/mydoc/mydoc_cmor3_api.md b/mydoc/mydoc_cmor3_api.md index 124b822..5778dfa 100644 --- a/mydoc/mydoc_cmor3_api.md +++ b/mydoc/mydoc_cmor3_api.md @@ -64,7 +64,7 @@ Python: dataset_json(name) *Arguments*: - * **name**: JSON file which contains all information needed by CMOR in the form of key:value. Here is an example: [CMIP6_input_example.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_input_example.json) + * **name**: JSON file which contains all information needed by CMOR in the form of key:value. Here is an example: [CMIP6_input_example.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_input_example.json) Returns upon success: diff --git a/mydoc/mydoc_cmor3_c.md b/mydoc/mydoc_cmor3_c.md index ed8f386..17b232a 100644 --- a/mydoc/mydoc_cmor3_c.md +++ b/mydoc/mydoc_cmor3_c.md @@ -8,7 +8,7 @@ permalink: /mydoc_cmor3_c/ ### CMOR user input -* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/master/Test/CMOR_input_example.json) +* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/main/Test/CMOR_input_example.json)
Click to expand JSON file @@ -96,8 +96,8 @@ permalink: /mydoc_cmor3_c/ ### C source code -* [ipcc_test_code.c](https://github.com/PCMDI/cmor/blob/master/Test/ipcc_test_code.c) -* [reader_2D_3D.h](https://github.com/PCMDI/cmor/blob/master/Test/reader_2D_3D.h) +* [ipcc_test_code.c](https://github.com/PCMDI/cmor/blob/main/Test/ipcc_test_code.c) +* [reader_2D_3D.h](https://github.com/PCMDI/cmor/blob/main/Test/reader_2D_3D.h)
Click to expand C code diff --git a/mydoc/mydoc_cmor3_fortran.md b/mydoc/mydoc_cmor3_fortran.md index 4a6c941..df5d301 100644 --- a/mydoc/mydoc_cmor3_fortran.md +++ b/mydoc/mydoc_cmor3_fortran.md @@ -8,7 +8,7 @@ permalink: /mydoc_cmor3_fortran/ ### CMOR user input -* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/master/Test/CMOR_input_example.json) +* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/main/Test/CMOR_input_example.json)
Click to expand json file @@ -93,8 +93,8 @@ permalink: /mydoc_cmor3_fortran/ ### Fortran source code -* [ipcc_test_code.f90](https://github.com/PCMDI/cmor/blob/master/Test/ipcc_test_code.f90) -* [reader_2D_3D.f90](https://github.com/PCMDI/cmor/blob/master/Test/reader_2D_3D.f90) +* [ipcc_test_code.f90](https://github.com/PCMDI/cmor/blob/main/Test/ipcc_test_code.f90) +* [reader_2D_3D.f90](https://github.com/PCMDI/cmor/blob/main/Test/reader_2D_3D.f90)
Click to expand Fortran code diff --git a/mydoc/mydoc_cmor3_python.md b/mydoc/mydoc_cmor3_python.md index c75c493..8187eaa 100644 --- a/mydoc/mydoc_cmor3_python.md +++ b/mydoc/mydoc_cmor3_python.md @@ -8,17 +8,17 @@ permalink: /mydoc_cmor3_python/ ### CMOR Input Files -* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/master/Test/CMOR_input_example.json) -* [CMIP6_coordinate.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_coordinate.json) -* [CMIP6_formula_terms.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_formula_terms.json) -* [CMIP6_CV.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_CV.json) -* [CMIP6_Amon.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_Amon.json) -* [CMIP6_Omon.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/master/Tables/CMIP6_Omon.json) +* [CMOR_input_example.json](https://github.com/PCMDI/cmor/blob/main/Test/CMOR_input_example.json) +* [CMIP6_coordinate.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_coordinate.json) +* [CMIP6_formula_terms.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_formula_terms.json) +* [CMIP6_CV.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_CV.json) +* [CMIP6_Amon.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_Amon.json) +* [CMIP6_Omon.json](https://github.com/PCMDI/cmip6-cmor-tables/blob/main/Tables/CMIP6_Omon.json) ### Example 1: Python source code -* [test_doc.py](https://github.com/PCMDI/cmor/blob/master/Test/test_doc.py) +* [test_doc.py](https://github.com/PCMDI/cmor/blob/main/Test/test_doc.py)
Click to expand Python code @@ -1306,3 +1306,289 @@ data: ```
+ +### Example 7: Treatment of Grid Coordinates + +* [example7.py](/mydoc/examples/example7.py) + +
Click to expand Python code + +```python +import cmor +import numpy +import os + + +var_data = numpy.random.random((3, 4, 2)) + 34. + +x = numpy.arange(4, dtype=float) +x_bnds = numpy.array([[x_ - 0.5, x_ + 0.5] for x_ in x]) +y = numpy.arange(3, dtype=float) +y_bnds = numpy.array([[y_ - 0.5, y_ + 0.5] for y_ in y]) + +lat = numpy.array([10, 20, 30]).reshape((3, 1)) +lat = numpy.tile(lat, (1, 4)) +lon = numpy.array([0, 90, 180, 270]) +lon = numpy.tile(lon, (3, 1)) +lon_bnds = numpy.zeros((3, 4, 4)) +lat_bnds = numpy.zeros((3, 4, 4)) + +for j in range(3): + for i in range(4): + lon_bnds[j, i, 0] = (lon[j, i] - 45) % 360 + lon_bnds[j, i, 1] = lon[j, i] + lon_bnds[j, i, 2] = (lon[j, i] + 45) % 360 + lon_bnds[j, i, 3] = lon[j, i] + lat_bnds[j, i, 0] = lat[j, i] + lat_bnds[j, i, 1] = lat[j, i] - 5 + lat_bnds[j, i, 2] = lat[j, i] + lat_bnds[j, i, 3] = lat[j, i] + 5 + +time = numpy.array([0, 1]) +time_bnds = numpy.array([0, 1, 2]) + +ipth = opth = 'Test' +cmor.setup(inpath=ipth, + set_verbosity=cmor.CMOR_NORMAL, + netcdf_file_action=cmor.CMOR_REPLACE, + exit_control=cmor.CMOR_EXIT_ON_MAJOR) +cmor.dataset_json('CMOR_input_example.json') + +# First, load the grids table to set up x and y axes and the lat-long grid +grid_table_id = cmor.load_table('CMIP6_grids.json') +cmor.set_table(grid_table_id) + +y_axis_id = cmor.axis(table_entry='y_deg', + units='degrees', + coord_vals=y, + cell_bounds=y_bnds) +x_axis_id = cmor.axis(table_entry='x_deg', + units='degrees', + coord_vals=x, + cell_bounds=x_bnds) + +grid_id = cmor.grid(axis_ids=[y_axis_id, x_axis_id], + latitude=lat, + longitude=lon, + latitude_vertices=lat_bnds, + longitude_vertices=lon_bnds) + +# Now, load the Omon table to set up the time axis and variable +omon_table_id = cmor.load_table('CMIP6_Omon.json') +cmor.set_table(omon_table_id) + +time_axis_id = cmor.axis(table_entry='time', + units='months since 1980', + coord_vals=time, + cell_bounds=time_bnds) + +var_id = cmor.variable(table_entry='sos', + units='0.001', + axis_ids=[grid_id, time_axis_id]) + +cmor.write(var_id, var_data, 2) + +filename = cmor.close(var_id, file_name=True) +print("Stored in:", filename) +cmor.close() +os.system("ncdump {}".format(filename)) + +``` + +
+
Click to expand NetCDF dump + +``` +netcdf sos_Omon_PCMDI-test-1-0_piControl-withism_r3i1p1f1_gn_198001-198002 { +dimensions: + time = UNLIMITED ; // (2 currently) + y = 3 ; + x = 4 ; + bnds = 2 ; + vertices = 4 ; +variables: + double time(time) ; + time:bounds = "time_bnds" ; + time:units = "days since 1980" ; + time:calendar = "360_day" ; + time:axis = "T" ; + time:long_name = "time" ; + time:standard_name = "time" ; + double time_bnds(time, bnds) ; + double y(y) ; + y:bounds = "y_bnds" ; + y:units = "degrees" ; + y:axis = "Y" ; + y:long_name = "y coordinate of projection" ; + y:standard_name = "projection_y_coordinate" ; + double y_bnds(y, bnds) ; + double x(x) ; + x:bounds = "x_bnds" ; + x:units = "degrees" ; + x:axis = "X" ; + x:long_name = "x coordinate of projection" ; + x:standard_name = "projection_x_coordinate" ; + double x_bnds(x, bnds) ; + double latitude(y, x) ; + latitude:standard_name = "latitude" ; + latitude:long_name = "latitude" ; + latitude:units = "degrees_north" ; + latitude:missing_value = 1.e+20 ; + latitude:_FillValue = 1.e+20 ; + latitude:bounds = "vertices_latitude" ; + double longitude(y, x) ; + longitude:standard_name = "longitude" ; + longitude:long_name = "longitude" ; + longitude:units = "degrees_east" ; + longitude:missing_value = 1.e+20 ; + longitude:_FillValue = 1.e+20 ; + longitude:bounds = "vertices_longitude" ; + double vertices_latitude(y, x, vertices) ; + vertices_latitude:units = "degrees_north" ; + vertices_latitude:missing_value = 1.e+20 ; + vertices_latitude:_FillValue = 1.e+20 ; + double vertices_longitude(y, x, vertices) ; + vertices_longitude:units = "degrees_east" ; + vertices_longitude:missing_value = 1.e+20 ; + vertices_longitude:_FillValue = 1.e+20 ; + float sos(time, y, x) ; + sos:standard_name = "sea_surface_salinity" ; + sos:long_name = "Sea Surface Salinity" ; + sos:comment = "Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term \'salinity\' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand." ; + sos:units = "0.001" ; + sos:cell_methods = "area: mean where sea time: mean" ; + sos:cell_measures = "area: areacello" ; + sos:history = "2025-01-13T20:25:29Z altered by CMOR: Reordered dimensions, original order: y x time. 2025-01-13T20:25:29Z altered by CMOR: Converted type from \'d\' to \'f\'." ; + sos:missing_value = 1.e+20f ; + sos:_FillValue = 1.e+20f ; + sos:coordinates = "latitude longitude" ; + +// global attributes: + :Conventions = "CF-1.7 CMIP-6.2" ; + :activity_id = "ISMIP6" ; + :branch_method = "no parent" ; + :branch_time_in_child = 59400. ; + :branch_time_in_parent = 0. ; + :contact = "Python Coder (coder@a.b.c.com)" ; + :creation_date = "2025-01-13T20:25:29Z" ; + :data_specs_version = "01.00.33" ; + :experiment = "preindustrial control with interactive ice sheet" ; + :experiment_id = "piControl-withism" ; + :external_variables = "areacello" ; + :forcing_index = 1 ; + :frequency = "mon" ; + :further_info_url = "https://furtherinfo.es-doc.org/CMIP6.PCMDI.PCMDI-test-1-0.piControl-withism.none.r3i1p1f1" ; + :grid = "native atmosphere regular grid (3x4 latxlon)" ; + :grid_label = "gn" ; + :history = "2025-01-13T20:25:29Z ;rewrote data to be consistent with ISMIP6 for variable sos found in table Omon.;\n", + "Output from archivcl_A1.nce/giccm_03_std_2xCO2_2256." ; + :initialization_index = 1 ; + :institution = "Program for Climate Model Diagnosis and Intercomparison, Lawrence Livermore National Laboratory, Livermore, CA 94550, USA" ; + :institution_id = "PCMDI" ; + :mip_era = "CMIP6" ; + :nominal_resolution = "10000 km" ; + :parent_activity_id = "no parent" ; + :parent_experiment_id = "no parent" ; + :parent_mip_era = "no parent" ; + :parent_source_id = "no parent" ; + :parent_time_units = "no parent" ; + :parent_variant_label = "no parent" ; + :physics_index = 1 ; + :product = "model-output" ; + :realization_index = 3 ; + :realm = "ocean" ; + :references = "Model described by Koder and Tolkien (J. Geophys. Res., 2001, 576-591). Also see http://www.GICC.su/giccm/doc/index.html. The ssp245 simulation is described in Dorkey et al. \'(Clim. Dyn., 2003, 323-357.)\'" ; + :run_variant = "3rd realization" ; + :source = "PCMDI-test 1.0 (1989): \n", + "aerosol: none\n", + "atmos: Earth1.0-gettingHotter (360 x 180 longitude/latitude; 50 levels; top level 0.1 mb)\n", + "atmosChem: none\n", + "land: Earth1.0\n", + "landIce: none\n", + "ocean: BlueMarble1.0-warming (360 x 180 longitude/latitude; 50 levels; top grid cell 0-10 m)\n", + "ocnBgchem: none\n", + "seaIce: Declining1.0-warming (360 x 180 longitude/latitude)" ; + :source_id = "PCMDI-test-1-0" ; + :source_type = "AOGCM ISM AER" ; + :sub_experiment = "none" ; + :sub_experiment_id = "none" ; + :table_id = "Omon" ; + :table_info = "Creation Date:(18 November 2020) MD5:1a7c21fe7a3ec7429780675800b70460" ; + :title = "PCMDI-test-1-0 output prepared for CMIP6" ; + :tracking_id = "hdl:21.14100/d2dac814-dcd1-4da6-a6f9-e35ebb1d1bcb" ; + :variable_id = "sos" ; + :variant_label = "r3i1p1f1" ; + :license = "CMIP6 model data produced by Lawrence Livermore PCMDI is licensed under a Creative Commons Attribution 4.0 International License (https://creativecommons.org/licenses/by/4.0/). Consult https://pcmdi.llnl.gov/CMIP6/TermsOfUse for terms of use governing CMIP6 output, including citation requirements and proper acknowledgment. Further information about this data, including some limitations, can be found via the further_info_url (recorded as a global attribute in this file) and at https:///pcmdi.llnl.gov/. The data producers and data providers make no warranty, either express or implied, including, but not limited to, warranties of merchantability and fitness for a particular purpose. All liabilities arising from the supply of the information (including any liability arising in negligence) are excluded to the fullest extent permitted by law." ; + :cmor_version = "3.9.0" ; +data: + + time = 15, 45 ; + + time_bnds = + 0, 30, + 30, 60 ; + + y = 0, 1, 2 ; + + y_bnds = + -0.5, 0.5, + 0.5, 1.5, + 1.5, 2.5 ; + + x = 0, 1, 2, 3 ; + + x_bnds = + -0.5, 0.5, + 0.5, 1.5, + 1.5, 2.5, + 2.5, 3.5 ; + + latitude = + 10, 10, 10, 10, + 20, 20, 20, 20, + 30, 30, 30, 30 ; + + longitude = + 0, 90, 180, 270, + 0, 90, 180, 270, + 0, 90, 180, 270 ; + + vertices_latitude = + 10, 5, 10, 15, + 10, 5, 10, 15, + 10, 5, 10, 15, + 10, 5, 10, 15, + 20, 15, 20, 25, + 20, 15, 20, 25, + 20, 15, 20, 25, + 20, 15, 20, 25, + 30, 25, 30, 35, + 30, 25, 30, 35, + 30, 25, 30, 35, + 30, 25, 30, 35 ; + + vertices_longitude = + 315, 0, 45, 0, + 45, 90, 135, 90, + 135, 180, 225, 180, + 225, 270, 315, 270, + 315, 0, 45, 0, + 45, 90, 135, 90, + 135, 180, 225, 180, + 225, 270, 315, 270, + 315, 0, 45, 0, + 45, 90, 135, 90, + 135, 180, 225, 180, + 225, 270, 315, 270 ; + + sos = + 34.8876, 34.84557, 34.84164, 34.83435, + 34.9416, 34.08398, 34.33438, 34.99736, + 34.23587, 34.22417, 34.60325, 34.67004, + 34.32861, 34.72874, 34.52488, 34.19158, + 34.48695, 34.07372, 34.91237, 34.68412, + 34.53342, 34.16178, 34.93912, 34.50451 ; +} + +``` +
diff --git a/pdf/mydoc.pdf b/pdf/mydoc.pdf index 9240c00..4b3100e 100644 Binary files a/pdf/mydoc.pdf and b/pdf/mydoc.pdf differ