Пример #1
0
def check_material_def(test):
    """Check `AtLeastOne` rule in DEFI_MATERIAU.

    Arguments
        test (TestCase): Tester object that reports the results.
    """
    print("\n>>> Checking for DEFI_MATERIAU rule...")
    # in the case that there is several AtLeastOne rules (only one today),
    # only keep those with a lot of keywords!
    atleastone = [
        rule for rule in DEFI_MATERIAU.rules
        if isinstance(rule, AtLeastOne) and len(rule.ruleArgs) > 50
    ]
    test.assertEqual(len(atleastone),
                     1,
                     msg="expect exactly one AtLeastOne/AU_MOINS_UN rule")

    args = atleastone[0].ruleArgs if atleastone else []
    inspect = InspectDEFI_MATERIAU()
    DEFI_MATERIAU.accept(inspect)
    kwds = set(inspect.lfact)
    # add exceptions
    kwds.add("COMP_THM")

    missing = set(kwds).difference(args)
    unknown = set(args).difference(kwds)

    test.assertTrue(not unknown,
                    msg="unknown keyword in the AU_MOINS_UN rule: " +
                    ", ".join(unknown))
    test.assertTrue(not missing,
                    msg="These keywords must be added into the "
                    "AU_MOINS_UN rule: " + ", ".join(missing))
Пример #2
0
def Auxi(E=100000., Nu=0.3, fx=0., fy=0.):

    ### Lecture du maillage
    asMeshA = LIRE_MAILLAGE(
        FORMAT='MED',
        UNITE=20,  # Unité logique du fichier de maillage
        NOM_MED='global',  # Nom du maillage au sein du fichier
        INFO=1,
    )
    # Nombre de noeuds physiques du maillage
    nbNoeudA = asMeshA.sdj.DIME.get()[0]
    dimA = 2  # Dimension du problème

    ### Affectation des modèles
    modA = AFFE_MODELE(
        MAILLAGE=asMeshG,
        AFFE=(
            _F(
                GROUP_MA='AuxiG',  # Modèle de la structure
                PHENOMENE='MECANIQUE',
                MODELISATION='C_PLAN',
            ), ))

    ### Définition des matériaux
    matA = DEFI_MATERIAU(ELAS=_F(
        E=100000.,
        NU=0.3,
    ), )

    ### Affectation des matériaux
    MatA = AFFE_MATERIAU(
        MAILLAGE=asMeshG,
        AFFE=(_F(
            GROUP_MA='AuxiG',
            MATER=matA,
        ), ),
    )

    # Calcul des matrices de rigidité élémentaires
    matElemA = CALC_MATR_ELEM(OPTION='RIGI_MECA', MODELE=modA, CHAM_MATER=MatA)

    # Calcul de la numérotation
    numDDLA = NUME_DDL(MATR_RIGI=matElemA, )

    # Assemblage de la matrice de rigidité
    matAssA = ASSE_MATRICE(MATR_ELEM=matElemA,
                           NUME_DDL=numDDLA)  #, CHAR_CINE=FixA)
    return matAssA
