def _setInterpTransfers(aR, aD, variables=[], variablesIBC=['Density','MomentumX','MomentumY','MomentumZ','EnergyStagnationDensity'], bcType=0, varType=1, compact=0, graph=None, procDict=None, type='ALLD', Gamma=1.4, Cv=1.7857142857142865, MuS=1.e-08, Cs=0.3831337844872463, Ts=1.0): if (procDict is None): procDict = Cmpi.getProcDict(aD) if (graph is None): graph = Cmpi.computeGraph(aD, type=type) # Transferts locaux/globaux # Calcul des solutions interpolees par arbre donneur # On envoie aussi les indices receveurs pour l'instant datas = {} zonesD = Internal.getZones(aD) for zD in zonesD: infos = X.setInterpTransfersD(zD, variables, variablesIBC, bcType, varType, compact, Gamma, Cv, MuS, Cs, Ts) for n in infos: rcvName = n[0] proc = procDict[rcvName] if (proc == Cmpi.rank): field = n[1] #print 'direct', Cmpi.rank, rcvName if field != []: listIndices = n[2] z = Internal.getNodesFromName2(aR, rcvName)[0] C._setPartialFields(z, [field], [listIndices], loc=n[3]) else: rcvNode = procDict[rcvName] #print Cmpi.rank, 'envoie a ',rcvNode if not datas.has_key(rcvNode): datas[rcvNode] = [n] else: datas[rcvNode] += [n] #print datas # Envoie des numpys suivant le graph rcvDatas = Cmpi.sendRecv(datas, graph) # Remise des champs interpoles dans l'arbre receveur for i in rcvDatas.keys(): #print Cmpi.rank, 'recoit de',i, '->', len(rcvDatas[i]) for n in rcvDatas[i]: rcvName = n[0] #print 'reception', Cmpi.rank, rcvName field = n[1] if field != []: listIndices = n[2] z = Internal.getNodesFromName2(aR, rcvName)[0] C._setPartialFields(z, [field], [listIndices], loc=n[3]) return None
# - 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}
import KCore.test as test LOCAL = test.getLocal() # 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, LOCAL + '/in.cgns') Cmpi.barrier() # Relit des zones par procs t = Cmpi.convertFile2SkeletonTree(LOCAL + '/in.cgns') (t, dic) = Distributor2.distribute(t, NProc=2, algorithm='fast') # Squelette d = Cmpi.getProcDict(t) if Cmpi.rank == 0: test.testO(d, 1) t = Cmpi.readZones(t, LOCAL + '/in.cgns', rank=Cmpi.rank) # Squelette charge d = Cmpi.getProcDict(t) if Cmpi.rank == 0: test.testO(d, 2) t = Cmpi.convert2PartialTree(t) # Partiel charge d = Cmpi.getProcDict(t) if Cmpi.rank == 0: test.testO(d, 3)
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