Cassiopee Forum
CFD python modules
S'il vous plaît connectez vous ou Enregistrement'.
Date et heure en ce moment : dimanche, 22 octobre 2017, 06:40

Nouvelle discussion | Répondre
Cassiopee Forum :: Discussions, suggestions, bug report :: Connector :: Process de masquage complet avec setInterpolations  :: Page 1 de 2 [ 1  | 2 ]
ChristopheBenoit
Administrator
Image


Messages: 169
Process de masquage complet avec setInterpolations (mercredi, 7 novembre 2012, 15:01) citation  
Je transfers ici le message de Sylvain Mouton :


J'aimerais résumé ici le processus de masquage complet avec les derniers développements de calculs des coefficients d'interpolation par Cassiopée (setInterpolations).
Dans cet exemple fictif, j'imagine avoir deux bases, dans deux pyTree:
'myBase1' dans myPyTree1
'myBase2' dans myPyTree2
On assemble les deux dans un pyTree unique t

ça me donne le code ci-dessous, qui a demandé beaucoup d'efforts avant de mettre tous les morceaux dans le bon ordre. Je ne suis même pas encore certain que ça fonctionne complètement. Si quelqu'un veut se risquer à utiliser la démarche, ou à la compléter/critiquer, il est le bienvenu.

#============================ dans le fichier de préparation du calcul
XTree.elsACGNS.setBC(myPyTree1, 'BCOverlap', Family='OVLP_1')
XTree.advancedCGNS.convertBC2Overlap(myPyTree1,['OVLP_1'])
XTree.elsACGNS.setBC(myPyTree2, 'BCOverlap', Family='OVLP_2')
XTree.advancedCGNS.convertBC2Overlap(myPyTree2,['OVLP_2'])

# Create final pyTree
t = XTree.createRootNode(Childs=[XTree.createLibNode()])
XTree.addChild(t,XTree.allByType(myPyTree1,'CGNSBase_t')[2])
XTree.addChild(t,XTree.allByType(myPyTree2,'CGNSBase_t')[2])

# Create masking boxes for wind tunnel
# example 1: rectangular box
maskingBox1 = Generator.PyTree.cart((x1,y1,z1), (dx1, dy1, dz1), (2,2,2)) # returns a node of type Zone_t
maskingBox1 = [Post.PyTree.exteriorFaces(maskingBox1)]
# example 2: extract a boundary from a family and close it
myMaskingBody = XTree.extract.ExFamily(myPyTree2,'MY_MASKING_FAMILY')[2] # a list of Zone_t
myMaskingBody = Converter.PyTree.convertArray2Tetra(myMaskingBody)
myMaskingBody += Transform.PyTree.symetrize(myMaskingBody,(0.,0.,0.),(1.,0.,0.),(0.,0.,1.)) # to close the body if it touches the symmetry plane
myMaskingBody = [Transform.PyTree.join(myMaskingBody,tol=1.e-3)] # join returns a single node
gapsmanagerIsWorking = True
if gapsmanagerIsWorking:
myMaskingBody = Generator.PyTree.gapsmanager(myMaskingBody, mode=1) # does it always work ?
else:
hatTops = numpy.array([[xt1,yt1,zt1],[xt2,yt2,zt2]])
for hole in Transform.PyTree.splitConnexity(Post.PyTree.exteriorFaces(myMaskingBody)):
print 'Filling hole no',ihole,'of name',hole[0],'with pointedHat of top',hatTops[ihole,:],'m'
stingPatch = Converter.PyTree.convertArray2Tetra(Generator.PyTree.pointedHat(Converter.PyTree.convertBAR2Struct(hole),\
tuple(hatTops[ihole,:]))) # pointedHat returns a single node
myMaskingBody += [stingPatch]
ihole += 1
myMaskingBody = [Transform.PyTree.join(myMaskingBody,tol=1.e-3)]