def Global(E=100000., Nu=0., fx=5., fy=0.):

    ### Lecture du maillage
    asMeshG = LIRE_MAILLAGE(
        FORMAT='MED',
        UNITE=20,  # Unité logique du fichier de maillage
        NOM_MED='global',  # Nom du maillage au sein du fichier
        INFO=1,
    )

    # Nombre de noeuds physiques du maillage
    nbNoeudG = asMeshG.sdj.DIME.get()[0]
    dimG = 2  # Dimension du problème

    ### Affectation des modèles
    modG = AFFE_MODELE(
        MAILLAGE=asMeshG,
        AFFE=(
            _F(
                TOUT='OUI',  # Modèle de la structure
                PHENOMENE='MECANIQUE',
                MODELISATION='C_PLAN',
            ), ))

    ### Définition des matériaux
    matG = DEFI_MATERIAU(ELAS=_F(
        E=E,
        NU=Nu,
    ), )

    ### Affectation des matériaux
    MatG = AFFE_MATERIAU(
        MAILLAGE=asMeshG,
        AFFE=(_F(
            TOUT='OUI',
            MATER=matG,
        ), ),
    )

    ### Affectation des conditions limites
    # Encastrement
    # GROUP_MA => group of edges
    FixG = AFFE_CHAR_CINE(MODELE=modG,
                          MECA_IMPO=(_F(GROUP_MA='Wd', DX=0., DY=0.), ))
    # Effort imposé
    FdG = AFFE_CHAR_MECA(
        MODELE=modG,
        FORCE_CONTOUR=_F(GROUP_MA='Fd', FX=fx, FY=fy),
        #FORCE_ARETE = _F(GROUP_MA='Fd',FX=0,FY=10),
        #PRES_REP = _F(GROUP_MA='Fd',PRES=10),
    )

    # Calcul des matrices de rigidité élémentaires
    matElemG = CALC_MATR_ELEM(OPTION='RIGI_MECA', MODELE=modG, CHAM_MATER=MatG)

    # Calcul de la numérotation
    numDDLG = NUME_DDL(MATR_RIGI=matElemG, )

    # Assemblage de la matrice de rigidité
    matAssG = ASSE_MATRICE(MATR_ELEM=matElemG,
                           NUME_DDL=numDDLG,
                           CHAR_CINE=FixG)

    # Calcul du second membre lié aux CL de Dirichlet
    vcineG = CALC_CHAR_CINE(
        NUME_DDL=numDDLG,
        CHAR_CINE=FixG,
    )

    # Calcul du second membre lié aux CL de Neumann
    vecElemG = CALC_VECT_ELEM(OPTION='CHAR_MECA', CHARGE=FdG, CHAM_MATER=MatG)
    vneumG = ASSE_VECTEUR(VECT_ELEM=vecElemG, NUME_DDL=numDDLG)

    # Factorisation de la matrice de rigidité et prise en compte des CL de
    # Dirichlet éliminées
    matAssG = FACTORISER(
        reuse=matAssG,
        MATR_ASSE=matAssG,
        METHODE='MUMPS',
    )

    matAssPG = matAssG.EXTR_MATR(sparse='True')
    matAssPG = sp.coo_matrix((matAssPG[0], (matAssPG[1], matAssPG[2])),
                             shape=(2 * nbNoeudG, 2 * nbNoeudG)).tocsc()

    return matAssG, vcineG, vneumG, MatG, modG, numDDLG, matAssPG
def Local(E=50000., Nu=0., fx=0., fy=0.):
    ### Lecture du maillage
    asMeshL = LIRE_MAILLAGE(
        FORMAT='MED',
        UNITE=21,  # Unité logique du fichier de maillage
        NOM_MED='local',  # Nom du maillage au sein du fichier
        INFO=1,
    )
    # Nombre de noeuds physiques du maillage
    nbNoeudL = asMeshL.sdj.DIME.get()[0]
    dim = 2  # Dimension du problème

    ### Affectation des modèles
    modL = AFFE_MODELE(
        MAILLAGE=asMeshL,
        AFFE=(
            _F(
                TOUT='OUI',  # Modèle de la structure
                PHENOMENE='MECANIQUE',
                MODELISATION='C_PLAN',
            ), ))

    ### Définition des matériaux
    matL = DEFI_MATERIAU(ELAS=_F(
        E=E,
        NU=Nu,
    ), )

    ### Affectation des matériaux
    MatL = AFFE_MATERIAU(
        MAILLAGE=asMeshL,
        AFFE=(_F(
            TOUT='OUI',
            MATER=matL,
        ), ),
    )

    # Effort imposé
    FdL = AFFE_CHAR_MECA(
        MODELE=modL,
        FORCE_CONTOUR=_F(GROUP_MA='Wd', FX=fx, FY=fy),
    )

    # Char_cine nul
    blank = AFFE_CHAR_CINE(MODELE=modL,
                           MECA_IMPO=_F(
                               GROUP_MA='Wd',
                               DX=0.,
                               DY=0.,
                           ))

    # Calcul des matrices de rigidité élémentaires
    matElemL = CALC_MATR_ELEM(OPTION='RIGI_MECA', MODELE=modL, CHAM_MATER=MatL)

    # Calcul de la numérotation
    numDDLL = NUME_DDL(MATR_RIGI=matElemL)

    matAssL = ASSE_MATRICE(
        MATR_ELEM=matElemL,
        NUME_DDL=numDDLL,
        CHAR_CINE=blank,
    )
    # Calcul du second membre force
    vecElemL = CALC_VECT_ELEM(OPTION='CHAR_MECA', CHARGE=FdL, CHAM_MATER=MatL)
    vneumL = ASSE_VECTEUR(VECT_ELEM=vecElemL, NUME_DDL=numDDLL)

    # Calcul du second membre cine nul
    vblank = CALC_CHAR_CINE(
        NUME_DDL=numDDLL,
        CHAR_CINE=blank,
    )

    # Assemblage de la matrice de rigidité

    matAssL = FACTORISER(
        reuse=matAssL,
        MATR_ASSE=matAssL,
        METHODE='MUMPS',
    )

    return matAssL, vneumL, MatL, modL, numDDLL
