def adjustNProc(): global STATS if CTK.t == []: return try: NProc = int(VARS[0].get()) except: NProc = 1 try: comSpeed = float(VARS[1].get()) except: CTK.TXT.insert('START', 'distribute: ComSpeed is invalid.\n') CTK.TXT.insert('START', 'Error: ', 'Error') return algo = VARS[2].get() useCom = VARS[3].get() classes = [8, 16, 32, 64, 128, 256, 512] CTK.saveTree() for c in range(len(classes)): if NProc > classes[c]: break CTK.t, stat1 = D.distribute(CTK.t, classes[c], perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) if c > 0: CTK.t, stat2 = D.distribute(CTK.t, classes[c - 1], perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) if c < len(classes) - 1: CTK.t, stat3 = D.distribute(CTK.t, classes[c + 1], perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) # Best VARS[0].set(str(classes[c])) CTK.t, STATS = D.distribute(CTK.t, classes[c], perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) CTK.TXT.insert('START', 'Blocks distributed.\n') CTK.TKTREE.updateApp() updateStats() return
def distribute(event=None): global STATS if CTK.t == []: return try: NProc = int(VARS[0].get()) except: CTK.TXT.insert('START', 'distribute: NProc is invalid.\n') CTK.TXT.insert('START', 'Error: ', 'Error') return try: comSpeed = float(VARS[1].get()) except: CTK.TXT.insert('START', 'distribute: ComSpeed is invalid.\n') CTK.TXT.insert('START', 'Error: ', 'Error') return algo = VARS[2].get() useCom = VARS[3].get() CTK.saveTree() CTK.t, STATS = D.distribute(CTK.t, NProc, perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) CTK.TXT.insert('START', 'Blocks distributed.\n') CTK.TKTREE.updateApp() updateStats()
def splitAndDistribute(event=None): global STATS if CTK.t == []: return try: NProc = int(VARS[0].get()) except: CTK.TXT.insert('START', 'distribute: NProc is invalid.\n') CTK.TXT.insert('START', 'Error: ', 'Error') return try: comSpeed = float(VARS[1].get()) except: CTK.TXT.insert('START', 'distribute: ComSpeed is invalid.\n') CTK.TXT.insert('START', 'Error: ', 'Error') return algo = VARS[2].get() useCom = VARS[3].get() level = int(VARS[5].get()) CTK.saveTree() try: #CTK.t = T.splitNParts(CTK.t, NProc, multigrid=level) CTK.t = T.splitSize(CTK.t, N=0, multigrid=level, R=NProc, type=2) # no need to check inconsistant match (they have been deleted) node = Internal.getNodeFromName(CTK.t, 'EquationDimension') if node is not None: ndim = Internal.getValue(node) # Manque le reglage de la tol else: CTK.TXT.insert( 'START', 'EquationDimension not found (tkState). Using 3D.\n') CTK.TXT.insert('START', 'Warning: ', 'Warning') ndim = 3 CTK.t = X.connectMatch(CTK.t, dim=ndim) CTK.display(CTK.t) except Exception as e: Panels.displayErrors([0, str(e)], header='Error: distribute/split') CTK.TXT.insert('START', 'splitSize fails for at least one zone.\n') CTK.TXT.insert('START', 'Warning: ', 'Warning') (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t) CTK.t, STATS = D.distribute(CTK.t, NProc, perfo=(1., 0., comSpeed), useCom=useCom, algorithm=algo) CTK.TXT.insert('START', 'Blocks split and distributed.\n') CTK.TKTREE.updateApp() updateStats()
# - getProcList (pyTree) - import Generator.PyTree as G import Distributor2.PyTree as D2 import Converter.PyTree as C import Connector.PyTree as X N = 11 t = C.newPyTree(['Base']) pos = 0 for i in range(N): a = G.cart((pos,0,0), (1,1,1), (10+i, 10, 10)) pos += 10 + i - 1 t[2][1][2].append(a) t = X.connectMatch(t) t, stats = D2.distribute(t, 3) procList = D2.getProcList(t) print(procList)
# - getProcDict (pyTree) - import Converter.PyTree as C import Converter.Internal as Internal import Converter.Mpi as Cmpi import Distributor2.PyTree as Distributor2 import Generator.PyTree as G import KCore.test as test # Cree le fichier test if Cmpi.rank == 0: a = G.cart((0,0,0), (1,1,1), (10,10,10)) b = G.cart((12,0,0), (1,1,1), (10,10,10)) t = C.newPyTree(['Base',a,b]) C.convertPyTree2File(t, 'in.cgns') Cmpi.barrier() # Relit des zones par procs t = Cmpi.convertFile2SkeletonTree('in.cgns') (t, dic) = Distributor2.distribute(t, NProc=2, algorithm='fast') procDict = Cmpi.getProcDict(t) if Cmpi.rank == 0: print procDict #>> {'cart.0': 1, 'cart': 0}
N = 11 t = C.newPyTree(['Base']) pos = 0 for i in xrange(N): a = G.cart((pos, 0, 0), (1, 1, 1), (10 + i, 10, 10)) pos += 10 + i - 1 t[2][1][2].append(a) t = X.connectMatch(t) if Cmpi.rank == 0: C.convertPyTree2File(t, 'in.cgns') Cmpi.barrier() # lecture du squelette a = Cmpi.convertFile2SkeletonTree('in.cgns') # equilibrage 1 (a, dic) = D2.distribute(a, NProc=Cmpi.size, algorithm='fast', useCom=0) # load des zones locales dans le squelette a = Cmpi.readZones(a, 'in.cgns', rank=Cmpi.rank) # equilibrage 2 (a partir d'un squelette charge) (a, dic) = D2.distribute(a, NProc=Cmpi.size, algorithm='gradient1', useCom='match') a = D2mpi.redispatch(a) # force toutes les zones sur 0 zones = Internal.getNodesFromType(a, 'Zone_t') for z in zones:
pos = 0 for i in xrange(N): a = G.cart((pos, 0, 0), (1, 1, 1), (10 + i, 10, 10)) pos += 10 + i - 1 t[2][1][2].append(a) t = C.initVars(t, '{centers:Density} = {CoordinateX} + {CoordinateY}') t = X.connectMatch(t) if (Cmpi.rank == 0): C.convertPyTree2File(t, 'in.cgns') Cmpi.barrier() # lecture du squelette sk = Cmpi.convertFile2SkeletonTree('in.cgns') # equilibrage (sk, dic) = Distributor2.distribute(sk, NProc=Cmpi.size, algorithm='gradient0', useCom='match') # load des zones locales dans le squelette a = Cmpi.readZones(sk, 'in.cgns', proc=Cmpi.rank) # center2Node a = Cmpi.center2Node(a, 'centers:Density') # a est maintenant un arbre partiel a = C.rmVars(a, 'centers:Density') # Reconstruit l'arbre complet a l'ecriture if (Cmpi.rank == 0): test.testT(a, 1)
# - convert2PartialTree (pyTree) - import Converter.PyTree as C import Converter.Mpi as Cmpi import Distributor2.PyTree as Distributor2 import Generator.PyTree as G # Cree le fichier test if Cmpi.rank == 0: a = G.cart((0,0,0), (1,1,1), (10,10,10)) b = G.cart((12,0,0), (1,1,1), (10,10,10)) t = C.newPyTree(['Base',a,b]) C.convertPyTree2File(t, 'test.cgns') Cmpi.barrier() # Relit des zones par procs t = Cmpi.convertFile2SkeletonTree('test.cgns') (t, dic) = Distributor2.distribute(t, NProc=Cmpi.size, algorithm='fast') t = Cmpi.readZones(t, 'test.cgns', proc=Cmpi.rank) # Arbre partiel (sans zones squelettes) t = Cmpi.convert2PartialTree(t) if Cmpi.rank == 0: C.convertPyTree2File(t, 'out.cgns')
import Distributor2.PyTree as D2 import Converter.PyTree as C import Connector.PyTree as X import KCore.test as test import Converter.Mpi as Cmpi N = 11 # Cas test t = C.newPyTree(['Base']) off = 0 for i in range(N): a = G.cart( (off,0,0), (1,1,1), (10+i, 10, 10) ) off += 9+i t[2][1][2].append(a) t = X.connectMatch(t) if Cmpi.rank == 0: C.convertPyTree2File(t, 'in.cgns') # arbre complet t, stats = D2.distribute(t, NProc=5, algorithm='gradient', useCom='overlap') print('full:', stats) if Cmpi.rank == 0: test.testT(t, 1) # arbre squelette charge (doit etre identique) t = Cmpi.convertFile2SkeletonTree('in.cgns') t, stats = D2.distribute(t, NProc=Cmpi.size, algorithm='fast', useCom=0) t = Cmpi.readZones(t, 'in.cgns', rank=Cmpi.rank) t, stats = D2.distribute(t, NProc=5, algorithm='gradient', useCom='overlap') print('loaded skel:', stats) if Cmpi.rank == 0: test.testT(t, 2)
# - Calcul d'isosurfaces a la paroi en distribue - import Converter.PyTree as C import Distributor2.PyTree as Distributor2 import Converter.Mpi as Cmpi import Transform.PyTree as T import Post.PyTree as P rank = Cmpi.rank size = Cmpi.size # lecture du squelette a = Cmpi.convertFile2SkeletonTree('cart.cgns') # equilibrage (a, dic) = Distributor2.distribute(a, NProc=size, algorithm='fast', useCom=0) # load des zones locales dans le squelette a = Cmpi.readZones(a, 'cart.cgns', proc=rank) # Passage en arbre partiel a = Cmpi.convert2PartialTree(a) # Calcul de l'iso surface isos = P.isoSurfMC(a, 'F', 0.3) isos = Cmpi.setProc(isos, rank) # affecte les isos au proc local t = C.newPyTree(['Base']) t[2][1][2] += isos # Reconstruit l'arbre complet a l'ecriture Cmpi.convertPyTree2File(t, 'out.cgns')
# Create case if Cmpi.rank == 0: ni = 100 nj = 100 nk = 100 m = G.cart((0, 0, 0), (10. / (ni - 1), 10. / (nj - 1), 1), (ni, nj, nk)) m = C.initVars(m, 'Density', 2.) m = C.initVars(m, 'centers:cellN', 1) m = T.splitNParts(m, 4) C.convertPyTree2File(m, 'in.cgns') # Extraction mesh a = G.cart((0., 0., 0.5), (1., 0.1, 1.), (20, 20, 1)) a[0] = 'extraction' a = T.splitNParts(a, 2) C.convertPyTree2File(a, 'in2.cgns') Cmpi.barrier() # Extract solution on extraction mesh m = Cmpi.convertFile2SkeletonTree('in.cgns') (m, dic) = Distributor2.distribute(m, NProc=Cmpi.size, algorithm='fast') m = Cmpi.readZones(m, 'in.cgns', rank=Cmpi.rank) a = Cmpi.convertFile2SkeletonTree('in2.cgns') (a, dic) = Distributor2.distribute(a, NProc=Cmpi.size, algorithm='fast') a = Cmpi.readZones(a, 'in2.cgns', rank=Cmpi.rank) a = Pmpi.extractMesh(m, a) if Cmpi.rank == 0: test.testT(a, 1)
import Converter.PyTree as C import Connector.PyTree as X import KCore.test as test N = 11 # Test raccords matchs t = C.newPyTree(['Base']) off = 0 for i in xrange(N): a = G.cart((off, 0, 0), (1, 1, 1), (10 + i, 10, 10)) off += 9 + i t[2][1][2].append(a) t = X.connectMatch(t) t, stats = D2.distribute(t, NProc=5, algorithm='gradient') test.testT(t, 1) t, stats = D2.distribute(t, NProc=5, algorithm='genetic') test.testT(t, 2) t, stats = D2.distribute(t, NProc=5, algorithm='fast') test.testT(t, 3) # avec overlap t = C.newPyTree(['Base']) off = 0 for i in xrange(N): a = G.cart((off, 0, 0), (1, 1, 1), (10 + i, 10, 10)) a = C.addBC2Zone(a, 'overlap', 'BCOverlap', 'imin') a = C.addBC2Zone(a, 'overlap', 'BCOverlap', 'imax')
import KCore.test as test LOCAL = test.getLocal() # Case N = 11 # Cas test t = C.newPyTree(['Base']) off = 0 for i in range(N): a = G.cart((off, 0, 0), (1, 1, 1), (10 + i, 10, 10)) off += 9 + i t[2][1][2].append(a) t = X.connectMatch(t) t, stats = D2.distribute(t, NProc=5, algorithm='fast', useCom=0) if Cmpi.rank == 0: C.convertPyTree2File(t, LOCAL + '/in.cgns') Cmpi.barrier() # full graph = Cmpi.computeGraph(t, type='match') if Cmpi.rank == 0: test.testO(graph, 1) # skel (doit etre identique) t = Cmpi.convertFile2SkeletonTree(LOCAL + '/in.cgns') graph = Cmpi.computeGraph(t, type='match') if Cmpi.rank == 0: test.testO(graph, 2) # load skel (doit etre identique) t = Cmpi.convertFile2SkeletonTree(LOCAL + '/in.cgns') t = Cmpi.readZones(t, LOCAL + '/in.cgns', rank=Cmpi.rank)