d7.01.03 Développer une nouvelle option#

Résumé :

Ce document vient en complément des présentations de la formation au développement. Il détaille les étapes nécessaires à la réalisation de l’exercice d’ajout d’une nouvelle option de calcul sur un élément fini.

On propose de créer une nouvelle option qui permet le calcul des contraintes moyennes par maille.

On suivra pour cela les étapes suivantes :

  • écrire un cas test pour tester son développement ;

  • rajouter un champ SIGM_ELEM dans le catalogue de la commande CALC_CHAMP ;

  • ajouter un nouveau champ SIGM_ELEM dans la structure de donnée résultat ;

  • définir une nouvelle option de calcul SIGM_ELEM avec ses paramètres d’entrée et de sortie ;

  • modifier les catalogues d’éléments finis, modes locaux et paramètres suite à l’ajout de cette nouvelle option ;

  • calculer la contrainte moyenne par élément dans un te ;

  • construire et tester son développement.

Remarque :

Les prérequis indispensables avant de commencer à développer est de connaître:

  • le Fortran,

  • le Python (y compris la Programmation Orientée Objet),

  • le gestionnaire de version Git,

  • l’interface GitLab.

Un squelette des fichiers nécessaires est fourni lors de la formation afin de guider les nouveaux développeurs.

Il est conseillé de commencer par la Compilation de la version de référence, puis les Fichiers des exercices.

Catalogue de la commande#

On doit ajouter l’option SIGM_ELEM dans les noms des champs des Commons code_aster/Cata/Commons/c_nom_cham_into.py:

[...]
        "SIEF_NOEU": (("lin", "nonlin", "dyna"), tr("Contraintes et efforts aux noeuds")),
        "SIGM_ELGA": (("lin", "nonlin", "dyna"), tr("Contraintes aux points de Gauss")),
        "SIGM_ELNO": (("lin", "nonlin", "dyna"), tr("Contraintes aux noeuds par élément")),
        "SIGM_NOEU": (("lin", "nonlin", "dyna"), tr("Contraintes aux noeuds")),
        "SIGM_ELEM": (...),
        "SIPM_ELNO": (
            ("lin", "nonlin"),
            tr("Contraintes aux noeuds par élément pour les éléments de poutre"),
        ),
[...]

Ajout Option dans la SD résultat#

On doit ajouter l’option SIGM_ELEM dans la SD résultats bibfor/resu_util/rscrsd.F90:

[...]
!     ------------------------------------------------------------------
!                      For mechanic
!     ------------------------------------------------------------------
integer, parameter :: nbFieldMeca = 132
character(len=16), parameter :: fieldMeca(nbFieldMeca) = (/ &
                                'DEPL            ', 'VITE            ', 'ACCE            ', &
                                'DEPL_ABSOLU     ', 'VITE_ABSOLU     ', 'ACCE_ABSOLU     ', &
                                'EFGE_ELNO       ', 'EFGE_NOEU       ', 'EGRU_ELNO       ', &
                                'EPSI_ELGA       ', 'EPSI_ELNO       ', &
                                'EPSI_NOEU       ', 'SIEF_ELGA       ', 'SIMY_ELGA       ', &
                                'SIGM_ELGA       ', 'EFGE_ELGA       ', 'SIGM_ELEM       ', &
[...]

Attention à modifier le nombre de champs nbFieldMeca et avoir la bonne longueur de chaîne.

Options de calcul#

On doit préciser les options de calcul de SIGM_ELEM dans un fichier catalo/cataelem/Options/sigm_elem.py:

from cataelem.Tools.base_objects import Option, CondCalcul
import cataelem.Commons.parameters as SP
import cataelem.Commons.attributes as AT


SIGM_ELEM = Option(
    para_in=(SP...,),
    para_out=(SP.PSIGMER,),
    condition=(),),
   comment="""  CALCUL DES CONTRAINTES MOYENNES PAR ELEMENT """,
)

On doit également ajouter cette option de calcul dans le catalogue des éléments finis catalo/cataelem/Elements/meca_3d.py:

[...]
OP.SIGM_ELEM(
    te=336,
    para_in=((OP.SIGM_ELEM..., LC...),),
    para_out=((OP.SIGM_ELEM.PSIGMER, ...),),
),
[...]

On trouvera dans le catalogues des composantes locales local_components.py la bonne quantité physique en entrée.

On ajoutera une quantité physique en sortie.

Ecriture du calcul dans le te#

On effectue le calcul dans un fichier te en:

  • récupérant les tailles locales et adresses mémoire des champs entrée et sortie par la routine tecach

  • calculant la moyenne par composantes entre les points de Gauss

    subroutine te0336(option, nomte)
!
    implicit none
!
#include "asterfort/tecach.h"
#include "jeveux.h"
!
    character(len=16), intent(in) :: option, nomte
!
    integer :: i, iret, j, ncmp, npg, tabin(7), tabout(7)
!
! --- Retrieving input and output local fields
!
    call tecach('OOO', 'PSIEFR', 'L', iret, nval=7, itab=tabin)
    call tecach('OOO', 'PSIGMER', 'E', iret, nval=7, itab=tabout)
!
! --- Retrieve number of Gauss points and components
!
    ! npg = ...
    ! ncmp = ...
!
! --- Loop over components
    do i = 1, ncmp
        !
        ! --- Loop over Gauss points
        ! ...
        do j = 1, npg
            ! ...
        end do
        ! ...
    end do
!
end subroutine