Udvidelser med brugersubrutiner¶
FrontISTR stiller et sæt brugersubrutiner til rådighed til at udvide funktionaliteten uden at ændre hovedkildekoden. De omfatter brugerimplementeringer af konstitutive love og integration af brugerdefinerede ydre laster. Dette kapitel opregner de tilgængelige udvidelsespunkter og de keywords i analysestyringsfilen, der bruges til at aktivere dem. For detaljerede subrutineargumenter og procedurer for genbygning se Brugersubrutiner (kodningsvejledning).
Funktionsoversigt¶
Udvidelsespunkter for brugersubrutiner opdeles i to kategorier: materialers konstitutive love og ydre laster. På siden for konstitutive love findes fire aktiveringsveje—lineær elasticitet, hyperelasticitet, elastoplasticitet og en generel konstitutiv lov—som hver aktiveres med et selvstændigt keyword. For ydre laster findes en vej, der læser lastinformation fra en ekstern fil udarbejdet af brugeren og føjer den til den globale lastvektor og residualvektor. Hver udvidelse bliver tilgængelig efter redigering af den skabelonfil, der følger med FrontISTR-distributionen, og genbygning af hovedprogrammet.
| Udvidelseskategori | Keyword i analysestyring | Primære brugersubrutiner | Skabelon, der skal redigeres |
|---|---|---|---|
| Brugerdefineret lineær elasticitet | !ELASTIC, TYPE=USER | uElasticMatrix, uElasticUpdate | fistr1/src/lib/user/uelastic.f90 |
| Brugerdefineret hyperelasticitet | !HYPERELASTIC, TYPE=USER | uElasticMatrix, uElasticUpdate | fistr1/src/lib/user/uelastic.f90 |
| Brugerdefineret elastoplasticitet (flydefunktion og return mapping) | !PLASTIC, YIELD=USER | uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus | fistr1/src/lib/user/uyield.f90 |
| Generel brugerdefineret konstitutiv lov | !USER_MATERIAL | uMatlMatrix, uUpdate | fistr1/src/lib/user/umat.f90 |
| Brugerdefineret ydre last | !ULOAD, FILE=<fname> | ureadload, uloading, uResidual | fistr1/src/lib/user/uload.f90 |
Brugerdefinerede hærdningslove (en vej, der bevarer den indbyggede flydefunktion og kun erstatter hærdningskurven med en brugerimplementering) understøttes ikke. Hvis der kræves en brugerdefineret hærdningskurve, vælges !PLASTIC, YIELD=USER, og hele den elastoplastiske konstitutive lov erstattes med en brugerimplementering. Brugerrandbetingelser og udvidelsespunkter til brugerbehandling under restart understøttes ikke.
!CREEP med TYPE=USER understøttes ikke. Brug !USER_MATERIAL til at implementere en tidsafhængig konstitutiv lov som brugerudvidelse.
Brugerdefinerede konstitutive love¶
Brugerdefinerede konstitutive love giver et indgangspunkt til i en ekstern subrutine at implementere spændings-tøjnings-relationer, som ikke kan repræsenteres af de indbyggede materialemodeller. Der findes fire veje svarende til rammen for den respektive indbyggede konstitutive lov: brugerdefineret lineær elasticitet, brugerdefineret hyperelasticitet, brugerdefineret elastoplasticitet og en generel brugerdefineret konstitutiv lov. På hver vej angives TYPE=USER eller YIELD=USER på det tilsvarende keyword i !MATERIAL-blokken i analysestyringsdataene. Op til 100 brugerkonstanter kan angives og videregives til subrutinen.
Brugerdefineret lineær elasticitet¶
Brugerdefineret lineær elasticitet er den vej, hvor brugeren beregner elasticitetsmatricen inden for rammen for infinitesimale deformationer. Når !ELASTIC, TYPE=USER angives i analysestyringsdataene, behandler FrontISTR den som en konstitutiv lov for infinitesimale deformationer og kalder uElasticMatrix (som returnerer elasticitetsmatricen \(D\)) under beregning af elementstivheden og uElasticUpdate (som returnerer spænding) under spændingsopdateringen. Den må ikke bruges sammen med en eksisterende hyperelastisk eller elastoplastisk model.
Brugerdefineret hyperelasticitet¶
Brugerdefineret hyperelasticitet er vejen til at beregne spænding og tangentiel stivhed ud fra afledte af en tøjningsenergifunktion inden for en ramme for store deformationer (Total Lagrange). Angiv !HYPERELASTIC, TYPE=USER i analysestyringsdataene. De kaldte subrutiner er de samme uElasticMatrix og uElasticUpdate som for brugerdefineret lineær elasticitet, og den samme skabelon fistr1/src/lib/user/uelastic.f90 deles. Da keyword-angivelsen skifter mellem, om FrontISTR behandler implementeringen som infinitesimal deformation eller Total Lagrange, kan den samme skabelon ikke samtidig bruges til implementeringer for både infinitesimale og store deformationer. Implementer den som én af de to konstitutive love.
Brugerdefineret elastoplasticitet¶
Brugerdefineret elastoplasticitet er den vej, hvor brugeren implementerer flydefunktionen og return-mapping-proceduren. Angiv !PLASTIC, YIELD=USER i analysestyringsdataene. Dette går ind i en gren, der er uafhængig af de indbyggede Mises-, Mohr-Coulomb- og Drucker-Prager-flydefunktioner. uElastoPlasticMatrix (som returnerer den elastoplastiske tangentielle stivhed \(D\)) kaldes under beregning af elementstivheden, uBackwardEuler (som mapper prøvespændingen til den sande spænding og opdaterer tilstandsvariable) under spændingsopdateringen, og uElastoPlasticNumStatus (som returnerer antallet af reelle tilstandsvariable, der skal bevares) under initialisering af Gauss-punkter. En vej, der kun erstatter hærdningskurven med en brugerimplementering, understøttes ikke. Selv når kun en brugerdefineret hærdningskurve er nødvendig, bruges denne vej til at erstatte hele den elastoplastiske konstitutive lov med en brugerimplementering.
Generel brugerdefineret konstitutiv lov¶
Den generelle brugerdefinerede konstitutive lov er en vej til at implementere konstitutive love, der ikke passer inden for de elastiske, hyperelastiske eller elastoplastiske rammer. Angiv !USER_MATERIAL i analysestyringsdataene. Som standard behandles den inden for Updated Lagrange-rammen; når KIRCHHOFF angives, behandles den som Total Lagrange. Antallet af tilstandsvariable angives med NSTATUS. uMatlMatrix (som returnerer den tangentielle stivhed \(D\)) kaldes under beregning af elementstivheden, og uUpdate (som opdaterer spænding og tilstandsvariable) under spændingsopdateringen.
Overførsel af brugerkonstanter og tilstandsvariable¶
For hver af vejene !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER og !USER_MATERIAL videregives de brugerkonstanter, der skrives på datalinjer i analysestyringsdataene (op til 100), direkte til subrutinen gennem argumentet matl. For !PLASTIC, YIELD=USER videregives de elastiske konstanter angivet med !ELASTIC og brugerkonstanterne leveret gennem !PLASTIC-datalinjerne.
For den generelle brugerdefinerede konstitutive lov og !PLASTIC, YIELD=USER kan historikinformation fra det foregående trin (såsom plastisk tøjning, back stress og skade) videregives til brugerimplementeringen gennem tilstandsvariablen fstat og skrives tilbage ved slutningen af trinnet. Antallet af tilstandsvariable bestemmes for den generelle brugerdefinerede konstitutive lov af !USER_MATERIAL og dens NSTATUS og for !PLASTIC, YIELD=USER af returværdien fra uElastoPlasticNumStatus.
Brugerdefinerede ydre laster¶
Brugerdefinerede ydre laster giver en vej til at definere ydre kræfter, der ikke kan repræsenteres af de indbyggede koncentrerede laster, fordelte laster eller legemekræfter. Når !ULOAD, FILE=<fname> skrives i analysestyringsdataene, videregiver FrontISTR det angivne filnavn til ureadload, og informationen, der læses af brugerimplementeringen, bevares som moduldata.
Følgende tre subrutiner svarer til aktivering af !ULOAD.
ureadload: Ved analysens start læses brugerdefinerede laster fra den eksterne fil, der er angivet i styringsfilen. Brugerimplementeringen åbner filen og gemmer de nødvendige data i modulvariable.uloading: Kaldes under samling af den ydre lastvektor for hvert trin og føjer brugerlasten til den globale lastvektor. Det aktuelle trinnummer og lastfaktoren videregives som argumenter.uResidual: Kaldes under samling af residualvektoren ved hver iteration og føjer bidraget fra brugerlasten til den globale residualvektor. Den kaldes både fra ikke-lineære iterationer og ligevægtsberegninger.
Der findes intet udvidelsespunkt for brugerrandbetingelser (brugerudvidelser af foreskrevne forskydninger eller kontaktbetingelser). Hvis der kræves en brugerudvidelse ud over en ydre kraft, anvendes det tilsvarende indbyggede keyword eller en vej for en brugerdefineret konstitutiv lov.
Procedure for implementering af brugersubrutiner¶
For at bruge en brugersubrutine redigeres den skabelonfil, der følger med FrontISTR-kildedistributionen, hvorefter FrontISTR genbygges. Brugersubrutiner kan ikke udskiftes i distribuerede binære filer, så brug af en brugerudvidelse kræver et miljø, hvor FrontISTR kan bygges fra kildekoden.
Skabeloner til brugersubrutiner findes under fistr1/src/lib/user/, med en bestemt fil, der skal redigeres for hver udvidelseskategori (se tabellen i Funktionsoversigt for filnavne). I deres oprindelige tilstand indeholder filerne enten tomme subrutinekroppe eller et eksempel på en lineærelastisk implementering; brugerne tilføjer deres egen konstitutive lov eller lastdefinition dér. Efter redigering af skabelonen genbygges FrontISTR normalt med CMake, og analysen køres med det resulterende fistr1-program.
Detaljer såsom betydningen af subrutineargumenter, håndtering af arrays med tilstandsvariable og forholdsregler ved genbygning findes på de tilsvarende sider i kodningsvejledningen.
- Brugersubrutiner (oversigt)
- Generel brugerdefineret konstitutiv lov
umat.f - Brugerdefineret elastoplasticitet
uyield.f - Brugerdefineret ydre last
uload.f - Brugerdefineret lineær elasticitet og hyperelasticitet
uelastic.f
Se også¶
- Materialedata — valgmuligheder for konstitutive love og liste over indbyggede modeller
- Randbetingelser og laster — indbyggede randbetingelser og laster
- Brugersubrutiner (kodningsvejledning) — specifikationer af subrutineargumenter og implementeringskonventioner
- !USER_MATERIAL — keyword-syntaks for den generelle brugerdefinerede konstitutive lov
- !ELASTIC — lineærelastisk keyword inklusive
TYPE=USER - !HYPERELASTIC — hyperelastisk keyword inklusive
TYPE=USER - !PLASTIC — elastoplastisk keyword inklusive
YIELD=USER