Пример #1
0
 def __evol_et_eval(self,pas,etat,gradient):
     print "__evol_et_eval",pas
     if type(pas)==list:pas=pas[0]
     if (pas==0.):
         return self.obji
     tempetat={}
     tempetat["i"]=0.
     self.fn_evol(etat=etat,newetat=tempetat,gradient=gradient,alpha=pas)
     #ajouter un teste ici en cas d echec de l evolution
     
     b=[]
     for a in range(0,len(self.tab_fn_contrainte)):
         b.append(1.)
     
     
     obji=0
     for k in range(0,len(self.tab_fn_contrainte)):
         if (k==0):
             objtemp=CO('objtemp')
             self.tab_fn_contrainte[k][0](etat=tempetat,valeur=objtemp,fn_para=self.tab_fn_contrainte[k][1])
             obji=objtemp['R',1]
             self.fn_detruire_table(table=objtemp)
         else:
             objk=CO('objk')
             self.tab_fn_contrainte[k][0](etat=tempetat,valeur=objk,fn_para=self.tab_fn_contrainte[k][1])
                     
             if (self.class_barriere!=None):
                 b[k]=self.class_barriere.valeur(objk['R',1])
             else:
                 b[k]=objk['R',1]
             
             obji=obji+b[k]*self.adapt_coef[k]
             self.fn_detruire_table(table=objk)
     aster.affiche('RESULTAT',"   evol et eval alpha=%f retour%f etat:"%(pas,obji))
     self.fn_detruire_etat(etat=tempetat)
     return obji
Пример #2
0
    def descente_gradient(self,tab_fn_contrainte,etat_init,nb_pas,pas_init,
                          adaptative_penality=False,adaptative_penality_beta1=1.6,
                          adaptative_penality_beta2=1.4,adaptative_penality_nb_iter=3,adaptative_penality_coef=[],
                          residu=10-3,pas_mini=0.01,normalise=False,normalise_iteration=False,
                          pas_optimal=None,pas_optimal_nb_brent_iter=5):
        
        self.tab_fn_contrainte=tab_fn_contrainte
        """
            la premiere fn_contrainte est l'objectif
            chaque fn contrainte est une class qui possede la proprietes suivantes
            (etat,gradient=CO(out),fn_para)
            on ne peut utiliser les propriete de classe que par l'ajout de .opti_vale=[]
            qui retourne la valeur de la fonction et le gradient si (out) est fournis
            gradient est toujours un objet aster (table ou champ)
            etat est toujours un dictionnaire
            
            a la fin toute les fonction contrainte doivent etre <=0
            """
        
        i=0
        alpha=pas_init
        etat_courrant=etat_init
        
        #coefficient de la fonction barriere
        b=[]
        derb=[]
        for a in range(0,len(self.tab_fn_contrainte)):
            b.append(1.)
            derb.append(1.)
        
        #coefficient pour l adaptation
        self.adapt_coef=adaptative_penality_coef
        self.adapt_historique=[]
        if (len(self.adapt_coef)==0):
            for a in range(0,len(self.tab_fn_contrainte)):
                self.adapt_coef.append(1.)
                self.adapt_historique.append(0)
        else:
            for a in range(0,len(self.tab_fn_contrainte)):
                self.adapt_historique.append(0)


            
        historique_convergence=[]
        convergence=False
        while (i<nb_pas and convergence!=True):
            aster.affiche('RESULTAT', "\n\ndescente de gradient iteration %d pas %f"%(i,alpha))
            gradi=0
            self.obji=0
            objectif=[]
            #print "construction du gradient avec les fonctions criteres"
            for k in range(0,len(self.tab_fn_contrainte)):
                objtemp=objtemp=CO('objtemp')
                objkval=0.
                if (k==0):
                    
                    gradi=CO('gradi')
                    self.tab_fn_contrainte[k][0](etat=etat_courrant,valeur=objtemp,gradient=gradi,fn_para=self.tab_fn_contrainte[k][1])
                    objkval=objtemp['R',1]
                    self.fn_detruire_table(table=objtemp)
                    
                    self.obji=objkval
                    objectif.append(objkval)
                    
                    #Si le gradient doit etre normalise
                    if (normalise):
                        gradinor=CO('gradin')
                        #print "gradi",gradi['R',1]
                        self.__normalise_grad(etat=etat_courrant,retour=gradinor,gradient=gradi)
                        gradi=gradinor
                        
                    #on vas dans la direction oppose a celle indique par le gradient 
                    gradineg=CO('gradineg')
                    self.fn_mult_grad(etat=etat_courrant,retour=gradineg,gradient=gradi,alpha=-1.)
                    gradi=gradineg
                        #gradi=self.__normalise_grad(etat=etat_courrant,gradient=gradi)
                else:
                    gradk=CO('gradk')
                    self.tab_fn_contrainte[k][0](etat=etat_courrant,valeur=objtemp,gradient=gradk,fn_para=self.tab_fn_contrainte[k][1])
                    objkval=objtemp['R',1]
                    self.fn_detruire_table(table=objtemp)
                    
                    objectif.append(objkval)

                    if (normalise):
                        gradkn=CO('gradkn')
                        self.__normalise_grad(etat=etat_courrant,retour=gradkn,gradient=gradk)
                        gradk=gradkn
                        
                    if (self.class_barriere!=None):
                        derb[k]=self.class_barriere.derive(objkval)
                        b[k]=self.class_barriere.valeur(objkval)
                    else:
                        b[k]=objkval
                        
                    if (adaptative_penality):
                        print "adaptative penality",self.adapt_historique
                        if (objkval>0):
                            self.adapt_historique[k]+=1
                        else:
                            self.adapt_historique[k]-=1
                        if ((i+1)%(adaptative_penality_nb_iter)==0):
                            print "adaptative penality i",i," self.adapt_historique[k]",self.adapt_historique[k]
                            if (self.adapt_historique[k]==adaptative_penality_nb_iter):
                                print "increase"
                                self.adapt_coef[k]=self.adapt_coef[k]*adaptative_penality_beta1
                            if (self.adapt_historique[k]==-adaptative_penality_nb_iter):
                                print "decrease"
                                self.adapt_coef[k]=self.adapt_coef[k]/adaptative_penality_beta2
                            self.adapt_historique[k]=0
                            
                    print self.adapt_coef[k]
                    print "bk",b[k],"derbk",derb[k]
                    
                    self.obji=self.obji+self.adapt_coef[k]*b[k]
                    
                    gikn=CO('gik%d'%k)
                    #analytique
                    self.fn_sauv_etat(etat=etat_courrant,text=self.chemin_de_sauvegarde+"etati.%d"%i)
                    self.fn_sauv_grad(etat=etat_courrant,gradient=gradi,text=self.chemin_de_sauvegarde+"gradi%davantk%d"%(i,k))
                    aster.affiche('RESULTAT'," "*10+"sauvegarde gradk adapt:%f, derb:%f"%(self.adapt_coef[k],derb[k]))
                    
                    self.fn_update_grad(etat=etat_courrant,retour=gikn,grad1=gradi,grad2=gradk,alpha=-self.adapt_coef[k]*derb[k])
                    gradi=gikn
                    
                    #analytique
                    self.fn_sauv_grad(etat=etat_courrant,gradient=gradi,text=self.chemin_de_sauvegarde+"gradi%dapresk%d"%(i,k))
                    
                    self.fn_detruire_gradient(gradient=gradk)
                out=" "*5+"tab_fn_contrainte i:"+str(k)+" objk:"+str(objkval)+" barriere"+str(b[k])+" derbarriere"+str(derb[k]);
                aster.affiche('RESULTAT', out)
            #if (self.fn_smoothgrad!=None):
            #    gradi=self.fn_smoothgrad(gradi)
            
            #si on normalise le gradien a chaque iteration
            if (normalise_iteration):
                gradifn=CO('gradifn')
                self.__normalise_grad(etat=etat_courrant,retour=gradifn,gradient=gradi)
                gradi=gradifn

            #determination du pas optimal
            if (pas_optimal!=None):
                
                if (pas_optimal=="brent"):
                    aster.affiche('RESULTAT', "Calcul du pas optimal avec brent")
                    if (alpha==0.):
                        alpha=pas_init
                    rbrent=scalarsearch.brent(self.__evol_et_eval,func0=self.obji,args=(etat_courrant,gradi),brack=[0.,alpha],maxiter=pas_optimal_nb_brent_iter,full_output=True);
                    out= "retour brent"+str(rbrent)
                    aster.affiche('RESULTAT', out)
                    alpha=rbrent[0]
                    
                if (pas_optimal=="armijo"):
                    aster.affiche('RESULTAT', "Calcul du pas optimal avec armijo")
                    if (alpha<pas_mini):
                        alpha=pas_init
                        
                    a=CO('a')
                    self.fn_prod_scalaire_grad(etat=etat_courrant,retour=a,grad1=gradi,grad2=gradi)
                    normgrad=a['R',1]
                    self.fn_detruire_table(table=a)
                    
                    retourls=scalarsearch.scalar_search_armijo(phi=self.__evol_et_eval,phi0=self.obji,derphi0=normgrad,alpha0=alpha,args=(etat_courrant,gradi),);
                    out= "retour arjimo"+str(retourls)
                    aster.affiche('RESULTAT', out)
                    alpha=retourls[0]

                #scalar_search_wolfe1
                if (pas_optimal=="wolfe1"):
                    aster.affiche('RESULTAT', "Calcul du pas optimal avec wolfe1")
                    #alpha=pas_init
                    if (alpha==0.):
                        alpha=pas_init
                        
                    a=CO('a')
                    self.fn_prod_scalaire_grad(etat=etat_courrant,retour=a,grad1=gradi,grad2=gradi)
                    normgrad=a['R',1]
                    self.fn_detruire_table(table=a)
                    
                    retourls=scalarsearch.scalar_search_wolfe1(phi=self.__evol_et_eval_avec_der,phi0=self.obji,derphi0=normgrad,alpha0=alpha,args=(etat_courrant,gradi),);
                    out= "retour wolfe1"+str(retourls)
                    aster.affiche('RESULTAT', out)
                    alpha=retourls[0]
                
                if (alpha==0.):
                    if(adaptative_penality):
                        for k in range(1,len(self.tab_fn_contrainte)):
                            if (objectif[k]>0):
                                print "increase"
                                self.adapt_coef[k]=self.adapt_coef[k]*adaptative_penality_beta1
                            if (objectif[k]<0):
                                print "decrease"
                                self.adapt_coef[k]=self.adapt_coef[k]/adaptative_penality_beta2
                            self.adapt_historique[k]=0
                    else:
                        convergence=True
                
            #analytique
            aster.affiche('RESULTAT',"sauvegarde iter %d, self.obji:%f"%(i,self.obji))
            self.fn_sauv_grad(etat=etat_courrant,gradient=gradi,text=self.chemin_de_sauvegarde+"gradi%d"%i)
            self.fn_sauv_etat(etat=etat_courrant,text=self.chemin_de_sauvegarde+"sauvegardeavanti.%d"%i)
            if (len(historique_convergence)>=1):
                self.variation_absolue=self.obji-historique_convergence[len(historique_convergence)-1][1][0]
                if (self.obji!=0):
                    self.variation_relative=self.variation_absolue/self.obji
                else:
                    self.variation_relative=self.variation_absolue
            else:
                self.variation_absolue=self.variation_relative=self.obji
            
            tempetat={}
            tempetat["i"]=0.
            self.fn_evol(etat=etat_courrant,newetat=tempetat,gradient=gradi,alpha=alpha)
            self.fn_detruire_etat(etat=etat_courrant)
            etat_courrant=tempetat
            
            self.fn_sauv_etat(etat=etat_courrant,text=self.chemin_de_sauvegarde+"sauvegardefini.%d"%i)
            
            historique_convergence.append((i,(self.obji,self.variation_absolue,self.variation_relative),alpha,list(self.adapt_coef),objectif))
            out= "historique_convergence (num_ iteration, [objectif,variation_absolue,variation_relative], pas ,[coeficient de lagrange],[objectif])"
            for aa in historique_convergence:
                out=out+"\n"+" "*5+str(aa)
            aster.affiche('RESULTAT', out)

            self.fn_detruire_gradient(gradient=gradi)
            i+=1
        
        print "fin de descente de grad"


        return etat_courrant
