1 #@ MODIF observation_ops Macro DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2007 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
25 def observation_ops(self,
38 Ecriture de la macro MACRO_OBSERVATION
43 # La macro compte pour 1 dans la numerotation des commandes
46 # on transforme le mc MODI_REPERE pour ne pas le confondre avec l'operateur
48 MODIF_REPERE = MODI_REPERE
50 # importation de commandes
53 from Utilitai.UniteAster import UniteAster
54 from Utilitai.Utmess import UTMESS
55 from Utilitai.Table import Table
56 from Cata.cata import mode_meca, dyna_harmo, evol_elas,dyna_trans
57 MODI_REPERE = self.get_cmd('MODI_REPERE')
58 PROJ_CHAMP = self.get_cmd('PROJ_CHAMP')
59 CREA_CHAMP = self.get_cmd('CREA_CHAMP')
60 CREA_RESU = self.get_cmd('CREA_RESU')
61 POST_RELEVE_T = self.get_cmd('POST_RELEVE_T')
62 DETRUIRE = self.get_cmd('DETRUIRE')
64 # dans **args, on range les options de PROJ_CHAMP facultatives, et dont on
65 # ne sert pas par la suite
68 if NOM_CHAM == 'DEPL':
69 if isinstance( RESULTAT, dyna_harmo):
70 TYPE_CHAM = 'NOEU_DEPL_C'
72 TYPE_CHAM = 'NOEU_DEPL_R'
73 elif NOM_CHAM == 'EPSI_NOEU_DEPL':
74 if isinstance( RESULTAT, dyna_harmo):
75 TYPE_CHAM = 'NOEU_EPSI_C'
77 TYPE_CHAM = 'NOEU_EPSI_R'
79 UTMESS('F','ELEMENTS4_48',valk=[NOM_CHAM])
81 if isinstance( RESULTAT, evol_elas): TYPE_RESU='EVOL_ELAS'
82 if isinstance( RESULTAT, dyna_trans): TYPE_RESU='DYNA_TRANS'
83 if isinstance( RESULTAT, dyna_harmo): TYPE_RESU='DYNA_HARMO'
84 if isinstance( RESULTAT, mode_meca): TYPE_RESU='MODE_MECA'
86 self.DeclareOut( 'RESU', self.sd)
87 jdc = CONTEXT.get_current_step().jdc
89 # recuperation du maillage associe au modele numerique
90 _maillag = aster.getvectjev( MODELE_1.nom.ljust(8) + '.MODELE .LGRF' )
91 maillage = _maillag[0].strip()
92 mayanum = self.get_concept(maillage)
94 # modele numerique 2D ou 3D
95 typmod= mayanum.DIME.get()
98 # recuperation du maillage associe au modele experimental
99 _maillag = aster.getvectjev( MODELE_2.nom.ljust(8) + '.MODELE .LGRF' )
100 maillage = _maillag[0].strip()
101 mayaexp = self.get_concept(maillage)
103 # cham_mater et cara_elem pour le resultat a projeter
104 iret,ibid,nom_cara_elem = aster.dismoi('F','CARA_ELEM',RESULTAT.nom,'RESULTAT')
105 if len(nom_cara_elem) > 0 :
106 assert nom_cara_elem.strip() != "#PLUSIEURS" , nom_cara_elem
107 if nom_cara_elem.strip() == "#AUCUN" :
110 cara_elem = self.get_concept(nom_cara_elem.strip())
114 iret,ibid,nom_cham_mater = aster.dismoi('F','CHAM_MATER',RESULTAT.nom,'RESULTAT')
115 if len(nom_cham_mater) > 0 :
116 assert nom_cham_mater.strip() != "#PLUSIEURS" , nom_cham_mater
117 if nom_cham_mater.strip() == "#AUCUN" :
120 cham_mater = self.get_concept(nom_cham_mater.strip())
124 # afreq pour les frequences propres
125 if isinstance( RESULTAT, mode_meca):
126 from Cata.cata import RECU_TABLE
127 __freq = RECU_TABLE(CO=RESULTAT,
129 afreq = __freq.EXTR_TABLE().Array('NUME_ORDRE','FREQ')
133 nume_ordr_demande = mcfact['NUME_ORDRE']
134 if type(nume_ordr_demande) != tuple :
135 nume_ordr_demande = [nume_ordr_demande]
137 num_max = len(RESULTAT.LIST_VARI_ACCES()['NUME_ORDRE'])
139 #***********************************************
140 # PHASE DE CALCUL DE LA DEFORMATION MOYENNE AUX NOEUDS
141 # CHAMP CALCULE SUR LE MODELE NUMERIQUE
142 #***********************************************
144 if EPSI_MOYENNE != None :
146 if NOM_CHAM != 'EPSI_NOEU_DEPL':
148 UTMESS('F','UTILITAI8_24',valk=['NOEU_EPSI',NOM_CHAM])
150 if nume_ordr_demande[0]:
151 num_ordr = nume_ordr_demande
153 num_ordr = RESULTAT.LIST_VARI_ACCES()['NUME_ORDRE']
155 if isinstance( RESULTAT, evol_elas):
156 list_inst = RESULTAT.LIST_VARI_ACCES()['INST']
157 if isinstance( RESULTAT, dyna_trans):
158 list_inst = RESULTAT.LIST_VARI_ACCES()['INST']
159 if isinstance( RESULTAT, dyna_harmo):
160 list_freq = RESULTAT.LIST_VARI_ACCES()['FREQ']
164 # il faut calculer le champ complet
166 nom_cmps = ['EPXX','EPYY','EPZZ','EPXY',]
168 nom_cmps = ['EPXX','EPYY','EPZZ','EPXY','EPXZ','EPYZ',]
170 argsi = {'ACTION' : [], }
175 for epsi_moye in EPSI_MOYENNE :
180 seuil_lu = epsi_moye['SEUIL_VARI']
181 if type(seuil_lu) == tuple :
182 val_seuil = seuil_lu[0]
185 seuil.append(val_seuil)
186 masque_lu = epsi_moye['MASQUE']
187 if type(masque_lu) != tuple :
188 val_masque.append(masque_lu)
190 val_masque = masque_lu
191 masque.append(val_masque)
192 for typ in ['NOEUD','GROUP_NO','MAILLE','GROUP_MA']:
193 if epsi_moye[typ] != None:
194 l_noeud = find_no(mayanum, {typ : epsi_moye[typ]})
195 nb_mcfact = nb_mcfact + 1
196 for i in range(len(l_noeud)):
197 l_noeud[i]=l_noeud[i].strip()
198 lnoeuds[str(nb_mcfact)]=l_noeud
201 UTMESS('F','MODELISA3_13',valk=['EPSI_MOYENNE'])
203 if TYPE_CHAM[-1:] == 'C':
204 mcfactr = { 'NOM_CMP' : nom_cmps,
205 'OPERATION' : 'EXTRACTION',
206 'INTITULE' : str('R'+str(nb_mcfact)),
209 'NOM_CHAM' : 'EPSI_NOEU_DEPL',
210 'RESULTAT' : RESULTAT,
211 'NUME_ORDRE' : num_ordr,
213 argsi['ACTION'].append(mcfactr)
214 mcfacti = { 'NOM_CMP' : nom_cmps,
215 'OPERATION' : 'EXTRACTION',
216 'INTITULE' : str('I'+str(nb_mcfact)),
219 'NOM_CHAM' : 'EPSI_NOEU_DEPL',
220 'RESULTAT' : RESULTAT,
221 'NUME_ORDRE' : num_ordr,
223 argsi['ACTION'].append(mcfacti)
225 mcfactr = { 'NOM_CMP' : nom_cmps,
226 'OPERATION' : 'EXTRACTION',
227 'INTITULE' : str(nb_mcfact),
229 'NOM_CHAM' : 'EPSI_NOEU_DEPL',
230 'RESULTAT' : RESULTAT,
231 'NUME_ORDRE' : num_ordr,
233 argsi['ACTION'].append(mcfactr)
235 _tepsi=POST_RELEVE_T(
238 table=_tepsi.EXTR_TABLE()
240 DETRUIRE( CONCEPT= _F( NOM = _tepsi ), INFO=1)
243 __chame = [None]*num_max
245 argsa = {'AFFE' : [], }
246 for mcfacta in range(nb_mcfact):
247 l_noeud_mcfact = lnoeuds[str(mcfacta+1)]
250 seuil_mc=seuil[mcfacta]
251 masque_mc=masque[mcfacta]
259 for row in table.rows:
260 if TYPE_CHAM[-1:] == 'C':
261 if row['INTITULE'].strip() == str('R'+str(mcfacta+1)) \
262 and row['NUME_ORDRE'] == ind :
263 l_valr.append(row[cmp])
265 elif row['INTITULE'].strip() == str('I'+str(mcfacta+1)) \
266 and row['NUME_ORDRE'] == ind :
267 l_vali.append(row[cmp])
271 if row['INTITULE'].strip() == str(mcfacta+1) \
272 and row['NUME_ORDRE'] == ind:
273 l_val.append(row[cmp])
275 if TYPE_CHAM[-1:] == 'C':
277 if len(l_valr) != len(l_vali):
278 UTMESS('F','POSTRELE_59')
279 for i in range(len(l_valr)):
280 l_valc.append(complex(l_valr[i],l_vali[i]))
285 UTMESS('F','POSTRELE_59')
287 # on regarde a la fois la partie reelle et la partie imag pour les complexes
288 vmoyer = sum(l_valr)/len(l_valr)
289 vmoyei = sum(l_vali)/len(l_vali)
290 vmoye = sum(l_valc)/len(l_valc)
296 if (vmaxr > vmoyer*(1.+seuil_mc)) or (vminr < vmoyer*(1-seuil_mc)):
297 l_cmp_vari.append(cmp)
299 if (vmaxi > vmoyei*(1.+seuil_mc)) or (vmini < vmoyei*(1-seuil_mc)):
300 l_cmp_vari.append(cmp)
302 if (vminr > vmoyer*(1.-seuil_mc)) or (vmaxr < vmoyer*(1+seuil_mc)):
303 l_cmp_vari.append(cmp)
305 if (vmini > vmoyei*(1.-seuil_mc)) or (vmaxi < vmoyei*(1+seuil_mc)):
306 l_cmp_vari.append(cmp)
308 vmoye = sum(l_val)/len(l_val)
312 if (vmax > vmoye*(1.+seuil_mc)) or (vmin < vmoye*(1-seuil_mc)):
313 l_cmp_vari.append(cmp)
315 if (vmin > vmoye*(1.-seuil_mc)) or (vmax < vmoye*(1+seuil_mc)):
316 l_cmp_vari.append(cmp)
318 l_vmoye.append(vmoye)
320 if len(l_cmp_vari) > 0:
323 for cmp_vari in l_cmp_vari:
324 if cmp_vari not in masque_mc:
325 if cmp == cmp_vari and not vu:
326 if EPSI_MOYENNE[mcfacta]['MAILLE'] != None:
327 entite = str('MAILLE : '+str(PSI_MOYENNE[mcfacta]['MAILLE']))
328 if EPSI_MOYENNE[mcfacta]['GROUP_MA'] != None:
329 entite = str('GROUP_MA : '+str(EPSI_MOYENNE[mcfacta]['GROUP_MA']))
330 UTMESS('A','OBSERVATION_8',vali=[ind],valr=[seuil_mc],valk=[entite,cmp])
334 if TYPE_CHAM[-1:] == 'C':
335 mcfactc = { 'NOM_CMP' : nom_cmps,
336 'NOEUD' : l_noeud_mcfact,
340 mcfactc = { 'NOM_CMP' : nom_cmps,
341 'NOEUD' : l_noeud_mcfact,
345 argsa['AFFE'].append(mcfactc)
347 __chame[ind-1] = CREA_CHAMP( OPERATION = 'AFFE',
350 TYPE_CHAM = TYPE_CHAM,
355 if isinstance( RESULTAT, mode_meca):
356 mcfact2 = {'CHAM_GD' : __chame[ind-1],
358 'NUME_MODE' : int(afreq[ind-1,0]),
359 'FREQ' : afreq[ind-1,1],
362 if isinstance( RESULTAT, evol_elas):
363 mcfact2 = {'CHAM_GD' : __chame[ind-1],
365 'INST' : list_inst[ind-1],
368 if isinstance( RESULTAT, dyna_trans):
369 mcfact2 = {'CHAM_GD' : __chame[ind-1],
371 'INST' : list_inst[ind],
374 if isinstance( RESULTAT, dyna_harmo):
375 mcfact2 = {'CHAM_GD' : __chame[ind-1],
377 'FREQ' : list_freq[ind-1],
380 if cham_mater is not None:
381 mcfact2['CHAM_MATER'] = cham_mater
382 if cara_elem is not None:
383 mcfact2['CARA_ELEM'] = cara_elem
385 liste.append(mcfact2)
389 TYPE_RESU = TYPE_RESU,
397 #***********************************************
398 # PHASE DE PROJECTION
399 #***********************************************
401 if PROJECTION == 'OUI':
402 __proj=PROJ_CHAMP(RESULTAT = __proj,
415 #***********************************************
416 # PHASE DE CHANGEMENT DE REPERE
417 #***********************************************
418 # Le changement de repere se fait dans les routines exterieures crea_normale et crea_repere
420 # On range dans le mcfact MODI_REPERE une liste de modifications. ex :
421 # MODI_REPERE = ( _F( GROUP_NO = toto,
422 # REPERE = 'NORMALE' ),
423 # CONDITION = (1.0,0.0,0.0),
425 # _F( NOEUD = ('a','z','e'...),
426 # REPERE = 'CYLINDRIQUE',
427 # ORIGINE = (0.,0.,0.),
428 # AXE_Z = (0.,1.,0.), ),
429 # _F( GROUP_NO = titi,
430 # REPERE = 'UTILISATEUR',
431 # ANGL_NAUT = (alpha, beta, gamma), )
435 if MODIF_REPERE != None :
436 if nume_ordr_demande[0]:
437 num_ordr = nume_ordr_demande
439 num_ordr = __proj.LIST_VARI_ACCES()['NUME_ORDRE']
441 for modif_rep in MODIF_REPERE :
442 type_cham = modif_rep['TYPE_CHAM']
443 if type_cham == 'TENS_2D':
444 nom_cmp = ['EPXX','EPYY','EPZZ','EPXY',]
445 elif type_cham == 'TENS_3D':
446 nom_cmp = ['EPXX','EPYY','EPZZ','EPXY','EPXZ','EPYZ',]
448 nom_cmp = modif_rep['NOM_CMP']
449 mcfact1 = { 'NOM_CMP' : nom_cmp,
450 'TYPE_CHAM' : type_cham,
451 'NOM_CHAM' : NOM_CHAM }
454 modi_rep = modif_rep.val
456 if modi_rep['REPERE'] == 'DIR_JAUGE' :
459 if modi_rep.has_key('VECT_X'):
460 vect_x = modi_rep['VECT_X']
461 if modi_rep.has_key('VECT_Y'):
462 vect_y = modi_rep['VECT_Y']
464 # il faut des mailles pour les tenseurs d'ordre 2
466 for typ in ['MAILLE','GROUP_MA',]:
467 if modi_rep.has_key(typ) :
468 if PROJECTION == 'OUI':
472 list_ma = find_ma(maya, {typ : modi_rep[typ]})
473 taille = len(list_ma)
475 mcfact1.update({ 'MAILLE' : list_ma })
476 angl_naut = crea_repere_xy(vect_x, vect_y)
478 mcfact2.update({ 'REPERE' : 'UTILISATEUR',
479 'ANGL_NAUT' : angl_naut })
481 args = {'MODI_CHAM' : mcfact1,
482 'DEFI_REPERE' : mcfact2 }
484 __proj = MODI_REPERE( RESULTAT = __proj,
485 NUME_ORDRE = num_ordr,
488 if modi_rep['REPERE'] == 'NORMALE' :
489 # Cas ou l'utilisateur choisit de creer les reperes locaux
490 # selon la normale. On fait un changement de repere local
492 for option in ['VECT_X','VECT_Y','CONDITION_X','CONDITION_Y'] :
493 if modi_rep.has_key(option):
494 vect = { option : modi_rep[option] }
496 UTMESS('E','UTILITAI7_9')
498 chnorm = crea_normale(self, MODELE_1, MODELE_2, NUME_DDL,
499 cham_mater, cara_elem)
501 chnormx = chnorm.EXTR_COMP('DX',[],1)
502 ind_noeuds = chnormx.noeud
503 nom_allno = [mayaexp.NOMNOE.get()[k-1] for k in ind_noeuds]
505 # on met les noeuds conernes sous forme de liste et on va
506 # chercher les noeuds des mailles pour 'MAILLE' et 'GROUP_MA'
507 for typ in ['NOEUD','GROUP_NO','MAILLE','GROUP_MA']:
508 if modi_rep.has_key(typ) :
509 list_no_exp = find_no(mayaexp, {typ : modi_rep[typ]})
511 # boucle sur les noeuds pour modifier les reperes.
512 __bid = [None]*(len(list_no_exp) + 1)
515 for nomnoe in list_no_exp:
516 ind_no = nom_allno.index(nomnoe)
517 angl_naut = crea_repere(chnorm, ind_no, vect)
519 mcfact1.update({ 'NOEUD' : nomnoe })
520 mcfact2.update({ 'REPERE' : 'UTILISATEUR',
521 'ANGL_NAUT' : angl_naut})
522 args = {'MODI_CHAM' : mcfact1,
523 'DEFI_REPERE' : mcfact2 }
524 __bid[k+1] = MODI_REPERE( RESULTAT = __bid[k],
530 __proj = __bid[-1:][0]
533 if modi_rep['REPERE'] == 'UTILISATEUR' or modi_rep['REPERE'] == 'CYLINDRIQUE':
535 if type_cham == 'TENS_2D' or type_cham == 'TENS_3D' :
536 for typ in ['MAILLE','GROUP_MA',]:
537 if modi_rep.has_key(typ) :
538 mcfact1.update({typ : modi_rep[typ]})
540 for typ in ['NOEUD','GROUP_NO','MAILLE','GROUP_MA']:
541 if modi_rep.has_key(typ) :
542 mcfact1.update({typ : modi_rep[typ]})
544 if modi_rep['REPERE'] == 'CYLINDRIQUE' :
545 origine = modi_rep['ORIGINE']
546 axe_z = modi_rep['AXE_Z']
547 mcfact2.update({ 'REPERE' : 'CYLINDRIQUE',
551 elif modi_rep['REPERE'] == 'UTILISATEUR' :
552 angl_naut = modi_rep['ANGL_NAUT']
553 mcfact2.update({ 'REPERE' : 'UTILISATEUR',
554 'ANGL_NAUT' : angl_naut })
556 args = {'MODI_CHAM' : mcfact1,
557 'DEFI_REPERE' : mcfact2 }
559 __bidon = MODI_REPERE( RESULTAT = __proj,
562 DETRUIRE( CONCEPT= _F( NOM = __proj ), INFO=1)
566 #*************************************************
567 # Phase de selection des DDL de mesure
568 #*************************************************
571 if nume_ordr_demande[0]:
572 num_ordr = nume_ordr_demande
574 num_ordr = __proj.LIST_VARI_ACCES()['NUME_ORDRE']
576 __chamf = [None]*num_max
577 if isinstance( RESULTAT, evol_elas):
578 list_inst_ini = RESULTAT.LIST_VARI_ACCES()['INST']
579 if isinstance( RESULTAT, dyna_trans):
580 list_inst_ini = RESULTAT.LIST_VARI_ACCES()['INST']
581 if isinstance( RESULTAT, dyna_harmo):
582 list_freq_ini = RESULTAT.LIST_VARI_ACCES()['FREQ']
589 __chamex = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
595 for mcfiltre in FILTRE :
597 filtre = mcfiltre.val
598 for typ in ['NOEUD','GROUP_NO','MAILLE','GROUP_MA']:
599 if filtre.has_key(typ) :
600 mcfact1.update({typ : filtre[typ]})
601 mcfact1.update({'NOM_CMP' : filtre['DDL_ACTIF'],
602 'CHAM_GD' : __chamex })
603 filtres.append(mcfact1)
605 if NOM_CHAM == 'DEPL':
606 __chamf[ind-1] = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
612 elif NOM_CHAM == 'EPSI_NOEU_DEPL':
613 __chamf[ind-1] = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
622 valk.append(NOM_CHAM)
624 valk.append('EPSI_NOEU_DEPL')
625 UTMESS('F','OBSERVATION_6',valk)
627 if isinstance( RESULTAT, mode_meca):
628 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
630 'NUME_MODE' : int(afreq[ind-1,0]),
631 'FREQ' : afreq[ind-1,1],
634 if isinstance( RESULTAT, evol_elas):
635 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
637 'INST' : list_inst_ini[ind-1],
640 if isinstance( RESULTAT, dyna_trans):
641 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
643 'INST' : list_inst_ini[ind-1],
646 if isinstance( RESULTAT, dyna_harmo):
647 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
649 'FREQ' : list_freq_ini[ind-1],
653 if cham_mater is not None:
654 mcfact2['CHAM_MATER'] = cham_mater
655 if cara_elem is not None:
656 mcfact2['CARA_ELEM'] = cara_elem
658 liste.append(mcfact2)
659 DETRUIRE( CONCEPT= _F( NOM = __chamex ), INFO=1)
663 TYPE_RESU = TYPE_RESU,
668 #*************************************************
669 # Recopie des resultats (__proj) dans RESU
670 #*************************************************
672 if nume_ordr_demande[0]:
673 num_ordr = nume_ordr_demande
675 num_ordr = __proj.LIST_VARI_ACCES()['NUME_ORDRE']
677 __chamf = [None]*num_max
678 if isinstance( RESULTAT, evol_elas):
679 list_inst = __proj.LIST_VARI_ACCES()['INST']
680 if isinstance( RESULTAT, dyna_trans):
681 list_inst = __proj.LIST_VARI_ACCES()['INST']
682 if isinstance( RESULTAT, dyna_harmo):
683 list_freq = __proj.LIST_VARI_ACCES()['FREQ']
690 __chamex = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
697 mcfact1.update({'TOUT' : 'OUI',
698 'CHAM_GD' : __chamex })
699 filtres.append(mcfact1)
701 if NOM_CHAM == 'DEPL':
702 __chamf[ind-1] = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
708 elif NOM_CHAM == 'EPSI_NOEU_DEPL':
709 __chamf[ind-1] = CREA_CHAMP(TYPE_CHAM = TYPE_CHAM,
718 valk.append(NOM_CHAM)
720 valk.append('EPSI_NOEU_DEPL')
721 UTMESS('F','OBSERVATION_6',valk)
723 if isinstance( RESULTAT, mode_meca):
724 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
726 'NUME_MODE' : int(afreq[ind-1,0]),
727 'FREQ' : afreq[ind-1,1],
730 if isinstance( RESULTAT, evol_elas):
731 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
733 'INST' : list_inst[ind-1],
736 if isinstance( RESULTAT, dyna_trans):
737 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
739 'INST' : list_inst[ind-1],
742 if isinstance( RESULTAT, dyna_harmo):
743 mcfact2 = {'CHAM_GD' : __chamf[ind-1],
745 'FREQ' : list_freq[ind-1],
749 if cham_mater is not None:
750 mcfact2['CHAM_MATER'] = cham_mater
751 if cara_elem is not None:
752 mcfact2['CARA_ELEM'] = cara_elem
754 liste.append(mcfact2)
755 DETRUIRE( CONCEPT= _F( NOM = __chamex ), INFO=1)
759 TYPE_RESU = TYPE_RESU,
769 #**********************************************
770 # RECUPERATION DES NORMALES
771 #**********************************************
773 def crea_normale(self, modele_1, modele_2,
774 nume_ddl, cham_mater=None, cara_elem=None):
775 """Cree un champ de vecteurs normaux sur le maillage experimental, par
776 projection du champ de normales cree sur le maillage numerique
777 les mailles doivent etre des elements de <peau> (facettes)
779 PROJ_CHAMP = self.get_cmd('PROJ_CHAMP')
780 CREA_CHAMP = self.get_cmd('CREA_CHAMP')
781 CREA_RESU = self.get_cmd('CREA_RESU')
782 DEFI_GROUP = self.get_cmd('DEFI_GROUP')
785 # recherche du maillage associe au modele numerique
786 nom_modele_num = modele_1.nom
787 _maillag = aster.getvectjev( nom_modele_num.ljust(8) + '.MODELE .LGRF' )
788 maillage = _maillag[0].strip()
789 jdc = CONTEXT.get_current_step().jdc
790 mayanum = self.get_concept(maillage)
793 DEFI_GROUP( reuse = mayanum,
795 CREA_GROUP_MA = _F( NOM = '&&TOUMAI',
799 __norm1 = CREA_CHAMP( MODELE = modele_1,
800 OPERATION = 'NORMALE',
801 TYPE_CHAM = 'NOEU_GEOM_R',
802 GROUP_MA = '&&TOUMAI',
805 DEFI_GROUP( reuse = mayanum,
807 DETR_GROUP_MA = _F( NOM = '&&TOUMAI' )
811 __norm2 = CREA_CHAMP( OPERATION = 'ASSE',
812 TYPE_CHAM = 'NOEU_DEPL_R',
814 ASSE = _F( TOUT='OUI',
816 NOM_CMP=('X','Y','Z'),
817 NOM_CMP_RESU=('DX','DY','DZ')
821 affe_dct = {'CHAM_GD' : __norm2,
824 if cham_mater is not None:
825 affe_dct["CHAM_MATER"] = cham_mater
826 if cara_elem is not None:
827 affe_dct["CARA_ELEM"] = cara_elem
829 __norm3 = CREA_RESU( OPERATION = 'AFFE',
830 TYPE_RESU = 'EVOL_ELAS',
832 AFFE = _F(**affe_dct)
836 __norm4 = PROJ_CHAMP( RESULTAT = __norm3,
844 # __norm5 : toutes les normales au maillage au niveau des capteurs
845 __norm5 = CREA_CHAMP( RESULTAT = __norm4,
849 TYPE_CHAM = 'NOEU_DEPL_R',
855 #**********************************************************************
856 # Calcul des angles nautiques pour le repere local associe a la normale
857 #**********************************************************************
859 def crea_repere(chnorm, ind_no, vect):
861 """Creation d'un repere orthonormal a partir du vecteur normale et
862 d'une equation supplementaire donnee par l'utilisateur sous forme
863 de trois parametres et du vecteur de base concerne.
868 nom_para = vect.keys()[0] # nom_para = 'VECT_X' ou 'VECT_Y'
869 condition = list(vect[nom_para])
871 # 1) pour tous les noeuds du maillage experimental, recuperer la normale
872 # calculee a partir du maillage numerique
873 chnormx = chnorm.EXTR_COMP('DX',[],1)
874 chnormy = chnorm.EXTR_COMP('DY',[],1)
875 chnormz = chnorm.EXTR_COMP('DZ',[],1)
877 noeuds = chnormx.noeud
880 normale = [chnormx.valeurs[ind_no],
881 chnormy.valeurs[ind_no],
882 chnormz.valeurs[ind_no]]
884 # 2.1) soit l'utilisateur a donne un deuxieme vecteur explicitement
885 # (option VECT_X Ou VECT_Y). Dans ce cas la, le 3e est le produit
886 # vectoriel des deux premiers.
887 if nom_para == 'VECT_X' :
888 vect1 = numpy.array(list(vect[nom_para])) # vect x du reploc
889 vect2 = numpy.cross(normale,vect1)
890 reploc = numpy.array([vect1.tolist(), vect2.tolist(), normale])
891 reploc = numpy.transpose(reploc)
893 elif nom_para == 'VECT_Y' :
894 vect2 = numpy.array(list(vect[nom_para])) # vect y du reploc
895 vect1 = numpy.cross(vect2, normale)
896 reploc = numpy.array([vect1.tolist(), vect2.tolist(), normale])
897 reploc = numpy.transpose(reploc)
899 # 2.2) TODO : plutot que de donner explicitement un vecteur du repere
900 # local avec VECT_X/Y, on devrait aussi pouvoir donner une condition
901 # sous forme d'une equation sur un de ces vecteurs. Par exemple,
902 # CONDITION_X = (0.,1.,0.) signifierait que le vecteur X1 verifie
903 #x(X1) + y(X1) + z(X1) = 0
904 elif nom_para == 'CONDITION_X':
906 elif nom_para == 'CONDITION_Y':
909 # 3) Calcul de l'angle nautique associe au repere local
910 angl_naut = anglnaut(reploc)
915 #**********************************************************************
916 # Calcul des angles nautiques pour le repere associe a VECT_X et VECT_Y
917 #**********************************************************************
919 def crea_repere_xy(vect_x, vect_y):
921 """Calcul des angles nautiques a partir des directions vect_x et vect_y.
922 Si vect_x != None et vect_y != None alors on impose le premier vecteur de base
923 colineaire a vect_x et le deuxieme vecteur dans le plan (vect_x,vect_y)
924 Si vect_x != None et vect_y == None alors on impose le premier vecteur de base
926 Si vect_x == None et vect_y != None alors on impose le deuxieme vecteur de base
928 Si vect_x == None et vect_y == None alors on ne fait rien
932 from Utilitai.Utmess import UTMESS
934 if vect_x == None and vect_y == None:
935 angl_naut = (0.,0.,0.)
937 if vect_x and vect_y:
938 vx = numpy.array(list(vect_x))
939 vy = numpy.array(list(vect_y))
941 vect3 = numpy.cross(vx,vy)
942 vect2 = numpy.cross(vect3,vx)
945 vx = numpy.array(list(vect_x))
946 vy1 = numpy.cross((1.,0.,0.),vx)
947 vy2 = numpy.cross((0.,1.,0.),vx)
948 vy3 = numpy.cross((0.,0.,1.),vx)
960 UTMESS('F','UTILITAI_7')
961 vect3 = numpy.cross(vx,vy)
963 vect2 = numpy.cross(vect3,vect1)
966 vy = numpy.array(list(vect_y))
967 vx1 = numpy.cross((1.,0.,0.),vy)
968 vx2 = numpy.cross((0.,1.,0.),vy)
969 vx3 = numpy.cross((0.,0.,1.),vy)
981 UTMESS('F','UTILITAI_7')
982 vect3 = numpy.cross(vx,vy)
984 vect1 = numpy.cross(vect2, vect3)
987 norm12=numpy.dot(vect1,vect1)
988 norm22=numpy.dot(vect2,vect2)
989 norm32=numpy.dot(vect3,vect3)
990 if norm12 == 0 or norm22 == 0 or norm32 == 0:
991 UTMESS('F','UTILITAI_7')
993 reploc = numpy.array([vect1.tolist(),vect2.tolist(),vect3.tolist()])
994 reploc = numpy.transpose(reploc)
995 angl_naut = anglnaut(reploc)
999 #*****************************************************************************
1000 # Aller chercher une liste de noeuds pour un mot cle 'NOEUD', 'GROUP_NO'
1001 # 'MAILLE' ou 'GROUP_MA'
1002 #*****************************************************************************
1004 def find_no(maya,mcsimp):
1005 """ Si on demande une liste de noeuds, c'est simple, on retourne les noeuds
1006 Si on demande une liste de groupes de noeuds, on va chercher les noeuds
1007 dans ces groupes, en faisant attention a ne pas etre redondant
1008 Si on demande un liste de mailles, on va chercher dans le .CONNEX
1009 du maillage les indices, puis les noms des noeuds concernes
1016 if mcsimp.has_key('GROUP_NO') and type(mcsimp['GROUP_NO']) != tuple :
1017 mcsimp['GROUP_NO'] = [mcsimp['GROUP_NO']]
1018 if mcsimp.has_key('MAILLE') and type(mcsimp['MAILLE']) != tuple :
1019 mcsimp['MAILLE'] = [mcsimp['MAILLE']]
1020 if mcsimp.has_key('GROUP_MA') and type(mcsimp['GROUP_MA']) != tuple :
1021 mcsimp['GROUP_MA'] = [mcsimp['GROUP_MA']]
1023 if mcsimp.has_key('NOEUD') :
1024 list_no = list(mcsimp['NOEUD'])
1025 elif mcsimp.has_key('GROUP_NO') :
1026 for group in mcsimp['GROUP_NO'] :
1027 list_ind_no = list(numpy.array(maya.GROUPENO.get()[group.ljust(8)])-1)
1028 for ind_no in list_ind_no :
1029 nomnoe = maya.NOMNOE.get()[ind_no]
1030 if nomnoe not in list_no :
1031 list_no.append(nomnoe)
1032 elif mcsimp.has_key('MAILLE') :
1033 for mail in mcsimp['MAILLE'] :
1034 for index in range(len(maya.NOMMAI.get())):
1035 if maya.NOMMAI.get()[index].strip() == mail:
1037 for ind_no in maya.CONNEX.get()[nu_ma+1]:
1038 nomnoe = maya.NOMNOE.get()[ind_no-1]
1039 if nomnoe not in list_no:
1040 list_no.append(nomnoe)
1041 elif mcsimp.has_key('GROUP_MA') :
1042 for group in mcsimp['GROUP_MA'] :
1043 list_nu_ma = list(numpy.array(maya.GROUPEMA.get()
1044 [group.ljust(8)]) - 1)
1045 for nu_ma in list_nu_ma:
1046 for ind_no in maya.CONNEX.get()[nu_ma+1]:
1047 nomnoe = maya.NOMNOE.get()[ind_no-1]
1048 if nomnoe not in list_no:
1049 list_no.append(nomnoe)
1053 #*****************************************************************************
1054 # Aller chercher une liste de mailles pour un mot cle 'MAILLE' ou 'GROUP_MA'
1055 #*****************************************************************************
1057 def find_ma(maya,mcsimp):
1058 """ Si mot cle MAILLE, on retourne la liste des mailles
1059 Si mot cle GROUP_MA, on va chercher les mailles dans ces groupes
1065 if mcsimp.has_key('GROUP_MA') and type(mcsimp['GROUP_MA']) != tuple :
1066 mcsimp['GROUP_MA'] = [mcsimp['GROUP_MA']]
1067 if mcsimp.has_key('MAILLE') and type(mcsimp['MAILLE']) != tuple :
1068 mcsimp['MAILLE'] = [mcsimp['MAILLE']]
1070 if mcsimp.has_key('MAILLE') :
1071 for mail in mcsimp['MAILLE'] :
1072 list_ma.append(mail)
1073 elif mcsimp.has_key('GROUP_MA') :
1074 for group in mcsimp['GROUP_MA'] :
1075 list_ind_ma = list(numpy.array(maya.GROUPEMA.get()[group.ljust(8)])-1)
1076 for ind_ma in list_ind_ma :
1077 nommail = maya.NOMMAI.get()[ind_ma]
1078 if nommail not in list_ma :
1079 list_ma.append(nommail)
1084 #************************************************************************************
1085 # Quelques utilitaires de calculs d'angles nautiques (viennent de zmat004a.comm
1086 #************************************************************************************
1089 """Calcul de la norme euclidienne d'un vecteur"""
1091 tmp = numpy.sqrt(numpy.dot(x,x))
1098 """Calcule les angles nautiques correspondant a un repere local
1099 NB : seuls les deux premiers vecteurs de P (les images respectives
1100 de X et Y) sont utiles pour le calcul des angles
1105 # expression des coordonnees globales des 3 vecteurs de base locale
1106 x = numpy.array([1.,0.,0.])
1107 y = numpy.array([0.,1.,0.])
1108 z = numpy.array([0.,0.,1.])
1114 # calcul des angles nautiques
1116 # x1 projection de xg sur la plan xy, non norme
1118 # produit scalaire X xg
1120 if normx == 0.: # on impose alpha = 0 pour lever l'indetermination
1125 #produit vectoriel X xg
1127 ar=numpy.arctan2(SINA,COSA)
1128 alpha=ar*180/numpy.pi
1132 beta=numpy.arctan2(SINB,COSB)*180/numpy.pi
1134 P2=numpy.zeros((3,3))
1135 P2[0,0]=numpy.cos(ar)
1136 P2[1,0]=numpy.sin(ar)
1137 P2[1,1]=numpy.cos(ar)
1138 P2[0,1]=-numpy.sin(ar)
1143 COSG=numpy.dot(y1n,yg)
1144 SING=numpy.dot(xg,numpy.cross(y1n,yg))
1145 gamma=numpy.arctan2(SING,COSG)*180/numpy.pi
1147 return alpha,beta,gamma
1150 ## NB : Equations de passage : un vecteur de coordonnees globales (X,Y,Z) a pour
1151 ## coordonnees locales (X1,Y1,Z1) avec
1152 ## _ _ _ _ _ _ _ _ _ _
1153 ## | 1 0 0 || cos(B) 0 -sin(B) || cos(A) sin(A) 0 || X | | X1 |
1154 ## | 0 cos(G) sin(G) || 0 1 0 || -sin(A) cos(A) 0 || Y | = | Y1 |
1155 ## |_0 -sin(G) cos(G)_||_sin(B) 0 cos(B)_||_ 0 0 1_||_Z_| |_Z1_|
1157 ## A (alpha), B(beta), gamma (G) sont les angle nautiques que l'on donne habituellemet
1158 ## dans les MODI_REPERE. Les equations a resoudre sont les suivantes :
1159 ## cos(A)cos(B) = reploc[0][0]
1160 ## -cos(G)sin(A) + sin(G)cos(A)sin(B) = reploc[0][1]
1161 ## sin(A)sin(G) + cos(A)sin(B)cos(G) = reploc[0][2]
1163 ## sin(A)cos(B) = reploc[1][0]
1164 ## cos(A)cos(G) + sin(A)sin(B)sin(G) = reploc[1][1]
1165 ## -cos(A)sin(G) + sin(A)sin(B)cos(G) = reploc[1][2]
1167 ## -sin(B) = reploc[2][0]
1168 ## cos(B)sin(G) = reploc[2][1]
1169 ## cos(B)cos(G) = reploc[2][2]