Esempio n. 1
0
# - filterPartialFields (pyTree) -
import Generator.PyTree as G
import Converter.PyTree as C
import Converter
import numpy

a = G.cart((0, 0, 0), (1, 1, 1), (10, 10, 1))
C._initVars(a, 'F', 2.)
f1 = Converter.array('F,G', 5, 1, 1)
f1 = Converter.initVars(f1, 'F=10.')
f1 = Converter.initVars(f1, 'G=1.')
f2 = Converter.array('F,G', 5, 1, 1)
f2 = Converter.initVars(f2, 'F=-10.')
f2 = Converter.initVars(f2, 'G=0.1')

inds = numpy.array([0, 1, 2], dtype=numpy.int32)
print(inds)
C._filterPartialFields(a, [f1, f2], inds, loc='nodes', filterName='G')
t = C.newPyTree(['Base', a])
C.convertPyTree2File(t, 'out.cgns')
Esempio n. 2
0
def _transfer(t,
              tc,
              variables,
              graph,
              intersectionDict,
              dictOfADT,
              dictOfNobOfRcvZones,
              dictOfNozOfRcvZones,
              dictOfNobOfDnrZones,
              dictOfNozOfDnrZones,
              dictOfNobOfRcvZonesC,
              dictOfNozOfRcvZonesC,
              time=0.,
              absFrame=True,
              procDict=None,
              cellNName='cellN'):
    if procDict is None: procDict = Cmpi.getProcDict(tc)

    # dictionnaire des matrices de mouvement pour passer du repere relatif d une zone au repere absolu
    dictOfMotionMatR2A = {}
    dictOfMotionMatA2R = {}
    coordsD = [0., 0., 0.]
    coordsC = [0., 0., 0.]  # XAbs = coordsD + Mat*(XRel-coordsC)
    dictOfFields = {}
    dictOfIndices = {}

    datas = {}
    for z in Internal.getZones(t):
        zname = Internal.getName(z)
        if zname not in dictOfNobOfRcvZones: continue

        # coordonnees dans le repere absolu de la zone receptrice
        # on les recupere de zc pour eviter un node2center des coordonnees de z
        nobc = dictOfNobOfRcvZonesC[zname]
        nozc = dictOfNozOfRcvZonesC[zname]
        zc = tc[2][nobc][2][nozc]
        if zc[0] != zname:  # check
            raise ValueError(
                "_transfer: t and tc skeletons must be identical.")

        C._cpVars(z, 'centers:' + cellNName, zc, cellNName)
        res = X.getInterpolatedPoints(zc, loc='nodes', cellNName=cellNName)
        # print 'Zone %s du proc %d a interpoler'%(zname, Cmpi.rank)

        if res is not None:
            # print 'Res not None : zone %s du proc %d a interpoler'%(zname, Cmpi.rank)

            indicesI, XI, YI, ZI = res
            # passage des coordonnees du recepteur dans le repere absolu
            # si mouvement gere par FastS -> les coordonnees dans z sont deja les coordonnees en absolu
            if not absFrame:
                if zname in dictOfMotionMatR2A:
                    MatRel2AbsR = RM.getMotionMatrixForZone(z,
                                                            time=time,
                                                            F=None)
                    dictOfMotionMatR2A[zname] = MatRel2AbsR
                else:
                    MatRel2AbsR = dictOfMotionMatR2A[zname]
                RM._moveN([XI, YI, ZI], coordsD, coordsC, MatRel2AbsR)

            procR = procDict[zname]
            for znamed in intersectionDict[zname]:
                procD = procDict[znamed]
                if procD == Cmpi.rank:
                    nobc = dictOfNobOfDnrZones[znamed]
                    nozc = dictOfNozOfDnrZones[znamed]
                    zdnr = tc[2][nobc][2][nozc]
                    adt = dictOfADT[znamed]
                    if znamed in dictOfMotionMatA2R:
                        MatAbs2RelD = dictOfMotionMatA2R[znamed]
                    else:
                        if znamed in dictOfMotionMatR2A:
                            MatRel2AbsD = dictOfMotionMatR2A[znamed]
                            MatAbs2RelD = numpy.transpose(MatRel2AbsD)
                            dictOfMotionMatA2R[znamed] = MatAbs2RelD
                        else:
                            MatRel2AbsD = RM.getMotionMatrixForZone(zdnr,
                                                                    time=time,
                                                                    F=None)
                            dictOfMotionMatR2A[znamed] = MatRel2AbsD
                            MatAbs2RelD = numpy.transpose(MatRel2AbsD)
                            dictOfMotionMatA2R[znamed] = MatAbs2RelD
                    [XIRel, YIRel, ZIRel] = RM.moveN([XI, YI, ZI], coordsC,
                                                     coordsD, MatAbs2RelD)

                    # transfers avec coordonnees dans le repere relatif
                    fields = X.transferFields(zdnr,
                                              XIRel,
                                              YIRel,
                                              ZIRel,
                                              hook=adt,
                                              variables=variables)
                    if zname not in dictOfFields:
                        dictOfFields[zname] = [fields]
                        dictOfIndices[zname] = indicesI
                    else:
                        dictOfFields[zname].append(fields)

                else:
                    # print ' ECHANGE GLOBAL entre recepteur %s du proc %d et donneur %s du proc %d '%(zname, Cmpi.rank, znamed, procD)
                    if procD not in datas:
                        datas[procD] = [[zname, znamed, indicesI, XI, YI, ZI]]
                    else:
                        datas[procD].append(
                            [zname, znamed, indicesI, XI, YI, ZI])

    # print 'Proc  : ', Cmpi.rank, ' envoie les donnees : ' ,datas.keys()
    # print ' a partir du graphe ', graph
    # 1er envoi : envoi des numpys des donnees a interpoler suivant le graphe
    interpDatas = Cmpi.sendRecv(datas, graph)

    # recuperation par le proc donneur des donnees pour faire les transferts
    transferedDatas = {}
    for i in interpDatas:
        #print Cmpi.rank, 'recoit de',i, '->', len(interpDatas[i])
        for n in interpDatas[i]:
            zdnrname = n[1]
            zrcvname = n[0]
            indicesR = n[2]
            XI = n[3]
            YI = n[4]
            ZI = n[5]
            nobc = dictOfNobOfDnrZones[zdnrname]
            nozc = dictOfNozOfDnrZones[zdnrname]
            zdnr = tc[2][nobc][2][nozc]
            adt = dictOfADT[zdnrname]
            if zdnrname in dictOfMotionMatA2R:
                MatAbs2RelD = dictOfMotionMatA2R[zdnrname]
            else:
                if zdnrname in dictOfMotionMatR2A:
                    MatRel2AbsD = dictOfMotionMatR2A[zdnrname]
                    MatAbs2RelD = numpy.transpose(MatRel2AbsD)
                    dictOfMotionMatA2R[zdnrname] = MatAbs2RelD
                else:
                    MatRel2AbsD = RM.getMotionMatrixForZone(zdnr,
                                                            time=time,
                                                            F=None)
                    dictOfMotionMatR2A[zdnrname] = MatRel2AbsD
                    MatAbs2RelD = numpy.transpose(MatRel2AbsD)
                    dictOfMotionMatA2R[zdnrname] = MatAbs2RelD

            [XIRel, YIRel, ZIRel] = RM.moveN([XI, YI, ZI], coordsC, coordsD,
                                             MatAbs2RelD)
            # transferts avec coordonnees dans le repere relatif
            fields = X.transferFields(zdnr,
                                      XIRel,
                                      YIRel,
                                      ZIRel,
                                      hook=adt,
                                      variables=variables)
            procR = procDict[zrcvname]

            if procR not in transferedDatas:
                transferedDatas[procR] = [[zrcvname, indicesR, fields]]
            else:
                transferedDatas[procR].append([zrcvname, indicesR, fields])

    if transferedDatas != {}:
        # 2nd envoi : envoi des numpys des donnees  interpolees suivant le graphe
        rcvDatas = Cmpi.sendRecv(transferedDatas, graph)

        # remise des donnees interpolees chez les zones receveuses
        # une fois que tous les donneurs potentiels ont calcule et envoye leurs donnees
        for i in rcvDatas:
            #print Cmpi.rank, 'recoit des donnees interpolees de',i, '->', len(rcvDatas[i])
            for n in rcvDatas[i]:
                zrcvname = n[0]
                indicesI = n[1]
                fields = n[2]
                if zrcvname not in dictOfFields:
                    dictOfFields[zrcvname] = [fields]
                    dictOfIndices[zrcvname] = indicesI
                else:
                    dictOfFields[zrcvname].append(fields)

    for zrcvname in dictOfIndices:
        nob = dictOfNobOfRcvZones[zrcvname]
        noz = dictOfNozOfRcvZones[zrcvname]
        z = t[2][nob][2][noz]
        allInterpFields = dictOfFields[zrcvname]
        indicesI = dictOfIndices[zrcvname]
        C._filterPartialFields(z,
                               allInterpFields,
                               indicesI,
                               loc='centers',
                               startFrom=0,
                               filterName='donorVol')

    # SORTIE
    return None