From: eficas <> Date: Mon, 20 Sep 2004 09:33:25 +0000 (+0000) Subject: CCAR: ajout des fichiers macros X-Git-Tag: CCAR_avant_7_3_22~4 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=16f6e9f687b4849e43f7bf6b644966f63588e3aa;p=tools%2Feficas.git CCAR: ajout des fichiers macros --- diff --git a/Aster/Cata/Macro/impr_fonction_ops.py b/Aster/Cata/Macro/impr_fonction_ops.py new file mode 100644 index 00000000..2283e755 --- /dev/null +++ b/Aster/Cata/Macro/impr_fonction_ops.py @@ -0,0 +1,351 @@ +#@ MODIF impr_fonction_ops Macro DATE 17/08/2004 AUTEUR DURAND C.DURAND +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== +# RESPONSABLE MCOURTOI M.COURTOIS + +import os.path + +def impr_fonction_ops(self, FORMAT, COURBE, INFO, **args): + """ + Macro IMPR_FONCTION permettant d'imprimer dans un fichier des fonctions, + colonnes de table... + Erreurs dans IMPR_FONCTION pour ne pas perdre la base. + """ + import aster + from Utilitai import Graph + from Accas import _F + ier=0 + # La macro compte pour 1 dans la numerotation des commandes + self.set_icmd(1) + + # On importe les definitions des commandes a utiliser dans la macro + # Le nom de la variable doit etre obligatoirement le nom de la commande + CALC_FONC_INTERP = self.get_cmd('CALC_FONC_INTERP') + DEFI_LIST_REEL = self.get_cmd('DEFI_LIST_REEL') + # DETRUIRE =self.get_cmd('DETRUIRE') + + #---------------------------------------------- + # 0. Traitement des arguments, initialisations + + # 0.1. Fichier + if args.has_key('UNITE'): + nomfich='fort.'+str(args['UNITE']) + else: + nomfich='impr_fonction.out' + if INFO==2: + print ' Nom du fichier :',nomfich + if os.path.exists(nomfich): + print ' Le fichier '+nomfich+' existe déjà. Il va etre écrasé.' + fich=open(nomfich,'w') + + # 0.2. Récupération des valeurs sous COURBE + unparmi=('FONCTION','LIST_RESU','FONC_X') + + Courbe=[] + for Ci in COURBE: + dC = Ci.cree_dict_valeurs(Ci.mc_liste) + for mc in dC.keys(): + if dC[mc]==None: del dC[mc] + Courbe.append(dC) + if INFO==2: + print ' Nombre de fonctions à analyser : ',len(Courbe) + + # 0.3. Devra-t-on interpoler globalement ? + # Dans ce cas, __linter est le LIST_PARA + # ou, à défaut, les abscisses de la première courbe + interp=0 + if FORMAT=='TABLEAU': + interp=1 + dCi=Courbe[0] + if dCi.has_key('LIST_PARA'): + __linter=dCi['LIST_PARA'] + else: + obj=None + for typi in unparmi: + if dCi.has_key(typi): + obj=dCi[typi] + typ=obj.__class__.__name__ + break + if obj==None: + raise aster.error, ' incohérence entre le catalogue et la macro.' + if typi=='FONCTION': + if typ=='nappe_sdaster': + lpar,lval=obj.Valeurs() + linterp=lval[0][0] + else: + linterp=obj.Valeurs()[0] + elif typi=='FONC_X': + lbid,linterp=obj.Valeurs() + __linter=DEFI_LIST_REEL(VALE=linterp) + if INFO==2: + print ' Interpolation globale sur la liste :\n',__linter.Valeurs() + + + #---------------------------------------------- + # 1. Récupération des valeurs des N courbes sous forme + # d'une liste de N listes + #---------------------------------------------- + graph=Graph.Graph() + iocc=-1 + for dCi in Courbe: + iocc=iocc+1 + + # 1.1. Type d'objet à traiter + obj=None + for typi in unparmi: + if dCi.has_key(typi): + obj=dCi[typi] + typ=obj.__class__.__name__ + break + if obj==None: + raise aster.error, ' incohérence entre le catalogue et la macro.' + + # 1.2. Extraction des valeurs + + # 1.2.1. Mot-clé FONCTION + if typi=='FONCTION': + if typ=='nappe_sdaster': + lpar,lval=obj.Valeurs() + dico,ldicf=obj.Parametres() + for i in range(len(lpar)): + p=lpar[i] + lx=lval[i][0] + ly=lval[i][1] + # sur quelle liste interpoler chaque fonction + if i==0: + if interp: + __li=__linter + elif dCi.has_key('LIST_PARA'): + __li=dCi['LIST_PARA'] + else: + __li=DEFI_LIST_REEL(VALE=lx) + # compléter les paramètres d'interpolation + dic=dico.copy() + for k,v in ldicf[i].items(): dic[k]=v + + if interp or dCi.has_key('LIST_PARA') or i>0: + __ftmp=CALC_FONC_INTERP( + FONCTION=obj, + VALE_PARA=p, + LIST_PARA_FONC=__li, + **dic + ) + pv,lv2=__ftmp.Valeurs() + lx=lv2[0][0] + ly=lv2[0][1] + # on stocke les données dans le Graph + dicC={ + 'Val' : [lx,ly], + 'Lab' : [dic['NOM_PARA_FONC'],dic['NOM_RESU']] + } + if dCi.has_key('LEGENDE'): dicC['Leg']=dCi['LEGENDE'] + if dCi.has_key('STYLE'): dicC['Sty']=dCi['STYLE'] + if dCi.has_key('COULEUR'): dicC['Coul']=dCi['COULEUR'] + if dCi.has_key('MARQUEUR'): dicC['Marq']=dCi['MARQUEUR'] + if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR'] + graph.AjoutCourbe(**dicC) + else: + __ftmp=obj + dpar=__ftmp.Parametres() + if interp: + __ftmp=CALC_FONC_INTERP( + FONCTION=obj, + LIST_PARA=__linter, + **dpar + ) + elif dCi.has_key('LIST_PARA'): + __ftmp=CALC_FONC_INTERP( + FONCTION=obj, + LIST_PARA=dCi['LIST_PARA'], + **dpar + ) + lval=list(__ftmp.Valeurs()) + lx=lval[0] + lr=lval[1] + if typ=='fonction_c' and dCi.has_key('PARTIE'): + if dCi['PARTIE']=='COMPLEXE' : lr=lval[2] + # on stocke les données dans le Graph + if typ=='fonction_c' and not dCi.has_key('PARTIE'): + dicC={ + 'Val' : lval, + 'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU']+'_R',dpar['NOM_RESU']+'_I'] + } + else: + dicC={ + 'Val' : [lx,lr], + 'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU']] + } + if dCi.has_key('LEGENDE'): dicC['Leg']=dCi['LEGENDE'] + if dCi.has_key('STYLE'): dicC['Sty']=dCi['STYLE'] + if dCi.has_key('COULEUR'): dicC['Coul']=dCi['COULEUR'] + if dCi.has_key('MARQUEUR'): dicC['Marq']=dCi['MARQUEUR'] + if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR'] + graph.AjoutCourbe(**dicC) + + # 1.2.2. Mot-clé LIST_RESU + elif typi=='LIST_RESU': + if interp and iocc>0: + raise aster.error, """ Il n'y a pas de règles d'interpolation pour LIST_PARA/LIST_RESU, + LIST_PARA/LIST_RESU ne peut donc apparaitre qu'une seule fois + et à la première occurence de COURBE""" + lx=dCi['LIST_PARA'].Valeurs() + lr=obj.Valeurs() + if len(lx)!=len(lr): + raise aster.error, " LIST_PARA et LIST_RESU n'ont pas la meme taille" + # on stocke les données dans le Graph + dicC={ + 'Val' : [lx,lr], + 'Lab' : [dCi['LIST_PARA'].get_name(),obj.get_name()] + } + if dCi.has_key('LEGENDE'): dicC['Leg']=dCi['LEGENDE'] + if dCi.has_key('STYLE'): dicC['Sty']=dCi['STYLE'] + if dCi.has_key('COULEUR'): dicC['Coul']=dCi['COULEUR'] + if dCi.has_key('MARQUEUR'): dicC['Marq']=dCi['MARQUEUR'] + if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR'] + graph.AjoutCourbe(**dicC) + + # 1.2.3. Mot-clé FONC_X + # exemple : obj(t)=sin(t), on imprime x=sin(t), y=cos(t) + # ob2(t)=cos(t) + elif typi=='FONC_X': + ob2=dCi['FONC_Y'] + # peut-on blinder au niveau du catalogue + if typ=="nappe_sdaster" or ob2.__class__.__name__=="nappe_sdaster": + raise aster.error, " FONC_X/FONC_Y ne peuvent pas etre des nappes !" + __ftmp=obj + dpar=__ftmp.Parametres() + __ftm2=ob2 + dpa2=__ftm2.Parametres() + intloc=0 + if interp: + intloc=1 + __li=__linter + elif dCi.has_key('LIST_PARA'): + intloc=1 + __li=dCi['LIST_PARA'] + if intloc: + __ftmp=CALC_FONC_INTERP( + FONCTION=obj, + LIST_PARA=__li, + **dpar + ) + lt,lx=__ftmp.Valeurs() + __ftm2=CALC_FONC_INTERP( + FONCTION=ob2, + LIST_PARA=__li, + **dpa2 + ) + else: + lt,lx=__ftmp.Valeurs() + __li=DEFI_LIST_REEL(VALE=lt) + __ftm2=CALC_FONC_INTERP( + FONCTION=ob2, + LIST_PARA=__li, + **dpa2 + ) + + lbid,ly=__ftm2.Valeurs() + #DETRUIRE(CONCEPT=_F(NOM='__ftmp'),) + #DETRUIRE(CONCEPT=_F(NOM='__ftm2'),) + # on stocke les données dans le Graph + if interp: + dicC={ + 'Val' : [lt,lx,ly], + 'Lab' : [dpar['NOM_PARA'],dpar['NOM_RESU'],dpa2['NOM_RESU']] + } + else: + dicC={ + 'Val' : [lx,ly], + 'Lab' : [dpar['NOM_PARA'],dpa2['NOM_RESU']] + } + if dCi.has_key('LEGENDE'): dicC['Leg']=dCi['LEGENDE'] + if dCi.has_key('STYLE'): dicC['Sty']=dCi['STYLE'] + if dCi.has_key('COULEUR'): dicC['Coul']=dCi['COULEUR'] + if dCi.has_key('MARQUEUR'): dicC['Marq']=dCi['MARQUEUR'] + if dCi.has_key('FREQ_MARQUEUR'): dicC['FreqM']=dCi['FREQ_MARQUEUR'] + graph.AjoutCourbe(**dicC) + + # 1.3. dbg + if INFO==2: + print '\n'+'-'*70+'\n Contenu du Graph : \n'+'-'*70 + print graph + print '-'*70+'\n' + + #---------------------------------------------- + # 2. Impression du 'tableau' de valeurs + #---------------------------------------------- + + # 2.0. Surcharge des propriétés du graphique et des axes + if args['TITRE']!=None: graph.Titre=args['TITRE'] + if args['SOUS_TITRE']!=None: graph.SousTitre=args['SOUS_TITRE'] + if FORMAT in ('XMGRACE','AGRAF'): + if args['BORNE_X']!=None: + graph.Min_X=args['BORNE_X'][0] + graph.Max_X=args['BORNE_X'][1] + if args['BORNE_Y']!=None: + graph.Min_Y=args['BORNE_Y'][0] + graph.Max_Y=args['BORNE_Y'][1] + if args['LEGENDE_X']!=None: graph.Legende_X=args['LEGENDE_X'] + if args['LEGENDE_Y']!=None: graph.Legende_Y=args['LEGENDE_Y'] + if args['ECHELLE_X']!=None: graph.Echelle_X=args['ECHELLE_X'] + if args['ECHELLE_Y']!=None: graph.Echelle_Y=args['ECHELLE_Y'] + if args['GRILLE_X']!=None: graph.Grille_X=args['GRILLE_X'] + if args['GRILLE_Y']!=None: graph.Grille_Y=args['GRILLE_Y'] + if args['TRI']!=None: graph.Tri=args['TRI'] + + # si Min/Max incohérents + if graph.Min_X > graph.Max_X or graph.Min_Y > graph.Max_Y: + graph.SetExtrema() + + # 2.1. au format TABLEAU + if FORMAT=='TABLEAU': + # surcharge par les formats de l'utilisateur + dico_formats={ + 'csep' : args['SEPARATEUR'], + 'ccom' : args['COMMENTAIRE'], + 'cdeb' : args['DEBUT_LIGNE'], + 'cfin' : args['FIN_LIGNE'] + } + tab=Graph.ImprTableau(graph,nomfich,dico_formats) + tab.Trace() + + # 2.2. au format AGRAF + elif FORMAT=='AGRAF': + nomdigr='fort.'+str(args['UNITE_DIGR']) + dico_formats={ 'formR' : '%12.5E' } + agraf=Graph.ImprAgraf(graph,[nomfich,nomdigr],dico_formats) + agraf.Trace() + + # 2.3. au format XMGRACE et dérivés + elif FORMAT=='XMGRACE': + dico_formats={ 'formR' : '%.8g' } + # parametres, valeurs par défaut : + if graph.Tri != '' and graph.Tri != 'N': + print ' TRI non traité au format XMGRACE' + + grace=Graph.ImprXmgrace(graph,nomfich,dico_formats) + grace.Pilote=args['PILOTE'] + grace.Trace() + + # 2.39. Format inconnu + else: + raise aster.error,' Format inconnu : '+FORMAT + + #---------------------------------------------- + # 9. Fin + return ier diff --git a/Aster/Cata/Macro/lire_fonction_ops.py b/Aster/Cata/Macro/lire_fonction_ops.py new file mode 100644 index 00000000..f4d92ce4 --- /dev/null +++ b/Aster/Cata/Macro/lire_fonction_ops.py @@ -0,0 +1,219 @@ +#@ MODIF lire_fonction_ops Macro DATE 16/06/2004 AUTEUR DURAND C.DURAND +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== + +import string,os,Numeric + + +###################################################################### +#### méthode de construction du VALE pour le format libre +###################################################################### +def m_format_libre(texte,INDIC_PARA,INDIC_RESU,SEPAR): + + # format LIBRE + # Les lignes contenant autre chose que des séquences de nombres + # réels et de séparateurs sont considérées comme délimitant deux + # fonctions différentes. Cette situation correspond à l exception + # ValueError levée par le map de float. Le deuxieme indice de + # INDIC_PARA et INDIC_RESU est l indice permettant de pointer sur la + # fonction voulue, au sens de ce découpage. + + from Utilitai.transpose import transpose + l_fonc=[] + fonc =[] + ier =0 + if SEPAR=='None' : SEPAR=None + for line in texte : + try : + if string.strip(line)=='' : raise ValueError + fonc.append(map(float,string.split(line,SEPAR))) + except ValueError: + if fonc==[] : pass # dans ce cas, on a plusieurs lignes délimitant 2 fonctions + else : + l_fonc.append(Numeric.array(fonc)) + fonc=[] + if fonc!=[] : + l_fonc.append(Numeric.array(fonc)) + + # vérifications de cohérences lignes et colonnes + ind_para=[INDIC_PARA[0]-1,INDIC_PARA[1]-1] + ind_resu=[INDIC_RESU[0]-1,INDIC_RESU[1]-1] + if INDIC_PARA[0]>len(l_fonc) : + ier=ier+1 + message= " INDIC_PARA :le nombre de blocs de fonctions dans " + message=message+"le fichier est inférieur à "+str(INDIC_PARA[0]) + return ier,message,[] + if INDIC_RESU[0]>len(l_fonc) : + ier=ier+1 + message= " INDIC_RESU :le nombre de blocs de fonctions dans " + message=message+"le fichier est inférieur à "+str(INDIC_RESU[0]) + return ier,message,[] + if INDIC_PARA[1]>len(l_fonc[ind_para[0]]) : + ier=ier+1 + message= " INDIC_PARA :la fonction numéro " + message=message+str(INDIC_PARA[0]) + message=message+" ne comporte que "+str(l_fonc[INDIC_PARA[0]])+" colonnes" + return ier,message,[] + if INDIC_RESU[1]>len(l_fonc[ind_resu[0]]) : + ier=ier+1 + message= " INDIC_RESU :la fonction numéro " + message=message+str(INDIC_RESU[0]) + message=message+" ne comporte que "+str(l_fonc[INDIC_RESU[0]])+" colonnes" + return ier,message,[] + + # construction du VALE de la fonction par recherche des indices + # de colonnes et de fonctions dans le tableau l_fonc + vale_1=l_fonc[ind_para[0]][:,ind_para[1]] + vale_2=l_fonc[ind_resu[0]][:,ind_resu[1]] + if len(vale_1)!=len(vale_2) : + ier=ier+1 + message= " INDIC_RESU :les deux colonnes demandées " + message=message+" pour INDIC_PARA et INDIC_RESU n ont pas la meme longueur :" + message=message+str(len(vale_1))+" et "+str(len(vale_2)) + return ier,message,[] + liste_vale=transpose([vale_1,vale_2]) + def add(x,y):return x+y + liste_vale=reduce(add,liste_vale) + return ier,'',liste_vale + +###################################################################### +#### recherche d une liste simple +###################################################################### +def liste_simple(texte,INDIC_PARA,SEPAR): + + # format LIBRE + # liste simple + + l_fonc=[] + fonc =[] + ier =0 + if SEPAR=='None' : SEPAR=None + for line in texte : + try : + if string.strip(line)=='' : raise ValueError + fonc.append(map(float,string.split(line,SEPAR))) + except ValueError: + if fonc==[] : pass # dans ce cas, on a plusieurs lignes délimitant 2 fonctions + else : + l_fonc.append(Numeric.array(fonc)) + fonc=[] + if fonc!=[] : + l_fonc.append(Numeric.array(fonc)) + + # vérifications de cohérences lignes et colonnes + ind_para=[INDIC_PARA[0]-1,INDIC_PARA[1]-1] + if INDIC_PARA[0]>len(l_fonc) : + ier=ier+1 + message= " INDIC_PARA :le nombre de blocs de fonctions dans " + message=message+"le fichier est inférieur à "+str(INDIC_PARA[0]) + return ier,message,[] + if INDIC_PARA[1]>len(l_fonc[ind_para[0]]) : + ier=ier+1 + message= " INDIC_PARA :la fonction numéro " + message=message+str(INDIC_PARA[0]) + message=message+" ne comporte que "+str(l_fonc[INDIC_PARA[0]])+" colonnes" + self.cr.fatal(message) + return ier,message,[] + + # construction du VALE de la fonction par recherche des indices + # de colonnes et de fonctions dans le tableau l_fonc + vale_1=l_fonc[ind_para[0]][:,ind_para[1]] + return ier,'',vale_1.tolist() + +###################################################################### +#### méthode corps de la macro +###################################################################### +def lire_fonction_ops(self,FORMAT,TYPE,SEPAR,INDIC_PARA,UNITE, + NOM_PARA,NOM_RESU,INTERPOL,PROL_DROITE, + PROL_GAUCHE,VERIF,INFO,TITRE,**args): + ier=0 + + from Accas import _F +# On recopie le mot cle defi_fonction pour le proteger + if TYPE=='NAPPE' : + mc_DEFI_FONCTION=args['DEFI_FONCTION'] + + # On importe les definitions des commandes a utiliser dans la macro + DEFI_FONCTION =self.get_cmd('DEFI_FONCTION') + DEFI_NAPPE =self.get_cmd('DEFI_NAPPE') + + # La macro compte pour 1 dans la numerotation des commandes + self.set_icmd(1) + + # Lecture de la fonction dans un fichier d unité logique UNITE + + file="./fort."+str(UNITE) + if not os.path.isfile(file) : + ier=ier+1 + self.cr.fatal(" le fichier d unité logique "+str(UNITE)+" est introuvable") + return ier + file=open(file,'r') + texte=file.readlines() + file.close() + + self.DeclareOut('ut_fonc',self.sd) + + if TYPE=='FONCTION': + # mise en forme de la liste de valeurs suivant le format choisi : + ier,message,liste_vale=m_format_libre(texte,INDIC_PARA,args['INDIC_RESU'],SEPAR) + if ier!=0 : + self.cr.fatal(message) + return ier + + # création de la fonction ASTER : + ut_fonc=DEFI_FONCTION( NOM_PARA =NOM_PARA, + NOM_RESU =NOM_RESU, + PROL_DROITE=PROL_DROITE, + PROL_GAUCHE=PROL_GAUCHE, + INTERPOL =INTERPOL, + INFO =INFO, + TITRE =TITRE, + VERIF =VERIF, + VALE =liste_vale,) + + elif TYPE=='NAPPE': + + # création de la nappe ASTER : + motscles={} + motscles['DEFI_FONCTION']=[] + for elem in mc_DEFI_FONCTION: + ier,message,liste_vale=m_format_libre(texte,args['INDIC_ABSCISSE'],elem['INDIC_RESU'],SEPAR) + if ier!=0 : + self.cr.fatal(message) + return ier + motscles['DEFI_FONCTION'].append( _F( VALE =liste_vale, + INTERPOL =args['INTERPOL_FONC'], + PROL_DROITE=args['PROL_DROITE_FONC'], + PROL_GAUCHE=args['PROL_GAUCHE_FONC'] ) ) + ier,message,liste_para=liste_simple(texte,INDIC_PARA,SEPAR) + if ier!=0 : + self.cr.fatal(message) + return ier + ut_fonc=DEFI_NAPPE( PARA =liste_para, + NOM_PARA =NOM_PARA, + NOM_PARA_FONC =args['NOM_PARA_FONC'], + NOM_RESU =NOM_RESU, + PROL_DROITE =PROL_DROITE, + PROL_GAUCHE =PROL_GAUCHE, + INTERPOL =INTERPOL, + INFO =INFO, + TITRE =TITRE, + VERIF =VERIF, + **motscles) + + return ier diff --git a/Aster/Cata/Macro/lire_table_ops.py b/Aster/Cata/Macro/lire_table_ops.py new file mode 100644 index 00000000..af584db3 --- /dev/null +++ b/Aster/Cata/Macro/lire_table_ops.py @@ -0,0 +1,174 @@ +#@ MODIF lire_table_ops Macro DATE 06/07/2004 AUTEUR CIBHHPD S.VANDENBERGHE +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== + +import string + + +###################################################################### +#### méthode de construction du dictionnaire +#### PARAMETRE / LISTE DE VALEURS +###################################################################### +def lecture_table(texte,nume,separ): + + # format ASTER + # Les lignes contenant autre chose que des séquences de nombres + # réels et de séparateurs sont considérées comme délimitant deux + # fonctions différentes. Cette situation correspond à l exception + # ValueError levée par le map de float. Le deuxieme indice de + # VALE_PARA et VALE_RESU est l indice permettant de pointer sur la + # fonction voulue, au sens de ce découpage. + + from Utilitai.transpose import transpose + if string.strip(separ)=='' : separ=None + tab_lue={} + nume_lign=[] + idt_deb='#DEBUT_TABLE\n' + idt_fin='#FIN_TABLE\n' + idt_tit='#TITRE' + if nume>texte.count(idt_deb) : + message= " NUME_TABLE :le nombre de blocs de tables dans " + message=message+"le fichier est "+str(texte.count(idt_deb)) + return 1,message,None,None,None + for i in range(nume): + texte=texte[texte.index(idt_deb)+1:] + texte=texte[:texte.index(idt_fin)] + + titre_tab=[string.rstrip(elem[7:-1]) for elem in texte if elem.find(idt_tit)!=-1] + texte_tab=[elem.split(separ) for elem in texte if elem.find(idt_tit)==-1] + + if ( separ!=None) : + tab_trav=[] + for line in texte_tab : + ligne=[] + for elem in line : + if ( elem != '' and elem !='\n') : + ligne.append(string.strip(elem)) + tab_trav.append(ligne) + texte_tab=tab_trav + + list_para=texte_tab[0] + list_type=texte_tab[1] + texte_tab.pop(0) + texte_tab.pop(0) + nb_para=len(texte_tab[0]) + + for line in texte_tab : + if len(line)!=nb_para : + message= " incoherence dans le nombre de colonnes " + message=message+"de la table a lire" + return 1,message,None,None,None + texte_tab=transpose(texte_tab) + for i in range(nb_para): + tab_trav=[] + list_val=[] + col_type=list_type[i] + if col_type=='R': + try : + texte_tab[i]=map(float,texte_tab[i]) + nume_lign.append([0]) + except ValueError: +# Presence de - dans la ligne + for indice in range(len(texte_tab[i])): + if texte_tab[i][indice]!='-': + tab_trav.append(indice+1) + list_val.append(float(texte_tab[i][indice])) + + nume_lign.append(tab_trav) + texte_tab[i]=list_val + elif col_type=='I' : + try : + texte_tab[i]=map(int,texte_tab[i]) + nume_lign.append([0]) +# Presence de - dans la ligne + except ValueError: + for indice in range(len(texte_tab[i])): + if texte_tab[i][indice]!='-': + tab_trav.append(indice+1) + list_val.append(float(texte_tab[i][indice])) + nume_lign.append(tab_trav) + texte_tab[i]=list_val + + else : + try : nume_lign.append([0]) + except ValueError: pass + + tab_lue[list_para[i]]=(list_type[i],texte_tab[i],nume_lign[i]) + + return 0,None,titre_tab,list_para,tab_lue + +###################################################################### +#### méthode corps de la macro LIRE_TABLE +###################################################################### +def lire_table_ops(self,UNITE,FORMAT,NUME_TABLE,SEPARATEUR, + TYPE_TABLE,PARA,TITRE,**args): + from Accas import _F + import os + + ier=0 + ### On importe les definitions des commandes a utiliser dans la macro + CREA_TABLE =self.get_cmd('CREA_TABLE') + + ### La macro compte pour 1 dans la numerotation des commandes + self.set_icmd(1) + + ### Lecture de la table dans un fichier d unité logique UNITE + file="./fort."+str(UNITE) + if not os.path.isfile(file) : + ier=ier+1 + self.cr.fatal(" le fichier d unité logique "+str(UNITE)+" est introuvable") + return ier + file=open(file,'r') + texte=file.readlines() + file.close() + + ### mise en forme de la liste de valeurs suivant le format choisi : + if FORMAT=='ASTER': + ier,message,titr_tab,list_para,tab_lue=lecture_table(texte,NUME_TABLE,SEPARATEUR) + if ier!=0 : + self.cr.fatal(message) + return ier + else : pass + + ### création de la table ASTER : + self.DeclareOut('ut_tab',self.sd) + mcfact=[] + num_col=0 + for tab_para in list_para: + mcsimp={} + mcsimp['PARA']=tab_para + + if tab_lue[tab_para][2] != [0] : + mcsimp['NUME_LIGN']=tab_lue[tab_para][2] + + if tab_lue[tab_para][0] not in ('I','R') : + mcsimp['TYPE_K'] =tab_lue[tab_para][0] + mcsimp['LISTE_K']=tab_lue[tab_para][1] + elif tab_lue[tab_para][0]=='I' : + mcsimp['LISTE_I']=tab_lue[tab_para][1] + elif tab_lue[tab_para][0]=='R' : + mcsimp['LISTE_R']=tab_lue[tab_para][1] + + mcfact.append( _F(**mcsimp) ) + num_col = num_col + 1 + motscles={} + motscles['LISTE']=mcfact + + ut_tab=CREA_TABLE(TITRE=titr_tab,TYPE_TABLE=TYPE_TABLE, **motscles) + + return ier diff --git a/Aster/Cata/Macro/macr_ascouf_calc_ops.py b/Aster/Cata/Macro/macr_ascouf_calc_ops.py new file mode 100644 index 00000000..4a590f17 --- /dev/null +++ b/Aster/Cata/Macro/macr_ascouf_calc_ops.py @@ -0,0 +1,680 @@ +#@ MODIF macr_ascouf_calc_ops Macro DATE 17/08/2004 AUTEUR DURAND C.DURAND +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== +def macr_ascouf_calc_ops(self,TYPE_MAILLAGE,CL_BOL_P2_GV,MAILLAGE,MODELE,CHAM_MATER,CARA_ELEM, + FOND_FISS,CHARGE,RESU_THER,AFFE_MATERIAU, + PRES_REP,ECHANGE,TORS_P1,COMP_INCR,COMP_ELAS, + SOLVEUR,CONVERGENCE,NEWTON,RECH_LINEAIRE, + INCREMENT,THETA_3D,IMPR_TABLE,IMPRESSION,INFO,TITRE ,**args): + """ + Ecriture de la macro MACR_ASCOUF_CALC + """ + from Accas import _F + import types + import math + import aster + from math import pi,sin,cos,sqrt,atan2 + ier=0 +# On recopie les mots cles affe_materiau et impr_table pour les proteger + mc_AFFE_MATERIAU=AFFE_MATERIAU + mc_IMPR_TABLE =IMPR_TABLE + # On importe les definitions des commandes a utiliser dans la macro + AFFE_MODELE =self.get_cmd('AFFE_MODELE' ) + AFFE_MATERIAU =self.get_cmd('AFFE_MATERIAU' ) + AFFE_CARA_ELEM =self.get_cmd('AFFE_CARA_ELEM' ) + AFFE_CHAR_THER_F =self.get_cmd('AFFE_CHAR_THER_F') + THER_LINEAIRE =self.get_cmd('THER_LINEAIRE' ) + AFFE_CHAR_MECA =self.get_cmd('AFFE_CHAR_MECA' ) + STAT_NON_LINE =self.get_cmd('STAT_NON_LINE' ) + CALC_ELEM =self.get_cmd('CALC_ELEM' ) + IMPR_RESU =self.get_cmd('IMPR_RESU' ) + IMPR_TABLE =self.get_cmd('IMPR_TABLE' ) + DEFI_FOND_FISS =self.get_cmd('DEFI_FOND_FISS' ) + CALC_THETA =self.get_cmd('CALC_THETA' ) + CALC_G_THETA_T =self.get_cmd('CALC_G_THETA_T' ) + CALC_G_LOCAL_T =self.get_cmd('CALC_G_LOCAL_T' ) + POST_RCCM =self.get_cmd('POST_RCCM' ) + POST_RELEVE_T =self.get_cmd('POST_RELEVE_T' ) + + # La macro compte pour 1 dans la numerotation des commandes + self.set_icmd(1) +#------------------------------------------------------------------ +# DATA + GRMAIL = ('COUDE','PEAUINT','PEAUEXT','EXTUBE','CLGV','FACE1','FACE2') +#------------------------------------------------------------------ +# + if CL_BOL_P2_GV!=None : + if TYPE_MAILLAGE=='SOUS_EPAIS_COUDE' : + print ' la condition aux limites sur bol a section conique' + print ' est ignoree pour un coude avec sous-epaisseurs' + elif (TYPE_MAILLAGE[:4]!='FISS') and (CL_BOL_P2_GV['AZIMUT']!=None) : + ier=ier+1 + self.cr.fatal(""" mot-cle AZIMUT non autorise dans le cas d''un coude sain""") + return ier +# + if mc_IMPR_TABLE!=None : + FLAG = 0 + if (mc_IMPR_TABLE['NOM_PARA']==None) and (mc_IMPR_TABLE['POSI_ANGUL']==None) and (mc_IMPR_TABLE['POSI_CURV_LONGI']==None) : + ier=ier+1 + self.cr.fatal(""" POSI_ANGUL POSI_CURV_LONGI est obligatoire""") + return ier + if (mc_IMPR_TABLE['NOM_PARA']!=None) : + impr_table_nom_para= mc_IMPR_TABLE['NOM_PARA'] + for impt in impr_table_nom_para : + if impt in ('SI_LONG','SI_CIRC','SI_RADI') : + FLAG = 1 + if (((impt['ANGLE']==None) and (impt['POSI_ANGUL']==None) and (impt['R_CINTR' ]==None)) or + ((impt['ANGLE']==None) and (impt['R_CINTR' ]==None) and (impt['POSI_CURV_LONGI']==None)) ) : + ier=ier+1 + self.cr.fatal(""" il faut renseigner : ANGLE, R_CINTR et POSI_ANGUL ou ANGLE, R_CINTR et POSI_CURV_LONGI""") + return ier + if (mc_IMPR_TABLE['NOM_PARA']==None) : FLAG = 1 + if not FLAG : print ' ANGL_COUDE et ANGL_SOUS_EPAI sont inutiles dans ce cas' +# +#------------------------------------------------------------------ +# +# --- commande AFFE_MODELE --- +# + self.DeclareOut('modele',MODELE) + mcfact=[] + if (PRES_REP!=None) and (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[:4]=='FISS') : + mcfact.append(_F(GROUP_MA=GRMAIL ,PHENOMENE='MECANIQUE',MODELISATION='3D' )) + else: + mcfact.append(_F(GROUP_MA=GRMAIL[:5] ,PHENOMENE='MECANIQUE',MODELISATION='3D' )) + if TORS_P1!=None : + mcfact.append(_F(GROUP_MA='P1' ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR')) + if CL_BOL_P2_GV==None : + mcfact.append(_F(GROUP_MA='P2' ,PHENOMENE='MECANIQUE',MODELISATION='DIS_TR')) + modele = AFFE_MODELE( MAILLAGE = MAILLAGE , + AFFE = mcfact ) + if ECHANGE!=None : # modele thermique + __modthe = AFFE_MODELE( MAILLAGE = MAILLAGE , + AFFE = _F(TOUT ='OUI', + PHENOMENE ='THERMIQUE', + MODELISATION='3D' ) ) +#------------------------------------------------------------------ +# +# --- commande AFFE_MATERIAU --- +# + if CHAM_MATER!=None : self.DeclareOut('affmat',CHAM_MATER) + mcfact=[] + for mater in mc_AFFE_MATERIAU : + if mater['TOUT']!=None : + mcfact.append(_F(TOUT =mater['TOUT' ],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + rccmat = mater['MATER'] + else : + mcfact.append(_F(GROUP_MA=mater['GROUP_MA'],MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + if mater['GROUP_MA'][:5]=='COUDE' : + if TORS_P1!=None : + mcfact.append(_F(GROUP_MA='P1',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + elif (len(mc_AFFE_MATERIAU)==1) and (CL_BOL_P2_GV==None) : + mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + elif (mater['BOL' ][:3]=='BOL' ) and (CL_BOL_P2_GV==None) : + mcfact.append(_F(GROUP_MA='P2',MATER=mater['MATER'],TEMP_REF=mater['TEMP_REF'])) + affmat = AFFE_MATERIAU( MAILLAGE = MAILLAGE , + MODELE = modele , + AFFE = mcfact ) +#------------------------------------------------------------------ +# +# --- commande AFFE_CARA_ELEM --- +# + if (TORS_P1!=None) or (CL_BOL_P2_GV==None) : + if CARA_ELEM!=None : self.DeclareOut('carael',CARA_ELEM) + motscles={} + motscles['DISCRET']=[] + if (TORS_P1!=None) : motscles['DISCRET'].append(_F( GROUP_MA='P1' , + CARA ='K_TR_D_N', + VALE = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),) + if (CL_BOL_P2_GV==None) : motscles['DISCRET'].append(_F( GROUP_MA='P2' , + CARA ='K_TR_D_N', + VALE = ( 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ) ),) + + carael = AFFE_CARA_ELEM( MODELE = modele ,**motscles) +# + if ECHANGE!=None : +#------------------------------------------------------------------ +# +# --- commande AFFE_CHAR_THER_F --- +# condition aux limites +# + __chther = AFFE_CHAR_THER_F( MODELE = __modthe , + ECHANGE= _F(GROUP_MA='PEAUINT', + COEF_H =ECHANGE['COEF_H'], + TEMP_EXT=ECHANGE['TEMP_EXT'],), ) +#------------------------------------------------------------------ +# +# --- calcul thermique --- +# + if RESU_THER!=None : self.DeclareOut('resuth',RESU_THER) + mcsimp={} + if INCREMENT['NUME_INST_INIT']!=None : mcsimp['NUME_INIT']=INCREMENT['NUME_INST_INIT'] + if INCREMENT['NUME_INST_FIN' ]!=None : mcsimp['NUME_FIN' ]=INCREMENT['NUME_INST_FIN' ] + mcfact=_F(LIST_INST=INCREMENT['LIST_INST'],**mcsimp) + resuth = THER_LINEAIRE( MODELE = __modthe , + CHAM_MATER = affmat , + TEMP_INIT = _F(STATIONNAIRE='OUI',), + EXCIT = _F(CHARGE=__chther,), + INCREMENT = mcfact, ) +# + if CHARGE!=None : self.DeclareOut('chmeth',CHARGE) + chmeth = AFFE_CHAR_MECA( MODELE = modele , + TEMP_CALCULEE = resuth ) +#------------------------------------------------------------------ +# +# --- commande AFFE_CHAR_MECA --- +# condition aux limites de type raccord 3d-poutre +# ou bien blocage de mouvements rigides en cas d embout +# a section conique, bol de type gv +# + motscles={} + motscles['LIAISON_ELEM']=[] + if TORS_P1!=None : + motscles['LIAISON_ELEM'].append(_F( OPTION ='3D_POU' , + GROUP_MA_1='EXTUBE', + GROUP_NO_2='P1') ) + if CL_BOL_P2_GV==None : + motscles['LIAISON_ELEM'].append(_F( OPTION ='3D_POU' , + GROUP_MA_1='CLGV', + GROUP_NO_2='P2') ) + motscles['DDL_IMPO' ]=_F( GROUP_NO ='P2' , + DX = 0.0 , + DY = 0.0 , + DZ = 0.0 , + DRX = 0.0 , + DRY = 0.0 , + DRZ = 0.0 , ) + else : + motscles['FACE_IMPO' ]=_F( GROUP_MA ='CLGV' , + DNOR = 0.0 , ) + ALPHA = CL_BOL_P2_GV['ANGLE' ] + AZIM = CL_BOL_P2_GV['AZIMUT'] + ALPHAR = ALPHA*pi/180.0 + AZIMR = AZIM *pi/180.0 + DDLB1 = [] + COEFB1 = [] + if (AZIM!=0.0) and (AZIM!=180.0) and (ALPHA!=90.0) : + DDLB1.append('DX') + COEFB1.append(SIN(AZIMR)*COS(ALPHAR)) + if (AZIM!=90.0) : + DDLB1.append('DY') + COEFB1.append(COS(AZIMR)) + if (AZIM!=0.) and (AZIM!=180.) and (ALPHA!=0.): + DDLB1.append('DZ') + COEFB1.append(-SIN(AZIMR)*SIN(ALPHAR)) + POINT=['BOUT1',]*len(DDLB1) + motscles['LIAISON_DDL']=_F( GROUP_NO = POINT , + DDL = DDLB1 , + COEF_MULT = COEFB1 , + COEF_IMPO = 0.0 , ) + + __conlim = AFFE_CHAR_MECA( MODELE = modele ,**motscles) +# +# --- commande AFFE_CHAR_MECA --- +# chargement mecanique : pres_rep, effet de fond +# + if PRES_REP!=None : + motscles={} + if (PRES_REP['PRES_LEVRE']=='OUI') and (TYPE_MAILLAGE[:4]=='FISS') : + motscles['PRES_REP']=_F( GROUP_MA = ('PEAUINT','FACE1','FACE2') , + PRES = PRES_REP['PRES'] ,) + else : + motscles['PRES_REP']=_F( GROUP_MA = 'PEAUINT', + PRES = PRES_REP['PRES'] ,) + if PRES_REP['EFFE_FOND_P1']!=None : + motscles['EFFE_FOND']=_F( GROUP_MA_INT = 'BORDTU' , + GROUP_MA = 'EXTUBE' , + PRES = PRES_REP['PRES'] ,) +# + __chpres = AFFE_CHAR_MECA( MODELE = modele ,**motscles) +# +# --- commande AFFE_CHAR_MECA --- +# chargement mecanique : torseur d efforts +# + if TORS_P1!=None : + __chtor = [None]*6 + i=0 + for tors in TORS_P1: + mcsimp={} + if tors['FX']!=None : mcsimp['FX']=tors['FX'] + if tors['FY']!=None : mcsimp['FY']=tors['FY'] + if tors['FZ']!=None : mcsimp['FZ']=tors['FZ'] + if tors['MX']!=None : mcsimp['MX']=tors['MX'] + if tors['MY']!=None : mcsimp['MY']=tors['MY'] + if tors['MZ']!=None : mcsimp['MZ']=tors['MZ'] + mcfact=_F(GROUP_NO='P1',**mcsimp) + __chtor[i] = AFFE_CHAR_MECA( MODELE = modele , + FORCE_NODALE = mcfact , ) + i=i+1 +# +# --- commande STAT_NON_LINE --- +# + motscles={} +# + mcfex=[] # mot clé facteur EXCIT + mcfex.append(_F(CHARGE=__conlim,)) + if ECHANGE!=None : + mcfex.append(_F(CHARGE=chmeth,)) + if PRES_REP!=None: + if PRES_REP['FONC_MULT']!=None : + mcfex.append(_F(CHARGE=__chpres,FONC_MULT=PRES_REP['FONC_MULT'])) + else : + mcfex.append(_F(CHARGE=__chpres,)) + if TORS_P1!=None: + i=0 + for tors in TORS_P1 : + if tors['FONC_MULT']!=None : + mcfex.append(_F(CHARGE=__chtor[i],FONC_MULT=tors['FONC_MULT'])) + else : + mcfex.append(_F(CHARGE=__chtor[i],)) + i=i+1 + motscles['EXCIT'] =mcfex +# + mcfci=[] # mot clé facteur COMP_INCR :obligatoire pour les noeuds discrets + if COMP_INCR!=None : + mcfci.append(_F(TOUT='OUI' ,RELATION=COMP_INCR['RELATION'])) + elif COMP_ELAS!=None : + motscles['COMP_ELAS'] =_F(GROUP_MA='COUDE',RELATION=COMP_ELAS['RELATION']) + if TORS_P1!=None : mcfci.append( _F(GROUP_MA='P1',RELATION='ELAS')) + if CL_BOL_P2_GV==None: mcfci.append( _F(GROUP_MA='P2',RELATION='ELAS')) + motscles['COMP_INCR'] =mcfci +# + dSolveur=SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste) + for i in dSolveur.keys(): + if dSolveur[i]==None : del dSolveur[i] +# + dConverg=CONVERGENCE[0].cree_dict_valeurs(CONVERGENCE[0].mc_liste) + for i in dConverg.keys(): + if dConverg[i]==None : del dConverg[i] +# + dNewton=NEWTON[0].cree_dict_valeurs(NEWTON[0].mc_liste) + for i in dNewton.keys(): + if dNewton[i]==None : del dNewton[i] +# + dRechlin=RECH_LINEAIRE[0].cree_dict_valeurs(RECH_LINEAIRE[0].mc_liste) + for i in dRechlin.keys(): + if dRechlin[i]==None : del dRechlin[i] +# + dIncrem=INCREMENT[0].cree_dict_valeurs(INCREMENT[0].mc_liste) + for i in dIncrem.keys(): + if dIncrem[i]==None : del dIncrem[i] +# + if TITRE!=None : + motscles['TITRE' ] =TITRE + motscles ['SOLVEUR' ] =dSolveur + motscles ['CONVERGENCE' ] =dConverg + motscles ['NEWTON' ] =dNewton + motscles ['RECH_LINEAIRE'] =dRechlin + motscles ['INCREMENT' ] =dIncrem + self.DeclareOut('nomres',self.sd) + nomres = STAT_NON_LINE( MODELE = modele , + CHAM_MATER = affmat , + CARA_ELEM = carael , + INFO = INFO , **motscles) +# +# --- commande CALC_ELEM --- +# + motscles = {} + if ECHANGE!=None : + motscles['EXCIT']=_F(CHARGE = chmeth) + nomres = CALC_ELEM( reuse = nomres, + RESULTAT = nomres , + MODELE = modele , + CHAM_MATER = affmat , + CARA_ELEM = carael , + TOUT_ORDRE = 'OUI' , + OPTION = ('SIEF_ELNO_ELGA','EQUI_ELNO_SIGM') , + INFO = INFO , **motscles) +# +# --- post-traitements --- +# + if TYPE_MAILLAGE=='SOUS_EPAIS_COUDE': +# +# --- post traitement sous-epaisseurs: ligaments --- +# + if mc_IMPR_TABLE!=None: +# + SECT=('MI','TU','GV') + LIG=('FDRO','EXDR','EXTR','EXGA','FGAU','INGA','INTR','INDR') + if mc_IMPR_TABLE['POSI_ANGUL']==None: + ASEP=(mc_IMPR_TABLE['POSI_CURV_LONGI']/mc_IMPR_TABLE['R_CINTR'])*(180./pi) + else : + ASEP=mc_IMPR_TABLE['POSI_ANGUL'] +# +# moyenne_rccm, invariant et moyenne sur les ligaments dans +# l epaisseur +# + l_grno=MAILLAGE.LIST_GROUP_NO() + tablig=[None]*4 +# +# prelevements des ligaments circonferentiels et longitudinaux +# de la sous-epaisseur +# + lgrno=[] + for tgrno in l_grno : + if tgrno[0][:3] in ('CIR','LON') : lgrno.append(tgrno[0]) + elif tgrno[0][:5]=='PCENT' : lgrno.append(tgrno[0]) + elif (tgrno[0][:4] in LIG) and (tgrno[0][4:6] not in ('GV','TU','MI')): lgrno.append(tgrno[0]) +# + motscles={} + motscles['SEGMENT']=[] + for grno in lgrno : motscles['SEGMENT'].append(_F(INTITULE=grno,GROUP_NO=grno)) + motscles['TITRE']='TABLE DE POST-TRAITEMENT SECTION SOUS-EPAISSEUR' + tablig[1]=POST_RCCM(MATER = rccmat, + MAILLAGE = MAILLAGE, + TYPE_RESU_MECA = 'EVOLUTION', + OPTION = 'PM_PB', + TRANSITOIRE=_F(RESULTAT=nomres, + NOM_CHAM='SIEF_ELNO_ELGA',),**motscles) +# + motscles={} + motscles['ACTION']=[] + for tgrno in lgrno : + motscles['ACTION'].append(_F(RESULTAT=nomres, + NOM_CHAM='SIEF_ELNO_ELGA', + INTITULE=tgrno, + GROUP_NO=tgrno, + INVARIANT='OUI', + OPERATION='EXTRACTION',)) + motscles['TITRE']='TABLE DE POST-TRAITEMENT SECTION SOUS-EPAISSEUR' + + tablig[2]=POST_RELEVE_T(**motscles) +# + motscles={} + nommail=MAILLAGE.nom + coord =aster.getvectjev(nommail.ljust(8)+'.COORDO .VALE') + linomno =aster.getvectjev(nommail.ljust(8)+'.NOMNOE') + collgrno=aster.getcolljev(nommail.ljust(8)+'.GROUPENO') + + motscles['ACTION']=[] + for tgrno in lgrno : + if tgrno[:3]!='LON' : + if mc_IMPR_TABLE['TRANSFORMEE']=='TUBE': vecty=(0.,0.,1.) + else : vecty=(sin(ASEP*pi/180.),0.,cos(ASEP*pi/180.)) + else : + if mc_IMPR_TABLE['TRANSFORMEE']=='TUBE': vecty=(0.,0.,1.) + else : + grpn=collgrno['FGAUTU '] + LT1=coord[3*(grpn[0]-1)+2] + for node in grpn: + X = coord[3*(node-1)] + Y = coord[3*(node-1)+1] + Z = coord[3*(node-1)+2] + RCIN = mc_IMPR_TABLE['R_CINTR'] + if Z= 0: # not currently bracketed + if abs(f1)=0: + raise BracketingException("initial interval does not bracket a root") + x4 = 123456789. + for j in range(max_iterations): + x3 = (x1+x2)/2 + f3 = f(x3) + temp = f3*f3 - f1*f2 + x4, x4old = x3 + (x3-x1)*sgn(f1-f2)*f3/temp**.5, x4 + f4 = f(x4) + if f1*f4<0: # x1 and x4 bracket root + x2, f2 = x4, f4 + else: # x4 and x2 bracket root + x1, f1 = x4, f4 + if min(abs(x1-x2),abs(x4-x4old))=120.) and (AZIM<=240.0): X = RM-EP/2.0 - SUREP + else: X = RM-EP/2.0 + else: X = RM+EP/2.0 + AZIMR = AZIM*2.0*pi/360.0 +# +# -- CALCUL COTE AXIALE DU CENTRE FISSURE SUR LA PLAQUE EN FONCTION +# DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE OU DE LA POSITION +# ANGULAIRE +# + if DSF: + if GEOM=='COUDE': SFP = SF/(1.0+X/RC*cos(AZIMR)) + else : SFP = SF + else : + BETAR = BETA*2.0*pi/360.0 + if (GEOM=='COUDE'): + SF = BETAR*(RC+X*cos(AZIMR)) + SFP = SF/(1.0+X/RC*cos(AZIMR)) + else: + SF = BETAR*RC + SFP = SF + if (GEOM=='COUDE'): print 'COTE AXIALE CENTRE FISSURE SUR COUDE : %.2f'%SF + if (GEOM=='TUBE') : print 'COTE AXIALE CENTRE FISSURE SUR TUBE : %.2f'%SF + print 'COTE AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP +# +# ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES +# DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA +# PARTIE RESTANT DANS LE COUDE. +# + if (GEOM=='COUDE'): DIST = ALPHA*2.0*pi/360.0*(RC+X*cos(AZIMR)) + else : DIST = ALPHA*2.0*pi/360.0*RC + BCOUD = 0.0 + BEMB = 0.0 + if abs(ORIEN)<0.01: +# -- FISSURE LONGITUDINALE (0 DEGRE) + BSUP = SF + AXEC + BINF = SF - AXEC + if BSUP>DIST: + BCOUD = DIST - BINF + BEMB = BSUP - DIST + elif BINF<0. : + BCOUD = BSUP + BEMB = abs(BINF) + elif (BINF>=0. and BSUP<=DIST): + BCOUD = 2.0*AXEC + elif abs(ORIEN-90.)<0.01: +# -- FISSURE CIRCONFERENTIELLE (90 DEGRES) + BSUP = SF + BINF = SF + if BSUP>DIST: + BCOUD = DIST - BINF + BEMB = BSUP - DIST + elif BINF<0. : + BCOUD = BSUP + BEMB = abs(BINF) + elif (BINF>=0. and BSUP<=DIST): + BCOUD = 2.0*AXEC + else: +# -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS + BSUP = SF + sqrt(2.0)/2.0*AXEC + BINF = SF - sqrt(2.0)/2.0*AXEC + if BSUP>DIST: + BCOUD = (DIST - BINF)*sqrt(2.0) + BEMB = (BSUP - DIST)*sqrt(2.0) + elif BINF<0. : + BCOUD = BSUP *sqrt(2.0) + BEMB = abs(BINF)*sqrt(2.0) + elif (BINF>=0. and BSUP<=DIST): + BCOUD = 2.0*AXEC + print 'PARTIE DU GRAND AXE DANS LE COUDE : %.2f'%BCOUD + print 'PARTIE DU GRAND AXE DANS L EMBOUT : %.2f'%BEMB +# +# -- CALCUL DE LA TAILLE DU GRAND AXE FISSURE SUR LA PLAQUE +# + NEWT=0 + if abs(ORIEN)<0.01: +# -- FISSURE LONGITUDINALE (0 DEGRE) + if GEOM=='COUDE': AXECP = BCOUD/(1.0+X/RC*cos(AZIMR)) + BEMB + else : AXECP = BCOUD + BEMB + elif abs(ORIEN-90.)<0.01: +# -- FISSURE CIRCONFERENTIELLE (90 DEGRES) + AXECP = (BCOUD+BEMB)*RM/X + else : + if GEOM=='COUDE': +# ------- TRANSFORMATION COUDE + if AZIM in (0.,180.): +# -- FISSURE A +/- 45 DEGRES SUR INTRADOS OU EXTRADOS + AXECP = BCOUD*RM*sqrt(2.)/( X*sqrt(1.+(RM/X+RM/RC*cos(AZIMR))**2) )+\ + BEMB*sqrt( (1.0+(X/RM)**2)*0.5 ) + else : +# -- FISSURE A +/- 45 DEGRES AILLEURS + AXECP = root(ASCFON,(BCOUD-1.,BCOUD+1.)) + AXECP = AXECP + BEMB*sqrt( (1.+(X/RM)**2)*0.5 ) + AXECC = ASCFON(AXECP)+BCOUD + NEWT=1 + elif GEOM=='TUBE': + AXECP = (BCOUD+BEMB)*sqrt( (1.+(X/RM)**2)*0.5 ) + else : + AXECP = BCOUD + BEMB +# + if GEOM=='COUDE': + print 'TAILLE GRAND AXE COUDE DONNE : %.2f'%(2.*AXEC) + elif GEOM=='TUBE': + print 'TAILLE GRAND AXE TUBE DONNE : %.2f'%(2.*AXEC) + print 'TAILLE GRAND AXE PLAQUE DEDUIT : %.2f'%AXECP + if NEWT: + print 'METHODE DE NEWTON FISSURE A 45 DEGRES -->' + print 'TAILLE GRAND AXE COUDE RECALCULE : %.2f'%AXECC + if GEOM=='COUDE' and BEMB>0. and BSUP>DIST : + SFP = ALPHA*2.*pi*RC/360. - AXECP/2. + BEMB + print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT' + print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP + if GEOM=='COUDE' and BEMB>0. and BINF<0. : + SFP = + AXECP/2. - BEMB + print 'CORRECTION CENTRE : FISSURE A CHEVAL SUR EMBOUT' + print 'ABSC. CURV. AXIALE CENTRE FISSURE SUR PLAQUE : %.2f'%SFP +# +# -- CORRECTION DU PETIT AXE DE LA FISSURE QUAND CELLE-CI SE TROUVE SUR +# LA ZONE DE SUREPAISSEUR +# + ALPHAR = ALPHA*2.*pi/360. + ZSUR1 = ALPHAR*RC/10. + ZSUR2 = ALPHAR*RC*9./10. + YFISS = (AZIMR-pi/2.)*RM + MU = 0. + if (AZIM>=120.) and (AZIM<=240.): + if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = 1. + elif (SFP<=ZSUR1): MU = SFP/ZSUR1 + elif (SFP>ZSUR2): MU = (ALPHAR*RC-SFP)/ZSUR1 + elif (AZIM>=90.) and (AZIM<=120.): + if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = YFISS/(pi/6.*RM) + elif (SFP<=ZSUR1): MU = YFISS*SFP/(pi/6.*RM*ZSUR1) + elif (SFP>ZSUR2): MU = YFISS*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1) + elif (AZIM>=240.) and (AZIM<=270.): + if (SFP>=ZSUR1) and (SFP<=ZSUR2): MU = (YFISS-5.*pi/6.*RM)/(pi/6.*RM) + elif (SFP<=ZSUR1): MU = (YFISS-5.*pi/6.*RM)*SFP/(pi/6.*RM*ZSUR1) + elif (SFP>ZSUR2): MU = (YFISS-5.*pi/6.*RM)*(ALPHAR*RC-SFP)/(pi/6.*RM*ZSUR1) +# + if SUREP!=0.: + AXEAP = AXEA * EP / ( EP + MU*SUREP ) + print '--> CORRECTION DUE A LA SUREPAISSEUR' + print '--> TAILLE PETIT AXE PLAQUE : %.2f'%AXEAP + else: AXEAP = AXEA +# + return AXEAP,AXECP,SFP +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCSEP +# taille initiale sur la plaque des sous-epaisseurs +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# ALPHA = ANGLE DU COUDE +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# EP = EPAISSEUR DU COUDE +# GEOM = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE) +# SYME = QUART DE STRUCTURE SI 'OUI' +# + +def ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP,GEOM,SYME): + ier=0 + CG=pi/180. +# +# --- BOUCLE SUR L ENSEMBLE DES SOUS-EPAISSEURS +# + i=0 + for ssep in MCL_SOUS_EPAIS : + i=i+1 + print '-------------------------------------' + print 'SOUS-EPAISSEUR NUMERO %d'%i + print '-------------------------------------' +# +# --- CAS DES SOUS-EPAISSEURS AXISYMETRIQUES +# + if ssep['TYPE']=='AXIS': + print 'SOUS-EPAISSEUR AXISYMETRIQUE : ' + print 'CALCUL DE LA TAILLE LONGI ENVELOPPE EN INTRADOS (AZIMUT PI)' + ssep.ICIRP = 2.*pi*RM + ssep.ISCP = pi*RM + ssep.IPHIC = 180. + AZIMC = pi + else: +# +# -- CALCUL DE L ABSCISSE CURVILIGNE CIRCONF.SUR LA PLAQUE +# EN FONCTION DE L AZIMUT OU DE L ABSCISSE CURVIL.CIRCONF +# SUR LE COUDE DU CENTRE DE LA SOUS-EPAISSEUR +# NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE +# + if ssep['POSI_CURV_CIRC']!=None: + ssep.ISCP = ssep['POSI_CURV_CIRC']*RM/(RM+EP/2.) + AZIMC = ssep.ISCP/RM + ssep.IPHIC = ssep['POSI_CURV_CIRC']/(RM+EP/2.)*180./pi + print 'AZIMUT CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%ssep.IPHIC + else: + ssep.ISCP = ssep['AZIMUT']*pi*RM/180. + AZIMC = ssep['AZIMUT']*pi/180. + print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%(AZIMC*(RM+EP/2.)) +# +# PASSAGE DANS LE REPERE PLAQUE (0,2PI) AVEC ORIGINE FLANC DROIT +# CAR L ORIGINE DES DONNEES CIRCONF. EST EN EXTRADOS +# + if ssep.ISCP>(3.*pi*RM/2.): ssep.ISCP = ssep.ISCP - 3.*pi*RM/2. + else: ssep.ISCP = ssep.ISCP + pi*RM/2. + print 'ABSC. CURV. CIRCONF. CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISCP +# +# -- CALCUL DE LA TAILLE CIRCONFERENTIELLE +# NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE +# + ssep.ICIRP = ssep['AXE_CIRC']*(RM/(RM+EP/2.)) + if ssep.ICIRP>(2.*pi*RM) : + print ' ASCSEP valeur hors domaine' + print ' sous-epaisseur numero : %d'%i + print ' taille axe circonferentiel : %.2f'%ssep.ICIRP + print ' bord plaque : %.2f'%2*pi*RM + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + print 'TAILLE CIRCONFERENTIELLE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ICIRP + print '<=> TAILLE EQUIVALENTE SUR LA CIRCONFERENCE (DEGRES) : %.2f'%(ssep.ICIRP*360./(2.*pi*RM)) +# +# -- CALCUL COTE AXIALE DU CENTRE SOUS-EPAISSEUR SUR LA PLAQUE +# EN FONCTION DE L ABSCISSE CURVILIGNE DONNEE SUR LE COUDE +# OU DE LA POSITION ANGULAIRE +# NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE +# + if ssep['POSI_CURV_LONGI']!=None: + if GEOM=='COUDE': + ssep.ISLP = ssep['POSI_CURV_LONGI']/(1.+(RM+EP/2.)/RC*cos(AZIMC)) + AZIML = ssep.ISLP/RC + print 'ANGLE COUDE CENTRE SOUS-EPAISSEUR (DEGRES) : %.2f'%(AZIML*180./pi) + else : + ssep.ISLP = ssep['POSI_CURV_LONGI'] + if (SYME in ('QUART','DEMI')) and (ssep.ISLP!=ALPHA*CG*RC/2.) : + print ' ASCSEP cas de symetrie :' + print ' la sous-epaisseur doit etre dans la section mediane du coude !' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + else : + if GEOM=='COUDE': + print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR COUDE : %.2f'%((ssep.BETA)*CG*(RC+(RM+EP/2.)*cos(AZIMC))) + AZIML = (ssep.BETA)*CG + else : + print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR TUBE : %.2f'%((ssep.BETA)*CG*RC) + ssep.ISLP = (ssep.BETA)*CG*RC + if (SYME in ('QUART','DEMI')) and (ssep.BETA!=ALPHA/2.) : + print ' ASCSEP cas de symetrie :' + print ' la sous-epaisseur doit etre dans la section mediane du coude !' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP +# +# -- CALCUL DE LA TAILLE LONGITUDINALE +# NB : MESURE FAITE EN PEAU EXTERNE SUR LE COUDE +# +# ON ENVISAGE LE CAS OU UNE PARTIE DE L AXE EST DANS LES +# DROITES DES EMBOUTS. LA TRANSFORMATION N EST FAITE QUE SUR LA +# PARTIE RESTANT DANS LE COUDE. +# + if GEOM=='COUDE' : DIST = ALPHA*CG*(RC+(RM+EP/2.)*cos(AZIMC)) + else : DIST = ALPHA*CG*RC + if ssep['POSI_CURV_LONGI']!=None: + BSUP = ssep['POSI_CURV_LONGI']+ssep['AXE_LONGI']/2. + BINF = ssep['POSI_CURV_LONGI']-ssep['AXE_LONGI']/2. + else: + if GEOM=='COUDE' : + BSUP = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))+ssep['AXE_LONGI']/2. + BINF = ssep.BETA*CG*(RC+(RM+EP/2.)*cos(AZIMC))-ssep['AXE_LONGI']/2. + else: + BSUP = ssep.BETA*CG*RC + ssep['AXE_LONGI']/2. + BINF = ssep.BETA*CG*RC - ssep['AXE_LONGI']/2. + BCOUD1 = 0. + BCOUD2 = 0. + BEMB1 = 0. + BEMB2 = 0. + if BINF<0. and BSUP>DIST : + BCOUD1 = DIST + BEMB1 = abs(BINF) + BSUP-DIST + elif BSUP>DIST : + BCOUD1 = DIST - BINF + BEMB1 = BSUP - DIST + elif BINF<0 : + BCOUD2 = BSUP + BEMB2 = abs(BINF) + elif (BINF>=0. and BSUP<=DIST) : + BCOUD1 = ssep['AXE_LONGI'] + BCOUD = BCOUD1+ BCOUD2 + BEMB = BEMB1 + BEMB2 + if GEOM=='COUDE' : BPLAQ = BCOUD/(1.+(RM+EP/2.)/RC*cos(AZIMC)) + else : BPLAQ = BCOUD + ssep.ILONP = BPLAQ+BEMB + if BEMB1>0.: + ssep.ISLP = ALPHA*CG*RC - ssep.ILONP/2. + BEMB1 + print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT' + print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP + if BEMB2>0.: + ssep.ISLP = ssep.ILONP/2. - BEMB2 + print 'CORRECTION CENTRE : SOUS-EP. A CHEVAL SUR EMBOUT' + print 'ABSC. CURV. AXIALE CENTRE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ISLP + if ssep.ISLP<0. : ssep.ISLP = 0. + if (ssep.ISLP>ALPHA*CG*RC) : ssep.ISLP = ALPHA*CG*RC +# +# SI LE CENTRE DE LA SOUS-EP CALCULE SUR LA PLAQUE EST DANS L EMBOUT +# ON CORRIGE SA POSITION EN LE METTANT A L INTERFACE SINON CA PLANTE +# DANS LA PROC DE MAILLAGE (A AMELIORER) +# + print 'TAILLE LONGITUDINALE SOUS-EPAISSEUR SUR PLAQUE : %.2f'%ssep.ILONP + print '<=> TAILLE EQUIVALENTE PAR RAPPORT A L ANGLE DU COUDE (DEGRES): %.2f'%(ssep.ILONP*360/(2*pi*RC)) +# + return ier +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCTCI +# APPELEE DANS : ASCSYM et ASCPRE +# CALCUL TABLEAU TRIE DES ABSCISSES DES CENTRES DE SOUS-EPAISSEURS +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# RM = RAYON MOYEN DU COUDE +# +#----------------------DONNEES RENVOYEES----------------------- +# +# IABSC1 = CORRESPONDANCE ABSC. CURVI. CIRCONF. SOUS-EP. I +# IABSC2 = CORRESPONDANCE ABSC. GAUCHE ET DROITE CIRCONF. SOUS-EP. I +# COORXD = ABSC. DU BORD DROIT DE LA SOUS-EP I +# COORXG = ABSC. DU BORD GAUCHE DE LA SOUS-EP I +# +def ASCTCI(MCL_SOUS_EPAIS,RM): +# +# --- tri du tableau des abscisses curvilignes circonf. plaque +# + TAMPON = [] + COORXG = [] + COORYG = [] + i=0 + for ssep in MCL_SOUS_EPAIS : + i=i+1 + if (ssep.ISCP>2.*pi*RM) or (ssep.ISCP<0.) : + print ' valeur hors domaine' + print ' SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep) + print ' ABSC. CURV. CIRCONF. :%.2f'%ssep.ISCP + print ' BORD PLAQUE :%.2f'%(2.*pi*RM) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + TAMPON.append((ssep.ISCP,i)) + TAMPON.sort() + IABSC1=[] + for j in range(i): + IABSC1.append(TAMPON[j][1]) + print + print 'TRI DES CENTRES ABSC. CURV. CIRCONF. :' + print '------------------------------------' + i=0 + for ssep in TAMPON : + i=i+1 + print '%d) SOUS-EP NO %d <> XC = %.2f'%(i,ssep[1],ssep[0]) +# +# --- calcul des abcisses droites et gauches des sous-epaisseurs +# + COORXD=[] + COORXG=[] + for bid in TAMPON : + XG=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2. + if XG<0. : XG=XG+2.*pi*RM + COORXG.append(XG) + XD=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ICIRP/2. + if XD>2.*pi*RM : XD=XD-2.*pi*RM + COORXD.append(XD) +# +# --- tri des bornes d'intervalles en abscisse +# + TAMPON = [] + for j in range(len(MCL_SOUS_EPAIS)): + TAMPON.append((COORXG[j],2*j+1)) + TAMPON.append((COORXD[j],2*j+2)) + TAMPON.sort() + IABSC2=[] + for j in range(2*len(MCL_SOUS_EPAIS)): + IABSC2.append(TAMPON[j][1]) + print + print 'TRI DES INTERVALLES G ET D ABSC. CURV. CIRCONF. :' + print '-----------------------------------------------' + for j in range(2*len(MCL_SOUS_EPAIS)): + if fmod(IABSC2[j],2): + print '%d) SOUS-EP NO %d <> XG = %.2f'%(j+1,IABSC1[IABSC2[j]/2],TAMPON[j][0]) + else: + print '%d) SOUS-EP NO %d <> XD = %.2f'%(j+1,IABSC1[IABSC2[j]/2-1],TAMPON[j][0]) +# + return TAMPON,IABSC1,IABSC2,COORXD,COORXG +# +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCTLO +# APPELEE DANS : ASCSYM et ASCPRE +# CALCUL TABLEAU TRIE DES ORDONNEES DES CENTRES DE SOUS-EPAISSEURS +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# RC = RAYON MOYEN DU COUDE +# ALPHA = ANGLE DU COUDE +# LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT +# LTCLIM = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES +# +#----------------------DONNEES RENVOYEES----------------------- +# +# IORDO1 = CORRESPONDANCE ORDO. CURVI. LONGIT. SOUS-EP. I +# IORDO2 = CORRESPONDANCE ORDO. GAUCHE ET DROITE LONGIT. SOUS-EP. I +# COORYI = ORDONNEE. DU BORD INTERIEUR DE LA SOUS-EP I +# COORYS = ORDONNEE. DU BORD SUPERIEUR DE LA SOUS-EP I +# +def ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM): +# +# tri du tableau des abscisses curvilignes axiales plaque +# + ALPHAR = 2.*ALPHA*pi/360. + TAMPON = [] + i=0 + for ssep in MCL_SOUS_EPAIS : + i=i+1 + if (ssep.ISLP>ALPHAR*RC) or (ssep.ISLP<0.) : + print ' valeur hors domaine' + print ' SOUS-EPAISSEUR NUMERO :%d'%MCL_SOUS_EPAIS.index(ssep) + print ' ABSC. CURV. LONGIT. :%.2f'%ssep.ISLP + print ' BORDS PLAQUE :%.2f'%(ALPHAR*RC) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + TAMPON.append((ssep.ISLP,i)) + TAMPON.sort() + IORDO1=[] + for j in range(i): + IORDO1.append(TAMPON[j][1]) + print + print 'TRI DES CENTRES ABSC. CURV. LONGIT. :' + print '------------------------------------' + i=0 + for ssep in TAMPON : + i=i+1 + print '%d) SOUS-EP NO %d <> YC = %.2f'%(i,ssep[1],ssep[0]) +# +# calcul des abscisses sup. et inf. des sous-ep. +# + COORYI=[] + COORYS=[] + EPS=0.000000000001 + for bid in TAMPON : + i=i+1 + YI=bid[0]-MCL_SOUS_EPAIS[bid[1]-1].ILONP/2. + YS=bid[0]+MCL_SOUS_EPAIS[bid[1]-1].ILONP/2. + if fabs(bid[0]) valeur hors domaine' + print ' SOUS-EPAISSEUR NUMERO :',bid[1] + print ' BORD INFERIEUR :',YI + print ' BORD PLAQUE :',-LTCHAR + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if YS>(ALPHAR*RC+LTCLIM): + print ' valeur hors domaine' + print ' SOUS-EPAISSEUR NUMERO :',bid[1] + print ' BORD INFERIEUR :',YS + print ' BORD PLAQUE :',ALPHAR*RC+LTCLIM + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + COORYI.append(YI) + COORYS.append(YS) +# +# tri des bornes d'intervalles en abscisse +# + TAMPON = [] + for j in range(len(MCL_SOUS_EPAIS)): + TAMPON.append((COORYI[j],2*j+1)) + TAMPON.append((COORYS[j],2*j+2)) + TAMPON.sort() + IORDO2=[] + for j in range(2*len(MCL_SOUS_EPAIS)): + IORDO2.append(TAMPON[j][1]) + print + print 'TRI DES INTERVALLES I ET S ABSC. CURV. LONGIT. :' + print '-----------------------------------------------' + for j in range(2*len(MCL_SOUS_EPAIS)): + if fmod(IORDO2[j],2): + print '%d) SOUS-EP NO %d <> YI = %.2f'%(j+1,IORDO1[IORDO2[j]/2],TAMPON[j][0]) + else: + print '%d) SOUS-EP NO %d <> YS = %.2f'%(j+1,IORDO1[IORDO2[j]/2-1],TAMPON[j][0]) +# + return TAMPON,IORDO1,IORDO2,COORYI,COORYS +# +# +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCNBE +# APPELEE DANS : ASCSYM et ASCPRE +# CALCUL DU NOMBRE D'ELEMENTS LONGI ET CIRCONF. DANS LES SOUS-EPAISSEURS +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# COORXG = ABSCISSE DU BORD GAUCHE DE LA SOUS-EPAISSEUR I +# COORXD = ABSCISSE DU BORD DROIT DE LA SOUS-EPAISSEUR I +# COORYI = ORDONNEE DU BORD INFERIEUR DE LA SOUS-EPAISSEUR I +# COORYS = ORDONNEE DU BORD SUPERIEUR DE LA SOUS-EPAISSEUR I +# BD = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J +# BG = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J +# BS = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J +# BI = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J +# DNX = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J +# DNY = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J +# INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J +# INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# IABSC1 = CORRESPONDANCE ABSCISSE CURVILIGNE CIRCONF. SOUS-EP. I +# IORDO1 = CORRESPONDANCE ABSCISSE CURVILIGNE LONGIT. SOUS-EP. I +# +#----------------------DONNEES RENVOYEES----------------------- +# +# NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K +# NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K +# +def ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI,DNX,DNY,RM,RC, + INDSEX,INDSEY,IABSC1,IORDO1): +# +# calcul du nombre d'elements longi. et circonf. dans les sous-epaisseurs: +# + print + print 'DETERMINATION DU NOMBRE D''ELEMENTS DANS LES SOUS-EPAISSEURS :' + print '------------------------------------------------------------' + NLX=[0]*len(MCL_SOUS_EPAIS) + NLY=[0]*len(MCL_SOUS_EPAIS) + for j in range(len(BD)): + if INDSEX[j]!=0: +# calcul au passage du nombre d'elements sur chaque zone circonf. + RNBEL = (BD[j]-BG[j])*360./(DNX[2*j]*2.*pi*RM) + RNBEL2 = RNBEL - floor(RNBEL) + if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL)) + else : NBEL=int(floor(RNBEL))+1 + if NBEL <= 1 : NBEL=2 +# calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf. + for i in range(len(MCL_SOUS_EPAIS)): + l=IABSC1[i]-1 + if ((COORXG[l]=COORXG[l] and BD[j]<=COORXD[l])\ + or (COORXG[l]>=COORXD[l] and (BG[j]<=COORXG[l] or BD[j]>=COORXD[l]))): + NLX[i]=NLX[i]+NBEL + print 'SOUS-EP NO %d ZONE CIRC. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL) + + for j in range(len(BS)): + if INDSEY[j]!=0: +# calcul au passage du nombre d'elements sur chaque zone longi. + RNBEL = ((BS[j]-BI[j])*360.)/(DNY[2*j]*2.*pi*RC) + RNBEL2 = RNBEL - floor(RNBEL) + if RNBEL2 <= 0.5 : NBEL=int(floor(RNBEL)) + else : NBEL=int(floor(RNBEL))+1 + if NBEL <= 1 : NBEL=2 +# calcul au passage du nombre d'elements sur chaque sous-epaisseur circonf. + i=0 + for i in range(len(MCL_SOUS_EPAIS)): + l=IORDO1[i]-1 + if (BI[j]>=COORYI[l] and BS[j]<=COORYS[l]): + NLY[i]=NLY[i]+NBEL + print 'SOUS-EP NO %d ZONE LONGI. NO %d NB ELEM. = %d'%(i+1,j+1,NBEL) + + for j in range(len(NLX)): + print 'SOUS-EP NO %d NBE TOTAL ELEMENTS CIRCONF. : %d'%(j+1,NLX[j]) + print 'SOUS-EP NO %d NBE TOTAL ELEMENTS LONGI. : %d'%(j+1,NLY[j]) + +# + return NLX,NLY +# +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCSYM +# PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE AVEC +# SOUS-EPAISSEURS : +# CAS D UNE SOUS-EPAISSEUR DANS LE PLAN DE SYMETRIE +# CONSTRUCTION D UN QUART DU MAILLAGE +# - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES +# - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# ALPHA = ANGLE DU COUDE +# LT = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT +# LGV = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES +# NBSEP = NOMBRE DE SOUS-EPAISSEURS +# +#----------------------DONNEES RENVOYEES----------------------- +# +# NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES +# NZONEY = NOMBRE DE ZONES LONGITUDINALES +# +def ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM): + ier=0 + DERAFC = 18. + DERAFL = 5. + INDSEX = [] + INDSEY = [] + BG = [] + BD = [] + INDBG = [] + INDBD = [] + DNX = [] + +# +# --- tri des donnees sous-ep. en circonferentiel + TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM) +# +# --- calcul des zones en circonferentiel +# + ssep=MCL_SOUS_EPAIS[0] + if (ssep.ISCP BORNE INF. = %.2f'\ + ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(j+1,BI[j],BS[j]) + else: + print 'ZONE NO %d <> BORNE INF. = %.2f'\ + ' / BORNE SUP. = %.2f'%(j+1,BI[j],BS[j]) + +# calcul du nombre d'elements longi. et circonf. dans les soue-ep + NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI, + DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1) + + return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY +################################################################################ +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL ASCPRE +# PREPARATION DES DONNEES POUR LE MAILLAGE DE PLAQUE +# SOUS-EPAISSEURS : +# - CALCUL TABLEAU TRIE DES ABSCISSES ET ORDONNEES DES CENTRES +# - CALCUL TABLEAU DES ZONES COUVERTES PAR LES SOUS-EPAISSEURS +# +#-----------------DONNEES FOURNIES PAR L UTILISATEUR-------------------- +# +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# ALPHA = ANGLE DU COUDE +# LT = LONGUEUR DE L EMBOUT DU COTE CHARGEMENT +# LGV = LONGUEUR DE L EMBOUT DU COTE CONDITIONS AUX LIMITES +# NBSEP = NOMBRE DE SOUS-EPAISSEURS +# SYME = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER" +# +#----------------------DONNEES RENVOYEES----------------------- +# +# NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES +# NZONEY = NOMBRE DE ZONES LONGITUDINALES +# +def ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM): + ier=0 + ALPHAR = 2.*ALPHA*pi/360. + DERAFC = 18. + DERAFL = 5. + EPSI = 0.001 + NBSEP = len(MCL_SOUS_EPAIS) + print 'RECHERCHE DES ZONES DE SOUS-EPAISSEURS DANS LE COUDE\n' + +# tri des donnees sous-epaisseurs en circonferentiel + TAMPON,IABSC1,IABSC2,COORXD,COORXG=ASCTCI(MCL_SOUS_EPAIS,RM) +# --- calcul des recouvrements de zones en circonferentiel +# + NZONEX=0 + j=0 + ICE=1 + NBGAU=0 + NBDRO=0 + TYPG=0 + TYPD=0 + go10=1 + go20=1 +# + BG =[] + BD =[] + INDBG =[] + INDBD =[] + DNX =[] + INDSEX=[] +# + + while go10: + + j=j+1 +# +# definition de la zone courante (borne gauche, borne droite) +# +# TYPG = type de la borne: +# 0 : borne gauche sous-epaisseur +# 1 : borne droite sous-epaisseur +# 2 : centre sous-epaisseur +# + if j>2*NBSEP and ICE= 2*NBSEP : + MIND = TAMPON[2*NBSEP-1][0] + MING = MIND + if fmod(IABSC2[2*NBSEP-1],2): + TYPG = 0 + NUMG = IABSC1[IABSC2[2*NBSEP-1]/2] + else: + TYPG = 1 + NUMG = IABSC1[IABSC2[2*NBSEP-1]/2-1] + TYPD=TYPG + NUMD=NUMG + else: + MING=TAMPON[j-1][0] + MIND=TAMPON[j][0] + if fmod(IABSC2[j-1],2): + TYPG = 0 + NUMG = IABSC1[IABSC2[j-1]/2] + else: + TYPG = 1 + NUMG = IABSC1[IABSC2[j-1]/2-1] + if fmod(IABSC2[j],2): + TYPD = 0 + NUMD = IABSC1[IABSC2[j]/2] + else: + TYPD = 1 + NUMD = IABSC1[IABSC2[j]/2-1] + if fabs(MING-MIND)2*NBSEP and ICE>=NBSEP: + break #on sort de la boucle + + while go20: + i=ICE + if i<=NBSEP: +# recherche des centres a intercaler + INDC=IABSC1[i-1] + if i>1: +# le centre est deja le meme que precedent + if fabs(MCL_SOUS_EPAIS[INDC-1].ISCP-MCL_SOUS_EPAIS[IABSC1[i-2]-1].ISCP) < EPSI : + ICE=ICE+1 + continue + if MCL_SOUS_EPAIS[INDC-1].ISCP < MING : +# le centre est la nouvelle borne gauche + j=j-1 + MIND = MING + TYPD = TYPG + NUMD = NUMG + MING = MCL_SOUS_EPAIS[INDC-1].ISCP + TYPG = 2 + NUMG = INDC + ICE = ICE+1 + elif MCL_SOUS_EPAIS[INDC-1].ISCP < MIND : +# le centre est la nouvelle borne droite + MIND = MCL_SOUS_EPAIS[INDC-1].ISCP + TYPD = 2 + NUMD = INDC + ICE = ICE+1 + continue + else:pass + NZONEX=NZONEX+1 +# +# codes d'intervalles de zones +# 0 0 = zone sous-ep. +# 0 1 = sous-ep. a droite de la zone +# 1 0 = sous-ep. a gauche de la zone +# 1 1 = sous-ep. a droite et a gauche de la zone +# +# cas ou la premiere zone ne commence pas au bord de la plaque + if MING>0. and NZONEX==1 : + BG.append(0.) + BD.append(MING) + if TYPG==0: + INDBG.append(0) + INDBD.append(1) + DNX.append(DERAFC) + DNX.append(0) + INDSEX.append(0) + elif TYPG==1 or TYPG==2: + INDBG.append(0) + INDBD.append(0) + DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC) + DNX.append(0) + INDSEX.append(NUMG) + else: pass + NZONEX=NZONEX+1 +# + BG.append(MING) + BD.append(MIND) +# + if TYPG == 0: +# borne gauche zone = borne gauche ssep + NBGAU=NBGAU+1 + INDBG.append(0) + INDBD.append(0) + if TYPD == 0: +# borne droite zone = borne gauche ssep + DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC) + DNX.append(0) + INDSEX.append(NUMG) + elif TYPD == 1 or TYPD == 2: +# borne droite zone = borne droite ssep : TYPD=1 +# borne droite zone = centre ssep : TYPD=2 + LTMP=[] + LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG)) + LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD)) + LTMP.sort() + DNX.append(LTMP[0][0]) + DNX.append(0) + INDSEX.append(LTMP[0][1]) + else: pass +# + elif TYPG == 1: +# borne gauche zone = borne droite ssep + NBDRO = NBDRO+1 + if TYPD == 0: +# borne droite zone = borne gauche ssep + if NBDRO==NBGAU: + INDBG.append(1) + INDBD.append(1) + DNX.append(DERAFC) + DNX.append(0) + INDSEX.append(0) + else: +# cas tordu: une sous-ep enveloppe le tout + INDBG.append(0) + INDBD.append(0) + DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC) + DNX.append(0) + INDSEX.append(NUMG) + elif TYPD == 1 or TYPD == 2: +# borne droite zone = borne droite ssep : TYPD=1 +# borne droite zone = centre ssep : TYPD=2 + INDBG.append(0) + INDBD.append(0) + DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC) + DNX.append(0) + INDSEX.append(NUMD) + else: pass +# + elif TYPG == 2: +# borne gauche zone = centre ssep + INDBG.append(0) + INDBD.append(0) + if TYPD == 0: +# borne droite zone = borne gauche ssep + DNX.append(MCL_SOUS_EPAIS[NUMG-1].IDENC) + DNX.append(0) + INDSEX.append(NUMG) + elif TYPD == 1 or TYPD == 2: +# borne droite zone = borne droite ssep : TYPD=1 +# borne droite zone = centre ssep : TYPD=2 + LTMP=[] + LTMP.append((MCL_SOUS_EPAIS[NUMG-1].IDENC,NUMG)) + LTMP.append((MCL_SOUS_EPAIS[NUMD-1].IDENC,NUMD)) + LTMP.sort() + DNX.append(LTMP[0][0]) + DNX.append(0) + INDSEX.append(LTMP[0][1]) + else:pass + else:pass + if j<=(2*NBSEP-2) or ICE<=NBSEP or (TYPD==2 and j<2*NBSEP): + iout=0 + break #on retourne dans la boucle go10 + else : + iout=1 + break #on sort definitivement + if iout:break + + if MIND<2.*pi*RM: + NZONEX=NZONEX+1 + BG.append(MIND) + BD.append(2.*pi*RM) + if TYPD==0 or TYPD==2: + INDBG.append(0) + INDBD.append(0) + DNX.append(MCL_SOUS_EPAIS[NUMD-1].IDENC) + DNX.append(0) + INDSEX.append(NUMD) + elif TYPD==1: + INDBG.append(1) + INDBD.append(0) + DNX.append(DERAFC) + DNX.append(0) + INDSEX.append(0) + else:pass + +# au cas ou 2.*pi*RM correspond a une borne d'intevalle de sous-ep ou a +# un centre de sous-ep. + if fabs(BG[NZONEX-1]-BD[NZONEX-1]) BORNE GAUCHE = %.2f'\ + ' / BORNE DROITE = %.2f * SOUS-EPAISSEUR'%(BG[j],BD[j]) + else: + print 'ZONE NO',j+1,'<> BORNE GAUCHE = %.2f'\ + ' / BORNE DROITE = %.2f'%(BG[j],BD[j]) + + +# --- tri des donnees sous-ep. en axial + TAMPON,IORDO1,IORDO2,COORYI,COORYS=ASCTLO(MCL_SOUS_EPAIS,RC,ALPHA,LTCHAR,LTCLIM) + + BI = [] + BS = [] + INDBI = [] + INDBS = [] + DNY = [] + INDSEY = [] + + if SYME == 'DEMI': +# calcul des zones en axial : +# zones (0,bord inferieur) et (bord inferieur,centre sous-ep.) + ssep = MCL_SOUS_EPAIS[0] + BI.append(0.) + BI.append(ssep.ISLP-ssep.ILONP/2.) + BS.append(ssep.ISLP-ssep.ILONP/2.) + BS.append(ssep.ISLP) + INDBI.append(0) + INDBI.append(0) + INDBS.append(1) + INDBS.append(0) + DNY.append(DERAFL) + DNY.append(0) + DNY.append(ssep.IDENL) + DNY.append(0) + INDSEY.append(0) + INDSEY.append(1) + NZONEY=1 +# + else: +# +# calcul des recouvrements de zones en axial + j = 0 + ICE = 1 + NBINF = 0 + NBSUP = 0 + TYPI=0 + TYPS=0 + go40=1 + go50=1 + NZONEY=0 +# + while go40: + j=j+1 +# +# definition de la zone courante (borne inf, borne sup) +# +# typi = type de la borne +# 0 : borne inf. sous-ep. +# 1 : borne sup. sous-ep. +# 2 : centre sous-ep. +# + if TYPS==2: +# cas ou la borne sup. de la zone prec. etait un centre + MINI=MINS + TYPI=TYPS + NUMI=NUMS + MINS=TAMPON[j-1][0] + if fmod(IORDO2[j-1],2): + TYPS = 0 + NUMS = IORDO1[IORDO2[j-1]/2] + else: + TYPS = 1 + NUMS = IORDO1[IORDO2[j-1]/2-1] + j=j-1 + else: + if j>= 2*NBSEP : + MINI = TAMPON[2*NBSEP-1][0] + MINS = MINI + if fmod(IORDO2[2*NBSEP-1],2): + TYPI = 0 + NUMI = IORDO1[IORDO2[2*NBSEP-1]/2] + else: + TYPI = 1 + NUMI = IORDO1[IORDO2[2*NBSEP-1]/2-1] + TYPS=TYPI + NUMS=NUMI + else: + MINI=TAMPON[j-1][0] + MINS=TAMPON[j][0] + if fmod(IORDO2[j-1],2): + TYPI = 0 + NUMI = IORDO1[IORDO2[j-1]/2] + else: + TYPI = 1 + NUMI = IORDO1[IORDO2[j-1]/2-1] + if fmod(IORDO2[j],2): + TYPS = 0 + NUMS = IORDO1[IORDO2[j]/2] + else: + TYPS = 1 + NUMS = IORDO1[IORDO2[j]/2-1] + if fabs(MINI-MINS)1: +# le centre est deja le meme que le precedent + if fabs(MCL_SOUS_EPAIS[INDC-1].ISLP-MCL_SOUS_EPAIS[IORDO1[i-2]-1].ISLP)0. and NZONEY==1: + first=0 + BI.append(0.) + BS.append(MINI) + if TYPI==0: + INDBI.append(0) + INDBS.append(1) + DNY.append(DERAFL) + DNY.append(0) + INDSEY.append(0) + elif TYPI==1 or TYPI==2: + INDBI.append(0) + INDBS.append(0) + DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL) + DNY.append(0) + INDSEY.append(NUMI) + else:pass + NZONEY = NZONEY+1 +# + BI.append(MINI) + BS.append(MINS) + + if TYPI==0: +# borne inferieure zone = borne inferieure ssep + NBINF = NBINF+1 + INDBI.append(0) + INDBS.append(0) + if TYPS==0: +# borne superieure zone = borne inferieur ssep + DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL) + DNY.append(0) + INDSEY.append(NUMI) + elif TYPS==1 or TYPS==2: +# borne superieure zone = borne superieure ssep:TYPS==1 +# borne superieure zone = centre ssep:TYPS==2 + LTMP=[] + LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI)) + LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS)) + LTMP.sort() + DNY.append(LTMP[0][0]) + DNY.append(0) + INDSEY.append(LTMP[0][1]) + else:pass + elif TYPI==1: +# borne inferieure zone=borne superieure ssep + NBSUP = NBSUP+1 + if TYPS==0: +# borne superieure zone = borne inferieur ssep + if NBSUP==NBINF: + INDBI.append(1) + INDBS.append(1) + DNY.append(DERAFL) + DNY.append(0) + INDSEY.append(0) + else: +# cas tordu: une sous-ep. enveloppe le tout + INDBI.append(0) + INDBS.append(0) + DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL) + DNY.append(0) + INDSEY.append(NUMI) + elif TYPS==1 or TYPS==2: +# borne superieure zone = borne superieure ssep:TYPS==1 +# borne superieure zone = centre ssep:TYPS==2 + INDBI.append(0) + INDBS.append(0) + DNY.append(MCL_SOUS_EPAIS[NUMS-1].IDENL) + DNY.append(0) + INDSEY.append(NUMS) + else:pass + elif TYPI==2: +# borne inferieure zone = centre ssep + INDBI.append(0) + INDBS.append(0) + if TYPS==0: +# borne superieure zone = borne inferieure ssep + DNY.append(MCL_SOUS_EPAIS[NUMI-1].IDENL) + DNY.append(0) + INDSEY.append(NUMI) + elif TYPS==1 or TYPS==2: +# borne superieure zone = borne superieure ssep + LTMP=[] + LTMP.append((MCL_SOUS_EPAIS[NUMI-1].IDENL,NUMI)) + LTMP.append((MCL_SOUS_EPAIS[NUMS-1].IDENL,NUMS)) + LTMP.sort() + DNY.append(LTMP[0][0]) + DNY.append(0) + INDSEY.append(LTMP[0][1]) + else:pass + else:pass + if j<=(2*NBSEP-2) or TYPS==2: + iout=0 + break #on retourne dans la boucle go40 + else: + iout=1 + break #on sort definitivement + if iout:break + +# cas ou la derniere zone ne finit pas au bout de la plaque + if MINS BORNE INF. = %.2f'\ + ' / BORNE SUP. = %.2f * SOUS-EPAISSEUR'%(BI[j],BS[j]) + else: + print 'ZONE NO',j+1,'<> BORNE INF. = %.2f'\ + ' / BORNE SUP. = %.2f '%(BI[j],BS[j]) + +# calcul du nombre d'elements longi. et circonf. dans les sous-ep + NLX,NLY=ASCNBE(MCL_SOUS_EPAIS,COORXG,COORXD,COORYI,COORYS,BD,BG,BS,BI, + DNX,DNY,RM,RC,INDSEX,INDSEY,IABSC1,IORDO1) + + + return ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_file_dgib_ASCFDO +# +# ECRIT DANS UN FICHIER LES DONNES GIBI DE LA PROCEDURE +# "PLAQUE FISSUREE" +# + +def write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1, + TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC, + SFP,ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME, loc_datg) : + + if TYPBOL!= None: + if TYPBOL=='CUVE' : TYPEMB = 'typcuv' + if TYPBOL=='GV' : TYPEMB = 'typegv' + if TYPBOL=='ASP_MPP' : TYPEMB = 'typapp' + else: + TYPEMB =' ' + + if POSIT =='DEB_INT' : + POSIT2 = 'interne' + else: + POSIT2 = 'externe' + if SYME[:6]=='ENTIER' : ZSYME = 'entier' + elif SYME[:5]=='QUART' : ZSYME = 'quart' + else : ZSYME = 'demi' + C=AXECP/2. + TETAF=AZIM*pi/180. + + POIVIR = ' ;\n' + texte='* DEBUT PARAMETRES UTILISATEUR\n' + texte=texte+'*\n' + texte=texte+'c = '+str(C) +POIVIR + texte=texte+'a = '+str(AXEAP) +POIVIR + texte=texte+'nt = '+str(NT) +POIVIR + texte=texte+'ns = '+str(NS) +POIVIR + texte=texte+'nc = '+str(NC) +POIVIR + texte=texte+'rm = '+str(RM) +POIVIR + texte=texte+'rc = '+str(RC) +POIVIR + texte=texte+'alphac = '+str(ALPHA) +POIVIR + texte=texte+'nbtranep = '+str(NBTRAN) +POIVIR + texte=texte+'ep1 = '+str(EP1) +POIVIR + texte=texte+'ep2 = '+str(EP2) +POIVIR + texte=texte+'epi = '+str(EPI) +POIVIR + texte=texte+'teta1 = '+str(TETA1) +POIVIR + texte=texte+'teta2 = '+str(TETA2) +POIVIR + texte=texte+'ltran = '+str(LTRAN) +POIVIR + texte=texte+'posfis = '+str(SFP) +POIVIR + texte=texte+'ksiref = '+str(ORIEN) +POIVIR + texte=texte+'surep = '+str(SUREP) +POIVIR + texte=texte+'teta_f = '+str(TETAF) +POIVIR + texte=texte+'rc0 = '+str(RC0) +POIVIR + texte=texte+'rc2 = '+str(RC2) +POIVIR + texte=texte+'rc3 = '+str(RC3) +POIVIR + texte=texte+"pos = '"+POSIT2+"'" +POIVIR + texte=texte+'lt = '+str(LTCHAR) +POIVIR + texte=texte+'lgv = '+str(LTCLIM) +POIVIR + texte=texte+"typembou = '"+TYPEMB+"'" +POIVIR + texte=texte+"zsyme = '"+ZSYME+"'" +POIVIR + texte=texte+'epsif = '+str(EPSI) +POIVIR + texte=texte+'nivmag = '+str(NIVMAG) +POIVIR + texte=texte+'*\n' + texte=texte+'* FIN PARAMETRES UTILISATEUR\n' + texte=texte+'opti donn ' + texte=texte+"'"+loc_datg+'ascouf_fiss_v4.datg'+"';\n" + fdgib=open(nomFichierDATG,'w') + fdgib.write(texte) + fdgib.close() + +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_file_dgib_ASCSQO +# +# ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE +# "PLAQUE SOUS-EPAISSEUR" +# +#-----------------DONNEES FOURNIES PAR L'UTILISATEUR-------------------- +# +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# ALPHA = ANGLE DU COUDE +# NBTRAN = NOMBRE DE TRANSITION D'EPAISSEUR (0, 1 OU 2) +# EP1 = EPAISSEUR DU COUDE (COTE EMBOUT 1 SI TRANSITION) +# EP2 = EPAISSEUR DU COUDE (COTE EMBOUT 2 SI TRANSITION) +# EPI = EPAISSEUR DU COUDE INTERMEDIAIRE SI TRANSITION A 2 PENTES +# TETA1 = ANGLE DE LA PREMIERE TRANSITION D'EPAISSEUR EVENTUELLE +# TETA2 = ANGLE DE LA DEUXIEME TRANSITION D'EPAISSEUR EVENTUELLE +# LTRAN = LONGUEUR ENTRE FIN DE L'EMBOUT 1 ET DEBUT DE TRANSITION +# LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT +# LCLIM = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES +# GEOM = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE) +# SYME = "QUART" DE STRUCTURE, "DEMI" STRUCTURE OU BIEN "ENTIER" +# NBEP = NOMBRE D'ELEMENTS DANS LE COUDE +# NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR +# NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR + +def write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2, + EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM, + SYME,NBEP,NLX,NLY,NIVMAG,loc_datg) : + + ssep= MCL_SOUS_EPAIS[0] + POIVIR = ' ;\n' + texte=' nivmag = '+str(NIVMAG) +POIVIR + texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0'+POIVIR + texte=texte+'*\n' + texte=texte+'coory = table '+POIVIR + texte=texte+'coorz = table '+POIVIR + texte=texte+'prof = table '+POIVIR + texte=texte+'posit = table '+POIVIR + texte=texte+'axisym = table '+POIVIR + texte=texte+'axecir = table '+POIVIR + texte=texte+'axelon = table '+POIVIR + texte=texte+'sousep = table '+POIVIR + texte=texte+'coorzc = table '+POIVIR + texte=texte+'axelonc = table '+POIVIR + texte=texte+'*\n' + texte=texte+'* DEBUT PARAMETRES UTILISATEUR\n' + texte=texte+'*\n' + texte=texte+'* parametres generaux\n' + texte=texte+'*\n' + texte=texte+' pirad = '+str(pi) +POIVIR + texte=texte+' rm = '+str(RM) +POIVIR + texte=texte+' rc = '+str(RC) +POIVIR + texte=texte+' alpha = '+str(ALPHA) +POIVIR + texte=texte+' lt1 = '+str(LTCHAR) +POIVIR + texte=texte+' lt2 = '+str(LTCLIM) +POIVIR + texte=texte+' nbtranep = '+str(NBTRAN) +POIVIR + texte=texte+' ep1 = '+str(EP1) +POIVIR + texte=texte+' ep2 = '+str(EP2) +POIVIR + texte=texte+' epI = '+str(EPI) +POIVIR + texte=texte+' teta1 = '+str(TETA1) +POIVIR + texte=texte+' teta2 = '+str(TETA2) +POIVIR + texte=texte+' ltran = '+repr(LTRAN) +POIVIR + if GEOM == 'COUDE': + texte=texte+" zcoude = 'oui' "+POIVIR + else: + texte=texte+" zcoude = 'non' "+POIVIR + if SYME == 'ENTIER': + texte=texte+" zsyme = 'entier' "+POIVIR + elif SYME == 'QUART': + texte=texte+" zsyme = 'quart' "+POIVIR + else: + texte=texte+" zsyme = 'demi' "+POIVIR + if TYPELE == 'CU20': + texte=texte+" zquad = 'oui' "+POIVIR + else: + texte=texte+" zquad = 'non' "+POIVIR + SCP=pi*RM + texte=texte+' nxep = '+str(NBEP) +POIVIR + texte=texte+'*\n' + texte=texte+'* Caracteristiques de la sous-epaisseur\n' + texte=texte+'*\n' + texte=texte+' tysep = '+str(ssep.ICIRP) +POIVIR + texte=texte+' tzsep = '+str(ssep.ILONP) +POIVIR + texte=texte+' prof . 1 = '+str(ssep['PROFONDEUR']) +POIVIR + texte=texte+' ycsep = '+str(SCP-pi*RM) +POIVIR + texte=texte+' theta = '+str(ssep.IPHIC) +POIVIR + texte=texte+' zcsep = '+repr(ssep.ISLP) +POIVIR + + texte=texte+" posit . 1 = '"+str(ssep['SOUS_EPAIS'].lower())+"'"+POIVIR + texte=texte+' nby = '+str(int(NLX[0])) +POIVIR + texte=texte+' nbz = '+str(int(NLY[0])) +POIVIR + texte=texte+' nbxse = '+str(ssep['NB_ELEM_RADI']) +POIVIR + texte=texte+' axelonc . 1 = '+str(ssep['AXE_LONGI'])+POIVIR + if ssep['POSI_CURV_LONGI']!=None: + texte=texte+' coorzc . 1 = '+repr(ssep['POSI_CURV_LONGI'])+POIVIR + else: + DZC=ssep.BETA*pi*(RC+(RM+EP1/2.)*cos(pi/2.))/180. + texte=texte+' coorzc . 1 = '+repr(DZC)+POIVIR + if ssep['TYPE']=='AXIS': + texte=texte+" zaxis = 'oui' "+POIVIR + else: + texte=texte+" zaxis = 'non' "+POIVIR + if ssep['EMPREINTE'] == 'OUI': + texte=texte+" sousep . 1 = 'oui'"+POIVIR + else: + texte=texte+" sousep . 1 = 'non'"+POIVIR + texte=texte+'*\n' + texte=texte+'* FIN PARAMETRES UTILISATEUR \n' + texte=texte+'opti donn ' + texte=texte+"'"+loc_datg+'ascouf_ssep_mono_v1.datg'+"'"+POIVIR + fdgib=open(nomFichierDATG,'w') + fdgib.write(texte) + fdgib.close() +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_subpart_file_pgib_POST +# +# APPELEE DANS : write_file_pgib_ASCSQ2 , write_file_pgib_ASCSD2 +# DEFINIE UNE CHAINE DE CARACTERES UTILISEE LORS DE L'ECRITURE DU +# FICHIER GIBI DE POST-TRAITEMENTS +# +#-----------------DONNEES FOURNIES PAR L'UTILISATEUR-------------------- +# +# NLX = NOMBRE D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR +# NLY = NOMBRE D'ELEMENTS LONGI DE LA SOUS-EPAISSEUR +# +#-----------------DONNEE RENVOYEE PAR ASTER-------------------- +# +# texte = chaine de caracteres contenant des instructions gibi +# de post-traitements +# +def write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY): + CAR3 = ('fdro','exdr','extr','exga','fgau','inga','intr','indr') + + POIVIR = ' ;\n' + texte='* DEBUT POINTS DE POST-TRAITEMENT\n' + texte=texte+'*\n' + issep=0 + for ssep in MCL_SOUS_EPAIS: + issep=issep+1 + texte=texte+'*\n' + texte=texte+'* sous-epaisseur No '+str( issep)+'\n' + texte=texte+'*\n' + if ssep['TYPE'] == 'ELLI': + texte=texte+'*\n' + texte=texte+'* plans circonf longi et colonne centrale \n' + texte=texte+'*\n' + texte=texte+'pcirc'+str( issep)+' = circo .'+str(issep).rjust(4)+POIVIR + texte=texte+'plong'+str( issep)+' = longi .'+str(issep).rjust(4)+POIVIR + texte=texte+'pcent'+str( issep)+' = centr .'+str(issep).rjust(4)+POIVIR + texte=texte+'*\n' + texte=texte+'* ligaments tous les 45 degres a epaisseur minimale \n' + texte=texte+'*\n' + texte=texte+'isep = '+str( issep)+POIVIR + for k in range(8): + texte=texte+'ilig = '+str(k+1)+POIVIR + texte=texte+'rlig = ilig/10. + isep'+POIVIR + texte=texte+str(CAR3[k])+str( issep)+' = lig45 . rlig'+POIVIR + if ssep['TYPE'] == 'ELLI': + texte=texte+'*\n' + texte=texte+"* ligaments circonferentiels a l'epaisseur minimale\n" + texte=texte+'*\n' + texte=texte+'isep = '+str(issep)+POIVIR + for k in range(2*NLX[issep-1]+1): + texte=texte+'ilig = '+str(k+1)+POIVIR + texte=texte+'rlig = ilig/100. + isep'+POIVIR + texte=texte+'cir'+str(issep)+'_'+str(k+1)+' = ligcir . rlig'+POIVIR + texte=texte+'*\n' + texte=texte+"* ligaments longitudinaux a l'epaisseur minimale\n" + texte=texte+'* \n' + for k in range(2*NLY[issep-1]+1): + texte=texte+'ilig = '+str(k+1)+POIVIR + texte=texte+'rlig = ilig/100. + isep'+POIVIR + texte=texte+'lon'+str(issep)+'_'+str(k+1)+' = liglon . rlig'+POIVIR + texte=texte+'* FIN POINTS DE POST-TRAITEMENT\n' + return texte + +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_file_pgib_ASCSQ2 +# +# ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE +# "PLAQUE SOUS-EPAISSEURS" +# IL S'AGIT DE LA DEUXIEME PARTIE ( APRES LES DONNEES UTILISATEUR ) +# +# +#-----------------DONNEES FOURNIES PAR L'UTILISATEUR-------------------- +# +# NLX = NOMBRE TOTAL D'ELEMENTS CIRCONF. DE LA SOUS-EPAISSEUR K +# NLY = NOMBRE TOTAL D'ELEMENTS LONGIT. DE LA SOUS-EPAISSEUR K + +def write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY): + POIVIR = ' ;\n' + texte=write_subpart_file_pgib_POST(MCL_SOUS_EPAIS,NLX,NLY) + texte=texte+'*\n' + texte=texte+'p1 = 0. 0. (-1.*lt1)'+POIVIR + texte=texte+'p2 = 0. 0. (coor 3 bou3)'+POIVIR + texte=texte+'ma = coude et p1 et p2'+POIVIR + texte=texte+"opti sauv form 'fort.8'"+POIVIR + texte=texte+'sort ma'+POIVIR + texte=texte+'sauv form ma'+POIVIR + texte=texte+'fin'+POIVIR + fpgib=open('fort.71','w') + fpgib.write(texte) + fpgib.close() + +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_file_pgib_ASCSP1 +# +# ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE +# "PLAQUE SOUS-EPAISSEURS" +# IL S'AGIT DE LA PREMIERE PARTIE ( AVANT LES DONNEES UTILISATEUR ) +# +# +def write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg): + + POIVIR = ' ;\n' + texte=' nivmag = '+str(NIVMAG)+POIVIR + texte=texte+' option dime 3 elem '+TYPELE+' nive nivmag echo 0 '+POIVIR + texte=texte+'*\n' + texte=texte+'bg = table '+POIVIR + texte=texte+'bd = table '+POIVIR + texte=texte+'bi = table '+POIVIR + texte=texte+'bs = table '+POIVIR + texte=texte+'indbg = table '+POIVIR + texte=texte+'indbd = table '+POIVIR + texte=texte+'indbi = table '+POIVIR + texte=texte+'indbs = table '+POIVIR + texte=texte+'axecir = table '+POIVIR + texte=texte+'axelon = table '+POIVIR + texte=texte+'axelonc = table '+POIVIR + texte=texte+'coorzc = table '+POIVIR + texte=texte+'prof = table '+POIVIR + texte=texte+'posit = table '+POIVIR + texte=texte+'coory = table '+POIVIR + texte=texte+'coorz = table '+POIVIR + texte=texte+'deny = table '+POIVIR + texte=texte+'nbely = table '+POIVIR + texte=texte+'denz = table '+POIVIR + texte=texte+'nbelz = table '+POIVIR + texte=texte+'axisym = table '+POIVIR + texte=texte+'sousep = table '+POIVIR + texte=texte+'* \n' + texte=texte+'opti donn ' + texte=texte+"'"+loc_datg+'ascouf_ssep_mult_v1.datg'+"';\n" + fdgib=open(nomFichierDATG,'w') + fdgib.write(texte) + fdgib.close() + +################################################################################ +################################################################################ +################################################################################ +# MACR_ASCOUF_MAIL write_file_pgib_ASCSDO +# +# ECRIT DANS UN FICHIER LES DONNEES GIBI DE LA PROCEDURE +# "PLAQUE SOUS-EPAISSEURS" +# +#-----------------DONNEES FOURNIES PAR L'UTILISATEUR-------------------- +# +# RM = RAYON MOYEN DU COUDE +# RC = RAYON DE CINTRAGE DU COUDE +# ALPHA = ANGLE DU COUDE +# EP = EPAISSEUR DU COUDE +# LTCHAR = LONGUEUR DE L'EMBOUT DU COTE CHARGEMENT +# LCLIM = LONGUEUR DE L'EMBOUT DU COTE CONDITIONS AUX LIMITES +# GEOM = TYPE DE GEOMETRIE MODELISEE (COUDE OU TUBE) +# SYME = QUART DE STRUCTURE SI 'OUI' +# INDBG = INDICATEUR BORD GAUCHE DE LA ZONE CIRCONF J +# INDBD = INDICATEUR BORD DROIT DE LA ZONE CIRCONF J +# BG = ABSCISSE DU BORD GAUCHE DE LA ZONE CIRCONF J +# BD = ABSCISSE DU BORD DROIT DE LA ZONE CIRCONF J +# BI = ORDONNEE DU BORD INFERIEUR DE LA ZONE LONGI J +# BS = ORDONNEE DU BORD SUPERIEUR DE LA ZONE LONGI J +# INDBI = INDICATEUR BORD INFERIEUR DE LA ZONE LONGI J +# INDBS = INDICATEUR BORD SUPERIEUR DE LA ZONE LONGI J +# INDSEX = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE CIRCONF J +# INDSEY = NUMERO DE SOUS-EPAISSEUR CONTENU DANS LA ZONE LONGI J +# DNX = DENSITE ET NOMBRE D'ELEMENTS CIRCONF. DE LA ZONE J +# DNY = DENSITE ET NOMBRE D'ELEMENTS LONGIT. DE LA ZONE J +# NZONEX = NOMBRE DE ZONES CIRCONFERENTIELLES +# NZONEY = NOMBRE DE ZONES LONGITUDINALES +# +def write_file_pgib_ASCSDO(RM,RC,ALPHA,EP,LTCLIM,LTCHAR,NBEP, + NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS, + DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME): + + POIVIR = ' ;\n' + NY=20 + DELTAY=2.*pi*RM/NY + + def nint(x): + if 0 les quart et demi structure' + print ' ne peuvent etre realisees ' + print ' sur un modele comportant une transition ' + print ' d epaisseur ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# + DEXT = COUDE['DEXT_T1'] + EP1 = COUDE['EPAIS_T1'] + EP2 = COUDE['EPAIS_T2'] + TETA1 = COUDE['ANGL_TETA1'] + TETA2 = 0.0 + EPI = 0.0 + if COUDE['ANGL_TETA2']!=None : + NBTRAN = 2 + TETA2 = COUDE['ANGL_TETA2'] + EPI = COUDE['EPAIS_TI'] +# + if COUDE['ABSC_CURV_TRAN']!=None : + LTRAN = COUDE['ABSC_CURV_TRAN'] + else : + LTRAN = COUDE['POSI_ANGU_TRAN']* RC * pi / 180.0 +# + RM = (DEXT-EP1)/2.0 + RM2 = RM + (EP2-EP1)/2.0 + R1 = RC + R2 = RM + E = EP1 +# + if COUDE['SYME']!='ENTIER' and (LTCHAR!=LTCLIM) : + print ' les deux embouts doivent etre' + print ' de meme longueur pour les cas de symetrie ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# + LAMOR = 3.0/2.0 * sqrt( RM*RM*RM / EP1) + if LTCHAR longueur d embout P1 inferieure' + print ' a la longueur d amortissement = ',LAMOR + print ' alarme' +# + LAMOR = 3.0/2.0 * sqrt( RM2*RM2*RM2 / EP2) + if LTCLIM longueur d embout P2 inferieure' + print ' a la longueur d amortissement = ',LAMOR + print ' alarme' +# + if TYPBOL!=None: + if TYPBOL[:1]=='GV' : + print ' la condition aux limites raccord' + print ' 3d-poutre appliquee avec la macro de calcul' + print ' ascouf n est pas licite avec un embout' + print ' de type conique' + print ' alarme' +# +################################################################################ +# --- caracteristiques de la fissure --- +################################################################################ +# + if FISS_COUDE!=None: + if NBEP!=3: + print ' le nombre d elements dans l epaisseur' + print ' du coude n est pas parametrable pour' + print ' un coude avec fissure' + print ' mot-cle NB_ELEM_EPAIS ignore' + print ' alarme' + FPROF = FISS_COUDE['PROFONDEUR'] + FAXI = FISS_COUDE['AXIS'] + if FAXI=='NON' and FISS_COUDE['LONGUEUR']==None : + print ' pour les fissures non axisymetriques' + print ' la longueur doit etre specifiee ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if FAXI=='OUI' and FISS_COUDE['LONGUEUR']!=None : + print ' la fissure est axisymetrique : on ne' + print ' tient pas compte de la longueur specifiee' + print ' alarme' + if FISS_COUDE['LONGUEUR']!=None : FLONG = FISS_COUDE['LONGUEUR'] + if FAXI=='OUI' : +#### on prend une marge de securite a cause des modifs dans ascfis + FLONG = 2.0 * pi * (RM + EP1) + if FISS_COUDE['ABSC_CURV']!=None : + SF = FISS_COUDE['ABSC_CURV'] + LDEFAU = SF + BETA = 0.0 + else: + SF = 0.0 + BETA = FISS_COUDE['POSI_ANGUL'] + LDEFAU = BETA * RC * pi / 180.0 + AZIM = FISS_COUDE['AZIMUT'] + ORIEN = FISS_COUDE['ORIEN'] + POSIT = FISS_COUDE['FISSURE'] + NT = FISS_COUDE['NB_TRANCHE'] + NS = FISS_COUDE['NB_SECTEUR'] + NC = FISS_COUDE['NB_COURONNE'] + if FISS_COUDE['RAYON_TORE']!=None : RC0 = FISS_COUDE['RAYON_TORE'] + else : RC0 = 0. + if FISS_COUDE['COEF_MULT_RC2']!=None : RC2 = FISS_COUDE['COEF_MULT_RC2'] + else : RC2 = 0. + if FISS_COUDE['COEF_MULT_RC3']!=None : RC3 = FISS_COUDE['COEF_MULT_RC3'] + else : RC3 = 0. + EPSI = FISS_COUDE['ANGL_OUVERTURE'] + OR = ORIEN + AZ = AZIM + POS = POSIT + DGAXEC = FLONG/2.0 + DC = DGAXEC + if ORIEN!=90.0 and NBTRAN!=0 : + print ' avec une transition d epaisseur' + print ' la fissure doit obligatoirement etre transverse ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ORIEN!=90.0 and NBTRAN!=0 : + print ' avec une transition d epaisseur' + print ' la fissure doit obligatoirement etre transverse ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ORIEN!=90.0 and COUDE['SYME']!='ENTIER' : + print ' l orientation de la fissure doit' + print ' etre transverse (orien : 90.) pour modeliser ' + print ' un quart ou une demi structure ' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ORIEN!=90.0 and FAXI=='OUI' : + print ' la fissure est axisymetrique : son' + print ' orientation doit etre transverse (ORIEN : 90.)' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +################################################################################ +# --- caracteristiques des sous epaisseurs --- +################################################################################ +# + isep = 0 + MCL_SOUS_EPAIS = None + if SOUS_EPAIS_MULTI!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_MULTI + if SOUS_EPAIS_COUDE!=None : MCL_SOUS_EPAIS = SOUS_EPAIS_COUDE + if SOUS_EPAIS_MULTI!=None and NBTRAN!=0 : + print ' il ne peut pas y avoir plusieurs' + print ' sous-epaisseurs en meme temps qu une' + print ' transition d epaisseur : si une seule' + print ' sous-epaisseur utiliser sous_epais_coude' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if SOUS_EPAIS_COUDE!=None and FISS_COUDE!=None and NBTRAN!=0 : + print ' avec une transition d epaisseur' + print ' il doit obligatoirement y avoir un defaut' + print ' soit une fissure soit une sous-epaisseur' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if MCL_SOUS_EPAIS!=None : + AZIM = 90.0 + if MCL_SOUS_EPAIS.__class__.__name__ !='MCList' : MCL_SOUS_EPAIS=[MCL_SOUS_EPAIS,] + if len(MCL_SOUS_EPAIS)!=1 and COUDE['SYME']!='ENTIER' : + print ' ne modeliser qu une seule' + print ' sous-epaisseur pour un quart ou demi-coude' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + for ssep in MCL_SOUS_EPAIS : + isep=isep+1 + if ssep['AXE_CIRC']!=None and ssep['TYPE']=='AXIS' : + print ' vous ne pouvez declarer la sous-' + print ' epaisseur comme axisymetrique et donner' + print ' une taille d axe circonferentiel' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ssep['AXE_CIRC']==None and ssep['TYPE']=='ELLI' : + print ' vous devez donner une taille d axe' + print ' circonferentiel pour une sous-epaisseur de' + print ' type elliptique' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ssep['POSI_CURV_LONGI']!=None: + if ssep['POSI_CURV_LONGI']>(ALPHA*RC*pi/180.0) : + print ' valeur hors domaine de validite' + print ' sous-epaisseur numero :',isep + print ' abscisse curv. longit. :',ssep['POSI_CURV_LONGI'] + print ' valeur maximale autorisee :',(ALPHA*RC*pi/180.0) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + LDEFAU = ssep['POSI_CURV_LONGI'] + ssep['AXE_LONGI']/2.0 + BETA = 0.0 + else: + BETA=ssep['POSI_ANGUL'] + if (BETA<0.) or (BETA>ALPHA) : + print ' valeur hors domaine de validite' + print ' sous-epaisseur numero :',isep + print ' position angulaire centre sous-ep :',BETA + print ' valeur limite autorisee :',ALPHA + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + LDEFAU = (BETA*RC*pi/180.0) + ssep['AXE_LONGI']/2.0 +# + if ssep['POSI_CURV_CIRC']!=None: + if ssep['POSI_CURV_CIRC']>(2*pi*RM) : + print ' valeur hors domaine de validite' + print ' sous-epaisseur numero :',isep + print ' abscisse curv. circonf. :',ssep['POSI_CURV_CIRC'] + print ' valeur maximale autorisee :',(2*pi*RM) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if ssep['POSI_CURV_CIRC']!=(pi*RM) and ssep['TYPE']=='AXIS': + print ' le centre d une sous-epaisseur' + print ' axisymetrique est impose en intrados (pi*RM)' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + else: + ssep.IPHIC=ssep['AZIMUT'] + if ssep['AZIMUT']!=180. and ssep['TYPE']=='AXIS': + print ' le centre d une sous-epaisseur' + print ' axisymetrique est impose en intrados' + print ' l azimut est fixe a 180 degres' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# l_ITYPE.append(ssep['TYPE' ]) +# l_ICIRC.append(ssep['AXE_CIRC' ]) +# l_ILONC.append(ssep['AXE_LONGI' ]) +# l_IPROC.append(ssep['PROFONDEUR' ]) +# l_ISLC.append( ssep['POSI_CURV_LONGI']) +# l_IBETC.append(BETA) + ssep.BETA=BETA +# l_ISCC.append( ssep['POSI_CURV_CIRC' ]) +# l_IPHIC.append(ssep['AZIMUT' ]) +# l_IPOS.append( ssep['SOUS_EPAIS' ]) +# l_INBEL.append(ssep['NB_ELEM_LONGI' ]) +# l_INBEC.append(ssep['NB_ELEM_CIRC' ]) +# l_IEVID.append(ssep['EMPREINTE' ]) + + if SOUS_EPAIS_COUDE!=None and COUDE['NB_ELEM_EPAIS']!=3 : + print ' le nombre d elements dans l' + print ' epaisseur du coude n est pas parametrable pour' + print ' la version 2 de la procedure de plaque avec sous' + print ' -epaisseur : mot-cle NB_ELEM_EPAIS ignore' + print ' alarme' +# +################################################################################ +# --- verifications de coherences --- +################################################################################ +# +# donnees globales + if COUDE['TRANSFORMEE']=='COUDE' or COUDE['TRAN_EPAIS']=='NON' : + if SUREP<0. or SUREP>(RM-EP1/2.0): + print ' valeur hors domaine de validite' + print ' surepaisseur :',SUREP + print ' valeur limite autorisee (RM-EP1/2) :',(RM-EP1/2.0) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if RC<=(RM+EP1/2.0): + print ' valeur hors domaine de validite' + print ' le rayon de cintrage :',RC + print ' doit etre superieur a (RM+EP1/2) :',(RM+EP1/2.0) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +# coude fissure +# + if FISS_COUDE!=None: + if (RM/EP1)<5. or (RM/EP1)>12.: + print ' valeur hors domaine de validite (5,12)' + print ' rapport RM/EP1 :',(RM/EP1) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if FISS_COUDE['ABSC_CURV']!=None: + if SF<0. or SF>(ALPHA*RC*pi/180.0) : + print ' valeur hors domaine de validite' + print ' abscisse curviligne centre fissure :',SF + print ' valeur limite autorisee :',(ALPHA*RC*pi/180.0) + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (NT-2*(NT/2))!=0: + print ' valeur hors domaine de validite' + print ' nombre de tranches :',NT + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if FISS_COUDE['ABSC_CURV'] and ((BETA<0.) or (BETA>ALPHA)): + print ' valeur hors domaine de validite' + print ' position angulaire centre fissure :',BETA + print ' posi_angul doit etre >= 0 et <= ',ALPHA + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +# transition d epaisseur +# + if NBTRAN!=0: + LCOUDE = ALPHA * RC * pi / 180.0 + DEXT = 2.0*RM + EP1 + if (LTRANLCOUDE) : + print ' valeur hors domaine de validite' + print ' debut transition d epaisseur :',LTRAN + print ' valeur minimale autorisee :',LDEFAU + print ' valeur maximale autorisee :',LCOUDE + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (TETA1<0.) or (TETA1>30.) : + print ' valeur hors domaine de validite' + print ' angle de transition TETA1 :',TETA1 + print ' valeur minimale autorisee :',0. + print ' valeur maximale autorisee :',30. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +# transition d epaisseur a une pente +# + if NBTRAN==1: + if (EP1<12.) or (EP1>80.) : + print ' valeur hors domaine de validite' + print ' epaisseur avant la transition :',EP1 + print ' valeur minimale autorisee :',12. + print ' valeur maximale autorisee :',80. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP2<20.) or (EP2>110.) : + print ' valeur hors domaine de validite' + print ' epaisseur apres la transition :',EP2 + print ' valeur minimale autorisee :',20. + print ' valeur maximale autorisee :',110. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP1>EP2) : + print ' l epaisseur avant la transition' + print ' doit etre inferieure ' + print ' a celle apres la transition' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + LTRANF = LTRAN + ((EP2-EP1)/(tan(TETA1))) + if (LTRANF>LCOUDE) : + print ' valeur hors domaine de validite' + print ' fin transition d epaisseur :',LTRANF + print ' valeur limite autorisee :',LCOUDE + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if DEXT<112. or DEXT>880. : + print ' valeur hors domaine de validite' + print ' diam ext du tube avant transition:',DEXT + print ' valeur minimum autorisee :',112. + print ' valeur maximum autorisee :',880. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +# transition d epaisseur a une pente +# + else: + if (TETA2<0.) or (TETA2>45.) : + print ' valeur hors domaine de validite' + print ' angle de transition TETA2 :',TETA2 + print ' valeur minimale autorisee :',0. + print ' valeur maximale autorisee :',45. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP1<7.) or (EP1>35.) : + print ' valeur hors domaine de validite' + print ' epaisseur avant 1ere transition :',EP1 + print ' valeur minimale autorisee :',7. + print ' valeur maximale autorisee :',35. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP2<15.) or (EP2>40.) : + print ' valeur hors domaine de validite' + print ' epaisseur avant 2eme transition :',EP2 + print ' valeur minimale autorisee :',15. + print ' valeur maximale autorisee :',40. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EPI<15.) or (EPI>40.) : + print ' valeur hors domaine de validite' + print ' epaisseur intermediaire :',EPI + print ' valeur minimale autorisee :',15. + print ' valeur maximale autorisee :',40. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP1>EPI) : + print ' valeur hors domaine de validite' + print ' l epaisseur avant la transition' + print ' doit etre inferieure a l epaisseur intermediaire' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (EP2 valeur hors domaine de validite' + print ' l epaisseur apres la transition' + print ' doit etre inferieure a l epaisseur intermediaire' + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + LTRANF = LTRAN + (EPI-EP1)/(tan(TETA1)) + LTRANF = LTRANF + (EP2-EPI)/(tan(TETA2)) + if (LTRANF>LCOUDE) : + print ' valeur hors domaine de validite' + print ' fin transition d epaisseur :',LTRANF + print ' valeur limite autorisee :',LCOUDE + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier + if (DEXT<77.) or (DEXT>355.) : + print ' valeur hors domaine de validite' + print ' diam ext du tube avant transition:',LTRANF + print ' valeur minimale autorisee :',77. + print ' valeur maximale autorisee :',355. + self.cr.fatal(" erreur donnees ") + ier = ier+1 + return ier +# +################################################################################ +# --- calcul taille initiale des defauts sur la plaque --- +################################################################################ +# +# + if FISS_COUDE!=None: + DSF=(FISS_COUDE['ABSC_CURV']!=None) + AXEAP,AXECP,SFP = ASCFIS(ALPHA, RM, RC, EP1, SUREP, GEOM, FPROF, + DGAXEC, AZIM, POSIT, SF, DSF, BETA, ORIEN) + elif MCL_SOUS_EPAIS!=None : + ier= ASCSEP(MCL_SOUS_EPAIS,ALPHA,RM,RC,EP1,GEOM,SYME) + for ssep in MCL_SOUS_EPAIS: + ssep.IDENL = ssep.ILONP/ssep['NB_ELEM_LONGI']*180./(pi*RC) + ssep.IDENC = ssep.ICIRP/ssep['NB_ELEM_CIRC']*180./(pi*RM) + if SYME=='QUART' : +# quart de structure + ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\ + = ASCSYM(MCL_SOUS_EPAIS,RM,RC,ALPHA,LTCHAR,LTCLIM) + else : +# demi-structure ou entiere + ier,NLX,NLY,NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS,DNX,DNY\ + = ASCPRE(MCL_SOUS_EPAIS,RM,RC,ALPHA,SYME,LTCHAR,LTCLIM) +# +# + loc_gibi=aster.repout() + logiel = EXEC_MAILLAGE['LOGICIEL' ] + UNITD = EXEC_MAILLAGE['UNITE_DATG'] + UNITP = EXEC_MAILLAGE['UNITE_MGIB'] + if logiel=='GIBI98' : logiel = loc_gibi+'gibi98' + elif logiel=='GIBI2000': logiel = loc_gibi+'gibi2000' + else : + self.cr.fatal(" seuls gibi98 et gibi2000 sont appelableS") + ier = ier+1 + return ier +# +# --- ecriture sur le fichier .datg de la procedure --- +# +# Nom du fichier de commandes pour GIBI + nomFichierDATG = 'fort.'+str(UNITD) +# Nom du fichier de maillage GIBI + nomFichierGIBI = 'fort.'+str(UNITP) + loc_datg = aster.repdex() +# + if FISS_COUDE!=None: +# procedure coude fissure (MOT-CLE FISS_COUDE) + write_file_dgib_ASCFDO(nomFichierDATG,RM,RC,ALPHA,NBTRAN,EP1,EP2,EPI,TETA1, + TETA2,LTRAN,SUREP,LTCHAR,LTCLIM,TYPBOL,AXEAP,AXECP,NT,NS,NC,SFP, + ORIEN,AZIM,RC0,RC2,RC3,POSIT,EPSI,NIVMAG,SYME,loc_datg) + elif MCL_SOUS_EPAIS!=None : + if SOUS_EPAIS_MULTI==None : +# procedure coude sous-ep.: (MOT-CLE SOUS_EPAIS_COUDE) + write_file_dgib_ASCSQO(nomFichierDATG,TYPELE,RM,RC,ALPHA,NBTRAN,EP1,EP2, + EPI,TETA1,MCL_SOUS_EPAIS,TETA2,LTRAN,LTCHAR,LTCLIM,GEOM, + SYME,NBEP,NLX,NLY,NIVMAG,loc_datg) + write_file_pgib_ASCSQ2(MCL_SOUS_EPAIS,NLX,NLY) + else: +# procedure coude sous-ep.:(MOT-CLE SOUS_EPAIS_MULTI) + write_file_dgib_ASCSP1(nomFichierDATG,TYPELE,MCL_SOUS_EPAIS,NIVMAG,loc_datg) + write_file_pgib_ASCSDO(RM,RC,ALPHA,EP1,LTCLIM,LTCHAR,NBEP, + NZONEX,NZONEY,BG,BD,BI,BS,INDBG,INDBD,INDBI,INDBS, + DNX,DNY,MCL_SOUS_EPAIS,GEOM,SYME) + write_file_pgib_ASCSP2(MCL_SOUS_EPAIS,NLX,NLY) + else: +# procedure coude regle + write_file_dgib_ASCRDO(nomFichierDATG,TYPELE,NIVMAG,TYPBOL,ALPHA,RC,RM,EP1,SUREP, + LTCLIM,LTCHAR,NBEP,loc_datg) + + +# GIBI + EXEC_LOGICIEL( LOGICIEL = logiel , + ARGUMENT = ( _F(NOM_PARA=nomFichierDATG), + _F(NOM_PARA=nomFichierGIBI), ), ) +# PRE_GIBI + PRE_GIBI() + + if SYME == 'QUART' : self.DeclareOut('nomres',self.sd) +# LIRE_MAILLAGE + nomres=LIRE_MAILLAGE(INFO=INFO) + +# DEFI_GROUP 1 + + motscles={} + l_CREA_GROUP_NO=[] + l_CREA_GROUP_NO.append('BORD1') + l_CREA_GROUP_NO.append('CLGV') + l_CREA_GROUP_NO.append('BORD2') + l_CREA_GROUP_NO.append('PEAUINT') + l_CREA_GROUP_NO.append('PEAUEXT') + +# cas des fissures axisymetriques + if FISS_COUDE!=None: + if FISS_COUDE['AXIS']=='OUI': + motscles['CREA_GROUP_MA']=[] + motscles['CREA_GROUP_MA'].append(_F(GROUP_MA = 'FONDFISS', + NOM = 'MAIL_ORI', + POSITION = 'INIT' , ),) + +# conversion des groupes de mailles en groupes du bloc fissure + if FISS_COUDE!=None: + if SYME == 'ENTIER': + l_CREA_GROUP_NO.append('NOLIG1') + l_CREA_GROUP_NO.append('FACE1') + l_CREA_GROUP_NO.append('NOLIG2') + l_CREA_GROUP_NO.append('FACE2') + l_CREA_GROUP_NO.append('FONDFISS') + + motscles['CREA_GROUP_NO']=[] + motscles['CREA_GROUP_NO'].append(_F(GROUP_MA=tuple(l_CREA_GROUP_NO))) + +# conversion des groupes de mailles en groupes de noeuds pour les +# ligaments des sous-ep. + if MCL_SOUS_EPAIS!=None: + issep=0 + for ssep in MCL_SOUS_EPAIS: + issep=issep+1 + if ssep['TYPE']=='ELLI': + for k in range(2*NLX[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='CIR'+chtmp + ch2='ICI'+chtmp + motscles['CREA_GROUP_NO'].append(_F(NOM = ch2, + GROUP_MA = ch1,),) + motscles['CREA_GROUP_NO'].append(_F(NOM = 'IPCEN'+str(issep), + GROUP_MA = 'PCENT'+str(issep),),) + for k in range(2*NLY[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='LON'+chtmp + ch2='ILO'+chtmp + motscles['CREA_GROUP_NO'].append(_F(NOM = ch2, + GROUP_MA = ch1,),) + for k in range(2*NLX[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='ICI'+chtmp + ch2='OCI'+chtmp + ch3='ECI'+chtmp + motscles['CREA_GROUP_NO'].append(_F(NOM = ch2, + INTERSEC = ('PEAUEXT',ch1),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = ch3, + INTERSEC = ('PEAUINT',ch1),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = 'OPCEN'+str(issep), + INTERSEC = ('PEAUEXT','IPCEN'+str(issep),),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = 'EPCEN'+str(issep), + INTERSEC = ('PEAUINT','IPCEN'+str(issep),),),) + for k in range(2*NLY[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='ILO'+chtmp + ch2='OLO'+chtmp + ch3='ELO'+chtmp + motscles['CREA_GROUP_NO'].append(_F(NOM = ch2, + INTERSEC = ('PEAUEXT',ch1),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = ch3, + INTERSEC = ('PEAUINT',ch1),),) + for k in range(2*NLX[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='CIR'+chtmp + ch2='ICI'+chtmp + ch3='OCI'+chtmp + ch4='ECI'+chtmp + motscles['CREA_GROUP_NO'].append(_F(OPTION = 'SEGM_DROI_ORDO', + NOM = ch1, + GROUP_NO = ch2, + GROUP_NO_ORIG = ch3, + GROUP_NO_EXTR = ch4, + PRECISION = PRECIS, + CRITERE = CRITER,),) + motscles['CREA_GROUP_NO'].append(_F(OPTION = 'SEGM_DROI_ORDO', + NOM = 'PCENT'+str(issep), + GROUP_NO = 'IPCEN'+str(issep), + GROUP_NO_ORIG = 'OPCEN'+str(issep), + GROUP_NO_EXTR = 'EPCEN'+str(issep), + PRECISION = PRECIS, + CRITERE = CRITER,),) + for k in range(2*NLY[issep-1]+1): + chtmp=str(issep)+'_'+str(k+1) + ch1='LON'+chtmp + ch2='ILO'+chtmp + ch3='OLO'+chtmp + ch4='ELO'+chtmp + motscles['CREA_GROUP_NO'].append(_F(OPTION = 'SEGM_DROI_ORDO', + NOM = ch1, + GROUP_NO = ch2, + GROUP_NO_ORIG = ch3, + GROUP_NO_EXTR = ch4, + PRECISION = PRECIS, + CRITERE = CRITER,),) +# 1/ noms intermediaires des groupes de noeuds representant les ligaments +# des sections: TU,MI,GV et sous-ep. + for k in range(8): + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR3[k]+str(issep), + GROUP_MA = CAR6[k]+str(issep),),) + + for k in range(3): + if SYME == 'ENTIER' or k!=2: + for j in range(8): + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR3[j]+SECT[k], + GROUP_MA = CAR6[j]+SECT[k],),) + +# 2/ determination et nommage des noeuds origine et extremite des groupes de noeuds +# representant les ligaments de la ou des sections: sous-ep. + issep=0 + for ssep in MCL_SOUS_EPAIS: + issep=issep+1 + for k in range(8): + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR4[k]+str(issep), + INTERSEC = ('PEAUEXT',CAR3[k]+str(issep),),),) + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR5[k]+str(issep), + INTERSEC = ('PEAUINT',CAR3[k]+str(issep),),),) +# 3/ nommage final des groupes de noeuds representant les ligaments +# de la ou des sections: sous-ep. + for k in range(8): + motscles['CREA_GROUP_NO'].append(_F(OPTION = 'SEGM_DROI_ORDO', + NOM = CAR6[k]+str(issep), + GROUP_NO = CAR3[k]+str(issep), + GROUP_NO_ORIG = CAR4[k]+str(issep), + GROUP_NO_EXTR = CAR5[k]+str(issep), + PRECISION = PRECIS, + CRITERE = CRITER,),) + +# 4/ determination et nommage des noeuds origine et extremite des groupes de noeuds +# representant les ligaments des sections: TU,MI,GV + for k in range(3): + if SYME == 'ENTIER' or k!=2: + for j in range(8): + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR4[j]+SECT[k], + INTERSEC = ('PEAUEXT',CAR3[j]+SECT[k],),),) + motscles['CREA_GROUP_NO'].append(_F( NOM = CAR5[j]+SECT[k], + INTERSEC = ('PEAUINT',CAR3[j]+SECT[k],),),) +# 5/ nommage final des groupes de noeuds representant les ligaments des sections: TU,MI,GV + for j in range(8): + motscles['CREA_GROUP_NO'].append(_F(OPTION = 'SEGM_DROI_ORDO', + NOM = CAR6[j]+SECT[k], + GROUP_NO = CAR3[j]+SECT[k], + GROUP_NO_ORIG = CAR4[j]+SECT[k], + GROUP_NO_EXTR = CAR5[j]+SECT[k], + PRECISION = PRECIS, + CRITERE = CRITER,),) + + + nomres=DEFI_GROUP(reuse =nomres, + MAILLAGE=nomres, + **motscles ) +# +# DEFI_GROUP 2 + if FISS_COUDE!=None: +# creation des groupes petit axe et grand axe fissure par +# intersection de groupes existants + motscles={} + motscles['CREA_GROUP_NO']=[] + l_peau=[] + l_intersec=[] + if POSIT == 'DEB_INT': + l_peau.append('PEAUINT') + else: + l_peau.append('PEAUEXT') + + if SYME == 'ENTIER' : + l_intersec.append('FACE1') + motscles['CREA_GROUP_NO'].append(_F(NOM = 'P_AXE_1', + INTERSEC = ('NOLIG1','FACE1'),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = 'G_AXE_1', + INTERSEC = tuple(l_peau+l_intersec),),) + l_intersec=[] + l_intersec.append('FACE2') + motscles['CREA_GROUP_NO'].append(_F(NOM = 'P_AXE_2', + INTERSEC = ('NOLIG2','FACE2'),),) + motscles['CREA_GROUP_NO'].append(_F(NOM = 'G_AXE_2', + INTERSEC = tuple(l_peau+l_intersec),),) + + nomres=DEFI_GROUP(reuse =nomres, + MAILLAGE=nomres, + **motscles ) + +# AFFE_MODELE + __MODELE=AFFE_MODELE( MAILLAGE=nomres, + AFFE=_F( GROUP_MA = 'COUDE' , + PHENOMENE = 'MECANIQUE' , + MODELISATION = '3D' , ) + ) + +# MODI_MAILLAGE 1 + motscles={} + if GEOM == 'COUDE': + motscles['TUBE_COUDE']=[] + motscles['TUBE_COUDE'].append(_F(ANGLE=ALPHA, + R_CINTR=RC, + L_TUBE_P1=LTCHAR),) + motscles['PLAQ_TUBE']=[] + D_PLAQ_TUBE={} + D_PLAQ_TUBE['DEXT']=DEXT + D_PLAQ_TUBE['EPAIS']=EP1 + D_PLAQ_TUBE['L_TUBE_P1']=LTCHAR + if SYME == 'QUART' : D_PLAQ_TUBE['COUTURE']='NON' + if FISS_COUDE!=None: + D_PLAQ_TUBE['AZIMUT']=AZIM + elif SOUS_EPAIS_COUDE!=None : + D_PLAQ_TUBE['AZIMUT']=MCL_SOUS_EPAIS[0].IPHIC + else:pass + motscles['PLAQ_TUBE'].append(_F(**D_PLAQ_TUBE),) + nomres=MODI_MAILLAGE( reuse =nomres, + MAILLAGE=nomres, + **motscles ) + +# MODI_MAILLAGE 2 + motscles={} + motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE'),) + if FISS_COUDE!=None: + if FISS_COUDE['FISSURE'] == 'DEB_INIT': + motscles['ORIE_PEAU_3D']=_F(GROUP_MA=('PEAUINT','EXTUBE','FACE1','FACE2'),) + nomres=MODI_MAILLAGE(reuse =nomres, + MAILLAGE=nomres, + MODELE =__MODELE, + **motscles) + +# CREA_MAILLAGE + if SYME != 'QUART': + self.DeclareOut('nomre2',self.sd) + motscles={} + motscles['CREA_POI1']=[] + motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P1', + GROUP_NO='P1'),) + if TYPBOL == None : + motscles['CREA_POI1'].append(_F(NOM_GROUP_MA='P2', + GROUP_NO='P2'),) + nomre2=CREA_MAILLAGE( MAILLAGE=nomres, + **motscles) + else: + nomre2=nomres + + +# IMPRESSSION + if IMPRESSION!=None: + if IMPRESSION.__class__.__name__ !='MCList' : IMPRESSION =[IMPRESSION,] + for impr in IMPRESSION : +# + motscles={} + if impr['FORMAT']=='IDEAS' : motscles['VERSION'] =impr['VERSION'] + if impr['FORMAT']=='CASTEM' : motscles['NIVE_GIBI'] =impr['NIVE_GIBI'] + if impr['UNITE']!=None : motscles['UNITE'] =impr['UNITE'] + impr_resu = _F( MAILLAGE = nomre2,) +# + IMPR_RESU( RESU = impr_resu, + FORMAT= impr['FORMAT'],**motscles) + + + + return ier + + diff --git a/Aster/Cata/Macro/stanley_ops.py b/Aster/Cata/Macro/stanley_ops.py new file mode 100644 index 00000000..2729d26c --- /dev/null +++ b/Aster/Cata/Macro/stanley_ops.py @@ -0,0 +1,50 @@ +#@ MODIF stanley_ops Macro DATE 05/04/2004 AUTEUR ASSIRE A.ASSIRE +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== + +def stanley_ops(self,RESULTAT,MODELE,CHAM_MATER,CARA_ELEM,**args): + + """ + Importation et lancement de Stanley + """ + + import os,string + import aster + from Accas import _F + from Noyau.N_utils import AsType + ier=0 + + # La macro compte pour 1 dans la numerotation des commandes + self.icmd=1 + + import Stanley + from Stanley import stanley + + if (RESULTAT and MODELE and CHAM_MATER): + _MAIL = aster.getvectjev( string.ljust(MODELE.nom,8) + '.MODELE .NOMA ' ) + _MAIL = string.strip(_MAIL[0]) + MAILLAGE = self.jdc.g_context[_MAIL] + if CARA_ELEM: + stanley.STANLEY(RESULTAT,MAILLAGE,MODELE,CHAM_MATER,CARA_ELEM) + else: + stanley.STANLEY(RESULTAT,MAILLAGE,MODELE,CHAM_MATER,None) + else: + + stanley.PRE_STANLEY() + + return ier diff --git a/Aster/Cata/Macro/test_fichier_ops.py b/Aster/Cata/Macro/test_fichier_ops.py new file mode 100644 index 00000000..a8854743 --- /dev/null +++ b/Aster/Cata/Macro/test_fichier_ops.py @@ -0,0 +1,145 @@ +#@ MODIF test_fichier_ops Macro DATE 30/03/2004 AUTEUR MCOURTOI M.COURTOIS +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== + +def test_fichier_ops(self, FICHIER, NOM_SYSTEME, NB_CHIFFRE, EPSILON, VALE_K, INFO, **args): + """ + Macro TEST_FICHIER permettant de tester la non-regression d'un fichier + 'a une tolerance' pres pour les nombres reels en calculant + le md5sum. + """ + import aster + from Accas import _F + ier=0 + # La macro compte pour 1 dans la numerotation des commandes + #self.icmd=1 + self.set_icmd(1) + + # On importe les definitions des commandes a utiliser dans la macro + # Le nom de la variable doit etre obligatoirement le nom de la commande + CREA_TABLE =self.get_cmd('CREA_TABLE') + TEST_TABLE =self.get_cmd('TEST_TABLE') + + import os.path + from Macro.test_fichier_ops import md5file + + # calcule le md5sum du fichier + ier, mdsum = md5file(NOM_SYSTEME, NB_CHIFFRE, EPSILON, INFO) + if ier != 0: + if ier==4: + texte_erreur='Fichier inexistant : '+NOM_SYSTEME + else: + texte_erreur='Erreur dans md5file, code retour = '+str(ier) + texte_erreur=' '+texte_erreur +# raise aster.FatalError,texte_erreur + self.cr.fatal(texte_erreur) + return ier + + # comparaison a la reference + is_ok=0 + if INFO > 0 : + print ' %-20s : %32s' % ('REFERENCE',VALE_K) + print + + if mdsum == VALE_K: + is_ok=1 + + # produit le TEST_TABLE + __tab1=CREA_TABLE(LISTE=(_F(PARA='TEST', + TYPE_K='K8', + LISTE_K='VALEUR ',), + _F(PARA='BOOLEEN', + LISTE_I=is_ok,),),) + if args['REFERENCE'] == 'NON_REGRESSION': + TEST_TABLE(FICHIER=FICHIER, + TABLE=__tab1, + FILTRE=_F(NOM_PARA='TEST', + VALE_K='VALEUR ',), + NOM_PARA='BOOLEEN', + VALE_I=1, + PRECISION=1.e-3, + CRITERE='ABSOLU', + REFERENCE=args['REFERENCE'], + VERSION=args['VERSION'],) + else: + TEST_TABLE(FICHIER=FICHIER, + TABLE=__tab1, + FILTRE=_F(NOM_PARA='TEST', + VALE_K='VALEUR ',), + NOM_PARA='BOOLEEN', + VALE_I=1, + PRECISION=1.e-3, + CRITERE='ABSOLU', + REFERENCE=args['REFERENCE'],) + return ier + + +def md5file(fich,nbch,epsi,info=0): + """ + Cette methode retourne le md5sum d'un fichier en arrondissant les nombres + reels a la valeur significative. + IN : + fich : nom du fichier + nbch : nombre de decimales significatives + epsi : valeur en deca de laquelle on prend 0. + OUT : + code retour : 0 si ok, >0 sinon + md5sum + """ + import os.path + import re + import string + import math + import md5 + # 1 Mo 10 Mo 100 Mo + # v0 2.6 s 20.4 s 196.6 s + # v1 2.0 s 10.3 s 94.9 s (pas de distinction entier/reel) + # remplacer le try/except par if re.search(...), 80% plus lent + if not os.path.isfile(fich): + return 4, '' + f=open(fich,'r') + format_float='%'+str(nbch+7)+'.'+str(nbch)+'g' + m=md5.new() + i=0 + for ligne in f.xreadlines(): +#python2.3 for ligne in f: + i=i+1 + # pour decouper 123E+987-1.2345 + # r=re.split(' +|([0-9]+)\-+',ligne) + r=string.split(ligne) + for x in r: + try: + if abs(float(x))=2: + print 'LIGNE',i,'VALEUR RETENUE',s + m.update(s) + f.close() + md5sum=m.hexdigest() + if info>=1: + form=' %-20s : %32s' + print form % ('Fichier',fich) + print form % ('Nombre de lignes',str(i)) + print form % ('Format des reels',format_float) + print form % ('Epsilon',str(epsi)) + print form % ('md5sum',md5sum) + return 0, md5sum