diff --git a/Documentation.pdf b/Documentation.pdf deleted file mode 100644 index 95c546f0ffc773e71a70955014274dd6aa74653c..0000000000000000000000000000000000000000 Binary files a/Documentation.pdf and /dev/null differ diff --git a/data_all.nc b/data_all.nc deleted file mode 100644 index b503e7e8c2c7089cf46f55f4d75266a153a9572f..0000000000000000000000000000000000000000 Binary files a/data_all.nc and /dev/null differ diff --git a/run_ASFC.py b/run_ASFC.py deleted file mode 100644 index 193684051ca4bec6955594feae4bc0384ea469fd..0000000000000000000000000000000000000000 --- a/run_ASFC.py +++ /dev/null @@ -1,573 +0,0 @@ -""" -example of running AirSeaFluxCode with -1. R/V data (data_all.nc) or -2. one day era5 hourly data (era5_r360x180.nc) -compute fluxes -output NetCDF4 -and statistics in stats.txt - -@author: sbiri -""" -#%% import packages -import matplotlib.pyplot as plt -import netCDF4 as nc -import numpy as np -from AirSeaFluxCode import AirSeaFluxCode -import time -from tabulate import tabulate -#%% -def reject_outliers(data, m=2): - x = np.copy(data) - x = np.where(np.abs(x - np.nanmean(x)) < m*np.nanstd(x), - x, np.nan) - return x - - -def run_ASFC(inF, outF, gustIn, cskinIn, tolIn, meth): - """ - - - Parameters - ---------- - inF : str - input filename either data_all.nc or era5_r360x180.nc - outF : str - output filename - gustIn : float - gustiness option e.g. [1, 1.2, 800] - cskinIn : int - cool skin option input 0 or 1 - tolIn : float - tolerance input option e.g. ['all', 0.01, 0.01, 5e-05, 0.01, 1, 1] - meth : str - parametrisation method option - - Returns - ------- - res : float - AirSeaFluxCode output - lon : float - longitude from input netCDF file - lat : float - latitude from input netCDF file - - """ - if (inF == "data_all.nc"): - #%% load data_all - fid=nc.Dataset('data_all.nc') - date = np.array(fid.variables["date"]) - lon = np.array(fid.variables["lon"]) - lat = np.array(fid.variables["lat"]) - spd = np.array(fid.variables["spd"]) - t = np.array(fid.variables["t"]) - sst = np.array(fid.variables["sst"]) - rh = np.array(fid.variables["rh"]) - p = np.array(fid.variables["p"]) - sw = np.array(fid.variables["sw"]) - hu = np.array(fid.variables["spd"].getncattr("height")) - ht = np.array(fid.variables["t"].getncattr("height")) - hin = np.array([hu, ht, ht]) - del hu, ht - fid.close() - del fid - #%% run AirSeaFluxCode - res = AirSeaFluxCode(spd, t, sst, lat=lat, hum=['rh', rh], P=p, - hin=hin, Rs=sw, tol=tolIn, gust=gustIn, - cskin=cskinIn, meth=meth, out=1, L="ecmwf", n=30) - #%% save NetCDF4 - fid = nc.Dataset(outF,'w', format='NETCDF4') - fid.createDimension('lon', len(lon)) - fid.createDimension('lat', len(lat)) - fid.createDimension('time', None) - longitude = fid.createVariable('lon', 'f4', 'lon') - latitude = fid.createVariable('lat', 'f4', 'lat') - Date = fid.createVariable('Date', 'i4', 'time') - tau = fid.createVariable('tau', 'f4', 'time') - sensible = fid.createVariable('shf', 'f4', 'time') - latent = fid.createVariable('lhf', 'f4', 'time') - monob = fid.createVariable('MO', 'f4', 'time') - cd = fid.createVariable('cd', 'f4', 'time') - cdn = fid.createVariable('cdn', 'f4', 'time') - ct = fid.createVariable('ct', 'f4', 'time') - ctn = fid.createVariable('ctn', 'f4', 'time') - cq = fid.createVariable('cq', 'f4', 'time') - cqn = fid.createVariable('cqn', 'f4', 'time') - tsrv = fid.createVariable('tsrv', 'f4', 'time') - tsr = fid.createVariable('tsr', 'f4', 'time') - qsr = fid.createVariable('qsr', 'f4', 'time') - usr = fid.createVariable('usr', 'f4', 'time') - psim = fid.createVariable('psim', 'f4', 'time') - psit = fid.createVariable('psit', 'f4', 'time') - psiq = fid.createVariable('psiq', 'f4', 'time') - u10n = fid.createVariable('u10n', 'f4', 'time') - t10n = fid.createVariable('t10n', 'f4', 'time') - tv10n = fid.createVariable('tv10n', 'f4', 'time') - q10n = fid.createVariable('q10n', 'f4', 'time') - zo = fid.createVariable('zo', 'f4', 'time') - zot = fid.createVariable('zot', 'f4', 'time') - zoq = fid.createVariable('zoq', 'f4', 'time') - urefs = fid.createVariable('uref', 'f4', 'time') - trefs = fid.createVariable('tref', 'f4', 'time') - qrefs = fid.createVariable('qref', 'f4', 'time') - itera = fid.createVariable('iter', 'i4', 'time') - dter = fid.createVariable('dter', 'f4', 'time') - dqer = fid.createVariable('dqer', 'f4', 'time') - dtwl = fid.createVariable('dter', 'f4', 'time') - qair = fid.createVariable('qair', 'f4', 'time') - qsea = fid.createVariable('qsea', 'f4', 'time') - Rl = fid.createVariable('Rl', 'f4', 'time') - Rs = fid.createVariable('Rs', 'f4', 'time') - Rnl = fid.createVariable('Rnl', 'f4', 'time') - - longitude[:] = lon - latitude[:] = lat - Date[:] = date - tau[:] = res[0] - sensible[:] = res[1] - latent[:] = res[2] - monob[:] = res[3] - cd[:] = res[4] - cdn[:] = res[5] - ct[:] = res[6] - ctn[:] = res[7] - cq[:] = res[8] - cqn[:] = res[9] - tsrv[:] = res[10] - tsr[:] = res[11] - qsr[:] = res[12] - usr[:] = res[13] - psim[:] = res[14] - psit[:] = res[15] - psiq[:] = res[16] - u10n[:] = res[17] - t10n[:] = res[18] - tv10n[:] = res[19] - q10n[:] = res[20] - zo[:] = res[21] - zot[:] = res[22] - zoq[:] = res[23] - urefs[:] = res[24] - trefs[:] = res[25] - qrefs[:] = res[26] - itera[:] = res[27] - dter[:] = res[28] - dqer[:] = res[29] - dtwl[:] = res[30] - qair[:] = res[31] - qsea[:] = res[32] - Rl = res[33] - Rs = res[34] - Rnl = res[35] - longitude.long_name = 'Longitude' - longitude.units = 'degrees East' - latitude.long_name = 'Latitude' - latitude.units = 'degrees North' - Date.long_name = "calendar date" - Date.units = "YYYYMMDD UTC" - tau.long_name = 'Wind stress' - tau.units = 'N/m^2' - sensible.long_name = 'Sensible heat fluxe' - sensible.units = 'W/m^2' - latent.long_name = 'Latent heat flux' - latent.units = 'W/m^2' - monob.long_name = 'Monin-Obukhov length' - monob.units = 'm' - cd.long_name = 'Drag coefficient' - cd.units = '' - cdn.long_name = 'Neutral Drag coefficient' - cdn.units = '' - ct.long_name = 'Heat exchange coefficient' - ct.units = '' - ctn.long_name = 'Neutral Heat exchange coefficient' - ctn.units = '' - cq.long_name = 'Moisture exchange coefficient' - cq.units = '' - cqn.long_name = 'Neutral Moisture exchange coefficient' - cqn.units = '' - tsrv.long_name = 'star virtual temperature' - tsrv.units = 'degrees Celsius' - tsr.long_name = 'star temperature' - tsr.units = 'degrees Celsius' - qsr.long_name = 'star specific humidity' - qsr.units = 'gr/kgr' - usr.long_name = 'friction velocity' - usr.units = 'm/s' - psim.long_name = 'Momentum stability function' - psit.long_name = 'Heat stability function' - u10n.long_name = '10m neutral wind speed' - u10n.units = 'm/s' - t10n.long_name = '10m neutral temperature' - t10n.units = 'degrees Celsius' - tv10n.long_name = '10m neutral virtual temperature' - tv10n.units = 'degrees Celsius' - q10n.long_name = '10m neutral specific humidity' - q10n.units = 'gr/kgr' - zo.long_name = 'momentum roughness length' - zo.units = 'm' - zot.long_name = 'temperature roughness length' - zot.units = 'm' - zoq.long_name = 'moisture roughness length' - zoq.units = 'm' - urefs.long_name = 'wind speed at ref height' - urefs.units = 'm/s' - trefs.long_name = 'temperature at ref height' - trefs.units = 'degrees Celsius' - qrefs.long_name = 'specific humidity at ref height' - qrefs.units = 'gr/kgr' - qair.long_name = 'specific humidity of air' - qair.units = 'gr/kgr' - qsea.long_name = 'specific humidity over water' - qsea.units = 'gr/kgr' - itera.long_name = 'number of iterations' - fid.close() - #%% delete variables - del longitude, latitude, Date, tau, sensible, latent, monob, cd, cdn - del ct, ctn, cq, cqn, tsrv, tsr, qsr, usr, psim, psit, psiq, u10n, t10n - del tv10n, q10n, zo, zot, zoq, urefs, trefs, qrefs, itera, dter, dqer - del qair, qsea, Rl, Rs, Rnl - del t, rh, date, p, sw, spd, hin - - elif (inF == 'era5_r360x180.nc'): - #%% load era5_r360x180.nc - fid = nc.Dataset(inF) - lon = np.array(fid.variables["lon"]) - lat = np.array(fid.variables["lat"]) - T = np.array(fid.variables["t2m"]) - tim = np.array(fid.variables["time"]) - Td = np.array(fid.variables["d2m"]) - sst = np.array(fid.variables["sst"]) - sst = np.where(sst < -100, np.nan, sst) - p = np.array(fid.variables["msl"])/100 # to set hPa - lw = np.array(fid.variables["strd"])/60/60 - sw = np.array(fid.variables["ssrd"])/60/60 - u = np.array(fid.variables["u10"]) - v = np.array(fid.variables["v10"]) - lsm = np.array(fid.variables["lsm"]) - fid.close() - spd = np.sqrt(np.power(u, 2)+np.power(v, 2)) - del u, v, fid - lsm = np.where(lsm > 0, np.nan, 1) # reverse 0 on land 1 over ocean - hin = np.array([10, 2, 2]) - latIn = np.tile(lat, (len(lon), 1)).T.reshape(len(lon)*len(lat)) - #%% run AirSeaFluxCode - res = np.zeros((len(tim),len(lon)*len(lat), 36)) - # reshape input and run code - for x in range(len(tim)): - a = AirSeaFluxCode(spd.reshape(len(tim), len(lon)*len(lat))[x, :], - T.reshape(len(tim), len(lon)*len(lat))[x, :], - sst.reshape(len(tim), len(lon)*len(lat))[x, :], - lat=latIn, - hum=['Td', Td.reshape(len(tim), len(lon)*len(lat))[x, :]], - P=p.reshape(len(tim), len(lon)*len(lat))[x, :], - hin=hin, - Rs=sw.reshape(len(tim), len(lon)*len(lat))[x, :], - Rl=lw.reshape(len(tim), len(lon)*len(lat))[x, :], - gust=gustIn, cskin=cskinIn, tol=tolIn, qmeth='WMO', - meth=meth, n=30, L="ecmwf") - res[x, :, :] = a.T - del a - #%% save NetCDF4 - fid = nc.Dataset(outF,'w', format='NETCDF4') - fid.createDimension('lon', len(lon)) - fid.createDimension('lat', len(lat)) - fid.createDimension('time', None) - longitude = fid.createVariable('lon', 'f4', 'lon') - latitude = fid.createVariable('lat', 'f4', 'lat') - Date = fid.createVariable('Date', 'i4', 'time') - tau = fid.createVariable('tau', 'f4', ('time','lat','lon')) - sensible = fid.createVariable('shf', 'f4', ('time','lat','lon')) - latent = fid.createVariable('lhf', 'f4', ('time','lat','lon')) - monob = fid.createVariable('MO', 'f4', ('time','lat','lon')) - cd = fid.createVariable('cd', 'f4', ('time','lat','lon')) - cdn = fid.createVariable('cdn', 'f4', ('time','lat','lon')) - ct = fid.createVariable('ct', 'f4', ('time','lat','lon')) - ctn = fid.createVariable('ctn', 'f4', ('time','lat','lon')) - cq = fid.createVariable('cq', 'f4', ('time','lat','lon')) - cqn = fid.createVariable('cqn', 'f4', ('time','lat','lon')) - tsrv = fid.createVariable('tsrv', 'f4', ('time','lat','lon')) - tsr = fid.createVariable('tsr', 'f4', ('time','lat','lon')) - qsr = fid.createVariable('qsr', 'f4', ('time','lat','lon')) - usr = fid.createVariable('usr', 'f4', ('time','lat','lon')) - psim = fid.createVariable('psim', 'f4', ('time','lat','lon')) - psit = fid.createVariable('psit', 'f4', ('time','lat','lon')) - psiq = fid.createVariable('psiq', 'f4', ('time','lat','lon')) - u10n = fid.createVariable('u10n', 'f4', ('time','lat','lon')) - t10n = fid.createVariable('t10n', 'f4', ('time','lat','lon')) - tv10n = fid.createVariable('tv10n', 'f4', ('time','lat','lon')) - q10n = fid.createVariable('q10n', 'f4', ('time','lat','lon')) - zo = fid.createVariable('zo', 'f4', ('time','lat','lon')) - zot = fid.createVariable('zot', 'f4', ('time','lat','lon')) - zoq = fid.createVariable('zoq', 'f4', ('time','lat','lon')) - urefs = fid.createVariable('uref', 'f4', ('time','lat','lon')) - trefs = fid.createVariable('tref', 'f4', ('time','lat','lon')) - qrefs = fid.createVariable('qref', 'f4', ('time','lat','lon')) - itera = fid.createVariable('iter', 'i4', ('time','lat','lon')) - dter = fid.createVariable('dter', 'f4', ('time','lat','lon')) - dqer = fid.createVariable('dqer', 'f4', ('time','lat','lon')) - dtwl = fid.createVariable('dtwl', 'f4', ('time','lat','lon')) - qair = fid.createVariable('qair', 'f4', ('time','lat','lon')) - qsea = fid.createVariable('qsea', 'f4', ('time','lat','lon')) - Rl = fid.createVariable('Rl', 'f4', ('time','lat','lon')) - Rs = fid.createVariable('Rs', 'f4', ('time','lat','lon')) - Rnl = fid.createVariable('Rnl', 'f4', ('time','lat','lon')) - - longitude[:] = lon - latitude[:] = lat - Date[:] = tim - tau[:] = res[:, :, 0].reshape((len(tim), len(lat), len(lon)))*lsm - sensible[:] = res[:, :, 1].reshape((len(tim), len(lat), len(lon)))*lsm - latent[:] = res[:, :, 2].reshape((len(tim), len(lat), len(lon)))*lsm - monob[:] = res[:, :, 3].reshape((len(tim), len(lat), len(lon)))*lsm - cd[:] = res[:, :, 4].reshape((len(tim), len(lat), len(lon)))*lsm - cdn[:] = res[:, :, 5].reshape((len(tim), len(lat), len(lon)))*lsm - ct[:] = res[:, :, 6].reshape((len(tim), len(lat), len(lon)))*lsm - ctn[:] = res[:, :, 7].reshape((len(tim), len(lat), len(lon)))*lsm - cq[:] = res[:, :, 8].reshape((len(tim), len(lat), len(lon)))*lsm - cqn[:] = res[:, :, 9].reshape((len(tim), len(lat), len(lon)))*lsm - tsrv[:] = res[:, :, 10].reshape((len(tim), len(lat), len(lon)))*lsm - tsr[:] = res[:, :, 11].reshape((len(tim), len(lat), len(lon)))*lsm - qsr[:] = res[:, :, 12].reshape((len(tim), len(lat), len(lon)))*lsm - usr[:] = res[:, :, 13].reshape((len(tim), len(lat), len(lon)))*lsm - psim[:] = res[:, :, 14].reshape((len(tim), len(lat), len(lon)))*lsm - psit[:] = res[:, :, 15].reshape((len(tim), len(lat), len(lon)))*lsm - psiq[:] = res[:, :, 16].reshape((len(tim), len(lat), len(lon)))*lsm - u10n[:] = res[:, :, 17].reshape((len(tim), len(lat), len(lon)))*lsm - t10n[:] = res[:, :, 18].reshape((len(tim), len(lat), len(lon)))*lsm - tv10n[:] = res[:, :, 19].reshape((len(tim), len(lat), len(lon)))*lsm - q10n[:] = res[:, :, 20].reshape((len(tim), len(lat), len(lon)))*lsm - zo[:] = res[:, :, 21].reshape((len(tim), len(lat), len(lon)))*lsm - zot[:] = res[:, :, 22].reshape((len(tim), len(lat), len(lon)))*lsm - zoq[:] = res[:, :, 23].reshape((len(tim), len(lat), len(lon)))*lsm - urefs[:] = res[:, :, 24].reshape((len(tim), len(lat), len(lon)))*lsm - trefs[:] = res[:, :, 25].reshape((len(tim), len(lat), len(lon)))*lsm - qrefs[:] = res[:, :, 26].reshape((len(tim), len(lat), len(lon)))*lsm - itera[:] = res[:, :, 27].reshape((len(tim), len(lat), len(lon)))*lsm - dter[:] = res[:, :, 28].reshape((len(tim), len(lat), len(lon)))*lsm - dtwl[:] = res[:, :, 29].reshape((len(tim), len(lat), len(lon)))*lsm - dqer[:] = res[:, :, 30].reshape((len(tim), len(lat), len(lon)))*lsm - qair[:] = res[:, :, 31].reshape((len(tim), len(lat), len(lon)))*lsm - qsea[:] = res[:, :, 32].reshape((len(tim), len(lat), len(lon)))*lsm - Rl = res[:, :, 33].reshape((len(tim), len(lat), len(lon))) - Rs = res[:, :, 34].reshape((len(tim), len(lat), len(lon))) - Rnl = res[:, :, 35].reshape((len(tim), len(lat), len(lon))) - longitude.long_name = 'Longitude' - longitude.units = 'degrees East' - latitude.long_name = 'Latitude' - latitude.units = 'degrees North' - Date.long_name = "calendar date" - Date.units = "YYYYMMDD UTC" - tau.long_name = 'Wind stress' - tau.units = 'N/m^2' - sensible.long_name = 'Sensible heat fluxe' - sensible.units = 'W/m^2' - latent.long_name = 'Latent heat flux' - latent.units = 'W/m^2' - monob.long_name = 'Monin-Obukhov length' - monob.units = 'm' - cd.long_name = 'Drag coefficient' - cd.units = '' - cdn.long_name = 'Neutral Drag coefficient' - cdn.units = '' - ct.long_name = 'Heat exchange coefficient' - ct.units = '' - ctn.long_name = 'Neutral Heat exchange coefficient' - ctn.units = '' - cq.long_name = 'Moisture exchange coefficient' - cq.units = '' - cqn.long_name = 'Neutral Moisture exchange coefficient' - cqn.units = '' - tsrv.long_name = 'star virtual temperature' - tsrv.units = 'degrees Celsius' - tsr.long_name = 'star temperature' - tsr.units = 'degrees Celsius' - qsr.long_name = 'star specific humidity' - qsr.units = 'gr/kgr' - usr.long_name = 'friction velocity' - usr.units = 'm/s' - psim.long_name = 'Momentum stability function' - psit.long_name = 'Heat stability function' - u10n.long_name = '10m neutral wind speed' - u10n.units = 'm/s' - t10n.long_name = '10m neutral temperature' - t10n.units = 'degrees Celsius' - tv10n.long_name = '10m neutral virtual temperature' - tv10n.units = 'degrees Celsius' - q10n.long_name = '10m neutral specific humidity' - q10n.units = 'gr/kgr' - zo.long_name = 'momentum roughness length' - zo.units = 'm' - zot.long_name = 'temperature roughness length' - zot.units = 'm' - zoq.long_name = 'moisture roughness length' - zoq.units = 'm' - urefs.long_name = 'wind speed at ref height' - urefs.units = 'm/s' - trefs.long_name = 'temperature at ref height' - trefs.units = 'degrees Celsius' - qrefs.long_name = 'specific humidity at ref height' - qrefs.units = 'gr/kgr' - qair.long_name = 'specific humidity of air' - qair.units = 'gr/kgr' - qsea.long_name = 'specific humidity over water' - qsea.units = 'gr/kgr' - itera.long_name = 'number of iterations' - fid.close() - #%% delete variables - del longitude, latitude, Date, tau, sensible, latent, monob, cd, cdn - del ct, ctn, cq, cqn, tsrv, tsr, qsr, usr, psim, psit, psiq, u10n, t10n - del tv10n, q10n, zo, zot, zoq, urefs, trefs, qrefs, itera, dter, dqer - del qair, qsea, Rl, Rs, Rnl, dtwl - del T, Td, tim, p, lw, sw, lsm, spd, hin, latIn - return res, lon, lat -#%% run function -start_time = time.perf_counter() -#------------------------------------------------------------------------------ -inF = input("Give input file name (data_all.nc or era5_r360x180.nc): \n") -meth = input("Give prefered method: \n") -while meth not in ["S80", "S88", "LP82", "YT96", "UA", "LY04", "C30", "C35", - "C40", "ecmwf","Beljaars"]: - print("method unknown") - meth = input("Give prefered method: \n") -else: - meth = meth #[meth] -ext = meth+"_" -#------------------------------------------------------------------------------ -gustIn = input("Give gustiness option (to use default press enter): \n") -if (gustIn == ''): - gustIn = None - ext = ext+'gust_' -else: - gustIn = np.asarray(eval(gustIn), dtype=float) - if ((np.all(gustIn) == 0)): - ext = ext+'nogust_' - else: - ext = ext+'gust_' -#------------------------------------------------------------------------------ -cskinIn = input("Give cool skin option (to use default press enter): \n") -if (cskinIn == ''): - cskinIn = None - if ((cskinIn == None) and (meth == "S80" or meth == "S88" or meth == "LP82" - or meth == "YT96" or meth == "UA" or - meth == "LY04")): - cskinIn = 0 - ext = ext+'noskin_' - elif ((cskinIn == None) and (meth == "C30" or meth == "C35" or meth == "C40" - or meth == "ecmwf" or meth == "Beljaars")): - cskinIn = 1 - ext = ext+'skin_' -else: - cskinIn = int(cskinIn) - if (cskinIn == 0): - ext = ext+'noskin_' - elif (cskinIn == 1): - ext = ext+'skin_' -#------------------------------------------------------------------------------ -tolIn = input("Give tolerance option (to use default press enter): \n") -if (tolIn == ''): - tolIn = ['flux', 0.01, 1, 1] -else: - tolIn = eval(tolIn) -ext = ext+'tol'+tolIn[0] -#------------------------------------------------------------------------------ -outF = input("Give path and output file name: \n") -if (outF == ''): - outF = "out_"+inF[:-3]+"_"+ext+".nc" -elif (outF[-3:] != '.nc'): - outF = outF+".nc" -else: - outF = outF -#------------------------------------------------------------------------------ -print("\n run_ASFC.py, started for method "+meth) - -res, lon, lat = run_ASFC(inF, outF, gustIn, cskinIn, tolIn, meth) -print("run_ASFC.py took ", np.round((time.perf_counter()-start_time)/60, 2), - "minutes to run") - -#%% generate flux plots -if (inF == 'era5_r360x180.nc'): - cm = plt.cm.get_cmap('RdYlBu') - ttl = ["tau (Nm$^{-2}$)", "shf (Wm$^{-2}$)", "lhf (Wm$^{-2}$)"] - for i in range(3): - plt.figure() - plt.contourf(lon, lat, - np.nanmean(res[:, :, i], axis=0).reshape(len(lat), - len(lon)), - 100, cmap=cm) - plt.colorbar() - plt.tight_layout() - plt.xlabel("Longitude") - plt.ylabel("Latitude") - plt.title(meth+', '+ttl[i]) - plt.savefig('./'+ttl[i][:3]+'_'+ext+'.png', dpi=300, bbox_inches='tight') -elif (inF == "data_all.nc"): - ttl = ["tau (Nm$^{-2}$)", "shf (Wm$^{-2}$)", "lhf (Wm$^{-2}$)"] - for i in range(3): - plt.figure() - plt.plot(res[i],'.c', markersize=1) - plt.title(meth) - plt.xlabel("points") - plt.ylabel(ttl[i]) - plt.savefig('./'+ttl[i][:3]+'_'+ext+'.png', dpi=300, bbox_inches='tight') - -#%% generate txt file with statistic -if ((cskinIn == None) and (meth == "S80" or meth == "S88" or meth == "LP82" - or meth == "YT96" or meth == "UA" or - meth == "LY04")): - cskinIn = 0 -elif ((cskinIn == None) and (meth == "C30" or meth == "C35" or meth == "C40" - or meth == "ecmwf" or meth == "Beljaars")): - cskinIn = 1 -if (np.all(gustIn == None) and (meth == "C30" or meth == "C35" or meth == "C40")): - gustIn = [1, 1.2, 600] -elif (np.all(gustIn == None) and (meth == "UA" or meth == "ecmwf")): - gustIn = [1, 1, 1000] -elif np.all(gustIn == None): - gustIn = [1, 1.2, 800] -elif ((np.size(gustIn) < 3) and (gustIn == 0)): - gust = [0, 0, 0] -if (tolIn == None): - tolIn = ['flux', 0.01, 1, 1] - -print("Input summary", file=open('./stats.txt', 'a')) -print('input file name: {}, \n method: {}, \n gustiness: {}, \n cskin: {},' - ' \n tolerance: {}'.format(inF, meth, gustIn, cskinIn, tolIn), - file=open('./stats.txt', 'a')) -ttl = np.asarray(["tau ", "shf ", "lhf ", "L ", "cd ", "cdn ", - "ct ", "ctn ", "cq ", "cqn ", "tsrv ", "tsr ", - "qsr ", "usr ", "psim ", "psit ", "psiq ", "u10n ", - "t10n ", "tv10n", "q10n ", "zo ", "zot ", "zoq ", - "urefs", "trefs", "qrefs", "itera", "dter ", "dqer ", - "dtwl ", "qair ", "qsea ", "Rl ", "Rs ", "Rnl "]) -header = ["var", "mean", "median", "min", "max", "5%", "95%"] -n = np.shape(res) -stats = np.copy(ttl) -if (inF == 'era5_r360x180.nc'): - stats = np.c_[stats, np.nanmean(res.reshape(n[0]*n[1], n[2]), axis=0)] - stats = np.c_[stats, np.nanmedian(res.reshape(n[0]*n[1], n[2]), axis=0)] - stats = np.c_[stats, np.nanmin(res.reshape(n[0]*n[1], n[2]), axis=0)] - stats = np.c_[stats, np.nanmax(res.reshape(n[0]*n[1], n[2]), axis=0)] - stats = np.c_[stats, np.nanpercentile(res.reshape(n[0]*n[1], n[2]), 5, - axis=0)] - stats = np.c_[stats, np.nanpercentile(res.reshape(n[0]*n[1], n[2]), 95, - axis=0)] - print(tabulate(stats, headers=header, tablefmt="github", numalign="left", - floatfmt=("s", "2.2e", "2.2e", "2.2e", "2.2e", "2.2e", - "2.2e")), file=open('./stats.txt', 'a')) - print('-'*79+'\n', file=open('./stats.txt', 'a')) -elif (inF == "data_all.nc"): - stats = np.c_[stats, np.nanmean(res, axis=1)] - stats = np.c_[stats, np.nanmedian(res, axis=1)] - stats = np.c_[stats, np.nanmin(res, axis=1)] - stats = np.c_[stats, np.nanmax(res, axis=1)] - stats = np.c_[stats, np.nanpercentile(res, 5, axis=1)] - stats = np.c_[stats, np.nanpercentile(res, 95, axis=1)] - print(tabulate(stats, headers=header, tablefmt="github", numalign="left", - floatfmt=("s", "2.2e", "2.2e", "2.2e", "2.2e", "2.2e", - "2.2e")), file=open('./stats.txt', 'a')) - print('-'*79+'\n', file=open('./stats.txt', 'a')) - -print('input file name: {}, \n method: {}, \n gustiness: {}, \n cskin: {},' - ' \n tolerance: {}, \n output is written in: {}'.format(inF, meth, - gustIn, cskinIn, - tolIn, outF), - file=open('./readme.txt', 'w'))