# uncomment below to visualise the masking body 'myMaskingBody'
#~ body = XTree.base.createTree2Base('myMaskingBody',Value='2D3D',Childs=myMaskingBody)
#~ Converter.PyTree.convertPyTree2File(body,'myMaskingBody.cgns')

# prepare cellN field at cell centers
t = Converter.PyTree.initVars(t, 'centers:cellN',1.)

# apply blanking
BM = numpy.array([[1,1],\
[0,0]])
bodies = [maskingBox1,myMaskingBody] # a list of bodies, each body being a list of Zone_t objects
print 'running blankCells'
t = Connector.PyTree.blankCells(t, bodies, BM, blankingType=blankingType, depth=2, \
XRaydim1=100, XRaydim2=100, delta=0., dim=3)
t = Connector.PyTree.setHoleInterpolatedPoints(t,depth=2)

# apply overlaps
print 'Applying overlaps'
t = Connector.PyTree.applyBCOverlaps(t,depth=2)

# Optimize
print 'Optimizing overlaps'
t = Connector.PyTree.optimizeOverlap(t, double_wall=1, doubleWallTol=1000., \
priorities = ['myBase2', 1, 'myBase1', 0])
t = Connector.PyTree.maximizeBlankedCells(t, depth=4)

# Write result of masking / overlap
Converter.PyTree.convertPyTree2File(t, 'cellN.cgns') # only usefull to visualise the cellN field

# Compute and write interpolation coefficients for elsA
print 'Compute and write interpolation coefficients for elsA'
try: os.mkdir('InterpFiles')
except OSError: pass
Connector.PyTree.setInterpolations(t, depth=2, double_wall=1, doubleWallTol=1000.,\
storage='direct', prefixFile='InterpFiles/interpFile.', sameBase=0)

XTree.advancedCGNS.convertOverlap2BC(t) # convert overlap grid connectivity to bc understood by elsAxdt
XTree.base.removeNodeByName(t,'FlowSolution#Centers') # this is were cellN field info is stored. No longer usefull once Mask files have been written


#============================ dans la carte elsA
parser = elsAxdt.XdtCGNS('myFile.cgns')
parser.mode = elsAxdt.READ_ALL
parser.mode &= ~elsAxdt.READ_TRACE
parser.mode &= ~elsAxdt.CGNS_CHIMERACOEFF
parser.mode |= elsAxdt.READ_CALLBACK

num = elsA_user.numerics(name='num')
num.set('chm_conn_io','read')
num.set('chm_conn_fprefix','InterpFiles/interpFile.')
num.set('chm_compute_cfd', 'active')
num.set('chm_multigrid',['extrapolation','inactive','inactive']) # chm_mg_interp, chm_coarse_mask, chm_corrstarcells

Ip enregistré Statut: déconnecté Profil | Site Web 
Ordre des réponses: Première réponse en dernier :: Première réponse en premier
Sylvain Mouton
Junior Member
Image


Messages: 66
RE: Process de masquage complet avec setInterpolations (mercredi, 28 novembre 2012, 15:00) citation  
Merci Benoît,
Les indentations python passent à la trappe dans le formatage, à chacun de de les retrouver !
Sinon, je remarque que setInterpolations() a perdu sont argument depth ! Où est-ce qu'on spécifie alors qu'il faut interpoler sur une profondeur donnée ?


Ip enregistré Statut: déconnecté Profil | Site Web 
StephaniePeron
Full Member
Image


Messages: 158
RE: Process de masquage complet avec setInterpolations (jeudi, 29 novembre 2012, 10:17) citation  
Dans la version 1.10 effectivement, l'interface de la fonction a changé : l'argument depth ne sert à rien car les points interpolés sont déjà définis dans l'arbre via le champ cellN. Si tu veux du depth = 1, il faut que dans tout le process d'assemblage où la variable depth est spécifiée (setHoleInterpolatedPoints, applyBCOverlaps, maximizeBlankedCells), il faut que tu aies depth = 1
Pour avoir le calcul des coefs aux centres et aux points EX, il faut faire un coup de setInterpolations avec loc='cell' (les centres) puis une autre fois avec loc='face' (pour les pts EX).
a+

Ip enregistré Statut: déconnecté Profil | Site Web 
Sylvain Mouton
Junior Member
Image


Messages: 66
RE: Process de masquage complet avec setInterpolations (vendredi, 30 novembre 2012, 12:56) citation  
Je crois comprendre pourquoi le processus me prend des heures à présent :
dans Connector.PyTree.maximizeBlankedCells(), je spécifie un depth = 4 car l'expérience a montré qu'il vallait mieux garder un peu de viande pour éviter les points orphelins.
Du coup, lorsque je demande Connector.PyTree.setInterpolations() derrière, avec loc='cell', il me calcule les coefficients d'interpolation sur 4 rangées au lieu de 2. Exact ?

Autre question, s'il faut faire deux fois Connector.PyTree.setInterpolations(), comment on fait pour écrire les fichiers pour elsA ? Seulement sur le deuxième appel ? Sur les deux, avec des noms de fichiers différents ?
Pour ma part, je fais toujours du depth = 2 car j'ai eu des problèmes de robustesse chaque fois que j'ai tenté le depth = 1.

Ip enregistré Statut: déconnecté Profil | Site Web 
Sylvain Mouton
Junior Member
Image


Messages: 66
RE: Process de masquage complet avec setInterpolations (lundi, 3 décembre 2012, 08:52) citation  
Du coup, j'ai passé Connector.PyTree.maximizeBlankedCells() à depth = 2 mais je récupère des cellules orphelines...
Peut-être mon raisonnement n'était pas le bon néanmoins car Connector.PyTree.setInterpolations() doit chercher les coefficients d'interpolation pour les cellules dont le cellnf est à 2 et non pas à 1.
Le ralentissement observé était peut-être lié en fait à la charge de daapuv01, sur laquelle il paraît que des irresponsables font du "pythons multithreadés en openmp qui foutent le bordel".

Ip enregistré Statut: déconnecté Profil | Site Web 
Pascal Raud
Newbie
Image


Messages: 14
RE: Process de masquage complet avec setInterpolations (lundi, 3 décembre 2012, 10:12) citation  
Tu as raison, Connector.PyTree.setInterpolations() calcule les coefficients d'interpolations pour les cellules dont le cellN est égal à 2 quand loc='cell'.

Par ailleurs, quand tu fais du depth=1, il faut appeler la fonction une fois avec loc='cell' et une fois avec loc='face', en précisant à chaque fois l'écriture des fichiers elsA avec le même nom de préfixe. Le passage avec 'cell' va t'écrire les fichiers pour les centres de cellules et le passage avec 'face' écrira les fichiers pour les points EX, les fichiers seront alors automatiquement suffixés par "_Int" (requis par elsA).


Ip enregistré Statut: déconnecté Profil | Site Web 
VincentBrunet
Newbie
Image


Messages: 6
RE: Process de masquage complet avec setInterpolations (vendredi, 7 décembre 2012, 14:34) citation  
Chez moi ca marche nickel.
Plusieurs remarques néanmoins :
1/ La commande setInterpolations m'informe qu'il y a des cellules orphelines ... mais comment je fais pour les visualiser ? Pas reussi avec tkCassiopee ou tecplot
2/ Dans les fichiers sortis par setInterpolation et relu par elsA, il y a des *_Blanking, du coup est que ca sert a quelque chose de dire a elsA de relire dans l'arbre cellnf ?
3/ Le calcul des distances a la paroi (plutot un probleme elsA) est calculé avant la lecture des fichiers d'interpolations et de masquage ... mais n'est plus recalculé en cas de double wall au demarrage d'elsA ... du coup les distances doivent etre fausses je pense.

Ip enregistré Statut: déconnecté Profil | Site Web 
Pascal Raud
Newbie
Image


Messages: 14
RE: Process de masquage complet avec setInterpolations (mardi, 11 décembre 2012, 09:34) citation  
Vincent, voici quelques éléments de réponse :

1/ Pour l'instant, on n'a effectivement pas branché la visualisation des points orphelins. Ils sont stockés dans l'arbre mais on n'en fait rien... C'est un travail qui reste à faire de notre côté.

2/ Comme tu l'as dit, lorsqu'on relit les coefficients d'interpolations avec elsA, on relit également un fichier *_Blanking et dans ce cas, c'est effectivement inutile de relire le cellnf avec elsA puisque le cellNatureField sera rempli à partir de ces fichiers *_Blanking.

3/ Pour ce point précis, je vais en discuter avec Sébastien Heib et Julien Mayeur. On te réponds dans la journée. Mais juste une précision, tu veux bien parler de double wall, pas de doubly-defined?

Ip enregistré Statut: déconnecté Profil | Site Web 
StephaniePeron
Full Member
Image


Messages: 158
RE: Process de masquage complet avec setInterpolations (mardi, 11 décembre 2012, 11:49) citation  
Pour le point 3/, tu peux calculer la distance avec le module Dist2Walls en prétraitement.
Si tu as des parois masquées, elles ne sont pas prises en compte pour le calcul des distances.
Pour le côté double wall, il est peut-être possible de construire un corps unique à partir des parois, que tu fournis comme corps à partir duquel les distances sont calculées.
a+

Ip enregistré Statut: déconnecté Profil | Site Web 
Pascal Raud
Newbie
Image


Messages: 14
RE: Process de masquage complet avec setInterpolations (mardi, 11 décembre 2012, 15:17) citation  
Je reviens sur le point 3/. Côté solveur elsA, voilà ce qu'il en est actuellement :
Si tu relis le masquage dans le solveur et que tu veux prendre en compte ce masquage dans le calcul des distances à la paroi, il faut activer la clé Python 'chm_distrecomp_mask' disponible depuis la production v3.4.03 d'elsA (la clé vaut 'active' ou 'inactive').

CEPENDANT, cela va marcher seulement si tu laisses elsA calculer ces distances à la paroi. Si tu essayes de relire ces distances dans un fichier ou dans ton arbre CGNS, le recalcul (prenant en compte le masquage) est désactivé. Ce n'est pas satisfaisant mais c'est fait comme ça actuellement...

Conclusion :
Si tes masques ne bougent pas pendant le calcul, tu peux donc faire un calcul des distances une fois pour toute avec elsA (en activant la clé 'chm_distrecomp_mask'), sauver les fichiers de distances et les relire. Tu peux également calculer en pré-traitement ces distances à la paroi avec Cassiopée qui va tenir compte du masquage comme l'a dit Stéphanie et relire les fichiers avec elsA ensuite. Par contre, si tes masques bougent au cours du calcul, tu ne peux pas faire ces manipulations pour l'instant.

J'espère que c'est à peu près clair...?

Ip enregistré Statut: déconnecté Profil | Site Web 
VincentBrunet
Newbie
Image


Messages: 6
RE: Process de masquage complet avec setInterpolations (mardi, 11 décembre 2012, 16:15) citation  
Merci c'est super clair. La clef elsA va m'aider !. Mon je fais des avions, ca bouge pas un avion ...
Bon sinon, pour le point 1 j'arrive pas a retrouver ou sont stockes les cellules orphelines dans l'arbre cgns. Quelqu'un peut me dire ca SVP ?

Ip enregistré Statut: déconnecté Profil | Site Web 
Page 1 de 2 [ 1  | 2 ]Nouvelle discussion | Répondre

Software PBLang 4.65 © 2002-2003 by Martin Senftleben
Image