Пример #3
0
    def __evol_et_eval_avec_der(self,pas,etat,gradient):
        print "__evol_et_eval_avec_der",pas
        if type(pas)==list:pas=pas[0]
        if (pas==0.):
            return self.obji
        tempetat={}
        tempetat["i"]=0.
        self.fn_evol(etat=etat,newetat=tempetat,gradient=gradient,alpha=pas)
        #ajouter un teste ici en cas d echec de l evolution
        
        b=[]
        for a in range(0,len(self.tab_fn_contrainte)):
            b.append(1.)
        
        obji=0
        for k in range(0,len(self.tab_fn_contrainte)):
            objtemp=objtemp=CO('objtemp')
            objkval=0.
            
            if (k==0):
                
                gradj=CO('gradj')
                self.tab_fn_contrainte[k][0](etat=etat_courrant,valeur=objtemp,gradient=gradj,fn_para=self.tab_fn_contrainte[k][1])
                objkval=objtemp['R',1]
                self.fn_detruire_table(table=objtemp)
                
                obji=objkval

                #on vas dans la direction oppose a celle indique par le gradient 
                gradineg=CO('gradjneg')
                self.fn_mult_grad(etat=etat_courrant,retour=gradjneg,gradient=gradj,alpha=-1.)
                gradj=gradjneg
                    #gradi=self.__normalise_grad(etat=etat_courrant,gradient=gradi)
            else:
                gradjk=CO('gradjk')
                self.tab_fn_contrainte[k][0](etat=etat_courrant,valeur=objtemp,gradient=gradjk,fn_para=self.tab_fn_contrainte[k][1])
                objkval=objtemp['R',1]
                self.fn_detruire_table(table=objtemp)
                
                if (self.class_barriere!=None):
                    derb[k]=self.class_barriere.derive(objkval)
                    b[k]=self.class_barriere.valeur(objkval)
                else:
                    b[k]=objkval
                    
                obji=obji+self.adapt_coef[k]*b[k]
                
                gijkn=CO('gijk%d'%k)
                #self.fn_sauv_etat(etat=etat_courrant,text=" "*10+"sauvegarde etat")
                #self.fn_sauv_grad(etat=etat_courrant,gradient=gradj,text=" "*10+"sauvegarde gradi avant mise a jour")
                out=" "*10+"sauvegarde gradk adapt:%f, derb:%f"%(self.adapt_coef[k],derb[k])
                aster.affiche('RESULTAT',out)
                self.fn_update_grad(etat=etat_courrant,retour=gijkn,grad1=gradj,grad2=gradjk,alpha=-self.adapt_coef[k]*derb[k])
                gradj=gijkn
                #self.fn_sauv_grad(etat=etat_courrant,gradient=gradj,text=" "*10+"sauvegarde gradi")
                
                self.fn_detruire_gradient(gradient=gradjk)

        a=CO('a')
        #print "gradi=gradient",gradient['R',1]
        self.fn_prod_scalaire_grad(etat=tempetat,retour=a,grad1=gradient,grad2=gradi)
        der=a['R',1]
        self.fn_detruire_table(table=a)

        aster.affiche('RESULTAT',"   sauvegarde evol et eval et der alpha=%f retour(%f,%f) etat:"%(pas,obji,der))
        
        self.fn_detruire_etat(etat=tempetat)
        return obji,der
Пример #4
0
                nbVide += sum([1 for i in col if i is None])
            # be care to extract the statistics before changing `tab`!
            tab['STAT_VALE'] = [len(tab), len(tab.para), nbVide]
            tab['STAT_NOM'] = ['NB_LIGNES', 'NB_COLONNES', 'NB_VIDE']

    # 99. Création de la table_sdaster résultat
    # cas réentrant : il faut détruire l'ancienne table_sdaster
    if self.reuse is not None:
        DETRUIRE(CONCEPT=_F(NOM=TABLE), INFO=1)

    dprod = tab.dict_CREA_TABLE()
    if INFO == 2:
        echo_mess = ['']
        echo_mess.append(repr(tab))
        from pprint import pformat
        echo_mess.append(pformat(dprod))
        echo_mess.append('')
        texte_final = os.linesep.join(echo_mess)
        aster.affiche('MESSAGE', texte_final)

    # surcharge par le titre fourni
    tit = args['TITRE']
    if tit != None:
        if type(tit) not in (list, tuple):
            tit = [tit]
        dprod['TITRE'] = tuple(['%-80s' % lig for lig in tit])
    # type de la table de sortie à passer à CREA_TABLE
    tabout = CREA_TABLE(TYPE_TABLE=typ_tabout, **dprod)

    return ier
Пример #5
0
def gestion_sous_bande(solveur_lineaire, __nbmodi, nnfreq, nbproc, lborne,
                       stop):

    nbsb_nonvide = None
    proc_sb_nvide = []
    # Recuperation du nbre de modes total theorique
    nbmodeth = 0
    modemin = 1000000
    imin = 0
    modemax = -1
    imax = 0
    for i in range(0, nnfreq - 1):
        modei = __nbmodi['NB_MODE', i + 1]
        nbmodeth = nbmodeth + modei
        if (modei > modemax):
            modemax = modei
            imax = i + 1
        if (modei < modemin):
            modemin = modei
            imin = i + 1

    if ((modemax > 3 * modemin) & (modemax > 50)):
        UTMESS(
            'I',
            'MODAL_19',
            vali=(imin, modemin, imax, modemax),
        )
    if (modemin < 10):
        UTMESS(
            'I',
            'MODAL_20',
            vali=(imin, modemin),
        )
    if (modemax > 100):
        UTMESS(
            'I',
            'MODAL_21',
            vali=(imax, modemax),
        )

    # Recuperation du nbre de sous-bandes non vides
    nbsb_nonvide = 0
    for i in range(0, nnfreq - 1):
        if (__nbmodi['NB_MODE', i + 1] != 0):
            nbsb_nonvide = nbsb_nonvide + 1

    if ((nbmodeth == 0) | (nbsb_nonvide == 0)):
        aster.affiche('MESSAGE', 72 * '-')
        if stop:
            UTMESS('F', 'MODAL_8', valr=(lborne[0], lborne[nnfreq - 1]))
        else:
            UTMESS('A', 'MODAL_8', valr=(lborne[0], lborne[nnfreq - 1]))
        aster.affiche('MESSAGE', 72 * '-')

    if (nbproc > 1):
        if ((nbproc < nbsb_nonvide) | ((nbproc > nbsb_nonvide) &
                                       (solveur_lineaire != 'MUMPS'))):
            aster.affiche('MESSAGE', 72 * '-')
            UTMESS('F',
                   'MODAL_9',
                   vali=(nbproc, nbsb_nonvide),
                   valk=solveur_lineaire)
            aster.affiche('MESSAGE', 72 * '-')
        div = None
        reste = None
        div = nbproc // nbsb_nonvide
        reste = nbproc - nbsb_nonvide * div
        if ((nbproc > nbsb_nonvide) & (reste != 0)):
            aster.affiche('MESSAGE', 72 * '-')
            UTMESS(
                'I',
                'MODAL_12',
                vali=(nbsb_nonvide, div, div + 1),
            )
            aster.affiche('MESSAGE', 72 * '-')

        l1 = nbproc // nbsb_nonvide
        l11 = l1 + 1
        l2 = nbproc - (l1 * nbsb_nonvide)
        num_sb = 0
        for i in range(0, l2):
            num_sb = num_sb + 1
            for j in range(0, l11):
                proc_sb_nvide.append(num_sb)

        for i in range(l2, nbsb_nonvide):
            num_sb = num_sb + 1
            for j in range(0, l1):
                proc_sb_nvide.append(num_sb)

    else:
        proc_sb_nvide.append(-999)

    return nbmodeth, nbsb_nonvide, proc_sb_nvide
Пример #6
0
def post_dyna_alea_ops(self, INFO, **args):

    # On importe les définitions des commandes a utiliser dans la macro
    # Le nom de la variable doit être obligatoirement le nom de la commande

    #  ------------------------------------------------------------------
    #---------algorithme d'optimisation pour le  maximum de vraisemblance
    def vrais(x):
        am = x[0]
        beta = x[1]
        #       assert am >0.000, 'optimize.py: beta negatif'
        #       assert am >0.000, 'optimize.py: am negatif'
        if am <= 0.000:
            am = 0.01
        if beta <= 0.000:
            beta = 0.001
        res = 1.0
        for k in range(Nbval):
            ai = liste_indic[k]
            xi = float(liste_def[k])
            val = log(ai / am)
            pfa = normcdf(val / beta)
            f0 = pfa**xi * (1. - pfa)**(1 - xi)
            res = res * f0
        return -res

    def boot_vrais(x):
        am = x[0]
        beta = x[1]
        res = 1.0
        for k in range(Nbval):
            ai = liste_indic[list_rand[k]]
            xi = float(liste_def[list_rand[k]])
            val = log(ai / am)
            pfa = normcdf(val / beta)
            f0 = pfa**xi * (1. - pfa)**(1 - xi)
            res = res * f0
        return -res

    def fonc_def(vale, seuil):
        if vale >= seuil:
            resu = 1
        else:
            resu = 0
        return resu

