diff --git a/definitions/grib2/boot.def b/definitions/grib2/boot.def index 32f262bef..57f7c65e5 100644 --- a/definitions/grib2/boot.def +++ b/definitions/grib2/boot.def @@ -11,7 +11,7 @@ # See https://community.wmo.int/activity-areas/wmo-codes/manual-codes/latest-version constant tablesVersionLatestOfficial = 31 : edition_specific; # If this is different from the official version, then it is the pre-operational version -constant tablesVersionLatest = 31 : edition_specific; +constant tablesVersionLatest = 33 : edition_specific; constant million = 1000000 : hidden; constant grib2divider = 1000000; diff --git a/definitions/grib2/postProcessingConcept.def b/definitions/grib2/postProcessingConcept.def index e61d4b343..cfd5c0031 100644 --- a/definitions/grib2/postProcessingConcept.def +++ b/definitions/grib2/postProcessingConcept.def @@ -16,3 +16,4 @@ "mhm_mrm" = { typeOfPostProcessing = 203; } "pcrg_mrm" = { typeOfPostProcessing = 204; } "meteogrid" = { typeOfPostProcessing = 205; } +"ecPoint" = { typeOfPostProcessing = 206; } diff --git a/definitions/grib2/tables/33/4.0.table b/definitions/grib2/tables/33/4.0.table new file mode 100644 index 000000000..b2abf24b3 --- /dev/null +++ b/definitions/grib2/tables/33/4.0.table @@ -0,0 +1,111 @@ +# Code table 4.0 - Product definition template number +0 0 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time +1 1 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time +2 2 Derived forecasts based on all ensemble members at a horizontal level or in a horizontal layer at a point in time +3 3 Derived forecasts based on a cluster of ensemble members over a rectangular area at a horizontal level or in a horizontal layer at a point in time +4 4 Derived forecasts based on a cluster of ensemble members over a circular area at a horizontal level or in a horizontal layer at a point in time +5 5 Probability forecasts at a horizontal level or in a horizontal layer at a point in time +6 6 Percentile forecasts at a horizontal level or in a horizontal layer at a point in time +7 7 Analysis or forecast error at a horizontal level or in a horizontal layer at a point in time +8 8 Average, accumulation, extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +9 9 Probability forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +10 10 Percentile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +11 11 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval +12 12 Derived forecasts based on all ensemble members at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval +13 13 Derived forecasts based on a cluster of ensemble members over a rectangular area, at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval +14 14 Derived forecasts based on a cluster of ensemble members over a circular area, at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval +15 15 Average, accumulation, extreme values or other statistically processed values over a spatial area at a horizontal level or in a horizontal layer at a point in time +# 16-19 Reserved +20 20 Radar product +# 21-29 Reserved +30 30 Satellite product (deprecated) +31 31 Satellite product +32 32 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for simulated (synthetic) satellite data +33 33 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for simulated (synthetic) satellite data +34 34 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval for simulated (synthetic) satellite data +35 35 Satellite product with or without associated quality values +# 36-39 Reserved +40 40 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents +41 41 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents +42 42 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents +43 43 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents +44 44 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for aerosol +45 45 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for aerosol +46 46 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol +47 47 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol +48 48 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for optical properties of aerosol +49 49 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for optical properties of aerosol +# 50 Reserved +51 51 Categorical forecasts at a horizontal level or in a horizontal layer at a point in time +# 52 Reserved +53 53 Partitioned parameters at a horizontal level or in a horizontal layer at a point in time +54 54 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for partitioned parameters +55 55 Spatio-temporal changing tiles at a horizontal level or horizontal layer at a point in time +56 56 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for spatio-temporal changing tile parameters (deprecated) +57 57 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents based on a distribution function +58 58 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents based on a distribution function +59 59 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for spatio-temporal changing tile parameters (corrected version of template 4.56) +60 60 Individual ensemble reforecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time +61 61 Individual ensemble reforecast, control and perturbed, at a horizontal level or in a horizontal layer, in a continuous or non-continuous time interval +62 62 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for spatio-temporal changing tiles at a horizontal level or horizontal layer at a point in time +63 63 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for spatio-temporal changing tiles +# 64-66 Reserved +67 67 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents based on a distribution function +68 68 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents based on a distribution function +# 69 Reserved +70 70 Post-processing analysis or forecast at a horizontal level or in a horizontal layer at a point in time +71 71 Post-processing individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time +72 72 Post-processing average, accumulation, extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +73 73 Post-processing individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer, in a continuous or non-continuous time interval +# 74-75 Reserved +76 76 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents with source or sink +77 77 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for atmospheric chemical constituents with source or sink +78 78 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents with source or sink +79 79 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for atmospheric chemical constituents with source or sink +80 80 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for optical properties of aerosol with source or sink +81 81 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for optical properties of aerosol with source or sink +82 82 Average, accumulation, and/or extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol with source or sink +83 83 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol with source or sink +84 84 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol with source or sink +85 85 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for aerosol +86 86 Quantile forecasts at a horizontal level or in a horizontal layer at a point in time +87 87 Quantile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +88 88 Analysis or forecast at a horizontal level or in a horizontal layer at a specified local time +# 89-90 Reserved +91 91 Categorical forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +92 92 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a specified local time +93 93 Post-processing analysis or forecast at a horizontal level or in a horizontal layer at a specified local time +94 94 Post-processing individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a specified local time +95 95 Average, accumulation, extreme values or other statiscally processed value at a horizontal level or in a horizontal layer at a specified local time +96 96 Average, accumulation, extreme values or other statistically processed values of an individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a specified local time +97 97 Average, accumulation, extreme values or other statistically processed values of post-processing analysis or forecast at a horizontal level or in a horizontal layer at a specified local time +98 98 Average, accumulation, extreme values or other statistically processed values of a post-processing individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a specified local time +99 99 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with explicit list of frequencies and directions +100 100 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with explicit list of frequencies and directions +101 101 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with frequencies and directions defined by formulae +102 102 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with frequencies and directions defined by formulae +103 103 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for waves selected by period range +104 104 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for waves selected by period range +105 105 Anomalies, significance and other derived products from an analysis or forecast in relation to a reference period at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +106 106 Anomalies, significance and other derived products from an individual ensemble forecast, control and perturbed in relation to a reference period at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +107 107 Anomalies, significance and other derived products from derived forecasts based on all ensemble members in relation to a reference period at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +108 108 Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for generic optical products +109 109 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer at a point in time for generic optical products +110 110 Average, accumulation, extreme values or other statistically processed values at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval for generic optical products +111 111 Individual ensemble forecast, control and perturbed, at a horizontal level or in a horizontal layer, in a continuous or non-continuous interval for generic optical products +112 112 Anomalies, significance and other derived products as probability forecasts in relation to a reference period at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +# 113-120 Reserved +121 121 Post-processed quantile forecasts at a horizontal level or in a horizontal layer at a point in time +122 122, Post-processed quantile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval +# 123-254 Reserved +254 254 CCITT IA5 character string +# 255-999 Reserved +1000 1000 Cross-section of analysis and forecast at a point in time +1001 1001 Cross-section of averaged or otherwise statistically processed analysis or forecast over a range of time +1002 1002 Cross-section of analysis and forecast, averaged or otherwise statistically processed over latitude or longitude +# 1003-1099 Reserved +1100 1100 Hovmoller-type grid with no averaging or other statistical processing +1101 1101 Hovmoller-type grid with averaging or other statistical processing +# 1102-32767 Reserved +# 32768-65534 Reserved for local use +65535 65535 Missing diff --git a/definitions/grib2/template.4.121.def b/definitions/grib2/template.4.121.def new file mode 100644 index 000000000..2a33f049f --- /dev/null +++ b/definitions/grib2/template.4.121.def @@ -0,0 +1,11 @@ +# (C) Copyright 2005- ECMWF. + +# TEMPLATE 4.121, Post-processed quantile forecasts at a horizontal level or in a horizontal layer at a point in time + +include "grib2/template.4.parameter.def" +include "grib2/template.4.postproc.def" +include "grib2/template.4.generating_process.def" +include "grib2/template.4.forecast_time.def" +include "grib2/template.4.point_in_time.def" +include "grib2/template.4.horizontal.def" +include "grib2/template.4.quantile.def" diff --git a/definitions/grib2/template.4.122.def b/definitions/grib2/template.4.122.def new file mode 100644 index 000000000..c6d1f2676 --- /dev/null +++ b/definitions/grib2/template.4.122.def @@ -0,0 +1,11 @@ +# (C) Copyright 2005- ECMWF. + +# TEMPLATE 4.122, Post-processed quantile forecasts at a horizontal level or in a horizontal layer in a continuous or non-continuous time interval + +include "grib2/template.4.parameter.def" +include "grib2/template.4.postproc.def" +include "grib2/template.4.generating_process.def" +include "grib2/template.4.forecast_time.def" +include "grib2/template.4.horizontal.def" +include "grib2/template.4.quantile.def" +include "grib2/template.4.statistical.def" diff --git a/definitions/mars/grib.eefo.gbf.def b/definitions/mars/grib.eefo.gbf.def new file mode 100644 index 000000000..e84a28568 --- /dev/null +++ b/definitions/mars/grib.eefo.gbf.def @@ -0,0 +1,9 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + + diff --git a/definitions/mars/grib.eefo.gwt.def b/definitions/mars/grib.eefo.gwt.def new file mode 100644 index 000000000..e84a28568 --- /dev/null +++ b/definitions/mars/grib.eefo.gwt.def @@ -0,0 +1,9 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + + diff --git a/definitions/mars/grib.eefo.pfc.def b/definitions/mars/grib.eefo.pfc.def new file mode 100644 index 000000000..04adb5a22 --- /dev/null +++ b/definitions/mars/grib.eefo.pfc.def @@ -0,0 +1,10 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; diff --git a/definitions/mars/grib.eefo.ppm.def b/definitions/mars/grib.eefo.ppm.def new file mode 100644 index 000000000..9129cbcd8 --- /dev/null +++ b/definitions/mars/grib.eefo.ppm.def @@ -0,0 +1,11 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; + diff --git a/definitions/mars/grib.enfo.gbf.def b/definitions/mars/grib.enfo.gbf.def new file mode 100644 index 000000000..e84a28568 --- /dev/null +++ b/definitions/mars/grib.enfo.gbf.def @@ -0,0 +1,9 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + + diff --git a/definitions/mars/grib.enfo.gwt.def b/definitions/mars/grib.enfo.gwt.def new file mode 100644 index 000000000..e84a28568 --- /dev/null +++ b/definitions/mars/grib.enfo.gwt.def @@ -0,0 +1,9 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + + diff --git a/definitions/mars/grib.enfo.pfc.def b/definitions/mars/grib.enfo.pfc.def new file mode 100644 index 000000000..04adb5a22 --- /dev/null +++ b/definitions/mars/grib.enfo.pfc.def @@ -0,0 +1,10 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; diff --git a/definitions/mars/grib.enfo.ppm.def b/definitions/mars/grib.enfo.ppm.def new file mode 100644 index 000000000..9129cbcd8 --- /dev/null +++ b/definitions/mars/grib.enfo.ppm.def @@ -0,0 +1,11 @@ +alias mars.number = perturbationNumber; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; + diff --git a/definitions/mars/grib.mmsf.gbf.def b/definitions/mars/grib.mmsf.gbf.def new file mode 100644 index 000000000..f4adf1dc1 --- /dev/null +++ b/definitions/mars/grib.mmsf.gbf.def @@ -0,0 +1,24 @@ +#alias mars.step = endStep; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +if (class is "od") { alias mars.system = systemNumber; } +if (class is "me") { alias mars.system = systemNumber; } +if (class is "en") { alias mars.system = systemNumber; } +if (class is "c3") { alias mars.system = systemNumber; } +alias mars.number = perturbationNumber; +alias mars.method = methodNumber; + +if (!(class is "gw")) { # ECC-1448 + alias mars.origin = centre; +} + +# See ECC-624 +if (centre == 80 && subCentre == 98 && class is "c3") { + constant cnmc_cmcc = 'cmcc'; + alias mars.origin = cnmc_cmcc; +} diff --git a/definitions/mars/grib.mmsf.gwt.def b/definitions/mars/grib.mmsf.gwt.def new file mode 100644 index 000000000..f4adf1dc1 --- /dev/null +++ b/definitions/mars/grib.mmsf.gwt.def @@ -0,0 +1,24 @@ +#alias mars.step = endStep; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +if (class is "od") { alias mars.system = systemNumber; } +if (class is "me") { alias mars.system = systemNumber; } +if (class is "en") { alias mars.system = systemNumber; } +if (class is "c3") { alias mars.system = systemNumber; } +alias mars.number = perturbationNumber; +alias mars.method = methodNumber; + +if (!(class is "gw")) { # ECC-1448 + alias mars.origin = centre; +} + +# See ECC-624 +if (centre == 80 && subCentre == 98 && class is "c3") { + constant cnmc_cmcc = 'cmcc'; + alias mars.origin = cnmc_cmcc; +} diff --git a/definitions/mars/grib.mmsf.pfc.def b/definitions/mars/grib.mmsf.pfc.def new file mode 100644 index 000000000..a05a78ca1 --- /dev/null +++ b/definitions/mars/grib.mmsf.pfc.def @@ -0,0 +1,27 @@ +#alias mars.step = endStep; + +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; + +if (class is "od") { alias mars.system = systemNumber; } +if (class is "me") { alias mars.system = systemNumber; } +if (class is "en") { alias mars.system = systemNumber; } +if (class is "c3") { alias mars.system = systemNumber; } +alias mars.number = perturbationNumber; +alias mars.method = methodNumber; + +if (!(class is "gw")) { # ECC-1448 + alias mars.origin = centre; +} + +# See ECC-624 +if (centre == 80 && subCentre == 98 && class is "c3") { + constant cnmc_cmcc = 'cmcc'; + alias mars.origin = cnmc_cmcc; +} diff --git a/definitions/mars/grib.oper.gbf.def b/definitions/mars/grib.oper.gbf.def new file mode 100644 index 000000000..2797330c8 --- /dev/null +++ b/definitions/mars/grib.oper.gbf.def @@ -0,0 +1,5 @@ +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; diff --git a/definitions/mars/grib.oper.gwt.def b/definitions/mars/grib.oper.gwt.def new file mode 100644 index 000000000..2797330c8 --- /dev/null +++ b/definitions/mars/grib.oper.gwt.def @@ -0,0 +1,5 @@ +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; diff --git a/definitions/mars/grib.oper.pfc.def b/definitions/mars/grib.oper.pfc.def new file mode 100644 index 000000000..a8c09a96e --- /dev/null +++ b/definitions/mars/grib.oper.pfc.def @@ -0,0 +1,9 @@ +alias mars.step = stepRange; + +# We need this because 'postProcessing' is defined later +meta ecpt_model sprintf("%s", postProcessing) : no_copy; +alias mars.model = ecpt_model; + +meta marsQuantile sprintf("%d:%d",quantileValue,totalNumberOfQuantiles); +alias mars.quantile = marsQuantile; + diff --git a/definitions/mars/type.table b/definitions/mars/type.table index 94001b890..8af0982bd 100644 --- a/definitions/mars/type.table +++ b/definitions/mars/type.table @@ -69,3 +69,7 @@ 88 gsd Gridded satellite data 89 ga GFAS analysis 90 gai Gridded analysis input +91 gbf ecPoint bias-corrected gridbox +92 pfc ecPoint point values +93 ppm ecPoint point value metrics +94 gwt ecPoint weather types