Gå til innhold

Utvidelser med brukersubrutiner

FrontISTR tilbyr et sett med brukersubrutiner for å utvide funksjonaliteten uten å endre hovedkildekoden. De omfatter brukerimplementerte konstitutive lover og integrering av brukerdefinerte eksterne laster. Dette kapitlet gir en oversikt over tilgjengelige utvidelsespunkter og nøkkelordene i analysestyringsfilen som brukes til å aktivere hvert av dem. For detaljer om subrutineargumenter og fremgangsmåten for ombygging, se Brukersubrutiner (kodingsveiledning).

Funksjonsoversikt

Utvidelsespunktene for brukersubrutiner er delt i to kategorier: materialets konstitutive lover og eksterne laster. For konstitutive lover finnes fire aktiveringsveier – lineær elastisitet, hyperelastisitet, elastoplastisitet og en generell konstitutiv lov – som hver aktiveres med et eget nøkkelord. For eksterne laster finnes en vei som leser lastinformasjon fra en ekstern fil opprettet av brukeren og legger bidraget til den globale lastvektoren og restvektoren. Alle utvidelsene blir tilgjengelige etter at den aktuelle malfilen i FrontISTR-distribusjonen er redigert og hovedprogrammet er bygget på nytt.

Utvidelseskategori Nøkkelord i analysestyring Viktigste brukersubrutiner Malfil som skal redigeres
Brukerdefinert lineær elastisitet !ELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Brukerdefinert hyperelastisitet !HYPERELASTIC, TYPE=USER uElasticMatrix, uElasticUpdate fistr1/src/lib/user/uelastic.f90
Brukerdefinert elastoplastisitet (flytefunksjon og return mapping) !PLASTIC, YIELD=USER uElastoPlasticMatrix, uBackwardEuler, uElastoPlasticNumStatus fistr1/src/lib/user/uyield.f90
Generell brukerdefinert konstitutiv lov !USER_MATERIAL uMatlMatrix, uUpdate fistr1/src/lib/user/umat.f90
Brukerdefinert ekstern last !ULOAD, FILE=<fname> ureadload, uloading, uResidual fistr1/src/lib/user/uload.f90

Brukerdefinerte herdingslover (en vei der den innebygde flytefunksjonen beholdes og bare herdingskurven erstattes med en brukerimplementasjon) støttes ikke. Hvis en brukerdefinert herdingskurve er nødvendig, velges !PLASTIC, YIELD=USER, og hele den elastoplastiske konstitutive loven erstattes med en brukerimplementasjon. Brukerdefinerte randbetingelser og utvidelsespunkter for brukerbehandling ved restart støttes ikke.

!CREEP med TYPE=USER støttes ikke. Bruk !USER_MATERIAL for å implementere en tidsavhengig konstitutiv lov som brukerutvidelse.

Brukerdefinerte konstitutive lover

Brukerdefinerte konstitutive lover er inngangen for å implementere spennings–tøyningsrelasjoner som ikke kan uttrykkes med de innebygde materialmodellene, i en ekstern subrutine. Det finnes fire veier som følger rammene til de tilsvarende innebygde konstitutive lovene: brukerdefinert lineær elastisitet, brukerdefinert hyperelastisitet, brukerdefinert elastoplastisitet og en generell brukerdefinert konstitutiv lov. For alle veiene angis TYPE=USER eller YIELD=USER på det aktuelle nøkkelordet i !MATERIAL-blokken i analysestyringsdataene. Opptil 100 brukerkonstanter kan angis og sendes videre til subrutinen.

Brukerdefinert lineær elastisitet

Dette er veien der brukeren beregner elastisitetsmatrisen innenfor rammen for infinitesimal deformasjon. Når !ELASTIC, TYPE=USER angis i analysestyringsdataene, behandler FrontISTR den som en konstitutiv lov for infinitesimal deformasjon og kaller uElasticMatrix (som returnerer elastisitetsmatrisen \(D\)) ved beregning av elementstivheten og uElasticUpdate (som returnerer spenningen) ved spenningsoppdatering. Den skal ikke brukes sammen med eksisterende hyperelastiske eller elastoplastiske modeller.

Brukerdefinert hyperelastisitet

Dette er veien for å beregne spenning og tangentstivhet fra deriverte av en tøyningsenergifunksjon innenfor rammen for stor deformasjon (Total Lagrange). Angi !HYPERELASTIC, TYPE=USER i analysestyringsdataene. Subrutinene som kalles, er de samme uElasticMatrix og uElasticUpdate som for brukerdefinert lineær elastisitet, og den samme malen fistr1/src/lib/user/uelastic.f90 deles. Fordi nøkkelordangivelsen bestemmer om FrontISTR behandler implementasjonen som infinitesimal deformasjon eller Total Lagrange, kan samme mal ikke brukes samtidig for både infinitesimal og stor deformasjon. Implementer den som én av de to konstitutive lovene.

Brukerdefinert elastoplastisitet