#  ------------------------------------------------------------------
#  OPTION FRAGILITE
# ------------------------------------------------------------------

    if 'FRAGILITE' in args:
        FRAGILITE = args['FRAGILITE'][0]
        if FRAGILITE['LIST_PARA'] is not None:
            liste_a = FRAGILITE['LIST_PARA'].sdj.VALE.get()
        elif FRAGILITE['VALE'] is not None:
            liste_a = FRAGILITE['VALE']

        Nba = len(liste_a)
        lpfa = []
        tab2 = FRAGILITE['TABL_RESU'].EXTR_TABLE()
        dicta = tab2.values()

        if 'DEFA' in dicta:
            liste_def = dicta['DEFA']
            test2 = NP.equal(None, liste_def)
        elif 'DEMANDE' in dicta:
            liste_dem = dicta['DEMANDE']
            test2 = NP.equal(None, liste_dem)
        else:
            UTMESS('F', 'TABLE0_1', valk=('DEFA,DEMANDE'))

        if 'PARA_NOCI' in dicta:
            liste_indic = dicta['PARA_NOCI']
        else:
            UTMESS('F', 'TABLE0_1', valk=('PARA_NOCI'))

        Nbval = len(liste_indic)
        test1 = NP.equal(None, liste_indic)
        if test1.any() or test2.any():
            if 'DEFA' in dicta:
                UTMESS('F', 'TABLE0_14', valk=('DEFA', 'PARA_NOCI'))
            elif 'DEMANDE' in dicta:
                UTMESS('F', 'TABLE0_14', valk=('DEMANDE', 'PARA_NOCI'))

        if FRAGILITE['METHODE'] == "EMV":
            # 1) estimation paramètres maximum de vraisemblance
            if 'DEFA' not in dicta:
                if FRAGILITE['SEUIL'] is not None:
                    liste_def = [
                        fonc_def(vale, FRAGILITE['SEUIL'])
                        for vale in liste_dem
                    ]
                else:
                    UTMESS('F', 'FONCT0_16', valk=('SEUIL'))

            x0 = [FRAGILITE['AM_INI'], FRAGILITE['BETA_INI']]
            xopt = fmin(vrais, x0)

        elif FRAGILITE['METHODE'] == "REGRESSION":
            # 2) estimation paramètres REGRESSION
            para_b, para_a, sigma, = linregress(NP.log(NP.array(liste_indic)),
                                                NP.log(NP.array(liste_dem)))
            if INFO == 2:
                texte = 'PARAMETRES REGRESSION : ' + str(para_b) + ' ' + str(
                    exp(para_a)) + '\n'
                aster.affiche('MESSAGE', texte)

            Am = exp((log(FRAGILITE['SEUIL']) - para_a) / para_b)
            beta = sigma / para_b
            xopt = [Am, beta]

        texte = 'PARAMETRES Am, beta ESTIMES : ' + str(xopt) + '\n'
        aster.affiche('MESSAGE', texte)
        #print 'parametres Am, beta estimes: ', xopt

        # courbe de fragilité
        vec_a = NP.array(liste_a)
        vecval = (NP.log(vec_a / xopt[0])) / xopt[1]
        for m in range(Nba):
            lpfa.append(normcdf(vecval[m]))

        # table sortie
        mcfact = []
        if 'TITRE' in args:
            mcfact.append(_F(PARA='TITRE', LISTE_K=args['TITRE']))

        mcfact.append(_F(PARA='AM', LISTE_R=xopt[0]))
        mcfact.append(_F(PARA='BETA', LISTE_R=xopt[1]))
        mcfact.append(_F(PARA='PARA_NOCI', LISTE_R=liste_a))
        mcfact.append(_F(PARA='PFA', LISTE_R=lpfa))

        # si calcul de fractiles (intervalles de confiance) par bootstrap
        x0 = xopt
        if FRAGILITE['METHODE'] == "EMV":
            if FRAGILITE['FRACTILE'] is not None:
                if INFO == 2:
                    texte = 'FRACTILES A CALCULER PAR BOOTSTRAP ' + \
                        str(FRAGILITE['FRACTILE']) + '\n'
                    aster.affiche('MESSAGE', texte)
                if FRAGILITE['NB_TIRAGE'] is not None:
                    Nboot = FRAGILITE['NB_TIRAGE']
                    if Nboot > Nbval:
                        UTMESS('F', 'PROBA0_11')
                        # assert Nboot <= Nbval , 'ERREUR: nombre de
                        # tirages demandes trop grand'
                else:
                    Nboot = Nbval

                list_fonc = []
                lfract = FRAGILITE['FRACTILE']
                __F1 = [None] * Nbval
                __ABS = [None] * Nbval
                __ORDO = [None] * Nbval

                for kb in range(Nboot):  # in range(Nbval)

                    lpfa = []
                    list_rand = []

                    for kb2 in range(Nbval):
                        list_rand.append(random.randint(0, Nbval - 1))

                    xopt = fmin(boot_vrais, x0)
                    if INFO == 2:
                        texte1 = 'BOOTSTRAP TIRAGE ' + str(kb + 1)
                        texte2 = '  PARAMETRES Am, beta ESTIMES : ' + \
                            str(xopt) + '\n'
                        aster.affiche('MESSAGE', texte1)
                        aster.affiche('MESSAGE', texte2)
                    vecval = (NP.log(vec_a / xopt[0])) / xopt[1]
                    for m in range(Nba):
                        lpfa.append(normcdf(vecval[m]))

                    __ABS[kb] = DEFI_LIST_REEL(VALE=liste_a)
                    __ORDO[kb] = DEFI_LIST_REEL(VALE=lpfa)

                    __F1[kb] = DEFI_FONCTION(
                        NOM_PARA='PGAZ',
                        NOM_RESU='PFA',
                        VALE_PARA=__ABS[kb],
                        VALE_FONC=__ORDO[kb],
                    )
                    list_fonc.append(__F1[kb], )

                #__FRACTILE = [None]*len(lfract)
                liste = [None] * len(lfract)
                for kb in range(len(lfract)):
                    __FRACTILE = CALC_FONCTION(FRACTILE=_F(
                        FONCTION=(list_fonc), FRACT=lfract[kb]), )
                    liste[kb] = __FRACTILE.Ordo()
                    mcfact.append(_F(PARA=str(lfract[kb]), LISTE_R=liste[kb]))

        #   fin FRAGILITE
        tabout = CREA_TABLE(LISTE=mcfact, TITRE='POST_DYNA_ALEA - Fragilite')

#  ------------------------------------------------------------------

#  ------------------------------------------------------------------
#  OPTION INTESPEC
# ------------------------------------------------------------------
    if 'INTERSPECTRE' in args:

        INTERSPECTRE = args['INTERSPECTRE']

        INTE_SPEC = INTERSPECTRE['INTE_SPEC']

        NUME_ORDRE_I = INTERSPECTRE['NUME_ORDRE_I']
        NOEUD_I = INTERSPECTRE['NOEUD_I']
        OPTION = INTERSPECTRE['OPTION']
        MOMENT = INTERSPECTRE['MOMENT']
        DUREE = INTERSPECTRE['DUREE']
        FRACTILE = INTERSPECTRE['FRACTILE']

        # table résultat
        tabres = Table(titr='POST_DYNA_ALEA - Interspectre')

        #     ------------------------------------------------------------------
        #     Liste des moments spectraux
        #     repérer le type de l'interspectre et son nom
        #                   1- concept interspectre
        #                   2- table de table d interspectre

        intespec = INTE_SPEC.getName().ljust(8)

        #     ------------------------------------------------------------------
        #     Repérer les couples d'indices selectionnés
        #     vérification de l'égalité du nombre d indices en i et j

        if NUME_ORDRE_I is not None:
            l_ind_i = NUME_ORDRE_I
            if type(l_ind_i) not in EnumTypes:
                l_ind_i = [l_ind_i]
            l_ind_j = INTERSPECTRE['NUME_ORDRE_J']
            if l_ind_j:
                if type(l_ind_j) not in EnumTypes:
                    l_ind_j = [l_ind_j]
                if len(l_ind_i) != len(l_ind_j):
                    UTMESS('F', 'PROBA0_8')
            else:
                l_ind_j = NUME_ORDRE_I
                if type(l_ind_j) not in EnumTypes:
                    l_ind_j = [l_ind_j]

            # paramètres fixes de la table
            tabres.add_para(['NUME_ORDRE_I', 'NUME_ORDRE_J'], 'I')
        elif NOEUD_I is not None:
            l_ind_i = NOEUD_I
            l_cmp_i = INTERSPECTRE['NOM_CMP_I']
            if type(l_ind_i) not in EnumTypes:
                l_ind_i = [l_ind_i]
            if type(l_cmp_i) not in EnumTypes:
                l_cmp_i = [l_cmp_i]
            l_ind_j = INTERSPECTRE['NOEUD_J']
            if l_ind_j:
                l_cmp_j = INTERSPECTRE['NOM_CMP_J']
                if type(l_ind_j) not in EnumTypes:
                    l_ind_j = [l_ind_j]
                if type(l_cmp_j) not in EnumTypes:
                    l_cmp_j = [l_cmp_j]
                if len(l_ind_i) != len(l_ind_j):
                    UTMESS('F', 'PROBA0_8')
                if len(l_cmp_i) != len(l_cmp_j):
                    UTMESS('F', 'PROBA0_9')
                if len(l_ind_i) != len(l_cmp_i):
                    UTMESS('F', 'PROBA0_10')
            else:
                l_ind_j = NOEUD_I
                l_cmp_j = INTERSPECTRE['NOM_CMP_I']
                if type(l_ind_j) not in EnumTypes:
                    l_ind_j = [l_ind_j]
                if type(l_cmp_j) not in EnumTypes:
                    l_cmp_j = [l_cmp_j]
            # paramètres fixes de la table
            tabres.add_para(['NOEUD_I', 'NOEUD_J', 'NOM_CMP_I', 'NOM_CMP_J'],
                            'K8')

#     ------------------------------------------------------------------
#     Cas de tous les indices

        elif OPTION == 'TOUT':
            if aster.getvectjev(intespec + '.NUMI'):
                l_ind_i = aster.getvectjev(intespec + '.NUMI')
                l_ind_j = aster.getvectjev(intespec + '.NUMJ')
                tabres.add_para(['NUME_ORDRE_I', 'NUME_ORDRE_J'], 'I')
            if aster.getvectjev(intespec + '.NOEI'):
                l_ind_i = aster.getvectjev(intespec + '.NOEI')
                l_ind_j = aster.getvectjev(intespec + '.NOEJ')
                l_cmp_i = aster.getvectjev(intespec + '.CMPI')
                l_cmp_j = aster.getvectjev(intespec + '.CMPJ')
                tabres.add_para(
                    ['NOEUD_I', 'NOEUD_J', 'NOM_CMP_I', 'NOM_CMP_J'], 'K8')

#     ------------------------------------------------------------------
#     Cas de tous les indices centraux

        elif OPTION == 'DIAG':
            if aster.getvectjev(intespec + '.NUMI'):
                l_ind_i_all = aster.getvectjev(intespec + '.NUMI')
                l_ind_j_all = aster.getvectjev(intespec + '.NUMJ')
                l_ind_i = [
                    ind for i, ind in enumerate(l_ind_i_all)
                    if l_ind_j_all[i] == ind
                ]
                l_ind_j = l_ind_i
                tabres.add_para(['NUME_ORDRE_I', 'NUME_ORDRE_J'], 'I')
            if aster.getvectjev(intespec + '.NOEI'):
                l_ind_i_all = aster.getvectjev(intespec + '.NOEI')
                l_ind_j_all = aster.getvectjev(intespec + '.NOEJ')
                l_ind_i = [
                    ind for i, ind in enumerate(l_ind_i_all)
                    if l_ind_j_all[i] == ind
                ]
                l_ind_j = l_ind_i
                l_cmp_i_all = aster.getvectjev(intespec + '.CMPI')
                l_cmp_j_all = aster.getvectjev(intespec + '.CMPJ')
                l_cmp_i = [
                    cmpi for i, cmpi in enumerate(l_cmp_i_all)
                    if l_cmp_j_all[i] == cmpi
                ]
                l_cmp_j = l_cmp_i
                tabres.add_para(
                    ['NOEUD_I', 'NOEUD_J', 'NOM_CMP_I', 'NOM_CMP_J'], 'K8')

#     ------------------------------------------------------------------
#     Liste des moments spectraux

        l_moments = [0, 1, 2, 3, 4]
        if MOMENT is not None:
            l_moments.extend(list(MOMENT))
            l_moments = list(set(l_moments))

#     ------------------------------------------------------------------
#     Boucle sur les fonctions

        if aster.getvectjev(intespec + '.NOEI'):
            l_ind = list(zip(l_ind_i, l_ind_j, l_cmp_i, l_cmp_j))
        else:
            l_ind = list(zip(l_ind_i, l_ind_j))

        # pour la présentation de la table finale, on stocke le nbre de
        # paramètres "initiaux"
        nbpara0 = len(tabres.para)

        if INFO == 2:
            texte = 'POUR LA MATRICE INTERSPECTRALE ' + INTE_SPEC.getName(
            ) + '\n'
            aster.affiche('MESSAGE', texte)
        for ind in l_ind:
            dlign = {}
            dlrecu = {}
            if NOEUD_I:
                i_foncstat = ind[0] == ind[1] and ind[2] == ind[3]
                dlign['NOEUD_I'], dlign['NOEUD_J'], dlign['NOM_CMP_I'], dlign['NOM_CMP_J'] = \
                    ind[0], ind[1], ind[2], ind[3]
                if ind[0] == ind[1] and ind[2] == ind[3]:
                    dlrecu['NOEUD_I'], dlrecu['NOM_CMP_I'] = ind[0], ind[2]
                else:
                    dlrecu['NOEUD_I'], dlrecu['NOEUD_J'], dlrecu['NOM_CMP_I'], \
                        dlrecu['NOM_CMP_J'] = ind[0], ind[1], ind[2], ind[3]
                if INFO == 2:
                    aster.affiche('MESSAGE',
                                  'INDICES :' + ind[0] + ' - ' + ind[1])
                    aster.affiche('MESSAGE',
                                  'INDICES :' + ind[2] + ' - ' + ind[3] + '\n')
            elif NUME_ORDRE_I:
                i_foncstat = ind[0] == ind[1]
                dlign['NUME_ORDRE_I'], dlign['NUME_ORDRE_J'] = ind[0], ind[1]
                if ind[0] == ind[1]:
                    dlrecu['NUME_ORDRE_I'] = ind[0]
                else:
                    dlrecu['NUME_ORDRE_I'], dlrecu['NUME_ORDRE_J'] = ind[
                        0], ind[1]
                if INFO == 2:
                    aster.affiche(
                        'MESSAGE',
                        'INDICES :' + str(ind[0]) + ' - ' + str(ind[1]) + '\n')
            else:  # TOUT_ORDRE
                if aster.getvectjev(intespec + '.NUMI'):
                    i_foncstat = ind[0] == ind[1]
                    dlign['NUME_ORDRE_I'], dlign['NUME_ORDRE_J'] = ind[0], ind[
                        1]
                    if ind[0] == ind[1]:
                        dlrecu['NUME_ORDRE_I'] = ind[0]
                    else:
                        dlrecu['NUME_ORDRE_I'], dlrecu['NUME_ORDRE_J'] = ind[
                            0], ind[1]
                if aster.getvectjev(intespec + '.NOEI'):
                    i_foncstat = ind[0] == ind[1] and ind[2] == ind[3]
                    dlign['NOEUD_I'], dlign['NOEUD_J'], dlign['NOM_CMP_I'], dlign['NOM_CMP_J'] = \
                        ind[0], ind[1], ind[2], ind[3]
                    if ind[0] == ind[1] and ind[2] == ind[3]:
                        dlrecu['NOEUD_I'], dlrecu['NOM_CMP_I'] = ind[0], ind[2]
                    else:
                        dlrecu['NOEUD_I'], dlrecu['NOEUD_J'], dlrecu['NOM_CMP_I'], \
                            dlrecu['NOM_CMP_J'] = ind[
                                0], ind[1], ind[2], ind[3]

            __fon1 = RECU_FONCTION(INTE_SPEC=INTE_SPEC, **dlrecu)

            val = __fon1.Valeurs()

            fvalx = NP.array(val[0])
            fvaly = NP.array(val[1])
            frez = fvalx[0]
            # -- moments spectraux

            val_mom = {}
            for i_mom in l_moments:
                n = len(fvaly)
                trapz = NP.zeros(n)
                trapz[0] = 0.
                valy = fvaly * (2 * pi * fvalx)**i_mom
                trapz[1:n] = (valy[1:n] + valy[:-1]) / 2. * (fvalx[1:n] -
                                                             fvalx[:-1])
                prim_y = NP.cumsum(trapz)
                val_mom[i_mom] = prim_y[-1]
                # -- cas si, seule la partie positive du spectre est utilisée
                # -- Il faut donc doubler lambda  pour calculer le bon écart type
                if frez >= 0.:
                    val_mom[i_mom] = val_mom[i_mom] * 2.
            for i_mom in l_moments:
                chmo = 'LAMBDA_' + str(i_mom).zfill(2)
                dlign[chmo] = val_mom[i_mom]

            #--- si auto-spectre:
            if i_foncstat:
                # test si le spectre est bien à valeurs positives
                if min(fvaly) < 0.0:
                    aster.affiche('MESSAGE', str(ind) + '\n')
                    UTMESS('F', 'MODELISA9_95')
                # -- fonctions statistiques

                dlign['ECART'] = sqrt(val_mom[0])

                if DUREE is not None:
                    Ts = DUREE
                    vop = sqrt(val_mom[2] / val_mom[0]) / (2. * pi)
                    Nu = Ts * vop / (-log(FRACTILE))
                    deltau = sqrt(1. - val_mom[1]**2 /
                                  (val_mom[2] * val_mom[0]))
                    valNd = 2. * Nu * \
                        (1 - exp(-(deltau) ** 1.2 * sqrt(pi * log(2. * Nu))))
                    val_peak = sqrt(2. * log(valNd))
                    dlign['FACT_PIC'] = val_peak  # -- facteur de peak
                    if FRACTILE == 0.5:
                        Titre_lign = 'MAX_MOY'
                    else:
                        Titre_lign = 'MAX_FRACT'
                    dlign[Titre_lign] = val_peak * sqrt(
                        val_mom[0])  # -- fractile du max (mediane pour 0.5)

                if abs(val_mom[2]) >= 1e-20:
                    dlign['NB_EXTREMA_P_S'] = 1. / \
                        pi * sqrt(val_mom[4] / val_mom[2])
                if abs(val_mom[0]) >= 1e-20:
                    dlign['NB_PASS_ZERO_P_S'] = 1. / \
                        pi * sqrt(val_mom[2] / val_mom[0])
                    dlign['FREQ_APPAR'] = 0.5 * dlign['NB_PASS_ZERO_P_S']
                    if abs(val_mom[4]) >= 1e-20:
                        dlign['FACT_IRRE'] = sqrt(val_mom[2] * val_mom[2] /
                                                  val_mom[0] / val_mom[4])

            # ajoute la ligne à la Table
            tabres.append(dlign)

#--- construction de la table produite

# tri des paramètres
        ord_para = tabres.para[nbpara0:]
        ord_para.sort()
        ord_para = tabres.para[:nbpara0] + ord_para
        dprod = tabres[ord_para].dict_CREA_TABLE()

        tabout = CREA_TABLE(**dprod)

    return tabout
