Commit f3fb2def authored by POLCHER Jan's avatar POLCHER Jan 🚴🏾
Browse files

A first attempt to plot the graph of the river flow.

parent da8221a4
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap, cm
import numpy as np
from netCDF4 import Dataset
NCfile="../MEDCORDEX_test_graph.nc"
GraphicFile = "test.png"
title="Test"
#
#####################################################################
#
class LandGrid :
def __init__(self, land) :
nj,ni = land.shape
self.indP=[]
self.nbland = 0
for i in range(ni) :
for j in range(nj) :
if (land[j,i] > 0 ) :
self.nbland = self.nbland+1
self.indP.append([j,i])
return
def land2ij(self, il) :
j,i = self.indP[il]
return j,i
#
#####################################################################
#
#
nc = Dataset(NCfile, 'r')
lon_full = nc.variables["lon"][:,:]
lat_full = nc.variables["lat"][:,:]
lon_bnd = nc.variables["lon_bnd"][:,:,:]
lat_bnd = nc.variables["lat_bnd"][:,:,:]
land = nc.variables["land"][:,:]
routetogrid = nc.variables["routetogrid"][:,:,:]
routetohtu = nc.variables["routetobasin"][:,:,:]
cglon = nc.variables["CG_lon"][:,:,:]
cglat = nc.variables["CG_lat"][:,:,:]
nc.close()
nhtu, nj, ni = routetogrid.shape
landindex = LandGrid(land)
print "Nb land points = ", landindex.nbland, 'Nb HTU : ', nhtu
#
# Get some average size of the grid boxes.
#
lon_res = np.nanmean(np.abs(np.gradient(lon_bnd, axis=0)))
lat_res = np.nanmean(np.abs(np.gradient(lat_bnd, axis=0)))
#
#
#
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.set_title(title)
ax.set_xlabel('Longitude',labelpad=20)
ax.set_ylabel('Latitude',labelpad=20)
ax.axis([0, 10, 0, 10])
#
m = Basemap(projection='cyl', resolution='i', \
llcrnrlon=np.nanmin(lon_bnd)-lon_res, llcrnrlat=np.nanmin(lat_bnd)-lat_res, \
urcrnrlon=np.nanmax(lon_bnd)+lon_res, urcrnrlat=np.nanmax(lat_bnd)+lat_res)
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.5)
m.drawparallels(np.arange(-180.,180.,0.1),labels=[1,0,0,0]) # draw parallels
m.drawmeridians(np.arange(-80.,80.,0.1),labels=[0,0,0,1]) # draw meridians
#
cmap = 'RdBu'
cmap = 'Pastel1'
cmap = 'prism'
#
#
#
for i in range(ni) :
for j in range(nj) :
if land[j,i] > 0 :
lo = np.append(lon_bnd[:,j,i],lon_bnd[0,j,i])
la = np.append(lat_bnd[:,j,i],lat_bnd[0,j,i])
xl,yl=m(lo, la)
plt.plot(xl,yl, color="m")
#
# Draw the graph
#
for il in range(landindex.nbland) :
j,i = landindex.land2ij(il)
print il,"== routetogrid ==",routetogrid[:,j,i]
print il,"== routetohtu ==",routetohtu[:,j,i]
for ih in range(nhtu) :
lo = cglon[ih,j,i]
la = cglat[ih,j,i]
xl,yl=m(lo, la)
if int(routetohtu[ih,j,i]-1) < nhtu :
plt.plot(xl,yl, marker=11)
else :
plt.plot(xl,yl, marker="o")
if int(routetohtu[ih,j,i]-1) < nhtu :
ile = int(routetogrid[ih,j,i]-1)
ie,je = landindex.land2ij(ile)
ihe = int(routetohtu[ih,j,i]-1)
loe = cglon[ihe,je,ie]
lae = cglat[ihe,je,ie]
xle,yle=m(loe, lae)
plt.plot([xl,xle],[yl,yle], color="b")
#
#
#
plt.savefig(GraphicFile, dpi=450)
plt.close()
...@@ -177,6 +177,7 @@ class HydroGraph : ...@@ -177,6 +177,7 @@ class HydroGraph :
NCFillValue=1.0e20 NCFillValue=1.0e20
vtyp=np.float64 vtyp=np.float64
cornerind=[0,2,4,6] cornerind=[0,2,4,6]
nbcorners = len(cornerind)
# #
if part.rank == 0 : if part.rank == 0 :
outnf=Dataset(filename, 'w', format='NETCDF4_CLASSIC') outnf=Dataset(filename, 'w', format='NETCDF4_CLASSIC')
...@@ -185,7 +186,7 @@ class HydroGraph : ...@@ -185,7 +186,7 @@ class HydroGraph :
outnf.createDimension('y', globalgrid.nj) outnf.createDimension('y', globalgrid.nj)
outnf.createDimension('land', len(procgrid.area)) outnf.createDimension('land', len(procgrid.area))
outnf.createDimension('htu', self.nbasmax) outnf.createDimension('htu', self.nbasmax)
outnf.createDimension('bnd', 4) outnf.createDimension('bnd', nbcorners)
# #
# Coordinates # Coordinates
# #
...@@ -197,11 +198,6 @@ class HydroGraph : ...@@ -197,11 +198,6 @@ class HydroGraph :
lon.title="Longitude" lon.title="Longitude"
lon.axis="X" lon.axis="X"
lon[:,:] = longitude[:,:] lon[:,:] = longitude[:,:]
# # Longitude bounds
# lonbnd=outnf.createVariable("lon_bnd", vtyp, ('bnd','y','x'), fill_value=NCFillValue)
# lonbnd.units="grid box corners degrees east"
# lonbnd.title="Longitude Corners"
# lonbnd[:,:] = np.array(procgrid.polyll)[:,cornerind,0]
# #
# Latitude # Latitude
latitude = part.gather(procgrid.lat_full) latitude = part.gather(procgrid.lat_full)
...@@ -212,12 +208,28 @@ class HydroGraph : ...@@ -212,12 +208,28 @@ class HydroGraph :
lat.title="Latitude" lat.title="Latitude"
lat.axis="Y" lat.axis="Y"
lat[:] = latitude[:,:] lat[:] = latitude[:,:]
# # Latitude bounds
# latbnd=outnf.createVariable("lat_bnd", vtyp, ('bnd','land'), fill_value=NCFillValue)
# latbnd.units="grid box corners degrees north"
# latbnd.title="Latitude Corners"
# latbnd[:,:] = np.array(procgrid.polyll)[:,cornerind,1]
# #
# Bounds of grid box
#
llonpoly=np.zeros((nbcorners,procgrid.nbland))
llatpoly=np.zeros((nbcorners,procgrid.nbland))
for i in range(procgrid.nbland) :
llonpoly[:,i] = [procgrid.polyll[i][ic][0] for ic in cornerind]
llatpoly[:,i] = [procgrid.polyll[i][ic][1] for ic in cornerind]
lon_bnd = procgrid.landscatter(llonpoly)
lat_bnd = procgrid.landscatter(llatpoly)
if part.rank == 0 :
lonbnd=outnf.createVariable("lon_bnd", vtyp, ('bnd','y','x'), fill_value=NCFillValue)
lonbnd.units="grid box corners degrees east"
lonbnd.title="Longitude of Corners"
latbnd=outnf.createVariable("lat_bnd", vtyp, ('bnd','y','x'), fill_value=NCFillValue)
latbnd.units="grid box corners degrees north"
latbnd.title="Latitude of Corners"
else :
lonbnd= np.zeros((1,1,1))
latbnd= np.zeros((1,1,1))
lonbnd[:,:,:] = part.gather(lon_bnd[:,:,:])
latbnd[:,:,:] = part.gather(lat_bnd[:,:,:])
# #
# Land sea mask # Land sea mask
# #
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
#PBS -j oe #PBS -j oe
#PBS -l nodes=1:ppn=42 #PBS -l nodes=1:ppn=42
#PBS -l walltime=48:00:00 #PBS -l walltime=48:00:00
#PBS -l mem=120gb #PBS -l mem=160gb
#PBS -l vmem=120gb #PBS -l vmem=160gb
# #
cd ${PBS_O_WORKDIR}/.. cd ${PBS_O_WORKDIR}/..
......
...@@ -5,6 +5,11 @@ import matplotlib.pyplot as plt ...@@ -5,6 +5,11 @@ import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap, cm from mpl_toolkits.basemap import Basemap, cm
import numpy as np import numpy as np
import getargs
log_master, log_world = getargs.getLogger()
INFO, DEBUG, ERROR = log_master.info, log_master.debug, log_world.error
INFO_ALL, DEBUG_ALL = log_world.info, log_world.debug
inc=np.zeros((8,2), dtype=np.int8) inc=np.zeros((8,2), dtype=np.int8)
inc[0,0] = 1; inc[0,1] =0 inc[0,0] = 1; inc[0,1] =0
inc[1,0] = 1; inc[1,1] =1 inc[1,0] = 1; inc[1,1] =1
...@@ -204,7 +209,7 @@ def SUPERMESHPLOT(filename, loninterval, latinterval, hoverlap, hsuper, atmpolys ...@@ -204,7 +209,7 @@ def SUPERMESHPLOT(filename, loninterval, latinterval, hoverlap, hsuper, atmpolys
lat = hoverlap.lat_bx lat = hoverlap.lat_bx
basin_sz = hsuper.basin_sz basin_sz = hsuper.basin_sz
basin_pts = hsuper.basin_pts basin_pts = hsuper.basin_pts
outlet = hsuper.basin_coor outlet = hsuper.basin_outcoor
# #
if np.nanmin(lon) <= max(loninterval) and np.nanmax(lon) > min(loninterval) and \ if np.nanmin(lon) <= max(loninterval) and np.nanmax(lon) > min(loninterval) and \
np.nanmin(lat) <= max(latinterval) and np.nanmax(lat) > min(latinterval) : np.nanmin(lat) <= max(latinterval) and np.nanmax(lat) > min(latinterval) :
...@@ -265,6 +270,7 @@ def SUPERMESHPLOT(filename, loninterval, latinterval, hoverlap, hsuper, atmpolys ...@@ -265,6 +270,7 @@ def SUPERMESHPLOT(filename, loninterval, latinterval, hoverlap, hsuper, atmpolys
if ibo == ib : if ibo == ib :
# Same grid box # Same grid box
if hsuper.outflow_basin[ib,iz] < undef_int : if hsuper.outflow_basin[ib,iz] < undef_int :
INFO("hsuper.outflow_basin[ib,iz] = "+str(hsuper.outflow_basin[ib,iz]))
ERROR("We cannot be here as we flow into an HTU of the same grid but we do not know the HTU index") ERROR("We cannot be here as we flow into an HTU of the same grid but we do not know the HTU index")
else : else :
izo = hsuper.outflow_basin[ib,iz]-1 izo = hsuper.outflow_basin[ib,iz]-1
......
...@@ -24,5 +24,5 @@ GraphFile = MEDCORDEX_test_graph.nc ...@@ -24,5 +24,5 @@ GraphFile = MEDCORDEX_test_graph.nc
# Diagnostics # Diagnostics
# You need to provide an interval in longitude and Latitude. # You need to provide an interval in longitude and Latitude.
# #
DiagLon = 3.9, 3.9 DiagLon = 2.3, 3.5
DiagLat = 40.0, 40.0 DiagLat = 39.0, 40.1
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment