Uitbreidingen met gebruikerssubroutines¶
FrontISTR biedt een reeks gebruikerssubroutines waarmee functionaliteit kan worden uitgebreid zonder de hoofdbroncode te wijzigen. Ze omvatten gebruikersimplementaties van constitutieve wetten en de integratie van door de gebruiker gedefinieerde externe belastingen. Dit hoofdstuk geeft een overzicht van de beschikbare uitbreidingspunten en de trefwoorden in het analysebesturingsbestand waarmee elk daarvan wordt aangeroepen. Zie voor gedetailleerde subroutineargumenten en procedures voor opnieuw bouwen Gebruikerssubroutines (coderingshandleiding).
Overzicht van functies¶
De uitbreidingspunten voor gebruikerssubroutines zijn verdeeld in twee categorieën: materiaalconstitutieve wetten en externe belastingen. Aan de zijde van de constitutieve wetten zijn er vier aanroeppaden — lineaire elasticiteit, hyperelasticiteit, elastoplasticiteit en een algemene constitutieve wet — die elk met een onafhankelijk trefwoord worden geactiveerd. Aan de zijde van de externe belastingen is er een pad dat belastingsinformatie uit een door de gebruiker voorbereid extern bestand leest en deze aan de globale belastingsvector en residuvector toevoegt. Elke uitbreiding wordt beschikbaar nadat het met de FrontISTR-distributie meegeleverde sjabloonbestand is bewerkt en het hoofdprogramma opnieuw is gebouwd.
| Uitbreidingscategorie | Trefwoord voor analysebesturing | Belangrijkste gebruikerssubroutines | Te bewerken sjabloon |
|---|---|---|---|
| Door gebruiker gedefinieerde lineaire elasticiteit | !ELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Door gebruiker gedefinieerde hyperelasticiteit | !HYPERELASTIC, TYPE=USER |
uElasticMatrix, uElasticUpdate |
fistr1/src/lib/user/uelastic.f90 |
| Door gebruiker gedefinieerde elastoplasticiteit (vloeifunctie en terugprojectie) | !PLASTIC, YIELD=USER |
uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus |
fistr1/src/lib/user/uyield.f90 |
| Algemene door gebruiker gedefinieerde constitutieve wet | !USER_MATERIAL |
uMatlMatrix, uUpdate |
fistr1/src/lib/user/umat.f90 |
| Door gebruiker gedefinieerde externe belasting | !ULOAD, FILE=<fname> |
ureadload, uloading, uResidual |
fistr1/src/lib/user/uload.f90 |
Door de gebruiker gedefinieerde verstevigingswetten (een pad waarbij de ingebouwde vloeifunctie behouden blijft en alleen de verstevigingscurve door een gebruikersimplementatie wordt vervangen) worden niet ondersteund. Als een door de gebruiker gedefinieerde verstevigingscurve nodig is, selecteert u !PLASTIC, YIELD=USER en vervangt u de volledige elastoplastische constitutieve wet door een gebruikersimplementatie. Gebruikersrandvoorwaarden en uitbreidingspunten voor gebruikersverwerking tijdens een herstart worden niet ondersteund.
!CREEP met TYPE=USER wordt niet ondersteund. Gebruik !USER_MATERIAL om een tijdsafhankelijke constitutieve wet als gebruikersuitbreiding te implementeren.
Door de gebruiker gedefinieerde constitutieve wetten¶
Door de gebruiker gedefinieerde constitutieve wetten bieden een ingang voor het in een externe subroutine implementeren van spanning-rekrelaties die niet door de ingebouwde materiaalmodellen kunnen worden weergegeven. Er zijn vier paden beschikbaar overeenkomstig het raamwerk van de bijbehorende ingebouwde constitutieve wet: door de gebruiker gedefinieerde lineaire elasticiteit, hyperelasticiteit, elastoplasticiteit en een algemene door de gebruiker gedefinieerde constitutieve wet. Geef in elk pad binnen het !MATERIAL-blok van de analysebesturingsgegevens TYPE=USER of YIELD=USER op bij het overeenkomstige trefwoord. Er kunnen maximaal 100 gebruikersconstanten worden opgegeven, die aan de subroutine worden doorgegeven.
Door de gebruiker gedefinieerde lineaire elasticiteit¶
Dit is het pad waarin de gebruiker de elastische matrix binnen het raamwerk van infinitesimale vervorming berekent. Wanneer !ELASTIC, TYPE=USER in de analysebesturingsgegevens wordt opgegeven, behandelt FrontISTR dit als een constitutieve wet voor infinitesimale vervorming en roept het tijdens de berekening van de elementstijfheid uElasticMatrix aan (dat de elastische matrix \(D\) retourneert) en tijdens de spanningsupdate uElasticUpdate (dat de spanning retourneert). Gebruik dit niet samen met een bestaand hyperelastisch of elastoplastisch model.
Door de gebruiker gedefinieerde hyperelasticiteit¶
Dit is het pad voor het berekenen van spanning en tangentiële stijfheid uit afgeleiden van een rekenergiefunctie binnen een raamwerk voor grote vervorming (Total Lagrange). Geef !HYPERELASTIC, TYPE=USER op in de analysebesturingsgegevens. De aangeroepen subroutines zijn dezelfde uElasticMatrix en uElasticUpdate als bij door de gebruiker gedefinieerde lineaire elasticiteit, en hetzelfde sjabloon fistr1/src/lib/user/uelastic.f90 wordt gedeeld. Omdat de trefwoordspecificatie bepaalt of FrontISTR de implementatie als infinitesimale vervorming of als Total Lagrange behandelt, kan hetzelfde sjabloon niet gelijktijdig worden gebruikt voor implementaties voor infinitesimale en grote vervorming. Implementeer het als een van beide constitutieve wetten.
Door de gebruiker gedefinieerde elastoplasticiteit¶
Dit is het pad waarin de gebruiker de vloeifunctie en de terugprojectieprocedure implementeert. Geef !PLASTIC, YIELD=USER op in de analysebesturingsgegevens. Hiermee wordt een tak gebruikt die onafhankelijk is van de ingebouwde vloeifuncties van Mises, Mohr-Coulomb en Drucker-Prager. uElastoPlasticMatrix (dat de elastoplastische tangentiële stijfheid \(D\) retourneert) wordt aangeroepen tijdens de berekening van de elementstijfheid, uBackwardEuler (dat de proefspanning naar de werkelijke spanning projecteert en toestandsvariabelen bijwerkt) tijdens de spanningsupdate, en uElastoPlasticNumStatus (dat het aantal te bewaren reële toestandsvariabelen retourneert) tijdens de initialisatie van Gauss-punten. Een pad waarbij alleen de verstevigingscurve door een gebruikersimplementatie wordt vervangen, wordt niet ondersteund. Gebruik ook wanneer alleen een door de gebruiker gedefinieerde verstevigingscurve nodig is dit pad om de volledige elastoplastische constitutieve wet door een gebruikersimplementatie te vervangen.
Algemene door de gebruiker gedefinieerde constitutieve wet¶
De algemene door de gebruiker gedefinieerde constitutieve wet is een pad voor de implementatie van constitutieve wetten die niet binnen de elastische, hyperelastische of elastoplastische raamwerken passen. Geef !USER_MATERIAL op in de analysebesturingsgegevens. Standaard wordt deze binnen het Updated Lagrange-raamwerk behandeld; wanneer KIRCHHOFF is opgegeven, wordt deze als Total Lagrange behandeld. Het aantal toestandsvariabelen wordt met NSTATUS opgegeven. uMatlMatrix (dat de tangentiële stijfheid \(D\) retourneert) wordt aangeroepen tijdens de berekening van de elementstijfheid, en uUpdate (dat spanning en toestandsvariabelen bijwerkt) tijdens de spanningsupdate.
Gebruikersconstanten en toestandsvariabelen doorgeven¶
Voor elk van de paden !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER en !USER_MATERIAL worden de gebruikersconstanten die op gegevensregels in de analysebesturingsgegevens zijn geschreven (maximaal 100) rechtstreeks via het argument matl aan de subroutine doorgegeven. Voor !PLASTIC, YIELD=USER worden de met !ELASTIC opgegeven elastische constanten en de via de gegevensregels van !PLASTIC opgegeven gebruikersconstanten doorgegeven.
Voor de algemene door de gebruiker gedefinieerde constitutieve wet en !PLASTIC, YIELD=USER kan historische informatie van de vorige stap (zoals plastische rek, tegenspanning en schade) via de toestandsvariabele fstat aan de gebruikersimplementatie worden doorgegeven en aan het einde van de stap worden teruggeschreven. Het aantal toestandsvariabelen wordt voor de algemene door de gebruiker gedefinieerde constitutieve wet bepaald door !USER_MATERIAL en de bijbehorende NSTATUS, en voor !PLASTIC, YIELD=USER door de retourwaarde van uElastoPlasticNumStatus.
Door de gebruiker gedefinieerde externe belastingen¶
Door de gebruiker gedefinieerde externe belastingen bieden een pad voor het definiëren van externe krachten die niet kunnen worden weergegeven door de ingebouwde geconcentreerde belastingen, verdeelde belastingen of volumekrachten. Wanneer !ULOAD, FILE=<fname> in de analysebesturingsgegevens wordt geschreven, geeft FrontISTR de opgegeven bestandsnaam door aan ureadload, en wordt de door de gebruikersimplementatie gelezen informatie als modulegegevens bewaard.
De volgende drie subroutines corresponderen met het aanroepen van !ULOAD.
ureadload: Leest aan het begin van de analyse door de gebruiker gedefinieerde belastingen uit het externe bestand dat in het besturingsbestand is opgegeven. De gebruikersimplementatie opent het bestand en slaat de vereiste gegevens op in modulevariabelen.uloading: Wordt aangeroepen tijdens het samenstellen van de externe-belastingsvector voor elke stap en voegt de gebruikersbelasting toe aan de globale belastingsvector. Het huidige stapnummer en de belastingsfactor worden als argumenten doorgegeven.uResidual: Wordt aangeroepen tijdens het samenstellen van de residuvector bij elke iteratie en voegt de bijdrage van de gebruikersbelasting toe aan de globale residuvector. De subroutine wordt aangeroepen vanuit zowel niet-lineaire iteraties als evenwichtsberekeningen.
Er is geen uitbreidingspunt voor gebruikersrandvoorwaarden (gebruikersuitbreidingen van voorgeschreven verplaatsingen of contactvoorwaarden). Als een andere gebruikersuitbreiding dan een externe kracht nodig is, gebruikt u het overeenkomstige ingebouwde trefwoord of een pad voor een door de gebruiker gedefinieerde constitutieve wet.
Procedure voor het implementeren van gebruikerssubroutines¶
Om een gebruikerssubroutine te gebruiken, bewerkt u het sjabloonbestand dat bij de FrontISTR-brondistributie is inbegrepen en bouwt u FrontISTR vervolgens opnieuw. Gebruikerssubroutines kunnen niet in gedistribueerde binaire bestanden worden vervangen, zodat het gebruik van een gebruikersuitbreiding een omgeving vereist waarin FrontISTR vanuit de broncode kan worden gebouwd.
De sjablonen voor gebruikerssubroutines bevinden zich onder fistr1/src/lib/user/, met voor elke uitbreidingscategorie een specifiek te bewerken bestand (zie de tabel in Overzicht van functies voor de bestandsnamen). In de begintoestand bevatten de bestanden ofwel lege subroutineblokken ofwel een voorbeeldimplementatie voor lineaire elasticiteit; gebruikers voegen daar hun eigen constitutieve wet of belastingsdefinitie aan toe. Bouw FrontISTR na het bewerken van het sjabloon op de gebruikelijke wijze opnieuw met CMake en voer de analyse uit met het resulterende uitvoerbare bestand fistr1.
Details zoals de betekenis van subroutineargumenten, de verwerking van arrays met toestandsvariabelen en aandachtspunten bij het opnieuw bouwen staan op de overeenkomstige pagina's van de coderingshandleiding.
- Gebruikerssubroutines (overzicht)
- Algemene door de gebruiker gedefinieerde constitutieve wet
umat.f - Door de gebruiker gedefinieerde elastoplasticiteit
uyield.f - Door de gebruiker gedefinieerde externe belasting
uload.f - Door de gebruiker gedefinieerde lineaire elasticiteit en hyperelasticiteit
uelastic.f
Zie ook¶
- Materiaalgegevens — opties voor constitutieve wetten en lijst met ingebouwde modellen
- Randvoorwaarden en belastingen — ingebouwde randvoorwaarden en belastingen
- Gebruikerssubroutines (coderingshandleiding) — specificaties van subroutineargumenten en implementatieconventies
- !USER_MATERIAL — trefwoordsyntaxis voor de algemene door de gebruiker gedefinieerde constitutieve wet
- !ELASTIC — trefwoord voor lineaire elasticiteit, inclusief
TYPE=USER - !HYPERELASTIC — trefwoord voor hyperelasticiteit, inclusief
TYPE=USER - !PLASTIC — trefwoord voor elastoplasticiteit, inclusief
YIELD=USER