Пример #7
0
def calc_modes_multi_bandes(self, stop_erreur, sturm, INFO, **args):
    """
       Macro-command CALC_MODES, case of the simultaneous iterations method
       over several frequency bands, with optional parallelization.
       Can be used only in the case of vibration modes (TYPE_RESU='DYNAMIQUE')
    """
    args = _F(args)
    SOLVEUR = args.get("SOLVEUR")
    SOLVEUR_MODAL = args.get("SOLVEUR_MODAL")
    VERI_MODE = args.get("VERI_MODE")

    MATR_RIGI = args['MATR_RIGI']
    MATR_MASS = args['MATR_MASS']
    CALC_FREQ = args['CALC_FREQ']
    METHODE = SOLVEUR_MODAL['METHODE']
    STOP_BANDE_VIDE = "NON"

    # ----------------------------------------------------------------------
    #
    # 1a. INITIALISATIONS
    #
    # ----------------------------------------------------------------------
    dbg = False  # True si on souhaite faire un IMPR_CO intermediaire, False sinon

    # Recuperation parametres solveur lineaire
    dSolveur = SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
    for i in list(dSolveur.keys()):
        if dSolveur[i] is None:
            del dSolveur[i]
    if 'TYPE_RESU' in dSolveur:  # because TYPE_RESU is a keyword with a 'global' position
        del dSolveur['TYPE_RESU']
    if 'OPTION' in dSolveur:  # because OPTION is a keyword with a 'global' position
        del dSolveur['OPTION']
    if 'FREQ' in dSolveur:  # because FREQ can be a keyword with a 'global' position
        del dSolveur['FREQ']
    solveur_lineaire = dSolveur.get('METHODE').strip()
    dSolveur_infomode = dSolveur
    # pour INFO_MODE, le mot-clé facteur SOLVEUR ne doit pas contenir les
    # mot-clés POSTTRAITEMENTS et RESI_RELA
    if 'POSTTRAITEMENTS' in dSolveur_infomode:
        del dSolveur_infomode['POSTTRAITEMENTS']
    if 'RESI_RELA' in dSolveur_infomode:
        del dSolveur_infomode['RESI_RELA']

    # Rang du processus MPI et taille du MPI_COMM_WORLD
    # Lorsqu'on ne veut q'un niveau de parallelisme (celui du solveur lineaire)
    # on bluffe l'algo en posant rang=0/nbproc=1 pour tous les procs.
    # Cependant si le solveur est autre que MUMPS on s'arrete en erreur.
    if CALC_FREQ['NIVEAU_PARALLELISME'] == 'COMPLET':
        rang, nbproc = aster_core.MPI_CommRankSize()
        niv_par = 'COMPLET'
    elif CALC_FREQ['NIVEAU_PARALLELISME'] == 'PARTIEL':
        rang = 0
        nbproc = 1
        niv_par = 'PARTIEL'
        nbproc_real = aster_core.MPI_CommRankSize()[1]
        if ((nbproc_real > 1) & (solveur_lineaire != 'MUMPS')):
            aster.affiche('MESSAGE', 72 * '-')
            UTMESS('F', 'MODAL_14', vali=nbproc_real, valk=solveur_lineaire)
            aster.affiche('MESSAGE', 72 * '-')
    else:
        assert (False)  # Pb parametrage NIVEAU_PARALLELISME

    # Construction de la liste de frequences
    if CALC_FREQ['FREQ']:
        lborne = []
        nnfreq = len(CALC_FREQ['FREQ'])
        for i in range(0, nnfreq):
            lborne.append(CALC_FREQ['FREQ'][i])
    else:
        assert (False)  # Pb parametrage CALC_FREQ

    # ----------------------------------------------------------------------
    #
    # 1b. TRAVAUX PREPARATOIRES AU LANCEMENT DE LA BOUCLE
    #
    # ----------------------------------------------------------------------

    # Modification de la sd_partition pour rendre compatible les niveaux de
    # parallelisme: celui en frequence et celui des calculs ele/assemblage.
    # Pour l'instant on fonctionne en mode 'CENTRALISE' au sein de la macro
    # (ds les sous-communicateurs, les calculs elem/assemblages
    # ne sont pas parallelises).
    # On remettra le mode de fonctionnement initial en fin de Macro.
    if (nbproc > 1):
        _, old_prtk1 = recup_modele_partition(MATR_RIGI, dbg)
        sd_modele = None
        if MATR_RIGI is not None:
            sd_modele = MATR_RIGI.getModel()
        if (sd_modele is None):
            assert (False)  # Pb, on arrive pas a recuperer le nom du modele
        if (old_prtk1 is not None):
            motdimo = {}
            motdimo['reuse'] = sd_modele
            motdimo['MODELE'] = sd_modele
            motdimo['DISTRIBUTION'] = _F(METHODE='CENTRALISE')
            __modimo = MODI_MODELE(**motdimo)

    # INFO_MODE global sur la liste de frequences
    # Parametres basiques
    motfaci = {}
    motfaci['COMPTAGE'] = _F(
        METHODE='AUTO',
        SEUIL_FREQ=CALC_FREQ['SEUIL_FREQ'],
        NMAX_ITER_SHIFT=CALC_FREQ['NMAX_ITER_SHIFT'],
        PREC_SHIFT=CALC_FREQ['PREC_SHIFT'],
    )

    # Gestion des frequences
    gestion_frequence(solveur_lineaire, nnfreq, nbproc)

    # Parametrage du parallelisme pour la couche FORTRAN/MPI
    if (nbproc > 1):
        motfaci['PARALLELISME_MACRO'] = _F(TYPE_COM=1)
    __nbmodi = INFO_MODE(MATR_RIGI=MATR_RIGI,
                         MATR_MASS=MATR_MASS,
                         INFO=INFO,
                         FREQ=lborne,
                         NIVEAU_PARALLELISME=niv_par,
                         SOLVEUR=dSolveur_infomode,
                         **motfaci)

    # Gestion des sous-bandes de frequences et construction (si //) de l'objet
    nbmodeth, nbsb_nonvide, proc_sb_nvide = gestion_sous_bande(
        solveur_lineaire, __nbmodi, nnfreq, nbproc, lborne,
        STOP_BANDE_VIDE == "OUI")

    # ----------------------------------------------------------------------
    #
    # 2. BOUCLE DE MODE_ITER_SIMULT(OPTION=BANDE) + NORM_MODE/IMPR_RESU
    #
    # ----------------------------------------------------------------------
    # On ne traite pas les sous-bandes vides (gain de temps et d'affichage!)
    # On affiche un message a la place.
    # Tous les processeurs font la meme chose pour ces sous-bandes vides, par
    # contre, ils se repartissent bien sur les non-vides.
    #
    # RQ MPI:
    # Les procs s'attendent via le MPI_COMM_SPLIT opere en fin de l'INFO_MODE
    # precedent. Ce n'est pas la peine de commencer la boucle si un proc
    # fait defaut.
    # ----------------------------------------------------------------------
    freq_ini = 1.E+99
    freq_fin = -1.E+99
    motscles = {}
    motscles['FILTRE_MODE'] = []
    numsb_nonvide = 0
    for i in range(0, nnfreq - 1):

        #--------------------------------------------------------------------
        #
        # 2. SOUS-BANDE NON VIDE
        #
        #--------------------------------------------------------------------
        sb_vide = None
        do_loop = None
        if (__nbmodi['NB_MODE', i + 1] == 0):
            sb_vide = True
            do_loop = False
        else:
            numsb_nonvide = numsb_nonvide + 1
            sb_vide = False
            if (((nbproc > 1) & (proc_sb_nvide[rang] == numsb_nonvide)) |
                (nbproc == 1)):
                do_loop = True
            else:
                do_loop = False

        if ((not sb_vide) & do_loop):
            motscit = {}
            motscfa = {}
            if SOLVEUR_MODAL['DIM_SOUS_ESPACE']:
                motscfa['DIM_SOUS_ESPACE'] = SOLVEUR_MODAL['DIM_SOUS_ESPACE']
            if SOLVEUR_MODAL['COEF_DIM_ESPACE']:
                motscfa['COEF_DIM_ESPACE'] = SOLVEUR_MODAL['COEF_DIM_ESPACE']
            motscfa['FREQ'] = (lborne[i], lborne[i + 1])
            motscfa['TABLE_FREQ'] = __nbmodi
            motscit['CALC_FREQ'] = _F(
                OPTION='BANDE',
                SEUIL_FREQ=CALC_FREQ['SEUIL_FREQ'],
                NMAX_ITER_SHIFT=CALC_FREQ['NMAX_ITER_SHIFT'],
                PREC_SHIFT=CALC_FREQ['PREC_SHIFT'],
                **motscfa)

            if (sturm == 'LOCAL'):
                motveri = 'OUI'
            else:
                motveri = 'NON'

            motscit['VERI_MODE'] = _F(STOP_ERREUR=stop_erreur,
                                      SEUIL=VERI_MODE['SEUIL'],
                                      STURM=motveri,
                                      PREC_SHIFT=VERI_MODE['PREC_SHIFT'])

            motscit['STOP_BANDE_VIDE'] = STOP_BANDE_VIDE

            OPTION = 'SANS'  # option for detecting rigid body modes
            if METHODE == 'TRI_DIAG':
                if 'NMAX_ITER_ORTHO' in args:
                    motscit['NMAX_ITER_ORTHO'] = SOLVEUR_MODAL[
                        'NMAX_ITER_ORTHO']
                if 'PREC_ORTHO' in args:
                    motscit['PREC_ORTHO'] = SOLVEUR_MODAL['PREC_ORTHO']
                if 'PREC_LANCZOS' in args:
                    motscit['PREC_LANCZOS'] = SOLVEUR_MODAL['PREC_LANCZOS']
                if 'MAX_ITER_QR' in args:
                    motscit['NMAX_ITER_QR'] = SOLVEUR_MODAL['NMAX_ITER_QR']
                    if SOLVEUR_MODAL['MODE_RIGIDE'] == 'OUI':
                        OPTION = 'MODE_RIGIDE'
            elif METHODE == 'JACOBI':
                if 'NMAX_ITER_BATHE' in args:
                    motscit['NMAX_ITER_BATHE'] = SOLVEUR_MODAL[
                        'NMAX_ITER_BATHE']
                if 'PREC_BATHE' in args:
                    motscit['PREC_BATHE'] = SOLVEUR_MODAL['PREC_BATHE']
                if 'NMAX_ITER_JACOBI' in args:
                    motscit['NMAX_ITER_JACOBI'] = SOLVEUR_MODAL[
                        'NMAX_ITER_JACOBI']
                if 'PREC_JACOBI' in args:
                    motscit['PREC_JACOBI'] = SOLVEUR_MODAL['PREC_JACOBI']
            elif METHODE == 'SORENSEN':
                if 'NMAX_ITER_SOREN' in args:
                    motscit['NMAX_ITER_SOREN'] = SOLVEUR_MODAL[
                        'NMAX_ITER_SOREN']
                if 'PARA_ORTHO_SOREN' in args:
                    motscit['PARA_ORTHO_SOREN'] = SOLVEUR_MODAL[
                        'PARA_ORTHO_SOREN']
                if 'PREC_SOREN' in args:
                    motscit['PREC_SOREN'] = SOLVEUR_MODAL['PREC_SOREN']
            elif METHODE == 'QZ':
                motscit['TYPE_QZ'] = SOLVEUR_MODAL['TYPE_QZ']
            else:
                assert (False)  # Pb parametrage METHODE

            # Parametrage du parallelisme pour la couche FORTRAN/MPI
            # afin d'operer les comm des modes propres et des parametres
            # modaux.
            if (nbproc > 1):
                motscit['PARALLELISME_MACRO'] = _F(
                    TYPE_COM=1,
                    IPARA1_COM=numsb_nonvide,
                    IPARA2_COM=nbsb_nonvide,
                )

            #-----------------------------------------------------------------
            #
            # 2a. Calcul des modes
            #
            #-----------------------------------------------------------------                                      )
            __nomre0 = MODE_ITER_SIMULT(MATR_RIGI=MATR_RIGI,
                                        MATR_MASS=MATR_MASS,
                                        INFO=INFO,
                                        METHODE=METHODE,
                                        OPTION=OPTION,
                                        SOLVEUR=dSolveur,
                                        **motscit)

            #-----------------------------------------------------------------
            #
            # 2b. Preparation du test de Sturm de l'etape 3a.
            #
            #-----------------------------------------------------------------
            if sturm in (
                    'GLOBAL', 'OUI'
            ):  # in the case of CALC_MODES on several bands, OUI is reset to GLOBAL
                dicomode = {}
                dicomode = __nomre0.LIST_VARI_ACCES()
                if (len(dicomode['FREQ']) != 0):
                    raux_ini = dicomode['FREQ'][0]
                    raux_fin = dicomode['FREQ'][-1]
                    if (raux_ini < freq_ini):
                        freq_ini = raux_ini
                    if (raux_fin > freq_fin):
                        freq_fin = raux_fin
                else:
                    assert (False
                            )  # Ce test ne marche pas (PB LIST_VARI_ACCES)

            #-----------------------------------------------------------------
            #
            # 2c. Préparation pour la concaténation de l'étape 3b.
            #
            #-----------------------------------------------------------------
            motscles['FILTRE_MODE'].append(_F(MODE=__nomre0, TOUT_ORDRE='OUI'))

            # Pour verification
            if (dbg):
                IMPR_CO(CONCEPT=_F(NOM=__nomre0))

        #--------------------------------------------------------------------
        #
        # 2. SOUS-BANDE VIDE
        #
        #--------------------------------------------------------------------
        elif (sb_vide):
            if (STOP_BANDE_VIDE == 'OUI'):
                UTMESS('F', 'MODAL_6', vali=(i + 1, ))
            elif (STOP_BANDE_VIDE == 'NON'):
                aster.affiche('MESSAGE', 72 * '-')
                UTMESS('I', 'MODAL_6', vali=(i + 1, ))
                aster.affiche('MESSAGE', 72 * '-')
            else:
                assert (False)  # Pb parametrage STOP_BANDE_VIDE

    #-----------------------------------------------------------------------
    #
    # 3a. Test de sturm effectif
    #
    #-----------------------------------------------------------------------
    if (sturm == 'NON'):
        aster.affiche('MESSAGE', 72 * '-')
        UTMESS('I', 'MODAL_2')
        aster.affiche('MESSAGE', 72 * '-')

    elif (sturm == 'LOCAL'):
        aster.affiche('MESSAGE', 72 * '-')
        UTMESS('I', 'MODAL_3')
        aster.affiche('MESSAGE', 72 * '-')

    elif sturm in (
            'GLOBAL', 'OUI'
    ):  # in the case of CALC_MODES on several bands, OUI is reset to GLOBAL

        # Construction des 2 bornes de la bande a tester
        if (nbmodeth != 0):
            omecor = CALC_FREQ['SEUIL_FREQ']
            precshift = VERI_MODE['PREC_SHIFT']
            freq_ini = (1.0 - precshift) * freq_ini
            freq_fin = (1.0 + precshift) * freq_fin
            if (abs(freq_ini) < omecor):
                freq_ini = -omecor
            if (abs(freq_fin) < omecor):
                freq_fin = omecor

            # Parametrage du parallelisme pour la couche FORTRAN/MPI
            if (nbproc > 1):
                motfaci['PARALLELISME_MACRO'] = _F(TYPE_COM=2)
            __nbmodf = INFO_MODE(MATR_RIGI=MATR_RIGI,
                                 MATR_MASS=MATR_MASS,
                                 INFO=INFO,
                                 FREQ=(freq_ini, freq_fin),
                                 NIVEAU_PARALLELISME=niv_par,
                                 SOLVEUR=dSolveur_infomode,
                                 **motfaci)

            # Recuperation du nbre de modes donnes par STURM global
            nbmodesg = __nbmodf['NB_MODE', 1]
            if (nbmodeth == nbmodesg):
                aster.affiche('MESSAGE', 72 * '-')
                UTMESS('I',
                       'MODAL_4',
                       valr=(freq_ini, freq_fin),
                       vali=(nbmodesg, nbmodeth))
                aster.affiche('MESSAGE', 72 * '-')
            else:
                # Message similaire a ALGELINE5_24 pour le FORTRAN
                if (stop_erreur == 'OUI'):
                    UTMESS('F',
                           'MODAL_5',
                           valr=(freq_ini, freq_fin, precshift),
                           vali=(nbmodesg, nbmodeth))
                elif (stop_erreur == 'NON'):
                    UTMESS('A',
                           'MODAL_5',
                           valr=(freq_ini, freq_fin, precshift),
                           vali=(nbmodesg, nbmodeth))
                else:
                    assert (False)  # Pb parametrage VERI_MODE

        # La bande globale est vide
        else:
            aster.affiche('MESSAGE', 72 * '-')
            UTMESS('I', 'MODAL_7', valr=(lborne[0], lborne[nnfreq - 1]))
            aster.affiche('MESSAGE', 72 * '-')
    else:
        assert (False)  # Pb parametrage STURM

    #-----------------------------------------------------------------------
    #
    # 3b. Concaténation des résultats
    #
    #-----------------------------------------------------------------------

    modes = EXTR_MODE(**motscles)

    # ----------------------------------------------------------------------
    #
    # 3c. Epilogue
    #
    # RQ MPI:
    # Si la SD_PARTITION existait avant de rentrer ds la Macro on remet ses
    # anciennes valeurs pour continuer la suite du fichier de commande.
    #----------------------------------------------------------------------
    if (nbproc > 1):
        if (old_prtk1 is not None):
            motdimo = {}
            motdimo['reuse'] = sd_modele
            motdimo['MODELE'] = sd_modele
            motdimo['DISTRIBUTION'] = _F(METHODE=old_prtk1)
            __modimo = MODI_MODELE(**motdimo)

    return modes