Пример #5
0
def char_grad_impo_ops(self, RESU_H2, TINIT, TFIN, RESUMECA, GRMAVOL, DIME,
                       Ctot0, CHARGRD0, Vh, R, T, INFO, **args):
    # macro pour calculer le chargement thermique specfique a la diffusion H2

    import numpy as NP
    import aster
    from code_aster.Cata.Syntax import _F
    ier = 0
    # La macro compte pour 1 dans la numerotation des commandes
    self.set_icmd(1)
    #    Le concept sortant dans le contexte de la macro
    self.DeclareOut('chth', self.sd)

    # On importe les definitions des commandes a utiliser dans la macro
    CREA_CHAMP = self.get_cmd('CREA_CHAMP')
    AFFE_CHAR_THER = self.get_cmd('AFFE_CHAR_THER')
    CALC_CHAMP = self.get_cmd('CALC_CHAMP')
    CALC_CHAM_ELEM = self.get_cmd('CALC_CHAM_ELEM')

    dt = TFIN - TINIT

    # Recuperation du modele a partir du resultat
    iret, ibid, __n_modele = aster.dismoi('MODELE', RESU_H2.nom, 'RESULTAT',
                                          'F')
    __n_modele = __n_modele.rstrip()
    __MOTH = self.get_concept(__n_modele)

    # Recuperation du maillage a partir du resultat
    iret, ibid, nom_ma = aster.dismoi('NOM_MAILLA', RESU_H2.nom, 'RESULTAT',
                                      'F')
    __MAIL = self.get_concept(nom_ma.strip())

    # Recuperation du modele mecanique a partir du resultat
    iret, ibid, nom_momec = aster.dismoi('MODELE', RESUMECA.nom, 'RESULTAT',
                                         'F')
    __MOME = self.get_concept(nom_momec.rstrip())

    # extraction du champ de cl instant -
    __C20 = CREA_CHAMP(OPERATION='EXTR',
                       TYPE_CHAM='NOEU_TEMP_R',
                       RESULTAT=RESU_H2,
                       NOM_CHAM='TEMP',
                       INST=TINIT,
                       INFO=INFO)

    # on suppose que les noeuds du maillage thermique et mecaniqeu sont les
    # memes (pour eviter un PROJ_CHAMP)
    lc_t0 = __C20.EXTR_COMP('TEMP', [], 1)
    c_t0 = lc_t0.valeurs
    node_th = lc_t0.noeud
    nbnode = len(node_th)

    # contruction du terme Grad SigmaH
    # trace de sigma aux noeuds
    __SIEQN2 = CALC_CHAMP(INST=TFIN,
                          RESULTAT=RESUMECA,
                          CRITERES='SIEQ_NOEU',
                          INFO=INFO)
    __SIEQN = PROJ_CHAMP(METHODE='COLLOCATION',
                         RESULTAT=__SIEQN2,
                         MODELE_1=__MOME,
                         MODELE_2=__MOTH,
                         NOM_CHAM='SIEQ_NOEU',
                         TOUT_ORDRE='OUI')
    __SIEQ = CREA_CHAMP(OPERATION='EXTR',
                        TYPE_CHAM='NOEU_SIEF_R',
                        RESULTAT=__SIEQN,
                        NOM_CHAM='SIEQ_NOEU',
                        INST=TFIN,
                        INFO=INFO)

    # on renome la CMP pour pouvoir calculer le flux "thermique"
    __TRSIG = CREA_CHAMP(OPERATION='ASSE',
                         TYPE_CHAM='NOEU_TEMP_R',
                         MODELE=__MOTH,
                         ASSE=(_F(CHAM_GD=__SIEQ,
                                  GROUP_MA=GRMAVOL,
                                  NOM_CMP='TRSIG',
                                  NOM_CMP_RESU='TEMP',
                                  COEF_R=1. / 3.), ),
                         INFO=INFO)
    # calcul du gradient de Trace(Sigma)
    __MAT1 = DEFI_MATERIAU(THER=_F(LAMBDA=-1., RHO_CP=0.))
    __CMT1 = AFFE_MATERIAU(
        MAILLAGE=__MAIL,
        AFFE=_F(
            TOUT='OUI',
            MATER=__MAT1,
        ),
    )
    __GRSH = CALC_CHAM_ELEM(MODELE=__MOTH,
                            CHAM_MATER=__CMT1,
                            GROUP_MA=GRMAVOL,
                            OPTION='FLUX_ELGA',
                            TEMP=__TRSIG)

    gradsighe = __GRSH.EXTR_COMP('FLUX', [], 1)
    gradsighx = gradsighe.valeurs
    gradsighy = __GRSH.EXTR_COMP('FLUY', [], 0).valeurs
    if (DIME == 3):
        gradsighz = __GRSH.EXTR_COMP('FLUZ', [], 0).valeurs

    fx = NP.zeros(nbnode)
    fy = NP.zeros(nbnode)
    if (DIME == 3):
        fz = NP.zeros(nbnode)
    for ino, node in enumerate(node_th):
        cl = c_t0[ino]
        grsigx = gradsighx[ino]
        grsigy = gradsighy[ino]
        if (DIME == 3):
            grsigz = gradsighz[ino]
            fx[ino], fx[ino], fz[ino] = FLUX(cl, grsigx, grsigy, DIME, grsigz,
                                             Vh, R, T)
        else:
            grsigz = 0.
            fx[ino], fx[ino] = FLUX(cl, grsigx, grsigy, DIME, grsigz, Vh, R, T)

    # pour gagner du temps on evite la construction du mot-cle PRE_GRAD_TEMP
    nomvale = CHARGRD0.nom.ljust(8) + '.CHTH.GRAIN.VALE'
    nomlima = CHARGRD0.nom.ljust(8) + '.CHTH.GRAIN.LIMA'
    nomdesc = CHARGRD0.nom.ljust(8) + '.CHTH.GRAIN.DESC'
    tabvale = aster.getvectjev(nomvale)
    tabdesc = aster.getvectjev(nomdesc)
    dicolima = aster.getcolljev(nomlima)

    nbrvale = len(tabvale)
    champ = NP.zeros(nbrvale)
    bidon = NP.zeros(nbrvale)

    nommai = __MAIL.sdj.NOMMAI.get()
    connex = __MAIL.sdj.CONNEX.get()
    groupma = __MAIL.sdj.GROUPEMA.get()[GRMAVOL.ljust(24)]
    nbzone = tabdesc[1]
    #   print "tabdesc",tabdesc
    #   print "tablima",dicolima

    for izone in dicolima.keys():

        # chaque maille du groupe est affectee
        for index, ima in enumerate(dicolima[izone]):
            if ima == 0:
                break
            if ima in groupma:
                # ATTENTION : dans Python, les tableaux commencent a 0
                # mais dans la connectivite, les noeuds commencent a 1!
                lnoeu = NP.array(connex[ima]) - 1
                nbno = len(lnoeu)

                # calcul de la moyenne par maille de fx
                lflux = fx[lnoeu]
                flux = NP.add.reduce(lflux)
                flux = flux / nbno

                lfluy = fy[lnoeu]
                fluy = NP.add.reduce(lfluy)
                fluy = fluy / nbno
                numa = index
                #              print 'essai, numa, ima',numa, ima, groupma, lnoeu, nbno
                champ[9 * (numa - 1) + 1] = -flux
                champ[9 * (numa - 1) + 2] = -fluy

    aster.putvectjev(nomvale, nbrvale, tuple(range(1, nbrvale + 1)),
                     tuple(champ), tuple(bidon), 1)