def recu_coor_z(noma, group, typ_group, tole_r): import aster from Utilitai.Utmess import UTMESS collcnx = aster.getcolljev(noma.nom.ljust(8) + '.CONNEX') coord = aster.getvectjev(noma.nom.ljust(8) + '.COORDO .VALE') cnom = aster.getvectjev(noma.nom.ljust(8) + '.NOMNOE') coor_z = [] if typ_group == 'group_ma': nomgrma = group collgrma = aster.getcolljev(noma.nom.ljust(8) + '.GROUPEMA') if nomgrma.ljust(24) not in collgrma: UTMESS("F", "MISS0_26", valk=group) else: numa = collgrma[nomgrma.ljust(24)] for ima in numa: n = collcnx[ima][0] uzmin = round(coord[3 * (n - 1) + 2], tole_r) uzmax = round(coord[3 * (n - 1) + 2], tole_r) for i in range(len(collcnx[ima])): n = collcnx[ima][i] uzmin = min(uzmin, round(coord[3 * (n - 1) + 2], tole_r)) uzmax = max(uzmax, round(coord[3 * (n - 1) + 2], tole_r)) if uzmin not in coor_z: coor_z.append(uzmin) if uzmax not in coor_z: coor_z.append(uzmax) elif typ_group == 'group_no': collgrno = aster.getcolljev(noma.nom.ljust(8) + '.GROUPENO') nomgrno = group if nomgrno.ljust(24) not in collgrno: UTMESS("F", "MISS0_26", valk=group) else: grpn = collgrno[nomgrno.ljust(24)] l_coor_group = [] i = 0 for node in grpn: l_coor_group.append( aster.getvectjev( noma.nom.ljust(8) + '.COORDO .VALE', 3 * (node - 1), 3)) uz = round(l_coor_group[i][2], tole_r) i += 1 if uz not in coor_z: coor_z.append(uz) else: assert 0, 'recu_coor_z : erreur argument typ_group' prov = sorted(coor_z) coor_z = prov[::-1] return coor_z
def EXTR_TABLE(self, para=None): """Produit un objet Table à partir du contenu d'une table Aster. On peut limiter aux paramètres listés dans 'para'. """ def Nonefy(l1, l2): if l2 == 0: return None else: return l1 if not self.accessible(): raise AsException("Erreur dans table.EXTR_TABLE en PAR_LOT='OUI'") from Utilitai.Table import Table # titre titr = self.TITRE() # récupération des paramètres #v_tblp = aster.getvectjev('%-19s.TBLP' % self.get_name()) v_tblp = self.sdj.TBLP.get() if v_tblp == None: # retourne une table vide return Table(titr=titr, nom=self.nom) tabnom = list(v_tblp) nparam = len(tabnom) / 4 lparam = [tabnom[4 * i:4 * i + 4] for i in range(nparam)] # restriction aux paramètres demandés if para is not None: if type(para) not in (list, tuple): para = [ para, ] para = [p.strip() for p in para] restr = [] for ip in lparam: if ip[0].strip() in para: restr.append(ip) lparam = restr dval = {} # liste des paramètres et des types lpar = [] ltyp = [] for i in lparam: value = list(aster.getvectjev(i[2])) exist = aster.getvectjev(i[3]) dval[i[0].strip()] = map(Nonefy, value, exist) lpar.append(i[0].strip()) ltyp.append(i[1].strip()) n = len(dval[lpar[0]]) # contenu : liste de dict lisdic = [] for i in range(n): d = {} for p in lpar: d[p] = dval[p][i] lisdic.append(d) return Table(lisdic, lpar, ltyp, titr, self.nom)
def EXTR_TABLE(self, para=None): """Produit un objet TablePy à partir du contenu d'une table Aster. On peut limiter aux paramètres listés dans 'para'. """ def Nonefy(l1, l2): if l2 == 0: return None else: return l1 # titre titr = self.TITRE() # récupération des paramètres #v_tblp = aster.getvectjev('%-19s.TBLP' % self.getName()) v_tblp = self.sdj.TBLP.get() if v_tblp == None: # retourne une table vide return TablePy(titr=titr, nom=self.getName()) tabnom = list(v_tblp) nparam = len(tabnom) // 4 lparam = [tabnom[4 * i:4 * i + 4] for i in range(nparam)] # restriction aux paramètres demandés if para is not None: if not isinstance(para, (list, tuple)): para = [ para, ] para = [p.strip() for p in para] restr = [] for ip in lparam: if ip[0].strip() in para: restr.append(ip) lparam = restr dval = {} # liste des paramètres et des types lpar = [] ltyp = [] for i in lparam: value = list(aster.getvectjev(i[2])) if i[1].strip().startswith("K"): value = [j.strip() for j in value] exist = aster.getvectjev(i[3]) dval[i[0].strip()] = list(map(Nonefy, value, exist)) lpar.append(i[0].strip()) ltyp.append(i[1].strip()) n = len(dval[lpar[0]]) # contenu : liste de dict lisdic = [] for i in range(n): d = {} for p in lpar: d[p] = dval[p][i] lisdic.append(d) return TablePy(lisdic, lpar, ltyp, titr, self.getName())
def get_maillage(self): for ind_cham in range(3): # on ne s'interesse qu'aux champ 'DEPL','VITE' et 'ACCE' pour # gagner du temps if self.obj.sdj.TACH.get(): tach = self.obj.sdj.TACH.get()[ind_cham + 1][0] if tach.strip(): refe = self.nom.ljust( 8) + ".%03i.000001.REFE" % (ind_cham + 1) if aster.getvectjev(refe): self.maya_name = aster.getvectjev(refe)[0].strip() self.maya = self.objects.maillages[self.maya_name]
def dist_min_deux_points(mail): nno = aster.getvectjev(mail.getName().ljust(8) + '.DIME')[0] l_coor1 = [] l_coor2 = [] for i in range(nno - 1): l_coor1 = aster.getvectjev( mail.getName().ljust(8) + '.COORDO .VALE', 3 * (i), 3) l_coor2 = aster.getvectjev( mail.getName().ljust(8) + '.COORDO .VALE', 3 * (i + 1), 3) d = sqrt((l_coor1[0] - l_coor2[0])**2 + (l_coor1[1] - l_coor2[1])**2 + (l_coor1[2] - l_coor2[2])**2) if i == 0: dist = d else: dist = min(d, dist) return dist
def get_nume(self): """ Recherche d'un nume_ddl. Le pb est qu'il n'est pas necessaire d'avoir un nume_ddl pour faire un dyna_harmo. On cherche donc le maillage associe au resultat et on regarde quel nume possede ce meme maillage""" self.get_maillage() for nume in list(self.objects.nume_ddl.keys()): refe = nume.ljust(14) + '.NUME.REFN' if aster.getvectjev(refe): nom_maya = aster.getvectjev( refe)[0].strip() # maillage associe au nume_ddl if nom_maya == self.maya_name: self.nume_ddl_name = nume self.nume_ddl = self.objects.nume_ddl[nume] return self.nume_ddl
def Parametres(self): """ Retourne un dictionnaire contenant les parametres de la nappe, le type jeveux (NAPPE) n'est pas retourne, le dictionnaire peut ainsi etre fourni a CALC_FONC_INTERP tel quel, et une liste de dictionnaire des parametres de chaque fonction. """ from Utilitai.Utmess import UTMESS if not self.accessible(): raise AsException( "Erreur dans nappe.Parametres en PAR_LOT='OUI'") TypeProl = {'E': 'EXCLU', 'L': 'LINEAIRE', 'C': 'CONSTANT'} objev = '%-19s.PROL' % self.get_name() prol = aster.getvectjev(objev) if prol == None: UTMESS('F', 'SDVERI_2', valk=[objev]) dico = { 'INTERPOL': [prol[1][0:3], prol[1][4:7]], 'NOM_PARA': prol[2][0:16].strip(), 'NOM_RESU': prol[3][0:16].strip(), 'PROL_DROITE': TypeProl[prol[4][1]], 'PROL_GAUCHE': TypeProl[prol[4][0]], 'NOM_PARA_FONC': prol[6][0:4].strip(), } lparf = [] nbf = (len(prol) - 7) / 2 for i in range(nbf): dicf = { 'INTERPOL_FONC': [prol[7 + i * 2][0:3], prol[7 + i * 2][4:7]], 'PROL_DROITE_FONC': TypeProl[prol[8 + i * 2][1]], 'PROL_GAUCHE_FONC': TypeProl[prol[8 + i * 2][0]], } lparf.append(dicf) return [dico, lparf]
def LIST_SOUS_STRUCT(self): """ retourne la liste des sous structures du modele generalise la liste des macro-elements sous-jacents""" nommodgen = self.getName() ncham = nommodgen + (8 - len(nommodgen)) * ' ' ssno = aster.getvectjev(ncham + (14 - len(ncham)) * ' ' + '.MODG.SSNO') ssme = aster.getcolljev(ncham + (14 - len(ncham)) * ' ' + '.MODG.SSME') return [([ssno[ind], ssme[ind + 1]]) for ind in range(len(ssno))]
def ecri_rela_cine_old(cabl_precont, MAILLAGE): """ Ecriture des relations cinematiques contenues dans le concept cabl_precont """ from Calc_epx.calc_epx_cata import cata_compo l_cara = [] dic_ddl_impo = cata_compo['DEPL'] nomnoe = aster.getvectjev(MAILLAGE.nom.ljust(8) + ".NOMNOE") dic_nomnoe = {} for i, noeu in enumerate(nomnoe): dic_nomnoe[noeu] = i + 1 nom_cabl_pr = cabl_precont.nom.ljust(8) nb_rela = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLNR')[0] typ_coef = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLTC')[0] if typ_coef[:4] != 'REEL': raise Exception("Coefficients non reels") vec_sm = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLBE') vec_nb_coef = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLNT') pointeur = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLPO') vec_coef = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLCO') vec_nomnoe = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLNO') vec_nomddl = aster.getvectjev(nom_cabl_pr + '.LIRELA .RLDD') for i_rela in range(nb_rela): #le second membre doit etre nul if vec_sm[i_rela] != 0.E0: raise Exception("Second memnbre non nul") #nb de coefficient de la relation nb_coef = vec_nb_coef[i_rela] nb_coef_temp = nb_coef #position du dernier terme de la realtion adr = pointeur[i_rela] for i_coef in range(nb_coef): if vec_coef[adr - nb_coef + i_coef] == 0.E0: nb_coef_temp -= 1 l_cara.append('1 %s' % nb_coef_temp) for i_coef in range(nb_coef): coeff = vec_coef[adr - nb_coef + i_coef] if coeff != 0.E0: nomnoe_coef = vec_nomnoe[adr - nb_coef + i_coef] nomddl_coef = vec_nomddl[adr - nb_coef + i_coef] l_cara.append(' ' * 4 + str(coeff) + ' ' + str(dic_ddl_impo[nomddl_coef.rstrip()]) + ' ' + str(dic_nomnoe[nomnoe_coef]) + ' 0') return nb_rela, l_cara
def get_nume(self): """Recuperation de la numerotation et du nume_ddl""" indi = aster.getvectjev(self.nom.ljust(19) + '.INDI') if indi: iret, ibid, toto = aster.dismoi('NUME_DDL', self.nom, 'RESU_DYNA', 'C') self.nume_name = toto.strip() if self.nume_name: self.nume = self.objects.nume_ddl[self.nume_name]
def maillages(self): maillages = [] for carte in CaraElem.CARTES: ncham = self.nom.ljust(8) + "." + carte.ljust(10) + ".NOMA" maill = aster.getvectjev(ncham.ljust(32)) if maill: for m in maill: if m not in maillages: maillages.append(m) return maillages
def get(self): nomj = self.nomj() if aster.jeveux_exists(nomj): obj_simple = aster.jeveux_getattr(nomj, 'XOUS')[1].strip() == 'S' if obj_simple: return aster.getvectjev(nomj) else: return aster.getcolljev(nomj) else: return None
def EXTR_COMP(self, comp, lgma=[], topo=0): """Retourne les valeurs de la composante comp du champ sur la liste de groupes de mailles lgma avec eventuellement l'info de la topologie si topo>0. Si lgma est une liste vide, c'est equivalent a un TOUT='OUI' dans les commandes aster Arguments: comp (str): Name of the component. lgma (list[str]): List of groups of elements. topo (int): ``topo == 1`` means to return informations about the support of the field. Returns: :py:class:`.post_comp_cham_el`: Object containing the values and, eventually, the topological informations of the support. """ ncham = self.getName() ncham = ncham + (19 - len(ncham)) * ' ' nchams = aster.get_nom_concept_unique('_') ncmp = comp + (8 - len(comp)) * ' ' aster.prepcompcham(ncham, nchams, ncmp, "EL ", topo, lgma) valeurs = numpy.array( aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.V')) if (topo > 0): maille = (aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.M')) point = (aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.P')) sous_point = (aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.SP')) else: maille = None point = None sous_point = None aster.prepcompcham("__DETR__", nchams, ncmp, "EL ", topo, lgma) return post_comp_cham_el(valeurs, maille, point, sous_point)
def EXTR_COMP(self, comp=' ', lgno=[], topo=0): """ retourne les valeurs de la composante comp du champ sur la liste de groupes de noeuds lgno avec eventuellement l'info de la topologie si topo>0. Si lgno est une liste vide, c'est equivalent a un TOUT='OUI' dans les commandes aster Arguments: comp (str): Name of the component. lgno (list[str]): List of groups of nodes. topo (int): ``topo == 1`` means to return informations about the support of the field. Returns: :py:class:`.post_comp_cham_no`: Object containing the values and, eventually, the topological informations of the support. """ ncham = self.getName() ncham = ncham + (19 - len(ncham)) * ' ' nchams = aster.get_nom_concept_unique('_') ncmp = comp + (8 - len(comp)) * ' ' aster.prepcompcham(ncham, nchams, ncmp, "NO ", topo, lgno) valeurs = numpy.array( aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.V')) if (topo > 0): noeud = ( aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.N')) else: noeud = None if comp[:1] == ' ': comp = (aster.getvectjev(nchams + (19 - len(nchams)) * ' ' + '.C')) aster.prepcompcham( "__DETR__", nchams, ncmp, "NO ", topo, lgno) return post_comp_cham_no(valeurs, noeud, comp) else: aster.prepcompcham( "__DETR__", nchams, ncmp, "NO ", topo, lgno) return post_comp_cham_no(valeurs, noeud)
def LIST_SOUS_STRUCT(self): """ retourne la liste des sous structures du modele generalise la liste des macro-elements sous-jacents""" if not self.accessible(): raise AsException( "Erreur dans modele_gene.LIST_SOUS_STRUCT en PAR_LOT='OUI'") nommodgen = self.get_name() ncham = nommodgen + (8 - len(nommodgen)) * ' ' ssno = aster.getvectjev(ncham + (14 - len(ncham)) * ' ' + '.MODG.SSNO') ssme = aster.getcolljev(ncham + (14 - len(ncham)) * ' ' + '.MODG.SSME') return [([ssno[ind], ssme[ind + 1]]) for ind in range(len(ssno))]
def __getitem__(self, key): """Retourne la valeur d'une cellule de la table. Exemple : TAB['INST', 1] retourne la 1ère valeur de la colonne 'INST'.""" try: para, numlign = key except (TypeError, ValueError): raise RuntimeError("Table.__getitem__ takes exactly 2 arguments.") tabnom = self.sdj.TBLP.get() try: i = tabnom.index('%-24s' % para) resu = aster.getvectjev(tabnom[i + 2]) exist = aster.getvectjev(tabnom[i + 3]) assert resu is not None assert exist is not None assert exist[numlign - 1] != 0 res = resu[numlign - 1] except (ValueError, IndexError, AssertionError): # pour __getitem__, il est plus logique de retourner KeyError. raise KeyError return res
def Aster(self, suffixe='MATA'): """lit la matrice depuis l'espace Aster. nom : suffixe de l'objet jeveux """ import aster nom_obj_jeveux = string.ljust('PYTHON.TANGENT.' + suffixe, 24) obj_jeveux = aster.getvectjev(nom_obj_jeveux) if not obj_jeveux: raise RuntimeError('TANGENT : OBJET JEVEUX DE SUFFIXE ' + suffixe + ' INEXISTANT') self.Matrice(obj_jeveux)
def sdu_verif_nom_gd(nomgd): """vérifie que nomgd est bien un nom de grandeur""" nomgd2 = nomgd.strip() ptn = aster.getvectjev('&CATA.GD.NOMGD') ok = False for x in ptn: if x.strip() == nomgd2: ok = True break if not ok: checker.err(ojb, "condition non respectée : " + nomgd + " n'est pas un nom de grandeur.")
def __getitem__(self, key): """Retourne la valeur d'une cellule de la table. Exemple : TAB['INST', 1] retourne la 1ère valeur de la colonne 'INST'.""" from Utilitai.Utmess import UTMESS if not self.accessible(): raise AsException("Erreur dans table.__getitem__ en PAR_LOT='OUI'") assert len(key) == 2 para, numlign = key tabnom = self.sdj.TBLP.get() try: i = tabnom.index('%-24s' % para) resu = aster.getvectjev(tabnom[i + 2]) exist = aster.getvectjev(tabnom[i + 3]) assert resu is not None assert exist is not None assert exist[numlign - 1] != 0 res = resu[numlign - 1] except (IndexError, AssertionError): # pour __getitem__, il est plus logique de retourner KeyError. raise KeyError return res
def Valeurs(surface): # TODO : dirty workarround for this macro, until Surface.getValues() # implementaiton in c++ nsd = '%-19s' % surface.getName() dicv = aster.getcolljev(nsd + '.VALE') lpar = aster.getvectjev(nsd + '.PARA') lval = [] for k in range(len(dicv)): lbl = dicv[k + 1] dim = len(lbl) // 2 lval.append([lbl[0:dim], lbl[dim:2 * dim]]) return [list(lpar), lval]
def extr_nume_ordr(self): """! Extraction des numeros d'ordre de l'inter-spectre""" coupl_ddl = [] # Cas ou l'inter-spectre est defini par ses noeuds et composantes noeudi = aster.getvectjev(self.obj.nom.ljust(8) + '.NOEI') noeudj = aster.getvectjev(self.obj.nom.ljust(8) + '.NOEJ') cmpi = aster.getvectjev(self.obj.nom.ljust(8) + '.CMPI') cmpj = aster.getvectjev(self.obj.nom.ljust(8) + '.CMPJ') # l'inter-spectre n'est defini qu'avec des numeros d'ordre independants # du modele numi = aster.getvectjev(self.obj.nom.ljust(8) + '.NUMI') numj = aster.getvectjev(self.obj.nom.ljust(8) + '.NUMJ') if noeudi: self.isnume = 1 for ind in range(len(noeudi)): coupl_ddl.append( (noeudi[ind].split()[0] + '_' + cmpi[ind].split()[0], noeudj[ind].split()[0] + '_' + cmpj[ind].split()[0])) elif numi: self.isnume = 0 for ind in range(len(numi)): coupl_ddl.append((numi[ind], numj[ind])) return coupl_ddl
def EXTR_COMP(self, comp=' ', lgno=[], topo=0): """ retourne les valeurs de la composante comp du champ sur la liste de groupes de noeuds lgno avec eventuellement l'info de la topologie si topo>0. Si lgno est une liste vide, c'est equivalent a un TOUT='OUI' dans les commandes aster Attributs retourne - self.valeurs : numpy.array contenant les valeurs Si on a demande la topo (i.e. self.topo = 1) : - self.noeud : numero de noeud Si on demande toutes les composantes (comp = ' ') : - self.comp : les composantes associees a chaque grandeur pour chaque noeud """ import numpy if not self.accessible(): raise AsException("Erreur dans cham_no.EXTR_COMP en PAR_LOT='OUI'") ncham = self.get_name() ncham = ncham + (8 - len(ncham)) * ' ' nchams = ncham[0:7] + 'S' ncmp = comp + (8 - len(comp)) * ' ' aster.prepcompcham(ncham, nchams, ncmp, "NO ", topo, lgno) valeurs = numpy.array( aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.V')) if (topo > 0): noeud = (aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.N')) else: noeud = None if comp[:1] == ' ': comp = (aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.C')) aster.prepcompcham("__DETR__", nchams, ncmp, "NO ", topo, lgno) return post_comp_cham_no(valeurs, noeud, comp) else: aster.prepcompcham("__DETR__", nchams, ncmp, "NO ", topo, lgno) return post_comp_cham_no(valeurs, noeud)
def EXTR_COMP(self, comp, lgma, topo=0): """ retourne les valeurs de la composante comp du champ sur la liste de groupes de mailles lgma avec eventuellement l'info de la topologie si topo>0. Si lgma est une liste vide, c'est equivalent a un TOUT='OUI' dans les commandes aster Attributs retourne - self.valeurs : numpy.array contenant les valeurs Si on a demande la topo : - self.maille : numero de mailles - self.point : numero du point dans la maille - self.sous_point : numero du sous point dans la maille """ import numpy if not self.accessible(): raise AsException( "Erreur dans cham_elem.EXTR_COMP en PAR_LOT='OUI'") ncham = self.get_name() ncham = ncham + (8 - len(ncham)) * ' ' nchams = ncham[0:7] + 'S' ncmp = comp + (8 - len(comp)) * ' ' aster.prepcompcham(ncham, nchams, ncmp, "EL ", topo, lgma) valeurs = numpy.array( aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.V')) if (topo > 0): maille = (aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.M')) point = (aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.P')) sous_point = (aster.getvectjev(nchams + (19 - len(ncham)) * ' ' + '.SP')) else: maille = None point = None sous_point = None aster.prepcompcham("__DETR__", nchams, ncmp, "EL ", topo, lgma) return post_comp_cham_el(valeurs, maille, point, sous_point)
def recup_modele_partition(MATR_RIGI, dbg): nommod = None old_prtk1 = None # Recuperation de la sd_modele a partir de la matrice de rigidite # sur le schema des routines DISMOI/DISMMO/DISMMS/DISMNU/DISMPN/DISMLG matr_refa = MATR_RIGI.sdj.REFA.get() nume_lili = matr_refa[1][0:14] + '.NUME.LILI' vlili = aster.getvectjev(nume_lili[0:24]) buff_ligrel = vlili[1] if (buff_ligrel == 'LIAISONS'): UTMESS('F', 'MODAL_18') vlgrf = buff_ligrel[0:19] + '.LGRF' buff_modele = aster.getvectjev(vlgrf[0:24]) nommod = buff_modele[1] if (dbg): aster.affiche('MESSAGE', "Nom du modele retenu: " + str(nommod)) # Si parallele non centralise recuperation de lasd_partition et de son # option de partitionnement: old_prtk1 sd_partitb = None nompart = None vprtk = None vpartit = nommod[0:8] + '.PARTIT' sd_partitb = aster.getvectjev(vpartit) if (sd_partitb != None): nompart = sd_partitb[0] if (nompart != None): vprtk = aster.getvectjev(nompart[0:8] + '.PRTK') if (vprtk != None): old_prtk_buff = vprtk[0] old_prtk1 = old_prtk_buff.strip() if (dbg): aster.affiche( 'MESSAGE', "Nom de la partition retenue: " + str(nompart)) aster.affiche( 'MESSAGE', "Ancienne option de distribution: " + str(old_prtk1)) return nommod, old_prtk1
def get_maillage(self): """Recherche du maillage associe au resultat""" if not self.nume_name: self.get_nume() if self.nume_name: # methode 1 maillage = aster.getvectjev(self.nume_name[0:8].ljust(14) + ".NUME.REFN") self.maya_name = maillage[0].strip() self.maya = self.objects.maillages[self.maya_name] else: # methode 2 resu = self.nom liste_ordre = aster.getvectjev(resu.ljust(19) + '.ORDR') if not liste_ordre: return for j in liste_ordre: if j == 0: continue ordr = "%s.001.%06d" % (resu.ljust(8), j) info = aster.getvectjev(ordr.ljust(19) + ".REFE") if info is not None: if info[1].strip(): self.maya_name = info[0].strip() self.maya = self.objects.maillages[self.maya_name]
def get_nume(self): """Recherche des nume_ddl qui dependent de ce modele NB : attention, si plusieurs nume_ddl en dependent, seul le premier deviendra self.nume_ddl. C'est utile pour les modeles experimentaux pour lesquels le ddl est pipo. """ if self.nume_ddl is None: for nume_name, nume in list(self.objects.nume_ddl.items()): model = aster.getvectjev(nume_name.ljust(14) + ".NUME.LILI") if not model: pass elif model[1][:8] == self.nom: self.nume_ddl = nume self.nume_ddl_name = nume_name return
def LIST_GROUP_MA(self) : """ retourne la liste des groupes de mailles sous la forme : [ (gma1, nb mailles gma1, dime max des mailles gma1), ...] """ if not self.accessible(): raise AsException("Erreur dans maillage.LIST_GROUP_MA en PAR_LOT='OUI'") ltyma = aster.getvectjev("&CATA.TM.NOMTM") catama = aster.getcolljev("&CATA.TM.TMDIM") dic_gpma = self.sdj.GROUPEMA.get() if dic_gpma is None: return [] dimama = [catama[ltyma[ma-1].ljust(24)][0] for ma in self.sdj.TYPMAIL.get()] ngpma = [] for grp in dic_gpma.keys(): dim = max([dimama[ma-1] for ma in dic_gpma[grp]]) ngpma.append((grp.strip(), len(dic_gpma[grp]),dim)) return ngpma
def extr_matr_elim_lagr(self, matr_asse): import aster import numpy as NP matr_lagr=matr_asse.EXTR_MATR() # function EXTR_MATR available in the official source code #-----------------------------------------------------# #-- --# #-- Elimination des degres de libertes de Lagranges --# #-- --# #-- c.f. doc R4.06.02 - section 2.5 --# #-- + commentaires dans sdll123a.comm --# #-- --# #-----------------------------------------------------# iret,ibid,nom_nume = aster.dismoi('NOM_NUME_DDL',matr_asse.nom,'MATR_ASSE','F') Nume=aster.getvectjev(nom_nume.ljust(8)+' .NUME.DELG ' ) ind_lag1=[] ind_nolag=[] for i1 in range(len(Nume)) : if Nume[i1] > -0.5 : ind_nolag.append(i1) if (Nume[i1] < -0.5) & (Nume[i1] > -1.5): ind_lag1.append(i1) nlag1=len(ind_lag1) nnolag=len(ind_nolag) Z=NP.zeros((nnolag-nlag1,nnolag)) C=NP.vstack((matr_lagr[ind_lag1][:,ind_nolag],Z)) Q,R = NP.linalg.qr(NP.transpose(C)) dR=[] for i1 in range(len(R)) : dR.append(NP.abs(R[i1,i1])) mdR=NP.max(dR) indz=[] for i1 in range(len(R)) : if NP.abs(R[i1,i1]) <= mdR*1.e-16 : indz.append(i1) matr_sans_lagr=NP.dot(NP.transpose(Q[:][:,indz]),NP.dot(matr_lagr[ind_nolag][:,ind_nolag],Q[:][:,indz])) #-- Fin elimination return matr_sans_lagr
def LIST_GROUP_MA(self): """ retourne la liste des groupes de mailles sous la forme : [ (gma1, nb mailles gma1, dime max des mailles gma1), ...] """ ltyma = aster.getvectjev("&CATA.TM.NOMTM") catama = aster.getcolljev("&CATA.TM.TMDIM") dic_gpma = self.sdj.GROUPEMA.get() if dic_gpma is None: return [] dimama = [ catama[ltyma[ma - 1].ljust(24)][0] for ma in self.sdj.TYPMAIL.get() ] ngpma = [] for grp in list(dic_gpma.keys()): dim = max([dimama[ma - 1] for ma in dic_gpma[grp]]) ngpma.append((grp.strip(), len(dic_gpma[grp]), dim)) return ngpma
def get_matrices(self): """ recuperation des matrices du REFD et du nume_ddl""" indi = aster.getvectjev(self.nom.ljust(19) + '.INDI') if indi: iret, ibid, self.kass_name = aster.dismoi('REF_RIGI_PREM', self.nom, 'RESU_DYNA', 'C') iret, ibid, self.mass_name = aster.dismoi('REF_MASS_PREM', self.nom, 'RESU_DYNA', 'C') iret, ibid, self.cass_name = aster.dismoi('REF_AMOR_PREM', self.nom, 'RESU_DYNA', 'C') try: self.kass = self.objects.matrices[self.kass_name] self.mass = self.objects.matrices[self.mass_name] self.cass = self.objects.matrices[self.cass_name] except KeyError: pass