Пример #8
0
def macro_matr_ajou_ops(self,
                        MAILLAGE,
                        GROUP_MA_FLUIDE,
                        GROUP_MA_INTERF,
                        MODELISATION,
                        FLUIDE,
                        DDL_IMPO,
                        MODE_MECA=None,
                        DEPL_IMPO=None,
                        NUME_DDL_GENE=None,
                        MODELE_GENE=None,
                        MATR_MASS_AJOU=None,
                        MATR_AMOR_AJOU=None,
                        MATR_RIGI_AJOU=None,
                        NOEUD_DOUBLE=None,
                        DIST_REFE=None,
                        SOLVEUR=None,
                        INFO=None,
                        AVEC_MODE_STAT=None,
                        MODE_STAT=None,
                        MONO_APPUI=None,
                        FORC_AJOU=None,
                        ECOULEMENT=None,
                        **args):
    """
       Ecriture de la macro MACRO_MATR_AJOU
    """

    # On importe les definitions des commandes a utiliser dans la macro

    if len(FLUIDE) == 1:
        message = '<I> <MACRO_MATR_AJOU> tout le domaine fluide specifie dans GROUP_MA_INTERF et GROUP_MA_FLUIDE \n'
        message = message + '                      sera affecte par la masse volumique RHO = ' + \
            str(FLUIDE[0]['RHO']) + ' \n'
        aster.affiche('MESSAGE', message)
        if FLUIDE[0]['GROUP_MA'] is not None:
            message = '<I> <MACRO_MATR_AJOU> cas fluide simple : le group_ma dans lequel vous affectez la masse \n'
            message = message + \
                'volumique RHO doit etre la reunion de GROUP_MA_INTERF et GROUP_MA_FLUIDE. \n'
            aster.affiche('MESSAGE', message)
    else:
        for flu in FLUIDE:
            if flu['GROUP_MA'] is None:
                UTMESS('F', 'MATRICE0_1')

    IOCFLU = len(FLUIDE)

    #  ---------------------------------------------------------------
    #  definition du materiau fluide par caracteristique
    #  thermique equivalente

    # CAS FLUIDE SIMPLE
    if IOCFLU == 1:
        __NOMMAT = DEFI_MATERIAU(THER=_F(LAMBDA=1.0, RHO_CP=FLUIDE[0]['RHO']))
        __NOMCMA = AFFE_MATERIAU(
            MAILLAGE=MAILLAGE,
            AFFE=_F(GROUP_MA=(GROUP_MA_FLUIDE, GROUP_MA_INTERF),
                    MATER=__NOMMAT),
        )

#  ---------------------------------------------------------------
#  cas fluides multiples
    else:
        affmat = []
        for flu in FLUIDE:
            __NOMMAT = DEFI_MATERIAU(THER=_F(LAMBDA=1.0, RHO_CP=flu['RHO']))
            mfact = _F(GROUP_MA=flu['GROUP_MA'], MATER=__NOMMAT)
            affmat.append(mfact)

        __NOMCMA = AFFE_MATERIAU(MAILLAGE=MAILLAGE, AFFE=affmat)

#  ---------------------------------------------------------------
#  commande AFFE_MODELE modele fluide
    __NOMFLU = AFFE_MODELE(
        MAILLAGE=MAILLAGE,
        AFFE=_F(GROUP_MA=(GROUP_MA_FLUIDE, GROUP_MA_INTERF),
                MODELISATION=MODELISATION,
                PHENOMENE='THERMIQUE'),
    )

    #  ---------------------------------------------------------------
    #  commande AFFE_MODELE modele interface
    # Pour masquer certaines alarmes
    # <MODELE1_63> : DANS UN MODELE, IL EXISTE DES ELEMENTS DE TYPE "BORD" QUI N'ONT PAS DE VOISIN AVEC RIGIDITE
    # <MODELE1_64> : DANS UN MODELE, IL N'Y A AUCUN ELEMENT AVEC RIGIDITE
    MasquerAlarme('MODELE1_63')
    MasquerAlarme('MODELE1_64')

    __NOMINT = AFFE_MODELE(
        MAILLAGE=MAILLAGE,
        AFFE=_F(GROUP_MA=GROUP_MA_INTERF,
                MODELISATION=MODELISATION,
                PHENOMENE='THERMIQUE'),
    )
    RetablirAlarme('MODELE1_63')
    RetablirAlarme('MODELE1_64')

    #  ---------------------------------------------------------------
    #  commande AFFE_CHAR_THER condition de pression imposee
    #  en un point ou un groupe du fluide
    affimp = []
    nflui = 0
    for DDL in DDL_IMPO:
        if DDL['PRES_FLUIDE'] is not None:
            nflui = nflui + 1
            if DDL['NOEUD'] is not None:
                mfact = _F(NOEUD=DDL['NOEUD'], TEMP=DDL['PRES_FLUIDE'])
            if DDL['GROUP_NO'] is not None:
                mfact = _F(GROUP_NO=DDL['GROUP_NO'], TEMP=DDL['PRES_FLUIDE'])
            affimp.append(mfact)
    if nflui == 0:
        UTMESS('F', 'MATRICE0_2')

    __CHARGE = AFFE_CHAR_THER(MODELE=__NOMFLU, TEMP_IMPO=affimp)

    #  ---------------------------------------------------------------
    #  calcul des masses, rigidites et amortissements ajoutes en theorie
    #  potentielle
    #  commande CALC_MATR_AJOU, calcul de la masse ajoutee

    if MATR_MASS_AJOU is not None:
        solveur = SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
        mostcles = {}
        if NUME_DDL_GENE is not None:
            mostcles['NUME_DDL_GENE'] = NUME_DDL_GENE
        if INFO is not None:
            mostcles['INFO'] = INFO
        if MODE_MECA is not None:
            mostcles['MODE_MECA'] = MODE_MECA
        elif DEPL_IMPO is not None:
            mostcles['CHAM_NO'] = DEPL_IMPO
        elif MODELE_GENE is not None:
            mostcles['MODELE_GENE'] = MODELE_GENE
            mostcles['AVEC_MODE_STAT'] = AVEC_MODE_STAT
            mostcles['DIST_REFE'] = DIST_REFE
        if NOEUD_DOUBLE is not None:
            mostcles['NOEUD_DOUBLE'] = NOEUD_DOUBLE

        MASSAJ = CALC_MATR_AJOU(MODELE_FLUIDE=__NOMFLU,
                                MODELE_INTERFACE=__NOMINT,
                                CHARGE=__CHARGE,
                                CHAM_MATER=__NOMCMA,
                                OPTION='MASS_AJOU',
                                SOLVEUR=solveur,
                                **mostcles)
        self.register_result(MASSAJ, MATR_MASS_AJOU)

