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()
Example #4
0
    def loadAndSplitSkeleton(self, NParts=None, NProc=None):
        """Load and split skeleton."""
        a = self.loadSkeleton()
        import Transform.PyTree as T
        # split on skeleton
        splitDict = {}
        if NParts is not None:
            b = T.splitNParts(a, N=NParts, splitDict=splitDict)
        else:
            b = T.splitNParts(a, N=NProc, splitDict=splitDict)
        self.splitDict = splitDict

        zones = Internal.getZones(b)
        if NProc is not None:
            import Distributor2.PyTree as D2
            D2._distribute(b, NProc)

        # Correction dims en attendant que subzone fonctionne sur un skel
        for z in zones:
            j = splitDict[z[0]]
            ni = j[2] - j[1] + 1
            nj = j[4] - j[3] + 1
            nk = j[6] - j[5] + 1
            d = numpy.empty((3, 3), numpy.int32, order='Fortran')
            d[0, 0] = ni
            d[1, 0] = nj
            d[2, 0] = nk
            d[0, 1] = ni - 1
            d[1, 1] = nj - 1
            d[2, 1] = nk - 1
            d[0, 2] = 0
            d[1, 2] = 0
            d[2, 2] = 0
            z[1] = d
            # END correction
        return a
Example #5
0
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')
Example #7
0
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)
Example #8
0
# - 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')
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')
Example #10
0
# - 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)
Example #11
0
# - 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}
Example #12
0
def loadAndSplit(fileName,
                 NParts=None,
                 noz=None,
                 NProc=None,
                 rank=None,
                 variables=[]):
    if NParts is None: NParts = NProc
    if NProc is None: NProc = NParts
    import Transform.PyTree as T
    a = convertFile2SkeletonTree(fileName)
    # split on skeleton
    splitDict = {}
    b = T.splitNParts(a, N=NParts, splitDict=splitDict)

    zones = Internal.getZones(b)
    if rank is not None:
        import Distributor2.PyTree as D2
        D2._distribute(b, NProc)
        noz = []
        for i, z in enumerate(zones):
            p = D2.getProc(z)
            if p == rank: noz.append(i)

    f = {}
    for i in noz:
        z = zones[i]
        j = splitDict[z[0]]
        # Correction de dimension en attendant que subzone fonctionne sur un skel
        ni = j[2] - j[1] + 1
        nj = j[4] - j[3] + 1
        nk = j[6] - j[5] + 1
        ni1 = max(ni - 1, 1)
        nj1 = max(nj - 1, 1)
        nk1 = max(nk - 1, 1)
        d = numpy.empty((3, 3), numpy.int32, order='Fortran')
        d[0, 0] = ni
        d[1, 0] = nj
        d[2, 0] = nk
        d[0, 1] = ni1
        d[1, 1] = nj1
        d[2, 1] = nk1
        d[0, 2] = 0
        d[1, 2] = 0
        d[2, 2] = 0
        z[1] = d
        # END correction

        zname = z[0]  # zone name in b
        pname = zname.rsplit('.', 1)[0]  # parent name (guessed)
        (base, c) = Internal.getParentOfNode(b, z)
        bname = base[0]

        f = {}
        # Node fields
        path = []
        cont = Internal.getNodeFromName2(z, Internal.__GridCoordinates__)
        if cont is not None:
            for c in cont[2]:
                if c[3] == 'DataArray_t':
                    path += ['/%s/%s/%s/%s' % (bname, pname, cont[0], c[0])]
        cont = Internal.getNodeFromName2(z, Internal.__FlowSolutionNodes__)
        if cont is not None:
            for c in cont[2]:
                if c[3] == 'DataArray_t' and c[0] in variables:
                    path += ['/%s/%s/%s/%s' % (bname, pname, cont[0], c[0])]

        DataSpaceMMRY = [[0, 0, 0], [1, 1, 1], [ni, nj, nk], [1, 1, 1]]
        DataSpaceFILE = [[j[1] - 1, j[3] - 1, j[5] - 1], [1, 1, 1],
                         [ni, nj, nk], [1, 1, 1]]
        DataSpaceGLOB = [[0]]

        for p in path:
            f[p] = DataSpaceMMRY + DataSpaceFILE + DataSpaceGLOB

        # Center fields
        path = []
        cont = Internal.getNodeFromName2(z, Internal.__FlowSolutionCenters__)
        if cont is not None:
            for c in cont[2]:
                if c[3] == 'DataArray_t' and 'centers:' + c[0] in variables:
                    path += ['/%s/%s/%s/%s' % (bname, pname, cont[0], c[0])]

        DataSpaceMMRY = [[0, 0, 0], [1, 1, 1], [ni1, nj1, nk1], [1, 1, 1]]
        DataSpaceFILE = [[j[1] - 1, j[3] - 1, j[5] - 1], [1, 1, 1],
                         [ni1, nj1, nk1], [1, 1, 1]]
        DataSpaceGLOB = [[0]]

        for p in path:
            f[p] = DataSpaceMMRY + DataSpaceFILE + DataSpaceGLOB

        r = readNodesFromFilter(fileName, f)

        # Repositionne les chemins
        for k in r:
            k2 = k.replace(pname, zname)
            n = Internal.getNodeFromPath(b, k2)
            n[1] = r[k]

    b = convert2PartialTree(b)
    return b
Example #13
0
# - printProcStats (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)

# Distribute on 3 processors
t, stats = D2.distribute(t, 3)

# With stats and NProc
D2.printProcStats(t, stats, NProc=3)
# NProc is guessed from stats
D2.printProcStats(t, stats)
# All are guessed from t
D2.printProcStats(t)

C.convertPyTree2File(t, 'out.cgns')
Example #14
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:
# - getProcDict (pyTree) -
import Generator.PyTree as G
import Distributor2.PyTree as D2
import Converter.PyTree as C
import Connector.PyTree as X
import KCore.test as test

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)
t, stats = D2.distribute(t, 3)

proc = D2.getProcDict(t)
test.testO(proc, 1)

proc = D2.getProcDict(t, prefixByBase=True)
test.testO(proc, 2)
# - addProcNode (pyTree) -
import Generator.PyTree as G
import Distributor2.PyTree as D2
import KCore.test as test

a = G.cart((0,0,0), (1,1,1), (10,10,10))
a = D2.addProcNode(a, 12)
test.testT(a, 1)
# - distribute (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)

# Distribute on 3 processors
t, stats = D2.distribute(t, 3)
C.convertPyTree2File(t, 'out.cgns')
# - getProc (pyTree) -
import Converter.PyTree as C
import Generator.PyTree as G
import Distributor2.PyTree as D2

a = G.cart((0, 0, 0), (1, 1, 1), (10, 10, 10))
a = D2.addProcNode(a, 12)
proc = D2.getProc(a)
print proc
# 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)
# - copyDistribution (pyTree) -
import Converter.PyTree as C
import Distributor2.PyTree as D2
import Generator.PyTree as G

# Case
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))
    a[0] = 'cart%d' % i
    pos += 10 + i - 1
    D2._addProcNode(a, i)
    t[2][1][2].append(a)

t2 = C.newPyTree(['Base'])
for i in range(N):
    a = G.cart((pos, 0, 0), (1, 1, 1), (10 + i, 10, 10))
    a[0] = 'cart%d' % i
    pos += 10 + i - 1
    t2[2][1][2].append(a)
t2 = D2.copyDistribution(t2, t)
C.convertPyTree2File(t2, 'out.cgns')
Example #21
0
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)