Fra matematisk modell til effektiv programvare
Utvikling av simuleringsverktøy krever både rom for eksperimentering og effektiv kjøring av store beregninger. Julia er et programmeringsspråk for blant annet vitenskapelige beregninger som gjør det mulig å arbeide interaktivt med modeller og samtidig kompilere beregningskoden til effektiv maskinkode.
Dette gjør det mulig å utvikle en metode og forbedre ytelsen innenfor samme språk, uten nødvendigvis å skrive om beregningskjernen i C++ eller Fortran. Vi bruker Julia i prosjekter der kombinasjonen av fleksibel modellutvikling, numerisk ytelse og videreutvikling av programvaren er viktig.
Hva kan vi hjelpe med?
- Utvikle modeller og simulatorer: Omsette matematiske modeller til numeriske algoritmer og programvare for vitenskapelige og industrielle problemstillinger.
- Videreutvikle eksisterende verktøy: Legge til nye fysiske modeller, diskretiseringer og løsningsmetoder i Julia-baserte rammeverk.
- Forbedre beregningsytelsen: Analysere flaskehalser og tilpasse algoritmer, datastrukturer og minnebruk, med parallelle beregninger og GPU-er der det er hensiktsmessig.
- Bygge deriverbare beregningsmodeller: Integrere automatisk derivasjon og sensitivitetsberegninger som grunnlag for modellkalibrering og optimering.
- Vurdere teknologivalg og integrasjon: Undersøke hvor Julia passer inn i en eksisterende beregningsflyt, og hvordan nye komponenter kan samvirke med annen programvare.
Fleksible modeller med gjenbrukbare komponenter
Julia gjør det mulig å formulere generelle algoritmer som tilpasses ulike datatyper og modeller. Språkets mekanisme for å velge funksjonsimplementasjon ut fra typene til flere argumenter, kalt «multiple dispatch», gir et grunnlag for å kombinere og utvide numeriske komponenter.
I simulatorutvikling kan dette brukes til å skille beskrivelsen av fysikken fra diskretisering, løsningsalgoritmer og håndtering av data. Nye modeller kan dermed gjenbruke eksisterende infrastruktur, samtidig som spesialiserte implementasjoner kan benyttes der ytelsen krever det.
Vi kombinerer disse mulighetene med ekspertise innen numeriske metoder, automatisk derivasjon og koblede fysiske modeller. Målet er programvare som både kan videreutvikles effektivt og brukes til krevende beregninger.
Ytelse krever mer enn et språkvalg
Høy ytelse avhenger av hvordan algoritmene og programvaren er utformet. Vi arbeider blant annet med typeinformasjon som kompilatoren kan utnytte, effektiv minnetilgang, sparsomme matriser og organisering av parallelle beregninger.
Vi vurderer hele beregningsforløpet, inkludert kompilering ved første kjøring, dataoverføring og samspill med eksterne biblioteker. For en interaktiv modell, en lang simulering og et stort ensemble kan ulike deler av beregningen være avgjørende for den samlede ytelsen.
Åpen Julia-programvare utviklet ved SINTEF
Flere fagmiljøer ved SINTEF utvikler og vedlikeholder åpne Julia-pakker. Eksempler er:
- JutulDarcy.jl: Simulator for flerfase- og flerkomponentstrømning og varmetransport i porøse medier, bygget på simuleringsrammeverket Jutul.
- EnergyModelsX: Rammeverk for modellering og optimering av energisystemer med flere noder og energibærere.
- BattMo.jl: Deriverbar batterisimulering basert på Jutul, blant annet med porøse elektrodemodeller av P2D-typen.
- Muscade.jl: Rammeverk for optimeringsproblemer der endelig-element-modeller inngår som føringer.
Åpen kildekode gjør det mulig å undersøke metodene, reprodusere beregninger og bygge videre på eksisterende komponenter. Pakkene gir også konkrete utgangspunkt for samarbeid om nye modeller og anvendelser.
Vil du samarbeide med oss?
Vurderer dere Julia for en beregningsoppgave, eller trenger dere å videreutvikle en modell eller simulator? Ta kontakt med vår forskningsgruppe for Anvendt beregningsvitenskap. Vi diskuterer hvordan vår numeriske ekspertise kan bidra, og trekker inn andre fagmiljøer ved SINTEF ved behov.