#  ---------------------------------------------------------------
#  calcul de l amortissement ajoute
    if (MATR_AMOR_AJOU is not None) or (MATR_RIGI_AJOU is not None):

        #  ---------------------------------------------------------------
        #  on definit un nouveau modele fluide pour calculer
        #  le potentiel stationnaire - AFFE_MODELE
        grma = [
            GROUP_MA_FLUIDE,
        ]
        if ECOULEMENT is not None:
            grma.append(ECOULEMENT['GROUP_MA_1'])
            grma.append(ECOULEMENT['GROUP_MA_2'])
            if type(ECOULEMENT) not in (list, tuple):
                ECOULEMENT = (ECOULEMENT, )
        __NOFLUI = AFFE_MODELE(
            MAILLAGE=MAILLAGE,
            AFFE=_F(GROUP_MA=grma,
                    MODELISATION=MODELISATION,
                    PHENOMENE='THERMIQUE'),
        )
        affimp = []
        for DDL in DDL_IMPO:
            if DDL['PRES_SORTIE'] is not None:
                if DDL['NOEUD'] is not None:
                    mfact = _F(NOEUD=DDL['NOEUD'], TEMP=DDL['PRES_SORTIE'])
                if DDL['GROUP_NO'] is not None:
                    mfact = _F(GROUP_NO=DDL['GROUP_NO'],
                               TEMP=DDL['PRES_SORTIE'])
                affimp.append(mfact)

        affecl = []
        for ECL in ECOULEMENT:
            mfact = _F(GROUP_MA=ECL['GROUP_MA_1'], FLUN=ECL['VNOR_1'])
            affecl.append(mfact)
            mfact = _F(GROUP_MA=ECL['GROUP_MA_2'], FLUN=ECL['VNOR_2'])
            affecl.append(mfact)
        __CHARG2 = AFFE_CHAR_THER(MODELE=__NOFLUI,
                                  TEMP_IMPO=affimp,
                                  FLUX_REP=affecl)

        __POTEN = THER_LINEAIRE(MODELE=__NOFLUI,
                                CHAM_MATER=__NOMCMA,
                                EXCIT=_F(CHARGE=__CHARG2))

#  ---------------------------------------------------------------
#  calcul amortissement proprement dit
    if MATR_AMOR_AJOU is not None:
        solveur = SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
        mostcles = {}
        if NUME_DDL_GENE is not None:
            mostcles['NUME_DDL_GENE'] = NUME_DDL_GENE
        if INFO is not None:
            mostcles['INFO'] = INFO
        if MODE_MECA is not None:
            mostcles['MODE_MECA'] = MODE_MECA
        elif DEPL_IMPO is not None:
            mostcles['CHAM_NO'] = DEPL_IMPO
        else:
            UTMESS('F', 'MATRICE0_3')

        AMORAJ = CALC_MATR_AJOU(MODELE_FLUIDE=__NOMFLU,
                                MODELE_INTERFACE=__NOMINT,
                                CHARGE=__CHARGE,
                                CHAM_MATER=__NOMCMA,
                                OPTION='AMOR_AJOU',
                                SOLVEUR=solveur,
                                POTENTIEL=__POTEN,
                                **mostcles)
        self.register_result(AMORAJ, MATR_AMOR_AJOU)

#  ---------------------------------------------------------------
#  calcul de la rigidite ajoutee
    if MATR_RIGI_AJOU is not None:
        solveur = SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
        mostcles = {}
        if NUME_DDL_GENE is not None:
            mostcles['NUME_DDL_GENE'] = NUME_DDL_GENE
        if INFO is not None:
            mostcles['INFO'] = INFO
        if MODE_MECA is not None:
            mostcles['MODE_MECA'] = MODE_MECA
        elif DEPL_IMPO is not None:
            mostcles['CHAM_NO'] = DEPL_IMPO
        else:
            UTMESS('F', 'MATRICE0_4')

        RIGIAJ = CALC_MATR_AJOU(MODELE_FLUIDE=__NOMFLU,
                                MODELE_INTERFACE=__NOMINT,
                                CHARGE=__CHARGE,
                                CHAM_MATER=__NOMCMA,
                                OPTION='RIGI_AJOU',
                                SOLVEUR=solveur,
                                POTENTIEL=__POTEN,
                                **mostcles)
        self.register_result(RIGIAJ, MATR_RIGI_AJOU)

#  ---------------------------------------------------------------
#  boucle sur le nombre de vecteurs a projeter, commande CALC_FORC_AJOU
    if FORC_AJOU is not None:
        for FORCAJ in FORC_AJOU:
            solveur = SOLVEUR[0].cree_dict_valeurs(SOLVEUR[0].mc_liste)
            mostcles = {}
            if NUME_DDL_GENE is not None:
                mostcles['NUME_DDL_GENE'] = NUME_DDL_GENE
            if MODE_MECA is not None:
                mostcles['MODE_MECA'] = MODE_MECA
            elif MODELE_GENE is not None:
                mostcles['MODELE_GENE'] = MODELE_GENE
                mostcles['AVEC_MODE_STAT'] = AVEC_MODE_STAT
                mostcles['DIST_REFE'] = DIST_REFE
            if NOEUD_DOUBLE is not None:
                mostcles['NOEUD_DOUBLE'] = NOEUD_DOUBLE
            if MODE_STAT is not None:
                mostcles['MODE_STAT'] = MODE_STAT
                if FORCAJ['NOEUD'] is not None:
                    mostcles['NOEUD'] = FORCAJ['NOEUD']
                if FORCAJ['GROUP_NO'] is not None:
                    mostcles['GROUP_NO'] = FORCAJ['GROUP_NO']
            else:
                mostcles['MONO_APPUI'] = MONO_APPUI

            VECTAJ = CALC_FORC_AJOU(DIRECTION=FORCAJ['DIRECTION'],
                                    MODELE_FLUIDE=__NOMFLU,
                                    MODELE_INTERFACE=__NOMINT,
                                    CHARGE=__CHARGE,
                                    CHAM_MATER=__NOMCMA,
                                    SOLVEUR=solveur,
                                    **mostcles)
            self.register_result(VECTAJ, FORCAJ['VECTEUR'])

    return
Пример #9
0
def force_iss_vari(self, imod, MATR_GENE, NOM_CMP, ISSF, INFO, UNITE_RESU_FORC,
                   UNITE_RESU_IMPE, PRECISION, INTERF, MATR_COHE, TYPE, fini,
                   PAS, fmax):
    """Force sismique variable en ISS"""
    #--------------------------------------------------------------------------------
    NB_FREQ = 1 + int((fmax - fini) / PAS)
    FREQ_INIT = fini
    GROUP_NO_INTER = INTERF['GROUP_NO_INTERF']
    # MAILLAGE NUME_DDL
    resultat = MATR_GENE['BASE']
    n_resultat = resultat.getName()
    nume_ddl = resultat.getDOFNumbering()
    nom_mail = nume_ddl.getMesh().getName()
    # MODELE, DDLGENE

    nume_ddlgene = MATR_GENE['NUME_DDL_GENE']

    _, noe_interf = get_group_nom_coord(GROUP_NO_INTER, nom_mail)

    #   del nume_ddl, nom_mail, nom_modele
    # MODES
    _, nbmodd, _ = aster.dismoi('NB_MODES_DYN', n_resultat, 'RESULTAT', 'F')
    _, nbmods, _ = aster.dismoi('NB_MODES_STA', n_resultat, 'RESULTAT', 'F')
    _, nbmodt, _ = aster.dismoi('NB_MODES_TOT', n_resultat, 'RESULTAT', 'F')
    FSIST = NP.zeros((NB_FREQ, nbmodt)) + 0j
    nbno, _ = noe_interf.shape

    if INFO == 2:
        texte = 'NOMBRE DE MODES: ' + str(
            nbmodt) + '   MODES DYNAMIQUES: ' + str(
                nbmodd) + '   MODES STATIQUES: ' + str(nbmods)
        aster.affiche('MESSAGE', texte)
        aster.affiche('MESSAGE', 'COMPOSANTE ' + NOM_CMP)
        aster.affiche('MESSAGE', 'NBNO INTERFACE : ' + str(nbno))

    # ----- boucle sur les modes statiques
    for mods in range(0, nbmods):
        nmo = nbmodd + mods + 1
        __CHAM = CREA_CHAMP(TYPE_CHAM='NOEU_DEPL_R',
                            OPERATION='EXTR',
                            NUME_ORDRE=nmo,
                            RESULTAT=resultat,
                            NOM_CHAM='DEPL')
        MCMP2 = __CHAM.EXTR_COMP(' ', [GROUP_NO_INTER], 0).valeurs
        if mods == 0:
            NCMP2 = __CHAM.EXTR_COMP(' ', [GROUP_NO_INTER], topo=1).comp
            nddi = len(MCMP2)
            PHI = NP.zeros((nddi, nbmods))
        PHI[:, mods] = MCMP2
    PHIT = NP.transpose(PHI)
    PPHI = NP.dot(PHIT, PHI)

    # MODEL fonction de cohérence
    MODEL = MATR_COHE['TYPE']
    print('MODEL :', MODEL)
    Data_Cohe = {}
    Data_Cohe['TYPE'] = MODEL
    Data_Cohe['MAILLAGE'] = nom_mail
    Data_Cohe['GROUP_NO_INTERF'] = GROUP_NO_INTER
    Data_Cohe['NOEUDS_INTERF'] = noe_interf
    Data_Cohe['DIST'] = calc_dist2(noe_interf)
    if MODEL == 'MITA_LUCO':
        Data_Cohe['VITE_ONDE'] = MATR_COHE['VITE_ONDE']
        Data_Cohe['PARA_ALPHA'] = MATR_COHE['PARA_ALPHA']
    #---------------------------------------------------------------------
    # BOUCLE SUR LES FREQUENCES
    for k in range(NB_FREQ):
        freqk = FREQ_INIT + PAS * k
        if INFO == 2:
            aster.affiche('MESSAGE', 'FREQUENCE DE CALCUL: ' + str(freqk))
        COHE = CALC_COHE(freqk * 2. * pi, **Data_Cohe)

        #---------------------------------------------------------
        # On desactive temporairement les FPE qui pourraient etre generees (a tord!) par blas
        aster_core.matfpe(-1)
        eig, vec = linalg.eig(COHE)
        vec = NP.transpose(vec)  # les vecteurs sont en colonne dans numpy
        aster_core.matfpe(1)
        eig = eig.real
        vec = vec.real
        # on rearrange selon un ordre decroissant
        eig = NP.where(eig < 1.E-10, 0.0, eig)
        order = (NP.argsort(eig)[::-1])
        eig = NP.take(eig, order)
        vec = NP.take(vec, order, 0)
        #-----------------------
        # Nombre de modes POD a retenir
        etot = NP.sum(eig**2)
        ener = 0.0
        nbme = 0
        while nbme < nbno:
            ener = eig[nbme]**2 + ener
            prec = ener / etot
            nbme = nbme + 1
            if INFO == 2:
                aster.affiche(
                    'MESSAGE',
                    'VALEUR PROPRE  ' + str(nbme) + ' : ' + str(eig[nbme - 1]))
            if prec > PRECISION:
                break
        if INFO == 2:
            aster.affiche('MESSAGE',
                          'NOMBRE DE MODES POD RETENUS : ' + str(nbme))
            aster.affiche('MESSAGE',
                          'PRECISION (ENERGIE RETENUE) : ' + str(prec))
        PVEC = NP.zeros((nbme, nbno))
        for k1 in range(0, nbme):
            PVEC[k1, 0:nbno] = NP.sqrt(eig[k1]) * vec[k1]

        #----Impedances + force sismique.-----------------------------------------------------------------
        if k > 0:
            DETRUIRE(CONCEPT=_F(NOM=(__impe, __fosi)), INFO=1)

        __impe = LIRE_IMPE_MISS(
            BASE=resultat,
            TYPE=TYPE,
            NUME_DDL_GENE=nume_ddlgene,
            UNITE_RESU_IMPE=UNITE_RESU_IMPE,
            ISSF=ISSF,
            FREQ_EXTR=freqk,
        )
        #    on cree __fosi  pour  RECU_VECT_GENE_C   plus loin

        __fosi = LIRE_FORC_MISS(
            BASE=resultat,
            NUME_DDL_GENE=nume_ddlgene,
            NOM_CMP=NOM_CMP,
            NOM_CHAM='DEPL',
            UNITE_RESU_FORC=UNITE_RESU_FORC,
            ISSF=ISSF,
            FREQ_EXTR=freqk,
        )

        # -------------- impedance--------------------------------
        MIMPE = __impe.EXTR_MATR_GENE()
        #  extraction de la partie modes interface
        KRS = MIMPE[nbmodd:nbmodt, nbmodd:nbmodt]

        # -------------- force sismique-------------------------------
        FSISM = __fosi.EXTR_VECT_GENE_C()
        FS0 = FSISM[
            nbmodd:nbmodt][:]  #  extraction de la partie modes interface
        U0 = NP.dot(linalg.inv(KRS), FS0)
        # projection pour obtenir UO en base physique
        XI = NP.dot(PHI, U0)
        XPI = XI
        #      # facteur de correction pour tous les modes (on somme) >> c'est faux
        SI0 = 0.0
        for k1 in range(0, nbme):
            XOe = abs(NP.sum(PVEC[k1])) / nbno
            SI0 = SI0 + XOe**2
        SI = sqrt(SI0)
        for idd in range(0, nddi):  #nddi: nombre de ddl interface
            if NCMP2[idd][0:2] == NOM_CMP:
                XPI[idd] = SI * XI[idd]
        # retour en base modale
        QPI = NP.dot(PHIT, XPI)
        U0 = NP.dot(linalg.inv(PPHI), QPI)
        FS = NP.dot(KRS, U0)
        FSISM[nbmodd:nbmodt][:] = FS
        FSIST[k, nbmods:nbmodt] = FSISM[0:nbmodd][:]
        FSIST[k, 0:nbmods] = FS

    return FSIST
