Heat Index Calculation not right
Added by Bryan Kilgore over 1 year ago
We are trying to run our script to output grib for heat index based off 2 meter temp and Rh. When we input the script into CDO we are returning a value that is about 3 degrees too high compared to java.
CDO Command:
cdo -setrtomiss,264,265 -expr,' _tF = ((2t - 273.15) * 1.8) + 32; _hi = -42.379 + (2.04901523 * _tF) + (10.14333127 * 2r) - (0.22475541 * _tF * 2r) - (6.83783 * pow(10, -3) * pow(_tF, 2)) - (5.481717 * pow(10, -2) * pow(2r, 2)) + (1.22874 * pow(10, -3) * pow(_tF, 2) * 2r) + (8.5282 * pow(10, -4) * _tF * pow(2r, 2)) - (1.99 * pow(10, -6) * pow(_tF, 2) * pow(2r, 2)); _hi = _tF < 80 ? _tF : _hi; heatx = (_hi - 32) * 0.55555556 + 273.15; ' -invertlat ./temp2m_rh.grib2 ./heat.grib2
When we interigate a point on the grib it is:
2mt = 83.25
rh = 74.11
heat = 94
Run this same formula in java console.
var _tF = 83.25
var r2 = 74.11
console.log(-42.379 + 2.04901523 * _tF + 10.14333127 * r2 - 0.22475541 * _tF * r2 - 6.83783 * (Math.pow(10, -3) * Math.pow(_tF, 2)) - 5.481717 * (Math.pow(10, -2) * Math.pow(r2, 2)) + 1.22874 * (Math.pow(10, -3) * Math.pow(_tF, 2) * r2) + 8.5282 * (Math.pow(10, -4) * _tF * Math.pow(r2, 2)) - 1.99 * (Math.pow(10, -6) * Math.pow(_tF, 2) * Math.pow(r2, 2)))
Output: 90.09733414634763
The java output matches the WPC Heat Index calculator.
https://www.wpc.ncep.noaa.gov/html/heatindex.shtml
We are running following version:
Climate Data Operators version 2.1.1 (https://mpimet.mpg.de/cdo)
System: aarch64-apple-darwin22.3.0
CXX Compiler: /usr/bin/clang++ -std=gnu++17 -pipe -Os -stdlib=libc++ -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk -arch arm64 -pthread
CXX version : Apple clang version 14.0.0 (clang-1400.0.29.202)
C Compiler: /usr/bin/clang -pipe -Os -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk -arch arm64 -pthread -pthread
C version : Apple clang version 14.0.0 (clang-1400.0.29.202)
F77 Compiler: -pipe -Os -m64
Features: 32GB 10threads c++17 pthreads HDF5 NC4/HDF5 OPeNDAP sz udunits2 proj xml2 magics curl fftw3
Libraries: yac/2.6.1 HDF5/1.14.0 proj/8.2.1 xml2/2.10.3 curl/7.87.0 magics/4.5.1
CDI data types: SizeType=size_t
CDI file types: srv ext ieg grb1 grb2 nc1 nc2 nc4 nc4c nc5 nczarr
CDI library version : 2.1.1
ecCodes library version : 2.28.0
NetCDF library version : 4.9.0 of Feb 17 2023 15:11:40 $
HDF5 library version : 1.14.0
exse library version : 1.4.2
FILE library version : 1.9.1
We are using this version because when we upgraded to any version beyond this one other features break.
temp2m_rh.grib2 (12.5 MB) temp2m_rh.grib2 |
Replies (10)
RE: Heat Index Calculation not right - Added by Karin Meier-Fleischer over 1 year ago
Hi Bryan,
if I run the expression with the given _tF and r2 value I get the correct value.
I used Python for testing:
1. check your Java code result
_tF = 83.25 r2 = 74.11 result = -42.379 + 2.04901523 * _tF + 10.14333127 * r2 - 0.22475541 * \ _tF * r2 - 6.83783 * (math.pow(10, -3) * math.pow(_tF, 2)) - \ 5.481717 * (math.pow(10, -2) * math.pow(r2, 2)) + 1.22874 * \ (math.pow(10, -3) * math.pow(_tF, 2) * r2) + 8.5282 * \ (math.pow(10, -4) * _tF * math.pow(r2, 2)) - 1.99 * (math.pow(10, -6) * \ math.pow(_tF, 2) * math.pow(r2, 2)) result = 90.09733414634763
2. check cdo result
_tF = str(_tF) r2 = str(r2) cmd0 = "'heat= (-42.379 + 2.04901523 * " + _tF + " + 10.14333127 * " + r2 + "- 0.22475541 * " + \ _tF + " * " + r2 + "- 6.83783 * (pow(10, -3) * pow(" + _tF + ", 2)) - " + \ "5.481717 * (pow(10, -2) * pow("+r2+", 2)) + 1.22874 * " + \ "(pow(10, -3) * pow(" + _tF + ", 2) * " + r2 + ") + 8.5282 * " + \ "(pow(10, -4) * " + _tF + " * pow(" + r2 + ", 2)) - 1.99 * (pow(10, -6) * " + \ "pow("+ _tF + ", 2) * pow("+ r2 +", 2)))'" cdo.infon(input="-expr,"+cmd0+" -chname,topo,heat -topo") # use -topo as dummy input, it won't be used ['-1 : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter name', '1 : 0001-01-01 00:00:00 0 259200 0 : 90.097 90.097 90.097 : heat']
RE: Heat Index Calculation not right - Added by Bryan Kilgore over 1 year ago
If you output the grib does it also give you the same value? We are wondering if there is something wrong with the grib output causing this.
Lat/Lng: -86.317, 39.25
RE: Heat Index Calculation not right - Added by Karin Meier-Fleischer over 1 year ago
Send me the cdo command line you are using to compute the above heat, please.
RE: Heat Index Calculation not right - Added by Bryan Kilgore over 1 year ago
It is in the original post.
RE: Heat Index Calculation not right - Added by Karin Meier-Fleischer over 1 year ago
I asked because it gives me a complete other result.
cdo -setrtomiss,264,265 -expr,' _tF = ((2t - 273.15) * 1.8) + 32; _hi = -42.379 + (2.04901523 * _tF) + (10.14333127 * 2r) - (0.22475541 * _tF * 2r) - (6.83783 * pow(10, -3) * pow(_tF, 2)) - (5.481717 * pow(10, -2) * pow(2r, 2)) + (1.22874 * pow(10, -3) * pow(_tF, 2) * 2r) + (8.5282 * pow(10, -4) * _tF * pow(2r, 2)) - (1.99 * pow(10, -6) * pow(_tF, 2) * pow(2r, 2)); _hi = _tF < 80 ? _tF : _hi; heatx = (_hi - 32) * 0.55555556 + 273.15; ' -invertlat ./temp2m_rh.grib2 ./heat.grib2
cdo -s -outputtab,name,value -remapnn,lon=-86.317_lat=39.25 heat.grib2
Result:
# name value heatx 296.6302
RE: Heat Index Calculation not right - Added by Bryan Kilgore over 1 year ago
That's why I'm making this post because something isn't right. The commands I posted was straight copy and paste from my terminals. It seems like there is something wrong when it writes out to GRIB.
RE: Heat Index Calculation not right - Added by Karin Meier-Fleischer over 1 year ago
The results differ because the given cdo expression and the java expression are not the same. Please, check it, this is up to you.
RE: Heat Index Calculation not right - Added by Bryan Kilgore over 1 year ago
Ok let me start back over.
I ran this CDO command:
cdo -setrtomiss,264,265 -expr,' _tF = ((2t - 273.15) * 1.8) + 32; _hi = -42.379 + (2.04901523 * _tF) + (10.14333127 * 2r) - (0.22475541 * _tF * 2r) - (6.83783 * pow(10, -3) * pow(_tF, 2)) - (5.481717 * pow(10, -2) * pow(2r, 2)) + (1.22874 * pow(10, -3) * pow(_tF, 2) * 2r) + (8.5282 * pow(10, -4) * _tF * pow(2r, 2)) - (1.99 * pow(10, -6) * pow(_tF, 2) * pow(2r, 2)); _hi = _tF < 80 ? _tF : _hi; heatx = (_hi - 32) * 0.55555556 + 273.15; ' -invertlat ./temp2m_rh.grib2 ./heat.grib2
I have attached the grib output from the above output.
This has 1 extra part for if the temperature is below 80 degrees. In the following command that isn't necessary since we are specifiying the temperature.
var _tF = 83.25
var r2 = 74.11
console.log(-42.379 + 2.04901523 * _tF + 10.14333127 * r2 - 0.22475541 * _tF * r2 - 6.83783 * (Math.pow(10, -3) * Math.pow(_tF, 2)) - 5.481717 * (Math.pow(10, -2) * Math.pow(r2, 2)) + 1.22874 * (Math.pow(10, -3) * Math.pow(_tF, 2) * r2) + 8.5282 * (Math.pow(10, -4) * _tF * Math.pow(r2, 2)) - 1.99 * (Math.pow(10, -6) * Math.pow(_tF, 2) * Math.pow(r2, 2)))
The Lat/Lng: -86.317, 39.25 that I interrogated this spot in QGIS and received this result.
heat.grib2 (7.14 MB) heat.grib2 |
RE: Heat Index Calculation not right - Added by Karin Meier-Fleischer over 1 year ago
What is the difference between heat and heatx? What about 'heatx = (_hi - 32) * 0.55555556 + 273.15'?
RE: Heat Index Calculation not right - Added by Bryan Kilgore over 1 year ago
heatx is CDO parameter variable so it codes the output grib as heat index product.
heat in your screenshot is coming from the file name in QGIS.