55 Tier 2: other freely-available dataset.
66
77Source
8- ESGF:
9- https://esgf.nccs.nasa.gov/thredds/fileServer/CREATE-IP/
10- reanalysis/JMA/JRA-25/JRA-25/mon/atmos/
11-
8+ https://data.rda.ucar.edu/ds625.1
129Last access
13- 20221122
10+ 2023-06-14
1411
1512Download and processing instructions
1613 see download script cmorizers/data/downloaders/datasets/jra_25.py
1714"""
1815
1916import copy
17+ import glob
2018import logging
2119import os
20+ from datetime import datetime
2221
2322import iris
23+ from dateutil import relativedelta
24+ from esmvalcore .preprocessor import extract_levels
2425from iris import NameConstraint
26+ from iris .util import equalise_attributes
2527
2628from esmvaltool .cmorizers .data import utilities as utils
2729
2830logger = logging .getLogger (__name__ )
2931
3032
31- def _extract_variable (short_name , var , filename , cfg , in_dir , out_dir ):
33+ def _extract_variable (short_name , var , in_files , cfg , out_dir ):
3234 """Extract variable."""
3335 # load data
34- filepath = os .path .join (in_dir , filename )
3536 raw_var = var .get ("raw" , short_name )
36- cube = iris .load_cube (filepath , NameConstraint (var_name = raw_var ))
37+ rawcubes = iris .load (in_files , NameConstraint (var_name = raw_var ))
38+
39+ equalise_attributes (rawcubes )
40+
41+ # check if data are on hybrid levels
42+
43+ hybrid_levels = False
44+
45+ for coord in rawcubes [0 ].coords ():
46+ if (
47+ coord .standard_name
48+ == "atmosphere_hybrid_sigma_pressure_coordinate"
49+ ):
50+ hybrid_levels = True
51+ break
52+
53+ # If (3-dim) data are on hybrid levels then regrid data to pressure levels.
54+ # The pressure levels are taken from the JRA-25 files that provide JRA-25
55+ # data on pressure levels (e.g. anl_p.yyyymm.nc).
56+
57+ if hybrid_levels :
58+ pcubes = iris .cube .CubeList ([])
59+
60+ for cube in rawcubes :
61+ pcube = extract_levels (
62+ cube ,
63+ [
64+ 100000 ,
65+ 92500 ,
66+ 85000 ,
67+ 70000 ,
68+ 60000 ,
69+ 50000 ,
70+ 40000 ,
71+ 30000 ,
72+ 25000 ,
73+ 20000 ,
74+ 15000 ,
75+ 10000 ,
76+ 7000 ,
77+ 5000 ,
78+ 3000 ,
79+ 2000 ,
80+ 1000 ,
81+ 700 ,
82+ 500 ,
83+ 300 ,
84+ 200 ,
85+ 100 ,
86+ 40 ,
87+ ],
88+ "linear" ,
89+ coordinate = "air_pressure" ,
90+ )
91+ # remove auxiliary coordinate 'Surface_pressure'
92+ pcube .remove_coord ("Surface_pressure" )
93+ # rename dimension air_pressure to plev
94+ coord = pcube .coord ("air_pressure" )
95+ coord .rename ("plev" )
96+ coord .var_name = "plev"
97+
98+ pcubes .append (pcube )
99+
100+ cube = pcubes .concatenate_cube ()
101+ else :
102+ cube = rawcubes .concatenate_cube ()
37103
38- # Fix metadata
39104 cmor_info = cfg ["cmor_table" ].get_variable (var ["mip" ], short_name )
105+
106+ try :
107+ cube .convert_units (cmor_info .units )
108+ except Exception as ex : # pylint: disable=broad-except
109+ logger .warning (
110+ "Warning: could not convert units from %s to %s (%r)" ,
111+ cube .units ,
112+ cmor_info .units ,
113+ ex ,
114+ )
115+
116+ # Fix coordinates
117+ utils .fix_coords (cube )
118+ for coord in cube .coords ():
119+ if coord .var_name == "plev" :
120+ coord .standard_name = "air_pressure"
121+ coord .long_name = "pressure"
122+ coord .attributes ["positive" ] = "up"
123+
124+ # Fix metadata
40125 attrs = copy .deepcopy (cfg ["attributes" ])
41126 attrs ["mip" ] = var ["mip" ]
42127 utils .fix_var_metadata (cube , cmor_info )
43128 utils .set_global_atts (cube , attrs )
44129
130+ # Add height2m if needed
131+ if "height2m" in cmor_info .dimensions :
132+ utils .add_height2m (cube )
133+
45134 # Save variable
46135 utils .save_variable (
47136 cube , short_name , out_dir , attrs , unlimited_dimensions = ["time" ]
@@ -50,11 +139,28 @@ def _extract_variable(short_name, var, filename, cfg, in_dir, out_dir):
50139
51140def cmorization (in_dir , out_dir , cfg , cfg_user , start_date , end_date ):
52141 """Cmorization func call."""
53- # Run the cmorization
54- for short_name , var in cfg ["variables" ].items ():
55- short_name = var ["short_name" ]
56- filename = var ["file" ]
57- logger .info (
58- "CMORizing variable '%s' from file '%s'" , short_name , filename
59- )
60- _extract_variable (short_name , var , filename , cfg , in_dir , out_dir )
142+ if start_date is None :
143+ start_date = datetime (1979 , 1 , 1 )
144+ if end_date is None :
145+ end_date = datetime (2007 , 12 , 31 )
146+ loop_date = start_date
147+
148+ while loop_date <= end_date :
149+ year = loop_date .year
150+
151+ for short_name , var in cfg ["variables" ].items ():
152+ if "short_name" not in var :
153+ var ["short_name" ] = short_name
154+
155+ # Now get list of files
156+ filepattern = os .path .join (
157+ in_dir + "/" + var ["file" ].format (year = year )
158+ )
159+ print ("*** " + filepattern )
160+ in_files = glob .glob (filepattern )
161+ if not in_files :
162+ logger .warning ("Warning: no data found for %d" , year )
163+ continue
164+ _extract_variable (short_name , var , in_files , cfg , out_dir )
165+
166+ loop_date += relativedelta .relativedelta (years = 1 )
0 commit comments