Tutorial sull'utilizzo base di elementi shell in Code_Aster basato sui preziosi suggerimenti di Roberto Lugli (code-aster.it), il quale mi ha illustrato con dovizia di particolari tutti i metodi e i suggerimenti necessari per impostare con cognizione di causa una simulazione 3d-shell meccanica in Code_Aster. La modellazione shell ha senso quando uno spessore del nostro componente è decisamente inferiore alle altre due: ad esempio le lamiere. In questi casi infatti discretizzare lo spessore reale (pochi mm) a fronte di dimensioni macro (dm o m) in una mesh 3D porta ad un costo computazionale elevato e non pratico dal punto di vista del risultato finale. Si procede pertanto ad una modellazione ad elementi shell (2d in uno spazio 3d) descretizzando le superfici dell'oggetto in elementi bidimensionali come triangoli o quadrati (Tet3 o Quad4, dove la cifra rappresenta il numero di nodi).
Esempio pratico di simulazione shell: carter in lamiera per applicazioni elettroniche. In visione sovrapposta la geometria semplice e la mesh di calcolo (tetra - netgen2D)
#1 MODELLIZZAZIONE Coque_3D o DKT ? in Code_Aster è possibile scegliere tra queste due modalità di modellazione, visto che ovviamente non possiamo usare la semplice 3D. DKT usa elementi lineari (Tet3 o Quad4) ed è pertanto più snello, di contro non tiene conto della curvatura dell'elemento. Coque_3D usa solo elementi bi-quadratici (Tet7 o Quad9): elementi quadratici ai quali viene aggiunto un nodo al centro dell'elemento, grazie a questo nodo la curvatura dell'elemento viene modellata con maggiore accuratezza. La mesh può essere convertita all'interno di Salome_Meca nel modulo mesh attraverso Mesh / Modification / Converto to/from quadratic.
In Code_Aster è comunque possibile convertire la mesh attraverso CREA_MAILLAGE.
CONSIGLIO: Finchè si resta in piccole deformazioni, e meglio ancora se in campo lineare, conviene sempre usare la modellazione DKT per semplicità.
model = AFFE_MODELE(AFFE=_F(MODELISATION=('DKT', ),
PHENOMENE='MECANIQUE',
TOUT='OUI'),
MAILLAGE=mesh)
#2 SPESSORE DELL'ELEMENTO SHELL. Ovviamente per ottenere risultati coerenti dobbiamo inserire nel software lo spessore (EPAIS) del nostro elemento bidimensionale, e questo viene fatto attraverso il comando AFFE_CARA_ELEM. Possiamo (e spesso dobbiamo) aumentare il numero di livelli di integrazione nello spessore (COQUE_NCOU), immaginiamolo impropriamente come una discretizzazione dello spessore fittizio del nostro elemento shell. Teoricamente in campo lineare è sufficiente 1 solo livello di integrazione, per il non-lineare si consiglia sempre di partire con almeno 3 livelli, ma potrebbero esserne necessari 5 o 7. Questo paramento può aiutare molto la convergenza. Nell'esempio sottostante si nota come si può anche dare spessori diversi a seconda dei gruppi della nostra mesh. (https://www.code-aster.org/forum2/viewtopic.php?id=15182)
elemprop = AFFE_CARA_ELEM(COQUE=(_F(ANGL_REP=(0., 0.),
COQUE_NCOU=3,
EPAIS=0.01,
GROUP_MA=('steel10', )),
_F(ANGL_REP=(0., 0.),
COQUE_NCOU=3,
EPAIS=0.004,
GROUP_MA=('frame04', )),
_F(ANGL_REP=(0., 0.),
COQUE_NCOU=3,
EPAIS=0.003,
GROUP_MA=('cart03', ))),
MODELE=model)
#3 POSTPROCESSING. Bisogna ricordarsi, quando si usa elementi shell, di estrapolare i risultati in modo coerente affinchè Paraview possa utilizzarli. Il formato idoneo è quello dei RESU_NOEU (ad esempio SIGM_NOEU o EPSI_NOEU). Per estrapolare questi valori dobbiamo allungare un poco la parte di post-processing dopo l'analisi vera e propria. Una volta calcolati i campi ELNO questi vengono rielaborati con POST_CHAMP e l'apposita funzione EXTR_COQUE. Dobbiamo infatti dire a Code_Aster su quale livello (NIVE_COUCHE) vogliamo estrapolare le tensioni e le deformazioni (superiore, medio, inferiore) del nostro livello. Bisogna quindi selezionare il livello (NUME_COUCHE) coerente con il livello ricordando che 1 è il livello inferiore rispetto alla normale e il livello più alto corrisponde all'esterno (nel nostro caso 3):
"NUME_COUCHE = nume
Dans le cas d'un matériau multicouche (coque multicouche définie par DEFI_COQU_MULT), ou
d'un élément de structure avec comportement non linéaire local, intégré par couches,
NUME_COUCHE est la valeur entière comprise entre 1 et le nombre de couches, nécessaire pour
préciser la couche où l'on désire effectuer le calcul élémentaire. Par convention, la couche 1 est
la couche inférieure (dans le sens de la normale) dans le cas des éléments de coque mécanique
ou de coque thermique et correspond à la couche interne dans le cas d'un élément TUYAU.NIVE_COUCHE = Pour la couche nume définie par NUME_COUCHE, permet de préciser l'ordonnée où l'on désire
effectuer le calcul élémentaire :
'INF' ordonnée inférieure de la couche (peau interne),
'SUP' ordonnée supérieure de la couche (peau externe),
'MOY' ordonnée moyenne de la couche (feuillet moyen).
You need to do something likefirstply=CALC_ELEM(RESULTAT=RESU,
REPE_COQUE=_F(NUME_COUCHE=1,
NIVE_COUCHE='INF',),
OPTION=('EPSI_ELNO_DEPL',),);lastply=CALC_ELEM(RESULTAT=RESU,
REPE_COQUE=_F(NUME_COUCHE=3,
NIVE_COUCHE='SUP',),
OPTION=('EPSI_ELNO_DEPL',),);to see the results in each layer."
Una volta integrati i valori sul livello di riferimento viene calcolato il campo _NOEU attraverso un'altra funzione CALC_CHAMP avente come input i valori in uscita da POST_CHAMP.
res = CALC_CHAMP(reuse=res,
CARA_ELEM=elemprop,
CHAM_MATER=fieldmat,
CONTRAINTE=('SIGM_ELNO', ),
DEFORMATION=('EPSI_ELNO', ),
MODELE=model,
RESULTAT=res,
TOUT_ORDRE='OUI')
sup_res = POST_CHAMP(EXTR_COQUE=_F(NIVE_COUCHE='SUP',
NOM_CHAM=('SIGM_ELNO', 'EPSI_ELNO'),
NUME_COUCHE=3),
RESULTAT=res)
sup_res = CALC_CHAMP(reuse=s_res,
CARA_ELEM=elemprop,
CHAM_MATER=fieldmat,
CONTRAINTE=('SIGM_NOEU', ),
DEFORMATION=('EPSI_NOEU', ),
MODELE=model,
RESULTAT=s_res)
Si procede quindi ad esportare normalmente i risultati attraverso IMPR_RESU