Man må godt starte med en for-løkke
En af de første ting, man lærer inden for de fleste programmeringssprog, er brugen af if-sætninger og for-løkker. Disse tillader, kort fortalt, respektivt at inkorporere konditionelle udsagn og at gennemløbe indekser i koden, og når man har forstået brugen af disse, kan man hurtigt komme i gang med at skrive de første kodestumper.
Da jeg på mit første studieår lærte at programmere i Matlab, kunne jeg således som en af de første små programmer skrive et "sten-saks-papir"-spil - som udover nogle (pseudo-)tilfældigt genererede tal, bestod af en masse if-sætninger; hvis spiller et har fået sten, og spiller to har fået saks, vinder spiller et, hvis spiller et har fået papir, og spiller to har fået sten, vinder spiller et, osv.
Ligeledes lærte vi, at man nemt tilgår store matricer og deres elementer med for-løkker, hvilket på tilsvarende vis blev brugt til at simulere konkrete systemer, f.eks. vandforurening hvor felterne i matricerne repræsenterede forureningskoncentrationen i en to-dimensionel sø.
Vi lærte dog også snart, at for-løkker ikke er specielt effektive og nemt - i mere praktisk anvendelig kode - kommer til at udgøre en flaskehals for beregningstiden. Dette var i første omgang en Pandoras æske at få åbnet for sine øjne - "skal vi så glemme alt om denne let forståelige og anvendelige teknik, med hvilken vi så nemt regner på matricer?" - men på lidt længere sigt en adgang til at værdsætte, hvor kraftfuld lineær algebra er.
Særligt i Matlab - som er kort for, ja, matrix laboratory - er der meget at vinde ved at mestre lineær algebra og ved at vektorisere koden. Selvom det meste af min egen kode er trimmet for for-løkker, var der alligevel lidt at hente, da jeg optimerede større dele af min kode tidligere i år.
Konkret forbedrede jeg implementeringen af en Gram-Schmidt ortonormaliseringsalgoritme, som profiling viste var meget tidskrævende. Ændringen - som vektoriserede én af de involverede for-løkker - var efter en smule tænkearbejde oplagt og gav en kæmpe hastighedsforøgelse.
At jeg ikke i første omgang implementerede den vektoriserede udgave, har i princippet kostet mig en masse tid. Men ofte er det vigtigste at komme igang med kode, som virker, og som man sidenhen kan forbedre og optimere - og til dette formål er for-løkker et uvurderligt værktøj! Som beskrevet ovenfor er de nemme at forstå og implementere, og man kan ved at bruge dem lynhurtigt komme i gang med sine beregninger.
Dermed ikke sagt at man skal glemme alt om matricer og matrixoperationer i den indledende kodefase. Men det er bedre at komme i gang med kodningen og at opnå (måske lidt langsomt) nogle første resultater end at løbe hovedet imod den super effektive kodes mur fra første færd.
First 3D optical simulations: Guided modes of dielectric waveguide, calculated with my own Fourier Modal Method code. pic.twitter.com/7CB1APItai
— Jakob R. de Lasson (@Jakobrdl) 13. maj 2014
Med denne filosofi er jeg de sidste par dage kommet i gang med de tre-dimensionelle optiske simuleringer, jeg i mit ph.d. projekt arbejder med. Billedet i tweetet ovenfor viser feltprofiler af optiske modes i en firkantet bølgeleder (med længdeaksen langs z-aksen, ind i billedets plan).
Resultaterne er særdeles præliminære, og koden er absolut ikke optimeret - men at se og visualisere de første resultater er ganske motiverende og stimulerende for det videre arbejde, og de unødvendige for-løkker skal tidsnok blive luet ud.
For man må godt starte med en for-løkke.
