Esempio n. 1
0
def copie_fichier(src, dst):
    """Copie d'un fichier.
    """
    if src and dst:
        try:
            shutil.copyfile(src, dst)
        except:
            raise aster.error('MISS0_6', valk=(src, dst))
Esempio n. 2
0
def get_max_dabsc(fonction):
    """Retourne le maximum et le pas des abscisses de la fonction."""
    tfunc = fonction.convert()
    dx = tfunc.vale_x[1:] - tfunc.vale_x[:-1]
    dxmax = max(dx)
    dxmin = min(dx)
    if abs((dxmax - dxmin) / dxmax) > 1.e-3:
        raise aster.error('MISS0_9', valk=fonction.nom)
    return max(tfunc.vale_x), dxmax
Esempio n. 3
0
    def execute(self):
        """Exécute MISS3D.
        """
        self._dbg_trace("Start")

        copie_fichier(self._fichier_tmp("in"),
                      osp.join(self.param['_WRKDIR'], "MISS.IN"))
        cmd = osp.join(aster_core.get_option('repout'), "run_miss3d") + \
            " " + self.param['VERSION']
        iret = 4
        try:
            os.chdir(self.param['_WRKDIR'])
            if self.verbose:
                _print("Exécution de MISS3D dans :", self.param['_WRKDIR'])
                os.system('ls -la')
            comment = "Lancement de la commande :\n%s" % cmd
            if self.verbose:
                aster.affiche("MESSAGE", comment)
            iret, output, error = ExecCommand(cmd, alt_comment=comment,
                                              verbose=False, separated_stderr=True)
            if self.verbose:
                _print("Contenu du répertoire après l'exécution de MISS3D :")
                os.system('ls -la')
        finally:
            os.chdir(self.param['_INIDIR'])
        UTMESS('I', 'EXECLOGICIEL0_9',  valk=output)
        miss_out = ""
        if osp.exists(self._fichier_tmp("OUT")):
            miss_out = open(self._fichier_tmp("OUT"), "r").read()
        is_ok = iret == 0 and \
            (miss_out.find("INSUFFISAN") < 0 and miss_out.find("*** STOP") < 0)
        if not is_ok or self.verbose:
            aster.affiche("MESSAGE", miss_out)
        if not is_ok:
            UTMESS('I', 'EXECLOGICIEL0_10', valk=error, print_as='E')
            raise aster.error('EXECLOGICIEL0_3', vali=[0, iret])
        self._dbg_trace("Stop")
Esempio n. 4
0
    def check(self):
        """Vérification des règles impossible à écrire dans le .capy"""
        # tâches à la demande
        if self['TYPE_RESU'] in ('HARM_GENE', 'TRAN_GENE', 'TABLE', 'CHARGE'):
            self.set('_calc_impe', True)
            self.set('_calc_forc', True)
        elif self['TYPE_RESU'] in ('FICHIER', 'TABLE_CONTROL'):
            if self.get('UNITE_RESU_IMPE') is not None:
                self.set('_calc_impe', True)
            if self.get('UNITE_RESU_FORC') is not None:
                self.set('_calc_forc', True)
        else:
            if self['EXCIT_SOL'] is not None:
                self.set('_calc_forc', True)
        self.set('_hasPC', self.get('GROUP_MA_CONTROL') is not None)
        # unités logiques
        if self.get('UNITE_RESU_IMPE') is None:
            self.set('_exec_Miss', True)
            self['UNITE_RESU_IMPE'] = self.UL.Libre(action='ASSOCIER')
        if self.get('UNITE_RESU_FORC') is None:
            self.set('_exec_Miss', True)
            self['UNITE_RESU_FORC'] = self.UL.Libre(action='ASSOCIER')

        # fréquences
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['LIST_FREQ'] is not None \
                    and self['TYPE_RESU'] not in ('FICHIER', 'HARM_GENE', 'TABLE_CONTROL'):
                raise aster.error('MISS0_17')

        # si base modale, vérifier/compléter les amortissements réduits
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['BASE_MODALE']:
                res = aster.dismoi('NB_MODES_DYN', self['BASE_MODALE'].nom,
                                   'RESULTAT', 'C')
                ASSERT(res[0] == 0)
                self['_NBM_DYN'] = res[1]
                res = aster.dismoi('NB_MODES_STA', self['BASE_MODALE'].nom,
                                   'RESULTAT', 'C')
                ASSERT(res[0] == 0)
                self['_NBM_STAT'] = res[1]
                if self['AMOR_REDUIT']:
                    self.set('AMOR_REDUIT', force_list(self['AMOR_REDUIT']))
                    nval = len(self['AMOR_REDUIT'])
                    if nval < self['_NBM_DYN']:
                        # complète avec le dernier
                        nadd = self['_NBM_DYN'] - nval
                        self._keywords['AMOR_REDUIT'].extend([
                            self['AMOR_REDUIT'][-1],
                        ] * nadd)
                        nval = self['_NBM_DYN']
                    if nval < self['_NBM_DYN'] + self['_NBM_STAT']:
                        # on ajoute 0.
                        self._keywords['AMOR_REDUIT'].append(0.)
        # la règle ENSEMBLE garantit que les 3 GROUP_MA_xxx sont tous absents
        # ou tous présents
        if self['TYPE_RESU'] not in ('CHARGE'):
            if self['ISSF'] != 'NON':
                if self['GROUP_MA_FLU_STR'] is None:
                    UTMESS('F', 'MISS0_22')
                if self['MATER_FLUIDE'] is None:
                    UTMESS('F', 'MISS0_23')
