Estensioni mediante subroutine utente¶
FrontISTR fornisce un insieme di subroutine utente per estendere le funzionalità senza modificare il codice sorgente principale. Esse coprono implementazioni utente delle leggi costitutive e l'integrazione di carichi esterni definiti dall'utente. Questo capitolo elenca i punti di estensione disponibili e le keyword del file di controllo dell'analisi utilizzate per richiamare ciascuno di essi. Per i dettagli sugli argomenti delle subroutine e sulle procedure di ricompilazione, vedere Subroutine utente (Guida alla programmazione).
Panoramica delle funzioni¶
I punti di estensione mediante subroutine utente sono suddivisi in due categorie: leggi costitutive dei materiali e carichi esterni. Per le leggi costitutive sono disponibili quattro percorsi di chiamata — elasticità lineare, iperelasticità, elastoplasticità e legge costitutiva general-purpose — ciascuno attivato da una keyword indipendente. Per i carichi esterni è previsto un percorso che legge le informazioni di carico da un file esterno preparato dall'utente e le aggiunge al vettore globale dei carichi e al vettore dei residui. Ogni estensione diventa disponibile dopo aver modificato il file modello incluso nella distribuzione di FrontISTR e aver ricompilato il programma principale.
| Categoria di estensione | Keyword di controllo dell'analisi | Principali subroutine utente | Modello da modificare |
|---|---|---|---|
| Elasticità lineare utente | !ELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Iperelasticità utente | !HYPERELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Elastoplasticità utente (funzione di snervamento e return mapping) | !PLASTIC, YIELD=USER |
uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus |
fistr1/src/lib/user/uyield.f90 |
| Legge costitutiva utente general-purpose | !USER_MATERIAL |
uMatlMatrix, uUpdate |
fistr1/src/lib/user/umat.f90 |
| Carico esterno definito dall'utente | !ULOAD, FILE=<fname> |
ureadload, uloading, uResidual |
fistr1/src/lib/user/uload.f90 |
Le leggi di incrudimento definite dall'utente (un percorso che mantiene la funzione di snervamento incorporata sostituendo soltanto la curva di incrudimento con un'implementazione utente) non sono supportate. Se è necessaria una curva di incrudimento definita dall'utente, selezionare !PLASTIC, YIELD=USER e sostituire l'intera legge costitutiva elastoplastica con un'implementazione utente. Non sono supportate condizioni al contorno definite dall'utente né punti di estensione per l'elaborazione utente durante il restart.
!CREEP con TYPE=USER non è supportato. Per implementare come estensione utente una legge costitutiva dipendente dal tempo, utilizzare !USER_MATERIAL.
Leggi costitutive utente¶
Le leggi costitutive utente forniscono un punto di ingresso per implementare in una subroutine esterna relazioni tensione-deformazione che non possono essere rappresentate dai modelli di materiale incorporati. Sono disponibili quattro percorsi, in funzione dello schema della corrispondente legge costitutiva incorporata: elasticità lineare utente, iperelasticità utente, elastoplasticità utente e legge costitutiva utente general-purpose. In ciascun percorso, all'interno del blocco !MATERIAL dei dati di controllo dell'analisi, specificare TYPE=USER oppure YIELD=USER nella keyword corrispondente. È possibile specificare fino a 100 costanti utente, che vengono passate alla subroutine.
Elasticità lineare utente¶
L'elasticità lineare utente è il percorso in cui l'utente calcola la matrice elastica nell'ambito delle deformazioni infinitesime. Quando nei dati di controllo dell'analisi è specificato !ELASTIC, TYPE=USER, FrontISTR lo tratta come una legge costitutiva a deformazioni infinitesime e chiama uElasticMatrix (che restituisce la matrice elastica \(D\)) durante il calcolo della rigidezza dell'elemento e uElasticUpdate (che restituisce la tensione) durante l'aggiornamento della tensione. Non utilizzarlo insieme a un modello iperelastico o elastoplastico esistente.
Iperelasticità utente¶
L'iperelasticità utente è il percorso per calcolare tensione e rigidezza tangente a partire dalle derivate di una funzione di energia di deformazione nel quadro delle grandi deformazioni (Total Lagrange). Specificare !HYPERELASTIC, TYPE=USER nei dati di controllo dell'analisi. Le subroutine chiamate sono le stesse uElasticMatrix e uElasticUpdate dell'elasticità lineare utente e viene condiviso lo stesso modello fistr1/src/lib/user/uelastic.f90. Poiché la specifica della keyword commuta il modo in cui FrontISTR tratta l'implementazione, come deformazione infinitesima oppure Total Lagrange, lo stesso modello non può essere utilizzato contemporaneamente per implementazioni a deformazioni infinitesime e a grandi deformazioni. Implementarlo come una delle due leggi costitutive.
Elastoplasticità utente¶
L'elastoplasticità utente è il percorso in cui l'utente implementa la funzione di snervamento e la procedura di return mapping. Specificare !PLASTIC, YIELD=USER nei dati di controllo dell'analisi. In questo modo si entra in un ramo indipendente dalle funzioni di snervamento incorporate di Mises, Mohr-Coulomb e Drucker-Prager. uElastoPlasticMatrix (che restituisce la rigidezza tangente elastoplastica \(D\)) viene chiamata durante il calcolo della rigidezza dell'elemento, uBackwardEuler (che mappa la tensione di prova sulla tensione effettiva e aggiorna le variabili di stato) durante l'aggiornamento della tensione e uElastoPlasticNumStatus (che restituisce il numero di variabili di stato reali da mantenere) durante l'inizializzazione dei punti di Gauss. Non è supportato un percorso che sostituisca soltanto la curva di incrudimento con un'implementazione utente. Anche quando è necessaria soltanto una curva di incrudimento definita dall'utente, utilizzare questo percorso per sostituire l'intera legge costitutiva elastoplastica con un'implementazione utente.
Legge costitutiva utente general-purpose¶
La legge costitutiva utente general-purpose è un percorso per implementare leggi costitutive che non rientrano negli schemi elastico, iperelastico o elastoplastico. Specificare !USER_MATERIAL nei dati di controllo dell'analisi. Per impostazione predefinita viene trattata nel quadro Updated Lagrange; quando è specificato KIRCHHOFF, viene trattata come Total Lagrange. Il numero di variabili di stato è specificato mediante NSTATUS. uMatlMatrix (che restituisce la rigidezza tangente \(D\)) viene chiamata durante il calcolo della rigidezza dell'elemento e uUpdate (che aggiorna la tensione e le variabili di stato) durante l'aggiornamento della tensione.
Passaggio delle costanti utente e delle variabili di stato¶
Per ciascuno dei percorsi !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER e !USER_MATERIAL, le costanti utente scritte nelle righe dati dei dati di controllo dell'analisi (fino a 100) vengono passate direttamente alla subroutine tramite l'argomento matl. Per !PLASTIC, YIELD=USER, vengono passate le costanti elastiche specificate da !ELASTIC e le costanti utente fornite tramite le righe dati di !PLASTIC.
Per la legge costitutiva utente general-purpose e per !PLASTIC, YIELD=USER, le informazioni di storia del passo precedente (come deformazione plastica, back stress e danno) possono essere passate all'implementazione utente tramite la variabile di stato fstat e riscritte alla fine del passo. Il numero di variabili di stato è determinato, per la legge costitutiva utente general-purpose, da !USER_MATERIAL e dal relativo NSTATUS, e per !PLASTIC, YIELD=USER, dal valore restituito da uElastoPlasticNumStatus.
Carichi esterni definiti dall'utente¶
I carichi esterni definiti dall'utente forniscono un percorso per definire forze esterne che non possono essere rappresentate dai carichi concentrati, dai carichi distribuiti o dalle forze di volume incorporati. Quando nei dati di controllo dell'analisi viene scritto !ULOAD, FILE=<fname>, FrontISTR passa il nome file specificato a ureadload e le informazioni lette dall'implementazione utente vengono conservate come dati di modulo.
Le tre subroutine seguenti corrispondono alla chiamata di !ULOAD.
ureadload: all'inizio dell'analisi legge i carichi definiti dall'utente dal file esterno specificato nel file di controllo. L'implementazione utente apre il file e memorizza i dati necessari nelle variabili di modulo.uloading: viene chiamata durante l'assemblaggio del vettore dei carichi esterni per ciascun passo e aggiunge il carico utente al vettore globale dei carichi. Il numero del passo corrente e il fattore di carico vengono passati come argomenti.uResidual: viene chiamata durante l'assemblaggio del vettore dei residui a ogni iterazione e aggiunge il contributo del carico utente al vettore globale dei residui. Viene chiamata sia dalle iterazioni non lineari sia dai calcoli di equilibrio.
Non è previsto alcun punto di estensione per condizioni al contorno definite dall'utente (estensioni utente dello spostamento prescritto o delle condizioni di contatto). Se è necessaria un'estensione utente diversa da una forza esterna, utilizzare la corrispondente keyword incorporata oppure un percorso di legge costitutiva utente.
Procedura per implementare le subroutine utente¶
Per utilizzare una subroutine utente, modificare il file modello incluso nella distribuzione del codice sorgente di FrontISTR e quindi ricompilare FrontISTR. Le subroutine utente non possono essere sostituite nei binari distribuiti, pertanto per utilizzare un'estensione utente è necessario un ambiente in cui FrontISTR possa essere compilato dal sorgente.
I modelli delle subroutine utente si trovano in fistr1/src/lib/user/, con uno specifico file da modificare per ciascuna categoria di estensione (per i nomi dei file vedere la tabella in Panoramica delle funzioni). Nel loro stato iniziale, i file contengono corpi di subroutine vuoti oppure un'implementazione di esempio per elasticità lineare; l'utente vi aggiunge la propria legge costitutiva o definizione di carico. Dopo aver modificato il modello, ricompilare FrontISTR normalmente con CMake ed eseguire l'analisi usando l'eseguibile fistr1 risultante.
Dettagli quali il significato degli argomenti delle subroutine, la gestione degli array delle variabili di stato e le precauzioni durante la ricompilazione sono riportati nelle pagine corrispondenti della guida alla programmazione.
- Subroutine utente (Panoramica)
- Legge costitutiva utente general-purpose
umat.f - Elastoplasticità utente
uyield.f - Carico esterno definito dall'utente
uload.f - Elasticità lineare utente e iperelasticità utente
uelastic.f
Vedere anche¶
- Dati del materiale — opzioni delle leggi costitutive ed elenco dei modelli incorporati
- Condizioni al contorno e carichi — condizioni al contorno e carichi incorporati
- Subroutine utente (Guida alla programmazione) — specifiche degli argomenti delle subroutine e convenzioni di implementazione
- !USER_MATERIAL — sintassi della keyword per la legge costitutiva utente general-purpose
- !ELASTIC — keyword dell'elasticità lineare, incluso
TYPE=USER - !HYPERELASTIC — keyword dell'iperelasticità, incluso
TYPE=USER - !PLASTIC — keyword dell'elastoplasticità, incluso
YIELD=USER