# # # import numpy as np import os, sys import pickle from mpi4py import MPI import gc # import matplotlib as mpl mpl.use('Agg') from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pyplot as plt import time # # Gert the information from the configuration file. # import configparser config=configparser.ConfigParser({'SaveWeights':'true', "DiagLon":"0.0, 0.0", "DiagLat":"0.0, 0.0", "numop" : 100}) config.read("run.def") saveweights=config.get("OverAll", "SaveWeights") nbasmax=int(config.getfloat("OverAll", "nbasmax")) numop=int(config.getfloat("OverAll", "numop")) OutGraphFile=config.get("OverAll","GraphFile") lonint=np.array(config.get("OverAll", "DiagLon").split(","),dtype=float) latint=np.array(config.get("OverAll", "DiagLat").split(","),dtype=float) # EarthRadius=config.getfloat("OverAll", "EarthRadius") # import ModelGrid as MG import Partition as PA import RPPtools as RPP import HydroGrid as HG import diagplots as DP import Interface as IF from Truncate import trunc as TR from spherical_geometry import vector # # Logging in MPI : https://groups.google.com/forum/#!topic/mpi4py/SaNzc8bdj6U # 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 # # Read full grid and partition the domain. # gg = MG.GlobalGrid() # comm = MPI.COMM_WORLD szhalo=1 nbcore=comm.Get_size() rank=comm.Get_rank() # # Verify directories # wdir="Weights" if rank == 0 : if not os.path.exists(wdir) : os.mkdir(wdir) comm.Barrier() # # Region of grid to be treated # part = PA.partition(gg.ni, gg.nj, gg.land, comm, nbcore, szhalo, rank) # # Weight file to be created # wfile=os.path.basename(config.get("OverAll", "ModelGridFile").replace(".","_"))+"_i"+str(part.istart).zfill(4)+"di"+str(part.ni).zfill(4)+"j"+str(part.jstart).zfill(4)+"dj"+str(part.nj).zfill(4) # # modelgrid=MG.ModelGrid(part.ihstart+gg.igstart,part.nih,part.jhstart+gg.jgstart,part.njh) INFO("Longitude interval on proc "+str(rank)+" = "+str(modelgrid.box_land[0][0])+" : "+str(modelgrid.box_land[0][1])) INFO("Latitude interval on proc "+str(rank)+" = "+str(modelgrid.box_land[1][0])+" : "+str(modelgrid.box_land[1][1])) print("modelgrid.box_land",modelgrid.box_land) hydrogrid=HG.HydroGrid(modelgrid.box_land) icell = 0 sub_index = [] sub_area = [] sub_lon = [] sub_lat = [] # # Only compute the weights if the file does not exist. # if not os.path.exists(wdir+"/"+wfile) : INFO("Computing weights") for cell, center, radius, area in zip(modelgrid.polylist, modelgrid.centers, modelgrid.radius, modelgrid.area) : llinside=vector.vector_to_lonlat(cell.polygons[0].inside[0],cell.polygons[0].inside[1],cell.polygons[0].inside[2]) area_in=np.zeros((hydrogrid.jjm,hydrogrid.iim), dtype=float) selected = hydrogrid.select(center, radius) INFO(str(icell)+" Number of HydroCells selected : "+str(len(selected))+ " out of "+str(len(hydrogrid.index))) for isel in selected : hydrocell = hydrogrid.polylist[isel] index = hydrogrid.index[isel] if cell.intersects_poly(hydrocell): inter = cell.intersection(hydrocell) # Another strange behaviour of SphericalHarmonics. There should be an overlap but the intersection polygone is empty. if len(inter.polygons) > 0 : inside = inter.polygons[0]._inside if hydrocell.contains_point(inside) and cell.contains_point(inside): area_in[index[0],index[1]] = inter.area()*(EarthRadius**2) else: area_in[index[0],index[1]] = (4*np.pi-inter.area())*(EarthRadius**2) ############## # Output of Overlap areas for each grid point # #ncfile="Area_"+str("%.2f"%llinside[0])+"_"+str("%.2f"%llinside[1])+"_"+str(rank+1)+"of"+str(nbcore)+".nc" #RPP.dumpfield(area_in, hydrogrid.lon, hydrogrid.lat, ncfile, "Intersect area") # INFO(str(icell)+" Sum of overlap "+str(np.sum(area_in)/area)+ " Nb of Hydro grid overlaping : "+str(np.count_nonzero(area_in))) sub_index.append(np.where(area_in > 0.0)) sub_area.append(np.extract(area_in > 0.0, area_in)) sub_lon.append(np.extract(area_in > 0.0, hydrogrid.lon)) sub_lat.append(np.extract(area_in > 0.0, hydrogrid.lat)) icell = icell + 1 # # Save the weights to a dedicated file for future use # if ( saveweights.lower() == 'true' ) : with open(wdir+"/"+wfile, 'wb') as fp: pickle.dump(sub_index, fp) pickle.dump(sub_area, fp) pickle.dump(sub_lon, fp) pickle.dump(sub_lat, fp) fp.close() else : # # Extract the weights from the file if it exists # INFO("Reading weights") with open (wdir+"/"+wfile, 'rb') as fp: sub_index = pickle.load(fp) sub_area = pickle.load(fp) sub_lon = pickle.load(fp) sub_lat = pickle.load(fp) fp.close() # # # nbpt = len(sub_index) sub_pts = np.array(list(len(sub_index[i][0]) for i in range(len(sub_index)))) nbvmax = part.domainmax(max(sub_pts)) print("nbpt : ", nbpt) print("nbvmax : ", nbvmax) print("nbasmax : ", nbasmax) # # Extract hydo data from file # INFO("hydrodata") hydrodata = HG.HydroData(hydrogrid.ncfile, hydrogrid.box, sub_index) INFO("initiatmgrid") IF.initatmgrid(rank, nbcore, nbpt, modelgrid) INFO("hoverlap") hoverlap = IF.HydroOverlap(nbpt, nbvmax, sub_pts, sub_index, sub_area, sub_lon, sub_lat, part, modelgrid, hydrodata) # # Do some memory management and synchronize procs. # comm.Barrier() del sub_index del sub_area del sub_lon del sub_lat gc.collect() if rank ==0 : if lonint[0] != lonint[1] and latint[0] != latint[1] : DP.MAPPLOT("MapHydroGrid", lonint, latint, hoverlap, hoverlap.hierarchy_bx, modelgrid.polyll, title="Distance to ocean") hsuper = IF.HydroSuper(nbvmax, hydrodata, hoverlap, nbasmax) # # Plot the hydrological supermesh # if rank == 0 : if lonint[0] != lonint[1] and latint[0] != latint[1] : DP.SUPERMESHPLOT("MapSuperGrid_Beforelinkup", lonint, latint, hoverlap, hsuper, modelgrid.polyll) print("=================== LINKUP ====================") hsuper.linkup(hydrodata) if rank ==0 : if lonint[0] != lonint[1] and latint[0] != latint[1] : DP.SUPERMESHPLOT("MapSuperGrid_Afterlinkup", lonint, latint, hoverlap, hsuper, modelgrid.polyll) # # Do some memory management and synchronize procs. # comm.Barrier() del hoverlap gc.collect() print("=================== Compute fetch ====================") t = time.time() hsuper.fetch(part) comm.Barrier() t1 = time.time() print("Time for fetch: {:0.2f} s.".format(t1-t)) comm.Barrier() hsuper.dumpnetcdf(OutGraphFile.replace(".nc","_HydroSuper.nc"), gg, modelgrid, part) print("Rank : {0} - Basin_count Before Truncate : ".format(part.rank), hsuper.basin_count) hs = TR(hsuper, part, comm, modelgrid, numop = numop) print("Rank : {0} - Basin_count After Truncate : ".format(part.rank), hsuper.basin_count) hgraph = IF.HydroGraph(nbasmax, hsuper, part, modelgrid) hgraph.dumpnetcdf(OutGraphFile, gg, modelgrid, part) IF.closeinterface(comm)