Dette er veien der brukeren implementerer flytefunksjonen og return-mapping-prosedyren. Angi !PLASTIC, YIELD=USER i analysestyringsdataene. Dette går inn i en gren som er uavhengig av de innebygde flytefunksjonene Mises, Mohr-Coulomb og Drucker-Prager. Ved beregning av elementstivheten kalles uElastoPlasticMatrix (som returnerer den elastoplastiske tangentstivheten \(D\)), ved spenningsoppdatering kalles uBackwardEuler (som mapper prøvespenningen til sann spenning og oppdaterer tilstandsvariablene), og ved initialisering av Gauss-punktene kalles uElastoPlasticNumStatus (som returnerer antallet reelle tilstandsvariabler som skal lagres). En vei som bare erstatter herdingskurven med en brukerimplementasjon, støttes ikke. Også når bare en brukerdefinert herdingskurve er nødvendig, må hele den elastoplastiske konstitutive loven erstattes med en brukerimplementasjon via denne veien.

Generell brukerdefinert konstitutiv lov

Den generelle brukerdefinerte konstitutive loven er en vei for å implementere konstitutive lover som ikke passer inn i rammene for elastisitet, hyperelastisitet eller elastoplastisitet. Angi !USER_MATERIAL i analysestyringsdataene. Som standard behandles den innenfor Updated Lagrange-rammen; når KIRCHHOFF er angitt, behandles den som Total Lagrange. Antallet tilstandsvariabler angis med NSTATUS. Ved beregning av elementstivheten kalles uMatlMatrix (som returnerer tangentstivheten \(D\)), og ved spenningsoppdatering kalles uUpdate (som oppdaterer spenning og tilstandsvariabler).

Overføring av brukerkonstanter og tilstandsvariabler

For alle veiene !ELASTIC, TYPE=USER, !HYPERELASTIC, TYPE=USER og !USER_MATERIAL sendes brukerkonstantene som er skrevet på datalinjene i analysestyringsdataene (opptil 100), direkte til subrutinen gjennom argumentet matl. For !PLASTIC, YIELD=USER sendes både elastisitetskonstantene angitt med !ELASTIC og brukerkonstantene angitt via datalinjene til !PLASTIC.

For den generelle brukerdefinerte konstitutive loven og !PLASTIC, YIELD=USER kan historikkinformasjon fra forrige trinn (for eksempel plastisk tøyning, bakspenning og skade) sendes til brukerimplementasjonen gjennom tilstandsvariabelen fstat og skrives tilbake ved slutten av trinnet. Antallet tilstandsvariabler bestemmes av NSTATUS i !USER_MATERIAL for den generelle brukerdefinerte konstitutive loven, og av returverdien fra uElastoPlasticNumStatus for !PLASTIC, YIELD=USER.

Brukerdefinerte eksterne laster

Brukerdefinerte eksterne laster er en vei for å definere ytre krefter som ikke kan representeres med de innebygde konsentrerte lastene, fordelte lastene eller volumkreftene. Når !ULOAD, FILE=<fname> skrives i analysestyringsdataene, sender FrontISTR det angitte filnavnet til ureadload, og informasjonen som leses av brukerimplementasjonen, beholdes som moduldata.

Følgende tre subrutiner svarer til aktivering av !ULOAD.

  • ureadload: Leser ved starten av analysen brukerdefinerte laster fra den eksterne filen som er angitt i styringsfilen. Brukerimplementasjonen åpner filen og lagrer nødvendige data i modulvariabler.
  • uloading: Kalles ved sammenstilling av den eksterne lastvektoren for hvert trinn og legger brukerlasten til den globale lastvektoren. Gjeldende trinnnummer og lastfaktor sendes som argumenter.
  • uResidual: Kalles ved sammenstilling av restvektoren i hver iterasjon og legger bidraget fra brukerlasten til den globale restvektoren. Den kalles både fra ikke-lineære iterasjoner og likevektsberegninger.

Det finnes ikke noe utvidelsespunkt for brukerdefinerte randbetingelser (brukerutvidelser av foreskrevne forskyvninger eller kontaktbetingelser). Hvis det kreves en brukerutvidelse som ikke gjelder en ekstern kraft, brukes det tilsvarende innebygde nøkkelordet eller en vei for en brukerdefinert konstitutiv lov.

Fremgangsmåte for implementering av brukersubrutiner

For å bruke en brukersubrutine må malfilen som følger med FrontISTR-kildedistribusjonen redigeres, og deretter må FrontISTR bygges på nytt. Brukersubrutiner kan ikke byttes ut i distribuerte binærfiler, så bruk av en brukerutvidelse krever et miljø der FrontISTR kan bygges fra kildekode.

Malene for brukersubrutiner ligger under fistr1/src/lib/user/, og hvilken fil som skal redigeres, avhenger av utvidelseskategorien (se tabellen i Funksjonsoversikt for filnavn). I utgangspunktet inneholder filene enten tomme subrutinekropper eller et eksempel på lineær elastisitet; brukeren legger inn sin egen konstitutive lov eller lastdefinisjon her. Etter at malen er redigert, bygges FrontISTR på vanlig måte med CMake, og analysen kjøres med den resulterende kjørbare filen fistr1.

Detaljer som betydningen av subrutineargumentene, behandling av arrayer med tilstandsvariabler og forholdsregler ved ombygging er fordelt på de respektive sidene i kodingsveiledningen.

Relaterte emner