Assemblaggio di mesh e proiezione di campi

Questo post riprende un articolo apparso alcuni anni fa su CEALinux e scritto da Claus Andersen. I comandi sono stati aggiornati alla versione attuale di Code_Aster.

Risultato del calcolo sull’assemblaggio

Lo scopo è vedere come si possono assemblare diverse mesh costruite separatamente (in modo non conforme, cioè i nodi non sono necessariamente coincidenti). Le ragioni per utilizzare queste tecniche sono diverse, per esempio per semplificare l’operazione di meshing o semplicemente per voler lavorare solo su alcune parti di una struttura. Di seguito le parti da assemblare e lo schema di montaggio. Nello stesso studio si vedono altri concetti, come la conversione della mesh in elementi quadratici, la proiezione di un campo etc.

Definizione dei gruppi per il montaggio e per le condizioni al limite:

Per prima cosa, carichiamo nello studio le singole mesh, utilizzando più volte l’operatore LIRE_MAILLAGE:

Lettura della mesh “ring”
Lettura della mesh “mount”
Lettura della mesh “hinge”

Poi raggruppiamo le diverse mesh in una sola entità usando l’operatore ASSE_MAILLAGE. L’operatore lavora con due mesh alla volta, quindi dovremo chiamarlo di seguito usando il suo stesso risultato come nuovo ingresso.

Assemblaggio di “hinge” e “mount” producendo “mesh1”
Assemblaggio di “mesh1” e “ring”, producendo “mesh2”

Occorre notare che non c’è alcuna connessione tra le diverse parti, avendo usato l’opzione “SUPERPOSE” (sovrapposizione). Anche se avessimo dei nodi sulle stesse coordinate non sarebbero connessi tra di loro in alcun modo. Dovremo connettere queste parti con un’opportuna condizione al contorno. Dobbiamo per prima cosa assicurarci che la normale delle superfici che useremo nei comandi seguenti siano correttamente orientate (esterne rispetto ai volumi) usando MODI_MAILLAGE.

Orientamento delle superifici

Costruiamo un modello lineare basato su “mesh2”, sarà utile più tardi per recuperare i risultati su un modello più leggero)

Costruzione di un modello lineare

Trasformiamo tutta la mesh in elementi quadratici per una maggiore precisione dei risultati, utilizzando CREA_MAILLAGE(LINE_QUAD).

Conversione della mesh “Qmesh” in elementi quadratici

Costruiamo anche un modello quadratico per il calcolo basato su “Qmesh”. Come al solito definiamo un materiale e lo associamo a tutti gli elementi del modello. Definiamo anche le condizioni al contorno usando AFFE_CHAR_MECA: vincoliamo i gradi di libertà con DDL_IMPO, applichiamo una pressione con PRES_REP, costringiamo i nodi della faccia su cui applichiamo la pressione a spostarsi assieme usando LIAISON_UNIF e usiamo LIAISON_MAIL per unire le diverse parti della mesh. LIAISON_MAIL è uno strumento molto utile in Code_Aster: permette di unire in diversi modi delle parti nella mesh e si occupa di trovare una corrispondenza tra i nodi anche se non sono coincidenti. Usando LIAISON_MAIL è possibile anche definire certi tipi semplificati di contatto in lineare, ma lo vedremo in un altro post.

Definizione delle condizioni al limite con LIAISON_MAIL, LIAISON_UNIF, PRES_REP e DDL_IMPO

L’analisi viene fatta usando MECA_STATIQUE, il calcolo di campi (Von Mises, Tresca) usando CALC_CHAMP. A questo punto possiamo proiettare i risultati sul modello lineare, per avere dei risultati più leggeri (utile per grossi modelli) prima di esportarli usando PROJ_CHAMP. Anche questo operatore ha molti usi pratici: permette di applicare dei dati calcolati su punti diversi dai nodi una mesh (come per esempio delle temperature misurate con dei sensori), etc.

Proiezione dei risultati sul modello lineare.

A questo punto possiamo esportare i risultati con IMPR_RESU e visualizzarli con Paravis.

Visualizzazione degli spostamenti con Paravis
Deformata (amplificata 500 volte)

