Skip to content
Snippets Groups Projects
Commit 14d213b1 authored by POLCHER Jan's avatar POLCHER Jan :bicyclist_tone4:
Browse files

Added a __main__ to only compute the weight. Usefull for dealing with big problems.

parent e75d2113
No related branches found
No related tags found
Loading
...@@ -62,8 +62,6 @@ def adjustpart(partin, land, nbcore) : ...@@ -62,8 +62,6 @@ def adjustpart(partin, land, nbcore) :
addnbland(partin, land) addnbland(partin, land)
nbptproc=np.array([dom['nbi']*dom['nbj'] for dom in partin]) nbptproc=np.array([dom['nbi']*dom['nbj'] for dom in partin])
INFO("Nb of land points per proc : Mean = "+str(np.mean(nbptproc))+" Min = "+str(np.min(nbptproc))+\
" Max = "+str(np.max(nbptproc))+" Var :"+str((np.max(nbptproc)-np.min(nbptproc))/np.mean(nbptproc)*100)+"%")
if np.min(nbptproc) < 3 : if np.min(nbptproc) < 3 :
ERROR("The smallest domain in the partition is of a size less than 5. This will probably not work.") ERROR("The smallest domain in the partition is of a size less than 5. This will probably not work.")
sys.exit() sys.exit()
...@@ -71,7 +69,8 @@ def adjustpart(partin, land, nbcore) : ...@@ -71,7 +69,8 @@ def adjustpart(partin, land, nbcore) :
# #
# Partition domain in two steps : 1) halving, 2) adjusting by nb land points # Partition domain in two steps : 1) halving, 2) adjusting by nb land points
# #
def partitiondom(nig, njg, land, nbcore) : def partitiondom(land, nbcore, rank) :
njg,nig = land.shape
partout=[{"nbi":nig,"nbj":njg,"istart":0,"jstart":0, "nbland":int(np.sum(land))}] partout=[{"nbi":nig,"nbj":njg,"istart":0,"jstart":0, "nbland":int(np.sum(land))}]
while len(partout) <= nbcore/2 : while len(partout) <= nbcore/2 :
partout = halfpartition(partout) partout = halfpartition(partout)
...@@ -79,14 +78,96 @@ def partitiondom(nig, njg, land, nbcore) : ...@@ -79,14 +78,96 @@ def partitiondom(nig, njg, land, nbcore) :
# #
adjustpart(partout, land, nbcore) adjustpart(partout, land, nbcore)
# #
gindland=np.zeros((njg,nig), dtype=np.int32)
gindland[:,:]=-1
n=0
for i in range(nig) :
for j in range(njg) :
if (land[j,i] > 0 ) :
gindland[j,i] = n
n += 1
#
for ic in range(len(partout)) :
istart = partout[ic]["istart"]
nbi = partout[ic]["nbi"]
jstart = partout[ic]["jstart"]
nbj = partout[ic]["nbj"]
locgind=np.copy(gindland[jstart:jstart+nbj,istart:istart+nbi])
loccore=np.copy(gindland[jstart:jstart+nbj,istart:istart+nbi])
loccore[loccore >= 0] = ic
partout[ic]["glandindex"] = locgind
partout[ic]["corenb"] = loccore
partout[ic]["nblocland"] = np.count_nonzero(locgind >= 0)
#
return partout
#
# Build global map of processors
#
def buildprocmap(nig, njg, part) :
procmap=np.zeros((njg,nig), dtype=np.int8) procmap=np.zeros((njg,nig), dtype=np.int8)
procmap[:,:] = -1 procmap[:,:] = -1
for i in range(len(partout)) : for i in range(len(part)) :
for ij in range(partout[i]["nbj"]) : for ij in range(part[i]["nbj"]) :
for ii in range(partout[i]["nbi"]) : for ii in range(part[i]["nbi"]) :
procmap[ij+partout[i]["jstart"],ii+partout[i]["istart"]] = i procmap[ij+part[i]["jstart"],ii+part[i]["istart"]] = i
#
return partout, procmap return procmap
#
# Partion of only land points in the case where we do not need halos
#
def landpartition(land, nbcore, rank) :
nbland = np.count_nonzero(land > 0)
optland = int(nbland/nbcore)+(nbland%nbcore > 0)
print("RANK",rank,"Nbland = ", np.count_nonzero(land > 0), " nbcore = ", nbcore, " optland = ",optland)
#
distppc=np.zeros(nbcore)
distppc[:]=0
for i in range(nbcore-1) :
ptsleft = int(nbland-np.sum(distppc[0:i]))
crsleft = nbcore-i
if ptsleft > optland and ptsleft/2 > crsleft :
distppc[i] = optland
else :
print("On proc ", i," Still have ", ptsleft, " points to distribute and ", crsleft, " cores")
distppc[i] = int(ptsleft/crsleft)
#
distppc[-1]=nbland-np.sum(distppc[0:-1])
print("Distpcc :", distppc)
#
njg,nig=land.shape
gindland=np.zeros((njg,nig), dtype=np.int32)
gindland[:,:]=-1
glandcore=np.zeros((njg,nig), dtype=np.int32)
glandcore[:,:]=-1
n=0
for i in range(nig) :
for j in range(njg) :
if (land[j,i] > 0 ) :
gindland[j,i] = n
cc = np.argmax(distppc > 0)
glandcore[j,i] = cc
distppc[cc] = distppc[cc]-1
n += 1
#
# Decompose domain according to land point positions
#
partout=[]
for ic in range(nbcore) :
ff = np.nonzero(glandcore == ic)
# Region is at least 3x3
nbi=max(max(ff[1])-min(ff[1])+1, 3)
nbj=max(max(ff[0])-min(ff[0])+1, 3)
istart=min(min(ff[1]),nig-nbi)
jstart=min(min(ff[0]),njg-nbj)
#
loccore=np.copy(glandcore[jstart:jstart+nbj,istart:istart+nbi])
loccore[loccore != ic] = -1
locgind=np.copy(gindland[jstart:jstart+nbj,istart:istart+nbi])
locgind[loccore < 0] = -1
partout.append({"nbi":nbi, "nbj":nbj, "istart":istart, "jstart":jstart, "nbland":ff[0].shape[0], \
"corenb":loccore, "glandindex":locgind, "nblocland":np.count_nonzero(locgind >= 0)})
#
return partout
# #
# Add halo to the partition # Add halo to the partition
# #
...@@ -217,9 +298,6 @@ def toland_index(x,landmap) : ...@@ -217,9 +298,6 @@ def toland_index(x,landmap) :
# #
class partition : class partition :
def __init__ (self, nig, njg, land, mpicomm, nbcore, halosz, rank, wunit="None") : def __init__ (self, nig, njg, land, mpicomm, nbcore, halosz, rank, wunit="None") :
#
part, procmap = partitiondom(nig, njg, land, nbcore)
halosource_map, innersend_map = addhalo(nig, njg, part, procmap, halosz)
# #
# Self varibales # Self varibales
# #
...@@ -231,12 +309,27 @@ class partition : ...@@ -231,12 +309,27 @@ class partition :
self.nig = nig self.nig = nig
self.njg = njg self.njg = njg
self.nblandg = np.count_nonzero(land > 0) self.nblandg = np.count_nonzero(land > 0)
#
part = partitiondom(land, nbcore, rank)
procmap = buildprocmap(nig, njg, part)
# To be activated when halosz = 0 and we can deal with single point domain grids.
#
# part = landpartition(land, nbcore, rank)
# procmap = buildprocmap(nig, njg, part)
#
halosource_map, innersend_map = addhalo(nig, njg, part, procmap, halosz)
#
INFO(" Nb of land points on proc "+str(rank)+" = "+str(part[rank]["nblocland"])+" from "+str(self.nblandg)+\
" -- "+"%.2f"%(part[rank]["nblocland"]/self.nblandg*100)+"% of total.")
#
self.allistart = [] self.allistart = []
self.alljstart = [] self.alljstart = []
for i in range(self.size) : for i in range(self.size) :
self.allistart.append(part[i]["istart"]) self.allistart.append(part[i]["istart"])
self.alljstart.append(part[i]["jstart"]) self.alljstart.append(part[i]["jstart"])
# Local info #
# Information of domain on local processor
#
self.ni = part[rank]["nbi"] self.ni = part[rank]["nbi"]
self.nj = part[rank]["nbj"] self.nj = part[rank]["nbj"]
self.istart = part[rank]["istart"] self.istart = part[rank]["istart"]
......
...@@ -27,7 +27,6 @@ import ModelGrid as MG ...@@ -27,7 +27,6 @@ import ModelGrid as MG
import Partition as PA import Partition as PA
import RPPtools as RPP import RPPtools as RPP
import HydroGrid as HG import HydroGrid as HG
import diagplots as DP
import Interface as IF import Interface as IF
from Truncate import trunc as TR from Truncate import trunc as TR
# #
......
#
#
#
import numpy as np
import os, sys
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()
config.read("run.def")
nbasmax=config.getint("OverAll", "nbasmax")
numop=config.getint("OverAll", "numop", fallback=100)
OutGraphFile=config.get("OverAll","GraphFile")
DumpHydroSuper=config.getboolean("OverAll","DumpHydroSuper",fallback=False)
wfile=config.get("OverAll","WeightFile",fallback="Weights.nc")
#
import ModelGrid as MG
import Partition as PA
import RPPtools as RPP
import HydroGrid as HG
#
# 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=0
nbcore=comm.Get_size()
rank=comm.Get_rank()
#
# Region of grid to be treated
#
part = PA.partition(gg.ni, gg.nj, gg.land, comm, nbcore, szhalo, rank)
#
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]))
#
hydrogrid=HG.HydroGrid(modelgrid.box_land)
#
# Computes weights of overlap of modelgrid and hydrogrid
#
w = RPP.compweights(wfile, part, modelgrid, hydrogrid)
#
#
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment