3 .. index:: single: exemple
4 .. index:: single: python
6 On trouvera ici les instructions python pour quelques configurations caractéristiques. Les fichiers de données associés sont téléchargeables. Il faut penser à adapter la valeur de la variable ``data_dir`` : c'est le répertoire dans lequel les fichiers med auront été enregistrés. C'est dans ce répertoire ``dircase`` que seront écrits les fichiers résultant des adaptations successives.
10 .. index:: single: raffinement;uniforme
12 On fera ici trois raffinements uniformes successifs du maillage contenu dans le fichier ``tutorial_1.00.med``. Quelques remarques :
13 * la même hypothèse est utilisée à chaque itération
14 * le maillage produit porte toujours le même nom. Cela ne pose pas de problème car il est stocké dans des fichiers différents.
21 Hypo_0 = homard.CreateHypothesis('Hypo_0')
22 Hypo_0.SetAdapRefinUnRef(-1, 1, 0)
26 Case_1 = homard.CreateCase('Case_1', 'MAILL', data_dir+'/tutorial_1.00.med')
27 Case_1.SetDirName(dircase)
33 Iter_0 = Case_1.NextIteration('Iter_0')
34 Iter_0.SetMeshName('MESH')
35 Iter_0.SetMeshFile(dircase+'/maill.01.med')
36 Iter_0.AssociateHypo('Hypo_0')
37 codret = Iter_0.Compute(1)
40 Iter_1 = Iter_0.NextIteration('Iter_1')
41 Iter_1.SetMeshName('MESH')
42 Iter_1.SetMeshFile(dircase+'/maill.02.med')
43 Iter_1.AssociateHypo('Hypo_0')
44 codret = Iter_1.Compute(1)
47 Iter_2 = Iter_1.NextIteration('Iter_2')
48 Iter_2.SetMeshName('MESH')
49 Iter_2.SetMeshFile(dircase+'/maill.03.med')
50 Iter_2.AssociateHypo('Hypo_0')
51 codret = Iter_2.Compute(1)
54 Téléchargement des fichiers
56 * :download:`maillage initial<files/tutorial_1.00.med.gz>`
57 * :download:`commandes python<files/tutorial_1.py>`
60 Raffinement par des zones
61 """""""""""""""""""""""""
62 .. index:: single: zone
64 On procède ici au raffinement selon des zones. Pour passer du maillage initial au maillage 'M_1', on utilise une boîte encadrant le plan z=1 et une sphère centrée sur l'origine de rayon 1.05. Puis pour passer du maillage 'M_1' au maillage 'M_2', on remplace la sphère par une boîte encadrant le cube de côté 0.5, pointant sur l'origine. On notera que le type de raffinement n'a pas été précisé ; par défaut, il sera donc conforme.
68 # Creation of the zones
69 # =====================
71 Zone_0 = homard.CreateZoneBox('Zone_0', -0.1, 1.1, -0.1, 1.1, 0.9, 1.1)
74 Zone_1 = homard.CreateZoneSphere('Zone_1', 0., 0., 0., 1.05)
77 Zone_2 = homard.CreateZoneBox('Zone_2', -0.1, 0.51, -0.1, 0.51, -0.1, 0.51)
81 Hypo_0 = homard.CreateHypothesis('Hypo_0')
82 Hypo_0.SetAdapRefinUnRef(0, 1, 0)
83 Hypo_0.AddZone('Zone_1', 1)
84 Hypo_0.AddZone('Zone_0', 1)
88 Hypo_1 = homard.CreateHypothesis('Hypo_1')
89 Hypo_1.SetAdapRefinUnRef(0, 1, 0)
90 Hypo_1.AddZone('Zone_0', 1)
91 Hypo_1.AddZone('Zone_2', 1)
95 Case_1 = homard.CreateCase('Case_1', 'MZERO', data_dir+'/tutorial_2.00.med')
96 Case_1.SetDirName(dircase)
100 Iter_0 = Case_1.NextIteration('Iter_0')
101 Iter_0.SetMeshName('M_1')
102 Iter_0.SetMeshFile(dircase+'/maill.01.med')
103 Iter_0.AssociateHypo('Hypo_0')
104 codret = Iter_0.Compute(1)
108 Iter_1 = Iter_0.NextIteration('Iter_1')
109 Iter_1.SetMeshName('M_2')
110 Iter_1.SetMeshFile(dircase+'/maill.02.med')
111 Iter_1.AssociateHypo('Hypo_1')
112 codret = Iter_1.Compute(1)
115 Téléchargement des fichiers
117 * :download:`maillage initial<files/tutorial_2.00.med.gz>`
118 * :download:`commandes python<files/tutorial_2.py>`
121 Raffinement selon un champ
122 """"""""""""""""""""""""""
123 .. index:: single: champ
125 On procède ici au raffinement selon un champ. Les hypothèses servent à définir le nom du champ et les seuils de raffinement/déraffinement. La donnée du fichier et des instants est faite dans l'itération. Des champs sur les noeuds ou sur les mailles sont interpolés.
126 Pour adapter le maillage H_1 issu de l'itération Iter_1, deux variantes sont appliquées. Dans la première, Iter_2, le champ est un champ scalaire d'indicateurs d'erreur et on découpe les 1.5% de mailles où l'erreur est la plus grande. Dans la seconde variante, Iter_2_bis, on se base sur un champ vectoriel et on examine le saut de ce vecteur entre une maille et ses voisines : on découpera là où la norme infinie de ce saut est supérieure au seuil absolu de 0.0001.
130 # Hypothesis "Hypo_0vers1"
131 # ========================
132 Hypo_0vers1 = homard.CreateHypothesis('Hypo_0vers1')
133 Hypo_0vers1.SetAdapRefinUnRef(1, 1, 0)
134 # Characterization of the field
135 Hypo_0vers1.SetField('SOLU_0__QIRE_ELEM_SIGM__________')
136 Hypo_0vers1.SetUseComp(0)
137 Hypo_0vers1.AddComp('ERREST ')
138 Hypo_0vers1.SetRefinThr(3, 1.0)
139 Hypo_0vers1.SetTypeFieldInterp(2)
140 Hypo_0vers1.AddFieldInterp('SOLU_0__DEPL____________________')
141 Hypo_0vers1.AddFieldInterp('SOLU_0__ERRE_ELEM_SIGM__________')
143 # Hypothesis "Hypo_1vers2"
144 # ========================
145 Hypo_1vers2 = homard.CreateHypothesis('Hypo_1vers2')
146 Hypo_1vers2.SetAdapRefinUnRef(1, 1, 1)
147 # Characterization of the field
148 Hypo_1vers2.SetField('SOLU_1__QIRE_ELEM_SIGM__________')
149 Hypo_1vers2.SetUseComp(0)
150 Hypo_1vers2.AddComp('ERREST ')
151 Hypo_1vers2.SetRefinThr(3, 1.5)
152 Hypo_1vers2.SetUnRefThr(3, 6.)
153 Hypo_1vers2.SetTypeFieldInterp(2)
154 Hypo_1vers2.AddFieldInterp('SOLU_1__DEPL____________________')
155 Hypo_1vers2.AddFieldInterp('SOLU_1__QIRE_ELEM_SIGM__________')
157 # Hypothesis "Hypo_1vers2_bis"
158 # ============================
159 Hypo_1vers2_bis = homard.CreateHypothesis('Hypo_1vers2_bis')
160 Hypo_1vers2_bis.SetAdapRefinUnRef(1, 1, 1)
161 # Characterization of the field
162 Hypo_1vers2_bis.SetField('SOLU_1__DEPL____________________')
163 Hypo_1vers2_bis.SetUseComp(1)
164 Hypo_1vers2_bis.AddComp('DX')
165 Hypo_1vers2_bis.AddComp('DY')
166 Hypo_1vers2_bis.AddComp('DZ')
167 Hypo_1vers2_bis.SetRefinThr(1, 0.0001)
168 Hypo_1vers2_bis.SetUnRefThr(1, 0.000001)
169 Hypo_1vers2_bis.SetTypeFieldInterp(0)
173 Case_1 = homard.CreateCase('Case_1', 'G_0', data_dir+'/tutorial_3.00.med')
174 Case_1.SetDirName(dircase)
178 Iter_1 = Case_1.NextIteration('Iter_1')
179 Iter_1.SetMeshName('H_1')
180 Iter_1.SetMeshFile(dircase+'/maill.01.med')
181 Iter_1.SetFieldFile(data_dir+'/tutorial_3.00.med')
182 Iter_1.SetTimeStepRank( 1, 1)
183 Iter_1.AssociateHypo('Hypo_0vers1')
184 codret = Iter_1.Compute(1)
188 Iter_2 = Iter_1.NextIteration('Iter_2')
189 Iter_2.SetMeshName('H_2')
190 Iter_2.SetMeshFile(dircase+'/maill.02.med')
191 Iter_2.SetFieldFile(data_dir+'/tutorial_3.01.med')
192 Iter_2.SetTimeStepRank(1, 1)
193 Iter_2.AssociateHypo('Hypo_1vers2')
194 codret = Iter_2.Compute(1)
196 # Iteration "Iter_2_bis"
197 # ======================
198 Iter_2_bis = Iter_1.NextIteration('Iter_2_bis')
199 Iter_2_bis.SetMeshName('H_2_bis')
200 Iter_2_bis.SetMeshFile(dircase+'/maill.02.bis.med')
201 Iter_2_bis.SetFieldFile(data_dir+'/tutorial_3.01.med')
202 Iter_2_bis.SetTimeStepRank(1, 1)
203 Iter_2_bis.AssociateHypo('Hypo_1vers2_bis')
204 codret = Iter_2_bis.Compute(1)
207 Téléchargement des fichiers
209 * :download:`maillage et champ étape 0<files/tutorial_3.00.med.gz>`
210 * :download:`maillage et champ étape 1<files/tutorial_3.01.med.gz>`
211 * :download:`commandes python<files/tutorial_3.py>`
214 Suivi de frontières courbes
215 """""""""""""""""""""""""""
216 .. index:: single: champ
218 On teste ici le suivi des frontières courbes : des frontières analytiques pour décrire les différentes surfaces des tuyaux et une frontière discrète pour décrire les lignes d'intersection des deux tuyaux. Le pilotage du raffinement est le suivant : raffinement uniforme de toutes les mailles contenues dans des groupes désignés.
222 # Creation of the boundaries
223 # ==========================
224 Boundary_1 = homard.CreateBoundaryDi('intersection', 'PIQUAGE', data_dir+'/tutorial_4.fr.med')
226 Boundary_2 = homard.CreateBoundaryCylinder('cyl_1_ext', 0.0, 25., -25., 25., 50., 75., 100.)
228 Boundary_3 = homard.CreateBoundaryCylinder('cyl_2_ext', 17.5, -2.5, -12.5, -100., -75., -25., 50.)
230 Boundary_4 = homard.CreateBoundaryCylinder('cyl_1_int', 0.0, 25., -25., 25., 50., 75., 75.)
232 Boundary_5 = homard.CreateBoundaryCylinder('cyl_2_int', 17.5, -2.5, -12.5, -100., -75., -25., 25.)
235 # ===================
236 # Creation of the hypothesis Hypo_1
237 Hypo_1 = homard.CreateHypothesis('Hypo_1')
238 Hypo_1.SetAdapRefinUnRef(-1, 1, 0)
239 Hypo_1.AddGroup('T1_INT_I')
240 Hypo_1.AddGroup('T1_INT_O')
241 Hypo_1.AddGroup('T2_INT')
242 # Creation of the hypothesis Hypo_2
243 Hypo_2 = homard.CreateHypothesis('Hypo_2')
244 Hypo_2.SetAdapRefinUnRef(-1, 1, 0)
245 Hypo_2.AddGroup('T1_EXT_I')
246 Hypo_2.AddGroup('T1_EXT_O')
247 Hypo_2.AddGroup('T2_EXT')
251 Case = homard.CreateCase('Case', 'PIQUAGE', data_dir+'/tutorial_4.00.med')
252 Case.SetDirName(dircase)
253 Case.AddBoundaryGroup( 'intersection', '' )
254 Case.AddBoundaryGroup( 'cyl_1_ext', 'T1_EXT_I' )
255 Case.AddBoundaryGroup( 'cyl_1_ext', 'T1_EXT_O' )
256 Case.AddBoundaryGroup( 'cyl_2_ext', 'T2_EXT' )
257 Case.AddBoundaryGroup( 'cyl_1_int', 'T1_INT_I' )
258 Case.AddBoundaryGroup( 'cyl_1_int', 'T1_INT_O' )
259 Case.AddBoundaryGroup( 'cyl_2_int', 'T2_INT' )
261 # Creation of the iterations
262 # ==========================
263 # Creation of the iteration Iter_1
264 Iter_1 = Case.NextIteration('Iter_1')
265 Iter_1.SetMeshName('PIQUAGE_1')
266 Iter_1.SetMeshFile(dircase+'/maill.01.med')
267 Iter_1.AssociateHypo('Hypo_1')
268 codret = Iter_1.Compute(1)
269 # Creation of the iteration Iter_2
270 Iter_2 = Iter_1.NextIteration('Iter_2')
271 Iter_2.SetMeshName('PIQUAGE_2')
272 Iter_2.SetMeshFile(dircase+'/maill.02.med')
273 Iter_2.AssociateHypo('Hypo_2')
274 codret = Iter_2.Compute(1)
277 Téléchargement des fichiers
279 * :download:`maillage initial<files/tutorial_4.00.med.gz>`
280 * :download:`maillage de la frontière discrète<files/tutorial_4.fr.med.gz>`
281 * :download:`commandes python<files/tutorial_4.py>`
284 Instructions spécifiques au 2D
285 """"""""""""""""""""""""""""""
286 .. index:: single: 2D
288 Les instructions pour adapter un maillage 2D sont exactement identiques à celles nécessaires à l'adaptation d'un maillage 3D. La seule exception concerne le raffinement selon des zones géométriques : des fonctions différentes sont utilisées pour pouvoir définir des zones 2D. On donne alors les coordonnées 2D des zones, en précisant l'orientation du plan du maillage.
289 Dans le cas présenté ici, on raffine une première fois toutes les mailles contenues dans un disque percé, puis dans une seconde itération, toutes les mailles contenues dans un rectangle. On notera l'utilisation du suivi des frontières circulaires du domaine.
293 # Creation of the boundaries
294 # ==========================
295 # Creation of the discrete boundary Boun_1
296 Boun_1 = homard.CreateBoundaryDi('Boun_1', 'MAIL_EXT', data_dir+'/tutorial_5.fr.med')
298 # Creation of the zones
299 # =====================
300 # Creation of the disk with hole enveloppe
301 enveloppe = homard.CreateZoneDiskWithHole( 'enveloppe', 0., 0., 250., 193., 1 )
302 # Creation of the rectangle quart_sup
303 quart_sup = homard.CreateZoneBox2D( 'quart_sup', 0., 250., 0., 250., 1 )
307 # Creation of the hypothesis Hypo_1
308 Hypo_1 = homard.CreateHypothesis('Hypo_1')
309 Hypo_1.SetAdapRefinUnRef(0, 1, 0)
310 Hypo_1.AddZone('enveloppe', 1)
311 # Creation of the hypothesis Hypo_2
312 Hypo_2 = homard.CreateHypothesis('Hypo_2')
313 Hypo_2.SetAdapRefinUnRef(0, 1, 0)
314 Hypo_2.AddZone('quart_sup', 1)
318 Case_1 = homard.CreateCase('Case_1', 'COEUR_2D', data_dir+'/tutorial_5.00.med')
319 Case_1.SetDirName(dircase)
320 Case_1.SetConfType(3)
321 Case_1.AddBoundaryGroup('Boun_1', '')
325 Iter_1 = Case_1.NextIteration('Iter_1')
326 Iter_1.SetMeshName('COEUR_2D_01')
327 Iter_1.SetMeshFile(dircase+'/maill.01.med')
328 Iter_1.AssociateHypo('Hypo_1')
329 codret = Iter_1.Compute(1)
333 Iter_2 = Iter_1.NextIteration('Iter_2')
334 Iter_2.SetMeshName('COEUR_2D_02')
335 Iter_2.SetMeshFile(dircase+'/maill.02.med')
336 Iter_2.AssociateHypo('Hypo_2')
337 codret = Iter_2.Compute(1)
340 Téléchargement des fichiers
342 * :download:`maillage initial<files/tutorial_5.00.med.gz>`
343 * :download:`maillage de la frontière discrète<files/tutorial_5.fr.med.gz>`
344 * :download:`commandes python<files/tutorial_5.py>`