Possiamo anche estrarre di nuovo i risultati delle singole parti usando CREA_MAILLAGE(RESTREINT) + EXTR_RESU(RESTREINT) ed esportarli separatamente con IMPR_RESU. Un’alternativa consiste nell’utilizzo del filtro “Extract Group” di Paravis

Estrazione di una parte dei risultati con il filtro “Extract Group”

Di seguito il file di comandi completo. I file per riprodurre lo studio sono disponibili in questo archivio.

DEBUT()

ring = LIRE_MAILLAGE(FORMAT='MED',
                     UNITE=20)

mount = LIRE_MAILLAGE(FORMAT='MED',
                      UNITE=21)

hinge = LIRE_MAILLAGE(FORMAT='MED',
                      UNITE=22)

mesh1 = ASSE_MAILLAGE(MAILLAGE_1=hinge,
                      MAILLAGE_2=mount,
                      OPERATION='SUPERPOSE')

mesh2 = ASSE_MAILLAGE(MAILLAGE_1=mesh1,
                      MAILLAGE_2=ring,
                      OPERATION='SUPERPOSE')

mesh2 = MODI_MAILLAGE(reuse=mesh2,
                      MAILLAGE=mesh2,
                      ORIE_PEAU_3D=_F(GROUP_MA=('press', 'hinge_f', 'mount_f', 'encast', 'noDX')))

Qmesh = CREA_MAILLAGE(LINE_QUAD=_F(TOUT='OUI'),
                      MAILLAGE=mesh2)

linmod = AFFE_MODELE(AFFE=_F(MODELISATION='3D',
                             PHENOMENE='MECANIQUE',
                             TOUT='OUI'),
                     MAILLAGE=mesh2)

qmod = AFFE_MODELE(AFFE=_F(MODELISATION='3D',
                           PHENOMENE='MECANIQUE',
                           TOUT='OUI'),
                   MAILLAGE=Qmesh)

MA = DEFI_MATERIAU(ELAS=_F(E=210000.0,
                           NU=0.28))

MATE = AFFE_MATERIAU(AFFE=_F(MATER=MA,
                             TOUT='OUI'),
                     MAILLAGE=Qmesh)

CHAR = AFFE_CHAR_MECA(DDL_IMPO=(_F(DX=0.0,
                                   DY=0.0,
                                   DZ=0.0,
                                   GROUP_MA='encast'),
                                _F(DX=0.0,
                                   DY=0,
                                   GROUP_MA='noDX')),
                      LIAISON_MAIL=(_F(DISTANCE_ALARME=0.2,
                                       GROUP_MA_ESCL='mount_f',
                                       GROUP_MA_MAIT='hinge_v',
                                       TYPE_RACCORD='MASSIF'),
                                    _F(DISTANCE_ALARME=0.2,
                                       GROUP_MA_ESCL='ring_f',
                                       GROUP_MA_MAIT='mount_v',
                                       TYPE_RACCORD='MASSIF')),
                      LIAISON_UNIF=_F(DDL='DZ',
                                      GROUP_MA='press'),
                      MODELE=qmod,
                      PRES_REP=_F(GROUP_MA='press',
                                  PRES=0.325))

RESU = MECA_STATIQUE(CHAM_MATER=MATE,
                     EXCIT=_F(CHARGE=CHAR),
                     MODELE=qmod)

RESU = CALC_CHAMP(reuse=RESU,
                  CONTRAINTE=('SIGM_NOEU', 'SIEF_NOEU'),
                  CRITERES=('SIEQ_ELGA', 'SIEQ_NOEU'),
                  RESULTAT=RESU)

qresu = PROJ_CHAMP(MODELE_1=qmod,
                   MODELE_2=linmod,
                   RESULTAT=RESU)

IMPR_RESU(FORMAT='RESULTAT',
          RESU=_F(NOM_CHAM='SIEQ_ELGA',
                  NOM_CMP=('VMIS', 'TRESCA'),
                  RESULTAT=RESU,
                  VALE_MAX='OUI'),
          UNITE=8)

IMPR_RESU(FORMAT='MED',
          RESU=_F(NOM_CHAM=('SIGM_NOEU', 'SIEQ_NOEU', 'SIEF_NOEU', 'DEPL'),
                  RESULTAT=qresu),
          UNITE=80)

FIN()

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.