Пример #10
0
def impr_fonction_ops(self, FORMAT, COURBE, INFO, **args):
    """
    Macro IMPR_FONCTION permettant d'imprimer dans un fichier des fonctions,
    colonnes de table...
    Erreurs<S> dans IMPR_FONCTION pour ne pas perdre la base.
    """
    macro = 'IMPR_FONCTION'
    import pprint
    import aster
    from code_aster.Cata.Syntax import _F
    from code_aster.Cata.DataStructure import (nappe_sdaster, fonction_c,
                                               formule, formule_c)
    from Utilitai import Graph
    from Utilitai.Utmess import UTMESS
    from Utilitai.UniteAster import UniteAster

    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')

    #----------------------------------------------
    # 0. Traitement des arguments, initialisations
    # unité logique des fichiers réservés
    ul_reserve = (8, )
    UL = UniteAster()

    # 0.1. Fichier
    nomfich = None
    if args['UNITE'] and args['UNITE'] != 6:
        nomfich = UL.Nom(args['UNITE'])
        if INFO == 2:
            aster.affiche('MESSAGE', ' Nom du fichier :' + nomfich)
    if nomfich and os.path.exists(nomfich) and os.stat(nomfich).st_size != 0:
        if FORMAT == 'XMGRACE':
            niv = 'I'
        else:
            niv = 'I'
        UTMESS(niv, 'FONCT0_1', valk=nomfich)

    # 0.2. Récupération des valeurs sous COURBE
    unparmi = ('FONCTION', 'LIST_RESU', 'FONC_X', 'ABSCISSE', 'NAPPE',
               'NAPPE_LISSEE')

    # i0 : indice du mot-clé facteur qui contient LIST_PARA, sinon i0=0
    i0 = 0
    Courbe = []
    iocc = -1
    for Ci in COURBE:
        iocc += 1
        dC = Ci.cree_dict_valeurs(Ci.mc_liste)
        if dC.has_key('LIST_PARA') and dC['LIST_PARA'] != None and i0 == 0:
            i0 = iocc
        for mc in dC.keys():
            if dC[mc] == None:
                del dC[mc]
        Courbe.append(dC)
    if INFO == 2:
        aster.affiche('MESSAGE',
                      ' Nombre de fonctions à analyser : ' + str(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 = False
    if FORMAT == 'TABLEAU':
        interp = True
        dCi = Courbe[i0]
        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]
                    break
            if obj == None:
                UTMESS('S', 'SUPERVIS_56')
            if typi == 'FONCTION' or typi == 'NAPPE' or typi == 'NAPPE_LISSEE':
                if isinstance(obj, nappe_sdaster):
                    lpar, lval = obj.Valeurs()
                    linterp = lval[0][0]
                else:
                    linterp = obj.Valeurs()[0]
            elif typi == 'FONC_X':
                lbid, linterp = obj.Valeurs()
            elif typi == 'ABSCISSE':
                linterp = obj
            __linter = DEFI_LIST_REEL(VALE=linterp)
        if INFO == 2:
            aster.affiche('MESSAGE', ' Interpolation globale sur la liste :')
            aster.affiche('MESSAGE', pprint.pformat(__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 += 1

        # 1.1. Type d'objet à traiter
        obj = None
        for typi in unparmi:
            if dCi.has_key(typi):
                obj = dCi[typi]
                break
        if not dCi.has_key('LEGENDE') and hasattr(obj, 'get_name'):
            dCi['LEGENDE'] = obj.get_name()
        if obj == None:
            UTMESS('S', 'SUPERVIS_56')

        # 1.2. Extraction des valeurs

        # 1.2.1. Mot-clé FONCTION
        if typi == 'FONCTION' or typi == 'NAPPE' or typi == 'NAPPE_LISSEE':
            # formule à un paramètre seulement
            if isinstance(obj, formule):
                dpar = obj.Parametres()
                if len(dpar['NOM_PARA']) != 1:
                    UTMESS('S',
                           'FONCT0_50',
                           valk=obj.nom,
                           vali=len(dpar['NOM_PARA']))

            if isinstance(obj, nappe_sdaster):
                lpar, lval = obj.Valeurs()
                dico, ldicf = obj.Parametres()
                Leg = dCi['LEGENDE']
                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()
                    dic.update(ldicf[i])

                    if (interp or dCi.has_key('LIST_PARA')) and i > 0:

                        try:
                            __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]
                        except aster.error, err:
                            # on verifie que la bonne exception a ete levee
                            assert err.id_message == "FONCT0_9", 'unexpected id : %s' % err.id_message
                            continue

                    # on stocke les données dans le Graph
                    nomresu = dic['NOM_RESU'].strip() + '_' + str(
                        len(graph.Legendes))
                    dicC = {
                        'Val': [lx, ly],
                        'Lab': [dic['NOM_PARA_FONC'], nomresu]
                    }
                    # ajoute la valeur du paramètre
                    dCi['LEGENDE'] = '%s %s=%g' % (Leg,
                                                   dic['NOM_PARA'].strip(), p)
                    if typi == 'NAPPE':
                        dCi['LEGENDE'] = '%s %s=%g' % (
                            Leg, dic['NOM_PARA'].strip(), p)
                    if typi == 'NAPPE_LISSEE':
                        dCi['LEGENDE'] = 'NAPPE_LISSEE %s %s=%g' % (
                            Leg, dic['NOM_PARA'].strip(), p)
                    Graph.AjoutParaCourbe(dicC, args=dCi)
                    graph.AjoutCourbe(**dicC)
            else:
                __ftmp = obj
                dpar = __ftmp.Parametres()
                # pour les formules à un paramètre (test plus haut)
                if type(dpar['NOM_PARA']) in (list, tuple):
                    dpar['NOM_PARA'] = dpar['NOM_PARA'][0]
                if interp:
                    try:
                        __ftmp = CALC_FONC_INTERP(FONCTION=obj,
                                                  LIST_PARA=__linter,
                                                  **dpar)
                    except aster.error, err:

                        # on verifie que la bonne exception a ete levee
                        assert err.id_message == "FONCT0_9", 'unexpected id : %s' % err.id_message
                        continue
                elif dCi.has_key('LIST_PARA'):
                    try:
                        __ftmp = CALC_FONC_INTERP(FONCTION=obj,
                                                  LIST_PARA=dCi['LIST_PARA'],
                                                  **dpar)
                    except aster.error, err:
                        # on verifie que la bonne exception a ete levee
                        assert err.id_message == "FONCT0_9", 'unexpected id : %s' % err.id_message
                        continue
Пример #11
0
            lx = obj
            lr = dCi['ORDONNEE']
            if len(lx) != len(lr):
                UTMESS('S', 'FONCT0_7')
            # on stocke les données dans le Graph
            dicC = {'Val': [lx, lr], 'Lab': ['Absc', 'Ordo']}
            Graph.AjoutParaCourbe(dicC, args=dCi)
            graph.AjoutCourbe(**dicC)

    # 1.3. dbg
    if INFO == 2:
        message = '\n' + '-' * 70 + \
            '\n Contenu du Graph : \n' + '-' * 70 + '\n'
        message = message + graph.__repr__()
        message = message + '-' * 70 + '\n'
        aster.affiche('MESSAGE', message)

    #----------------------------------------------
    # 2. Impression du 'tableau' de valeurs
    #----------------------------------------------

    # 2.0. Surcharge des propriétés du graphique et des axes
    # (bloc quasiment identique dans Table)
    if args['TITRE'] != None:
        graph.Titre = args['TITRE']
    if args['SOUS_TITRE'] != None:
        graph.SousTitre = args['SOUS_TITRE']
    if FORMAT in ('XMGRACE', 'AGRAF', 'LISS_ENVELOP'):
        if args['BORNE_X'] != None:
            graph.Min_X = args['BORNE_X'][0]
            graph.Max_X = args['BORNE_X'][1]