Esempio n. 5
0
def fichier_sol(tab, struct, param=None):
    """Retourne le contenu du fichier de sol construit à partir de
    la table des données de sol et éventuellement des paramètres du calcul.
    """
    # vérification de la table
    for p in ("NUME_COUCHE", "NUME_MATE", "E", "NU", "RHO", "EPAIS",
              "AMOR_HYST", "RECEPTEUR", "SUBSTRATUM"):
        if not p in tab.para:
            raise aster.error('TABLE0_2', valk=(p, 'de sol'))
    nb_couche = len(tab)
    if max(tab.NUME_COUCHE.values()) != nb_couche:
        raise aster.error('MISS0_5')
    tsubstr = (tab.SUBSTRATUM == "OUI")
    if len(tsubstr) != 1:
        raise aster.error('MISS0_3')

    # complète la table
    tsol = tab.copy()

    # ... niveau récepteur

    def f_recep(v):
        res = ""
        if v.strip() == "OUI":
            res = "RECEP"
        return res

    tsol.fromfunction("s_RECEP", f_recep, "RECEPTEUR")

    # ... niveau source

    def f_force(num, v):
        res = 0
        if v.strip() == "OUI":
            res = num
        return res

    tsol.fromfunction("s_FORCE", f_force, ("NUME_COUCHE", "SOURCE"))
    # ... êta
    tsol.fromfunction("ETA", lambda x: 0., "NUME_COUCHE")

    content = []
    # titre de la table
    content.append("TITRE")
    content.append(tsol.titr)
    # materiaux
    tsol.sort(CLES=[
        "NUME_MATE",
    ])
    nb_mate = max(tsol.NUME_MATE.values())
    content.append("MATERIAU %8d" % nb_mate)
    content.append("RO           E            NU           BETA         ETA")
    format = "%%(RHO)%(R)s %%(E)%(R)s %%(NU)%(R)s %%(AMOR_HYST)%(R)s %%(ETA)%(R)s" \
        % dict_format
    last_id_mate = 0
    for row in tsol:
        if row['NUME_MATE'] == last_id_mate:  # déjà vu, on saute
            continue
        last_id_mate = row['NUME_MATE']
        content.append(format % row)
    # couches
    tsol.sort(CLES=[
        "NUME_COUCHE",
    ])
    content.append("COUCHE %8d" % (nb_couche - 1))
    format = "%%(EPAIS)%(R)s MATE %%(NUME_MATE)8d %%(s_RECEP)s" % dict_format
    for ic, row in enumerate(tsol):
        if ic == nb_couche - 1:
            continue
        content.append(format % row)
    # substratum
    substr = tsubstr.rows[0]
    content.append("SUBS   MATE %8d" % substr['NUME_MATE'])
    # sources
    nb_source = len(tsol.SOURCE == "OUI")
    content.append("SOURCE %8d 3D" % nb_source)
    # forces
    format = "FORCE HORIZ POSI %(s_FORCE)8d"
    if param and param.get('TYPE_RESU') == 'FICHIER_TEMPS' \
            and param.get('FICHIER_SOL_INCI') is None:
        # champ incident au substratum
        content.append("FORCE PLANE POSI   %8d" % nb_couche)
    else:
        for ic, row in enumerate(tsol):
            if row["s_FORCE"] != 0:
                content.append(format % row)
    # complément des paramètres du calcul
    spec_max_auto = False
    # Gestion automatique de certains parametres
    if param and param.get('AUTO') == "OUI" and param.get(
            '_auto_first_LT') == None:
        l_coor_nodes = struct.noeud_coor
        l_coor_x, l_coor_y, l_coor_z = l_coor_sort(l_coor_nodes)
        surf = param['SURF']
        coef_offset = param['COEF_OFFSET']
        dref_auto, rfic_auto, offset_max_auto, offset_nb_auto = calc_param_auto(
            l_coor_x, l_coor_y, l_coor_z, surf, coef_offset)
        sol_homo, vs = verif_sol_homogene(tab)
        if param['SURF'] == "OUI" and sol_homo:
            spec_max_auto = True
            spec_max = vs / 15.
        if param['OFFSET_MAX'] is None:
            param['OFFSET_MAX'] = offset_max_auto
        else:
            UTMESS('A', 'MISS0_43', valk='OFFSET_MAX')
        if param['OFFSET_NB'] is None:
            param['OFFSET_NB'] = offset_nb_auto
        else:
            UTMESS('A', 'MISS0_43', valk='OFFSET_NB')
        if param['OPTION_DREF'] == "OUI":
            if param['DREF'] == None:
                param['DREF'] = dref_auto
            else:
                UTMESS('A', 'MISS0_43', valk='DREF')
        if param['OPTION_RFIC'] == "OUI":
            if param['RFIC'] == None:
                param['RFIC'] = rfic_auto
            else:
                UTMESS('A', 'MISS0_43', valk='RFIC')
        else:
            param['RFIC'] = 0.
        if spec_max_auto:
            if param['SPEC_MAX'] == None:
                param['SPEC_MAX'] = spec_max
            else:
                UTMESS('A', 'MISS0_43', valk='SPEC_MAX')
        #
        print 'Mode automatique :'
        print '-    OFFSET_MAX auto = ', param['OFFSET_MAX']
        print '-    OFFSET_NB auto = ', param['OFFSET_NB']
        print '-    DREF auto = ', param['DREF']
        print '-    RFIC auto = ', param['RFIC']
        if spec_max_auto:
            print '-    SPEC_MAX auto = ', param['SPEC_MAX']
        # Pour Laplace-temps, on ne recalcule les parametre qu'une fois
        if param['_auto_first_LT'] == None:
            param['_auto_first_LT'] = False
    #
    if (param and param.get('OFFSET_MAX')) or (param
                                               and param.get('AUTO') == "OUI"):
        # ALGO
        if param and param.get('ALGO'):
            content.append("ALGO %s" % param['ALGO'])
        elif param['SURF'] == "OUI":
            content.append("ALGO DEPL")
        else:
            content.append("ALGO REGU")
        # DREF / SPEC / OFFSET
        if param['DREF']:
            content.append(("DREF" + sfmt) % param['DREF'])
        if param['SPEC_MAX']:
            content.append(("SPEC" + sfmt + " / %d") %
                           (param['SPEC_MAX'], param['SPEC_NB']))
        else:
            content.append("SPEC AUTO")
        content.append(("OFFSET" + sfmt + " / %d") %
                       (param['OFFSET_MAX'], param['OFFSET_NB']))

    content.append("FIND")

    # terminer le fichier par un retour chariot
    content.append("")
    return os.linesep.join(content)
Esempio n. 6
0
    def print_message(self,
                      code,
                      idmess,
                      valk=(),
                      vali=(),
                      valr=(),
                      exc_num=None,
                      exception=False,
                      print_as=None,
                      files=None,
                      cc=True):
        """Appelé par la routine fortran U2MESG ou à la fonction python UTMESS
        pour afficher un message.
        L'impression de ce message est différée si le `code` est suivi d'un "+".
            code  : 'A', 'E', 'S', 'F', 'I'
            idmess : identificateur du message
            valk, vali, valr : liste des chaines, entiers ou réels.
        Si exception==True, on lève une exception en cas d'erreur, sinon
        c'est l'appelant qui devra s'en charger (dans le C a priori).
        'print_as', 'files', 'cc' : cf. print_buffer_content.
        """
        idmess = idmess.strip()
        # le '+' n'a pas de sens pour les messages 'I'.
        if code == "I+":
            code = "I"
        if code == 'I':
            msg = self._cache_txt.get(idmess)
            if msg:
                try:
                    self.affiche('MESSAGE',
                                 msg % self.build_dict_args(valk, vali, valr))
                    return
                except:
                    # le formattage 'brut' échoue, on passera par une
                    # conversion complète
                    pass
        if self._parent is None:
            self.set_parent(idmess)
        if not self.update_counter(code, idmess):
            return
        # récupération du texte du message
        dictmess = self.get_message(code, idmess, valk, vali, valr, exc_num)

        # on le met dans le buffer
        self.add_to_buffer(dictmess)

        # si on n'attend pas une suite, ...
        if is_last_message(code):
            id0 = self.get_current_id().strip()
            # vérification des compteurs
            self.check_limit()

            # on imprime le message en attente
            self.print_buffer_content(print_as, files, cc)

            if exception and code[0] in ('S', 'F'):
                if self._mpi_rank is not None:
                    aster_core.MPI_Warn()
                if self._mpi_rank == 0:
                    l_unit = list_unit('F')
                    txt = _(
                        u"On ne peut pas lever d'exception dans une exécution MPI."
                    )
                    for unite in l_unit:
                        self.affiche(unite, txt)
                exc_typ = dictmess.get('exc_typ')
                if exc_typ:
                    raise exc_typ(id0, valk, vali, valr)
                raise error(id0, valk, vali, valr)
        return None