# - 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')
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