aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README14
-rw-r--r--doc/MoLdia1.eps451
-rw-r--r--doc/MoLdia2.eps397
-rw-r--r--doc/MoLdia3.eps409
-rw-r--r--doc/documentation.tex898
-rw-r--r--interface.ccl71
-rw-r--r--par/CarpetTest.th159
-rw-r--r--par/PUGHTest.th176
-rw-r--r--param.ccl53
-rw-r--r--schedule.ccl257
-rw-r--r--src/ChangeType.c572
-rw-r--r--src/Counter.c110
-rw-r--r--src/ExternalVariables.h26
-rw-r--r--src/GenericRK.c204
-rw-r--r--src/ICN.c120
-rw-r--r--src/IndexArrays.c211
-rw-r--r--src/InitialCopy.c312
-rw-r--r--src/MoL.h51
-rw-r--r--src/MoLFunctions.h27
-rw-r--r--src/ParamCheck.c84
-rw-r--r--src/RK2.c140
-rw-r--r--src/RKCoefficients.c159
-rw-r--r--src/Registration.c599
-rw-r--r--src/SandR.c109
-rw-r--r--src/SetTime.c231
-rw-r--r--src/Startup.c89
-rw-r--r--src/make.code.defn21
27 files changed, 5950 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..ad3169f
--- /dev/null
+++ b/README
@@ -0,0 +1,14 @@
+Cactus Code Thorn MoL2
+Authors : Ian Hawke
+CVS info : $Header$
+--------------------------------------------------------------------------
+
+Purpose of the thorn:
+
+This thorn provides generic time integrators.
+This allows clean coupling when multiple thorns wish to integrate at the
+same time.
+It also means a physics thorn doesn't have to rewrite its own time
+integrator.
+This version is designed to work with Mesh Refinement codes as well as
+unigrid.
diff --git a/doc/MoLdia1.eps b/doc/MoLdia1.eps
new file mode 100644
index 0000000..9523d6e
--- /dev/null
+++ b/doc/MoLdia1.eps
@@ -0,0 +1,451 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: MoLdia1
+%%Creator: Dia v0.84
+%%CreationDate: Fri Feb 1 17:42:34 2002
+%%For: admin
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 357 332
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-2.950000 -16.256637 translate
+%%EndProlog
+
+
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 5.000000 m 15.000000 5.000000 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 15.000000 m 15.000000 15.000000 l s
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 5.000000 14.000000 m 5.000000 6.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 5.400000 6.800000 m 5.000000 6.000000 l 4.600000 6.800000 l f
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(1\)) dup sw 2 div 4.000000 ex sub 10.000000 m gs 1 -1 sc sh gr
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 8.000000 10.000000 m 13.000000 10.000000 l s
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 8.000000 8.000000 m 13.000000 8.000000 l s
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 8.500000 5.450000 m 8.500000 7.600000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 8.300000 7.200000 m 8.500000 7.600000 l 8.700000 7.200000 l f
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 11.385510 7.606116 3.090625 3.090625 314.454329 49.322047 ellipse s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 13.869194 5.503031 m 13.550000 5.400000 l 13.659092 5.717173 l f
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 12.317472 6.527110 1.151250 1.151250 306.360077 111.261511 ellipse s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 13.330521 5.657061 m 13.000000 5.600000 l 13.152663 5.898653 l f
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.203094 8.124876 11.535625 11.535625 346.081090 34.146814 ellipse s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 14.617760 5.605109 m 14.400000 5.350000 l 14.326569 5.677273 l f
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(3\)) dup sw 2 div 7.500000 ex sub 6.650000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(2\)) dup sw 2 div 12.150000 ex sub 6.750000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(a\)) dup sw 2 div 9.000000 ex sub 16.000000 m gs 1 -1 sc sh gr
+showpage
diff --git a/doc/MoLdia2.eps b/doc/MoLdia2.eps
new file mode 100644
index 0000000..b446c5b
--- /dev/null
+++ b/doc/MoLdia2.eps
@@ -0,0 +1,397 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/admin/Cactus/Cactus/arrangements/CactusMoL/MoL/doc/MoLdia2
+%%Creator: Dia v0.84
+%%CreationDate: Fri Feb 1 17:37:34 2002
+%%For: admin
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 343 321
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-2.950000 -16.256637 translate
+%%EndProlog
+
+
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 5.000000 m 15.000000 5.000000 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 15.000000 m 15.000000 15.000000 l s
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 5.000000 14.000000 m 5.000000 6.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 5.400000 6.800000 m 5.000000 6.000000 l 4.600000 6.800000 l f
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(1\)) dup sw 2 div 4.000000 ex sub 10.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(b\)) dup sw 2 div 9.000000 ex sub 16.000000 m gs 1 -1 sc sh gr
+showpage
diff --git a/doc/MoLdia3.eps b/doc/MoLdia3.eps
new file mode 100644
index 0000000..49e58fb
--- /dev/null
+++ b/doc/MoLdia3.eps
@@ -0,0 +1,409 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: /home/admin/Cactus/Cactus/arrangements/CactusMoL/MoL/doc/MoLdia3
+%%Creator: Dia v0.84
+%%CreationDate: Fri Feb 1 17:39:33 2002
+%%For: admin
+%%Magnification: 1.0000
+%%Orientation: Portrait
+%%BoundingBox: 0 0 343 321
+%%Pages: 1
+%%BeginSetup
+%%EndSetup
+%%EndComments
+[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E
+/F /G /H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W /X /Y
+/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c
+/d /e /f /g /h /i /j /k /l /m
+/n /o /p /q /r /s /t /u /v /w
+/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright
+/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf
+/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde
+/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring
+/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave
+/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def
+/Times-Roman-latin1
+ /Times-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Italic-latin1
+ /Times-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-Bold-latin1
+ /Times-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Times-BoldItalic-latin1
+ /Times-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Book-latin1
+ /AvantGarde-Book findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-BookOblique-latin1
+ /AvantGarde-BookOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-Demi-latin1
+ /AvantGarde-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/AvantGarde-DemiOblique-latin1
+ /AvantGarde-DemiOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Light-latin1
+ /Bookman-Light findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-LightItalic-latin1
+ /Bookman-LightItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-Demi-latin1
+ /Bookman-Demi findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Bookman-DemiItalic-latin1
+ /Bookman-DemiItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-latin1
+ /Courier findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Oblique-latin1
+ /Courier-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-Bold-latin1
+ /Courier-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Courier-BoldOblique-latin1
+ /Courier-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-latin1
+ /Helvetica findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Oblique-latin1
+ /Helvetica-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Bold-latin1
+ /Helvetica-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-BoldOblique-latin1
+ /Helvetica-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-latin1
+ /Helvetica-Narrow findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Oblique-latin1
+ /Helvetica-Narrow-Oblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-Bold-latin1
+ /Helvetica-Narrow-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Helvetica-Narrow-BoldOblique-latin1
+ /Helvetica-Narrow-BoldOblique findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Roman-latin1
+ /NewCenturySchoolbook-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Italic-latin1
+ /NewCenturySchoolbook-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-Bold-latin1
+ /NewCenturySchoolbook-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/NewCenturySchoolbook-BoldItalic-latin1
+ /NewCenturySchoolbook-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Roman-latin1
+ /Palatino-Roman findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Italic-latin1
+ /Palatino-Italic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-Bold-latin1
+ /Palatino-Bold findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Palatino-BoldItalic-latin1
+ /Palatino-BoldItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/Symbol-latin1
+ /Symbol findfont
+definefont pop
+/ZapfChancery-MediumItalic-latin1
+ /ZapfChancery-MediumItalic findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/ZapfDingbats-latin1
+ /ZapfDingbats findfont
+ dup length dict begin
+ {1 index /FID ne {def} {pop pop} ifelse} forall
+ /Encoding isolatin1encoding def
+ currentdict end
+definefont pop
+/cp {closepath} bind def
+/c {curveto} bind def
+/f {fill} bind def
+/a {arc} bind def
+/ef {eofill} bind def
+/ex {exch} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth pop} bind def
+/tr {translate} bind def
+
+/ellipsedict 8 dict def
+ellipsedict /mtrx matrix put
+/ellipse
+{ ellipsedict begin
+ /endangle exch def
+ /startangle exch def
+ /yrad exch def
+ /xrad exch def
+ /y exch def
+ /x exch def /savematrix mtrx currentmatrix def
+ x y tr xrad yrad sc
+ 0 0 1 startangle endangle arc
+ savematrix setmatrix
+ end
+} def
+
+/colortogray {
+/rgbdata exch store
+rgbdata length 3 idiv
+/npixls exch store
+/rgbindx 0 store
+0 1 npixls 1 sub {
+grays exch
+rgbdata rgbindx get 20 mul
+rgbdata rgbindx 1 add get 32 mul
+rgbdata rgbindx 2 add get 12 mul
+add add 64 idiv
+put
+/rgbindx rgbindx 3 add store
+} for
+grays 0 npixls getinterval
+} bind def
+/mergeprocs {
+dup length
+3 -1 roll
+dup
+length
+dup
+5 1 roll
+3 -1 roll
+add
+array cvx
+dup
+3 -1 roll
+0 exch
+putinterval
+dup
+4 2 roll
+putinterval
+} bind def
+/colorimage {
+pop pop
+{colortogray} mergeprocs
+image
+} bind def
+
+28.346000 -28.346000 scale
+-2.950000 -16.256637 translate
+%%EndProlog
+
+
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 5.000000 m 15.000000 5.000000 l s
+0.100000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 3.000000 15.000000 m 15.000000 15.000000 l s
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 5.000000 14.000000 m 5.000000 6.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 5.400000 6.800000 m 5.000000 6.000000 l 4.600000 6.800000 l f
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(1\)) dup sw 2 div 4.000000 ex sub 10.000000 m gs 1 -1 sc sh gr
+0.000000 slw
+[] 0 sd
+[] 0 sd
+0 slc
+0.000000 0.000000 0.000000 srgb
+n 13.000000 6.000000 m 13.000000 14.000000 l s
+0 slj
+0.000000 0.000000 0.000000 srgb
+n 12.600000 13.200000 m 13.000000 14.000000 l 13.400000 13.200000 l f
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(2\)) dup sw 2 div 12.000000 ex sub 10.000000 m gs 1 -1 sc sh gr
+/Courier-latin1 ff 1.000000 scf sf
+0.000000 0.000000 0.000000 srgb
+(\(c\)) dup sw 2 div 9.000000 ex sub 16.000000 m gs 1 -1 sc sh gr
+showpage
diff --git a/doc/documentation.tex b/doc/documentation.tex
new file mode 100644
index 0000000..5785dcf
--- /dev/null
+++ b/doc/documentation.tex
@@ -0,0 +1,898 @@
+\documentclass{article}
+\usepackage{graphicx}
+
+\begin{document}
+
+\title{Method of Lines}
+\author{Ian Hawke}
+\date{$ $Id$ $}
+\maketitle
+
+\abstract{The Method of Lines is a way of separating the time
+ integration from the rest of an evolution scheme. This thorn is
+ intended to take care of all the bookwork and provide some basic
+ time integration methods, allowing for easy coupling of different
+ thorns.}
+
+\section{Purpose}
+\label{sec:purpose}
+
+The Method of Lines (MoL) converts a (system of) partial differential
+equation(s) into an ordinary differential equation containing some
+spatial differential operator. As an example, consider writing the
+hyperbolic system of PDE's
+\begin{equation}
+ \label{eq:mol1}
+ \partial_t {\bf q} + {\bf A}^i({\bf q}) \partial_i {\bf B}({\bf q})
+ = {\bf s}({\bf q})
+\end{equation}
+in the alternative form
+\begin{equation}
+ \label{eq:mol2}
+ \partial_t {\bf q} = {\bf L}({\bf q}),
+\end{equation}
+which (assuming a given discretization of space) is an ODE.
+
+Given this separation of the time and space discretizations, well
+known stable ODE integrators such as Runge-Kutta can be used to do the
+time integration. This is more modular (allowing for simple extensions
+to higher order methods), more stable (as instabilities can now only
+arise from the spatial discretization or the equations themselves) and
+also avoids the problems of retaining high orders of convergence when
+coupling different matter models.
+
+MoL can be used for hyperbolic, parabolic and even elliptic problems
+(although I definitely don't recommend the latter). As it currently
+stands it is set up for systems of equations in the first order type
+form of equation~(\ref{eq:mol2}). If you want to implement a
+multilevel scheme such as leapfrog it is not obvious to me that MoL is
+the thing to use. However if you have lots of thorns that you want to
+interact, for example ADM\_BSSN and a hydro code plus maybe EM or a
+scalar field, and they can easily be written in this sort of form,
+then you probably want to use MoL.
+
+This thorn is meant to provide a simple interface that will implement
+the MoL inside Cactus as transparently as possible. It will initially
+implement only the optimal Runge-Kutta time integrators (which are TVD
+up to RK3, so suitable for hydro) up to fourth order and iterated
+Crank Nicholson. All of the interaction with the MoL thorn should
+occur directly through the scheduler. For example, all synchronization
+steps should now be possible at the scheduler level.
+
+For more information on the Method of Lines the most comprehensive
+references are the works of Jonathan Thornburg~\cite{jt1,jt2} - see
+especially section 7.3 of the thesis. From the CFD viewpoint the
+review of ENO methods by Shu,~\cite{shu} has some information. For
+relativistic fluids the paper of Neilsen and Choptuik~\cite{nc} is
+also quite good. For Ian Hawke's viewpoint either see below or contact
+by email.
+
+\section{How to use}
+\label{sec:use}
+
+
+\subsection{Thorn users}
+\label{sec:useruse}
+
+For those who used the old version of MoL, this version is
+unfortunately slightly more effort to use. That is, for most methods
+you'll now have to set 4 parameters instead of just one. This
+documentation is still in the process of conversion...
+
+If you already have a thorn that uses the method of lines, then there
+are four main parameters that are relevant to change the integration
+method. The keyword {\tt MoL\_ODE\_Method} chooses between the
+different methods. Currently supported are {\tt RK2}, {\tt ICN} and
+{\tt Generic}. These are second order Runge-Kutta, Iterative Crank
+Nicholson, and the generic Shu-Osher type Runge-Kutta methods. To
+switch between the different types of generic methods there is also
+the keyword {\tt Generic\_Type} which is currently restricted to {\tt
+ RK} for the standard TVD Runge-Kutta methods (first to fourth order)
+and {\tt ICN} for the implementation of the Iterative Crank Nicholson
+method in generic form.
+
+The parameter {\tt MoL\_Intermediate\_Steps} controls the number of
+intermediate steps for the ODE solver. For the generic Runge-Kutta
+solvers it controls the order of accuracy of the method. For the {\tt
+ ICN} methods this parameter controls the number of iterations taken,
+which {\bf does not check for stability}. This parameter defaults to
+3.
+
+The parameter {\tt MoL\_Num\_Scratch\_Levels} controls the amount of
+scratch space used. If this is insufficient for the method selected
+there will be an error at parameter checking time. This parameter
+defaults to 0, as no scratch space is required for the efficient ICN
+and Runge-Kutta 2 solvers. For the generic solvers this must be at
+least {\tt MoL\_Intermediate\_Steps - 1}.
+
+A final parameter is {\tt MoL\_Memory\_Always\_On} which switches on
+memory for the scratch space always if true and only during evolution
+if false. This defaults to true for speed reasons; the memory gains
+are likely to be limited unless you're doing something very memory
+intensive at initialization or analysis.
+
+\subsection{Thorn writers}
+\label{sec:writeruse}
+
+To port an existing thorn using the method of lines, or to write a new
+thorn using it, should hopefully be relatively simple. As an example,
+within the MoL arrangement is WaveMoL which duplicates the WaveToy
+thorn given by CactusWave in a form suitable for use by MoL. In this
+section, ``the thorn'' will mean the user thorn doing the physics.
+
+We start with some terminology. Grid functions are split into four
+cateogories.
+\begin{enumerate}
+\item The first are those that are evolved using a MoL form. That is,
+ a right hand side is calculated and the variable updated using
+ it. These we call {\it evolved} variables.
+\item The second category are those variables that are set by a thorn
+ at every intermediate step of the evolution, usually to respect the
+ constraints. Examples of these include the primitive variables in a
+ hydrodynamics code. Another example would be the gauge variables if
+ these were set by constraints at every intermediate step (which is
+ slightly artificial; the usual example would be the use of maximal
+ slicing, which is only applied once every $N$ complete steps). These
+ are known as {\it primitive} variables in analogy with the hydro
+ code.
+\item The third category are those variables that a thorn depends on
+ but does not set or evolve. An example would include the metric
+ terms considered from a thorn evolving matter. These are known as
+ {\it dependent} variables.
+\item The final category are those variables that do not interact with
+ MoL. These would include temporary variables for analysis or setting
+ up the initial data. These can safely be ignored.
+\end{enumerate}
+
+MoL needs to know every GF that falls in one of the first three
+groups. If a GF is evolved by one thorn but is a dependent variable in
+another (for example, the metric in full GR Hydro) then each thorn
+should register the function as they see it. For example, the hydro
+thorn will register the metric as a dependent variable and the
+spacetime thorn will register the metric as an evolved variable. The
+different variable categories are given the priority evolved,
+primitive, dependent. So if a variable is registered as belonging in
+two different categories, it is always considered by MoL to belong to
+the category with the highest priority.
+
+Every thorn should register every grid function that it uses even if
+you expect it to be registered again by a different thorn. For
+example, a hydro thorn would register the metric variables as
+dependent, whilst the spacetime evolution thorn would register them as
+evolved (in ADM) or primitive (in ADM\_BSSN), both of which have
+precedence. To register your GFs with MoL schedule a routine in the
+bin {\tt MoL\_Register} which just contains the relevant function
+calls. For an evolved variable the GF corresponding to the update
+term (${\bf L}({\bf q})$ in equation~(\ref{eq:mol2})) should be
+registered at the same time, using the call {\tt MoL\_RegisterVar($q,
+ L(q)$)}. For the primitive and dependent variables the function
+calls are {\tt MoL\_RegisterPrimitive($q$)} and {\tt
+ MoL\_RegisterDepends($q$)} respectively. Here $q$ is the {\it
+ variable index} of the GF you wish to register, and $L(q)$ the
+variable index of the associated right hand side GF. These are found
+using the {\tt CCTK\_VarIndex*} functions.
+
+There are both C and Fortran versions of these functions; see the
+reference in section~\ref{sec:molfns}. For the C calls the prototypes
+are given in the file {\tt MoL.h} which can be included without hard
+paths by adding the line
+
+{\tt USES INCLUDE: MoL.h}
+
+\noindent to the {\tt interface.ccl} file of your thorn.
+
+{\bf UPDATE} This has now been switched to using function
+aliasing. The include file still exists, but is commented out in the
+{\tt interface.ccl}. For an example of how to use the aliased
+functions, see thorn WaveMoL.
+
+Having done that, one routine (or group of routines) which we'll here
+call {\tt Thorn\_CalcRHS} must be defined. This does all the finite
+differencing that you'd usually do, applied to ${\bf q}$, and finds
+the right hand sides which are stored in ${\bf L}$. This routine
+should be scheduled in {\tt MoL\_CalcRHS}. The precise order that
+these are scheduled should not matter, because no updating of any of
+the user thorns ${\bf q}$ will be done until after all the RHSs are
+calculated. {\bf Important note:} all the finite differencing must be
+applied to the most recent time level ${\bf q}$ and not to the
+previous time level ${\bf q}_p$ as you would normally do. Don't worry
+about setting up the data before the calculation, as MoL will do that
+automatically.
+
+Finally, if you have some things that have to be done after each
+update to an intermediate level, these should be scheduled in {\tt
+ MoL\_PostStep}. Examples of things that need to go here include the
+recalculation of primitive variables for hydro codes, the application
+of boundary conditions\footnote{It is possible to alter the
+ calculation of {\bf L} so that boundary conditions are automatically
+ updated and do not need setting. This is slightly tricksy. For an
+ example of how this would work see the new radiative boundary
+ condition in ADM\_BSSN. For more on this see section 7.3.4
+ of~\cite{jt1}.}, the solution of elliptic equations (although this
+would be a very expensive place to solve them, some sets of equations
+might require the updating of some variables by constraints in this
+fashion). When applying boundary conditions the cleanest thing to do
+is to write a routine applying the symmetries to the appropriate GFs
+and, when calling it from the scheduler, adding the {\tt SYNC}
+statement to the appropriate groups. An example is given by the
+routine {\tt WaveToyMoL\_Boundaries} in thorn WaveMoL.
+
+Points to note. The thorn routine {\tt Thorn\_CalcRHS} does not need
+to know and in fact should definitely not know where precisely in the
+MoL step it is. It just needs to know that it is receiving {\it some}
+intermediate data stored in the GFs ${\bf q}$ and that it should
+return the RHS ${\bf L}({\bf q})$. All the book-keeping to ensure that
+it is passed the correct intermediate state at that the GFs contain
+the correct data at the end of the MoL step will be dealt with by the
+MoL thorn and the flesh. Also the synchronization of grids across
+separate processors will be dealt with by the MoL thorn and the flesh.
+
+Final point. Currently this MoL thorn is not guaranteed to work with
+mesh refinement codes. Aside from a number of little details that need
+to be worked out, currently MoL does not ensure that {\tt
+ cctk\_delta\_time} is correctly set in the intermediate stages of
+the calculation. This will hopefully change, but for the immediate
+future don't expect this to work with any mesh refinement code.
+
+Update. It is now possible to change the category of a GF in the
+middle of a run. This was added solely to allow for mixed slicing for
+Einstein. In this case the lapse is an evolved function if using
+$1+\log$ slicing, a primitive variable if using maximal or static
+slicing, and a dependent variable if evolved in some unknown
+manner. Currently there exist functions for changing to any of the
+four categories listed above.
+
+{\bf I strongly suggest that these functions are not used}. They are
+almost completely untested, and even those that are tested are far
+from stable. Also, when moving to the version of this thorn that
+supports Mesh Refinement it is quite possible that these functions may
+be dropped.
+
+
+\section{Example}
+\label{sec:example}
+
+As a fairly extended example of how to use MoL I'll outline how
+ADM\_BSSN works in this context. The actual implementation of this is
+given in the thorn {\tt AEIDevelopment/BSSN\_MoL}.
+
+As normal the required variables are defined in the {\tt
+ interface.ccl} file, together with the associated source terms. For
+example, the conformal factor and source are defined by
+
+\begin{verbatim}
+real ADM_BSSN_phi type=GF timelevels=2
+{
+ ADM_BS_phi
+} "ADM_BSSN_phi"
+
+real ADM_BSSN_sources type=GF
+{
+...,
+ adm_bs_sphi,
+...
+}
+\end{verbatim}
+Also in this file we write {\tt USES INCLUDE: MoL.h}.
+
+Once the sources are defined the registration with MoL is required,
+for which the essential file is {\tt MoLRegister.c}. As we're
+registering from C we ensure that we {\tt \#include "MoL.h"}. In the
+ADM\_BSSN system the standard metric coefficients $g_{ij}$ are not
+evolved, and neither are the standard extrinsic curvature components
+$K_{ij}$. However these are used by ADM\_BSSN in a number of places,
+and are calculated from evolved quantities at the appropriate points.
+In the MoL terminology these variables are {\it primitive}. As the
+appropriate storage is defined in thorn Einstein, the actual calls
+have the form
+
+\begin{verbatim}
+ ierr += MoL_RegisterPrimitive(CCTK_VarIndex("einstein::kxx"));
+\end{verbatim}
+
+\noindent The actual evolved variables include things such as the
+conformal factor. This, and the appropriate source term, is defined in
+thorn ADM\_BSSN, and so the call has the form
+
+\begin{verbatim}
+ ierr += MoL_RegisterVar(CCTK_VarIndex("adm_bssn::ADM_BS_phi"),
+ CCTK_VarIndex("adm_bssn::adm_bs_sphi"));
+\end{verbatim}
+
+
+As well as the evolved variables, and those constrained variables such
+as the metric, there are the gauge variables. Precisely what status
+these have depends on how they are set. If harmonic or 1+log slicing
+is used then the lapse is evolved:
+
+\begin{verbatim}
+ ierr += MoL_RegisterVar(CCTK_VarIndex("einstein::alp"),
+ CCTK_VarIndex("adm_bssn::adm_bs_salp"));
+\end{verbatim}
+
+\noindent If maximal or static slicing is used then the lapse is a
+primitive variable\footnote{Note that this is actually a bit of a
+ hack. The rational for {\it dependent} variables was to deal with
+ maximal slicing. However it turned out that I hadn't thought it
+ through correctly and that the treatment for primitive variables was
+ required.}:
+
+\begin{verbatim}
+ ierr += MoL_RegisterPrimitive(CCTK_VarIndex("einstein::alp"));
+\end{verbatim}
+
+\noindent Finally, if none of the above apply we assume that the lapse
+is evolved in some unknown fashion, and so it must be registered as a
+dependent variable:
+
+\begin{verbatim}
+ ierr += MoL_RegisterDepends(CCTK_VarIndex("einstein::alp"));
+\end{verbatim}
+
+However, it is perfectly possible that we may wish to change how we
+deal with the gauge during the evolution. This is dealt with in the
+file {\tt PreLoop.F}. If the slicing changes then the appropriate
+routine is called. For example, if we want to use 1+log evolution then
+we call
+
+\begin{verbatim}
+ call CCTK_VarIndex(lapseindex,"einstein::alp")
+ call CCTK_VarIndex(lapserhsindex,"adm_bssn::adm_bs_salp")
+ call MoL_ChangeVarToEvolved(ierr, lapseindex, lapserhsindex)
+\end{verbatim}
+
+\noindent It is not required to tell MoL what the lapse is changing
+{\it from}, or indeed if it is changing at all; MoL will work this out
+for itself.
+
+Finally there are the routines that we wish to apply after every
+intermediate step. These are {\tt ADM\_BSSN\_removetrA} which enforces
+various constraints (such as the tracefree conformal extrinsic
+curvature remaining trace free), {\tt ADM\_BSSN\_Boundaries} which
+applies symmetry boundary conditions as well as various others (such
+as some of the radiative boundary conditions). Note all the calls to
+{\tt SYNC} at this point. We also convert from the updated BSSN
+variables back to the standard ADM variables in {\tt
+ ADM\_BSSN\_StandardVariables}, and also update the time derivative
+of the lapse in {\tt ADM\_BSSN\_LapseChange}.
+
+\section{The gory details}
+\label{sec:gory}
+
+This section is more for people wishing to maintain and extend the
+code. {\bf NEEDS TOTAL REWRITE FOR MOL2}
+
+There are three essential parts to the MoL thorn. The first is the
+registration process where the MoL thorn is told just how many GFs it
+should be looking to integrate, and where they and their RHSs
+are. This is split into three separate routines.
+\begin{itemize}
+\item {\tt MoL\_Init\_Register} Called by the MoL thorn at {\tt
+ postinitial}. Initializes the number of variables to the maximum
+ possible number (given by {\tt CCTK\_NumVars()}). Sets up two arrays
+ of pointers to GFs (CCTK\_Real**), one for the data ({\tt qindex})
+ and one for the RHSs ({\tt qrhsindex}). It also sets up index arrays
+ for the primitive and dependent variables.
+\item {\tt MoL\_Register} This group lets MoL knows where all the data
+ is and should contain all the user thorn calls to {\tt
+ MoL\_RegisterVar()}. This just associates the index of the
+ GFs to be evolved with their RHSs, and increments the number of
+ variables to be evolved. Also contains the routines to register the
+ primitive and dependent variables.
+\item {\tt MoL\_End\_Register} This could be used to reallocate the
+ index arrays to the correct size. For the moment I've decided that
+ the tiny memory gain is outweighed by the possiblity of problems
+ using realloc.
+\end{itemize}
+
+The second part of the MoL thorn sets up all the scratch space and the
+parameters for the generalized RK routines. This is also scheduled at
+postinitial. This contains the routines
+
+\begin{itemize}
+\item {\tt MoL\_SetupScratch} Sets up the scratch space. Sets the
+ scalar {\tt mol\_num\_scratch} which is the size of the required
+ scratch space from the defaults, then allocates the scratch arrays.
+\item {\tt MoL\_RKSetup} Sets up the $\alpha$ and $\beta$ arrays for
+ the generalized Runge Kutta step. Note that as we're currently only
+ storing the most recent RHS arrays the $\beta$ arrays are single
+ index only.
+\end{itemize}
+
+The final part of the MoL thorn is the evolution step. This is again
+split into a number of separate routines and groups. Firstly we
+describe a single evolution step, and what MoL expects.
+
+By a single evolution step we here mean the execution of everything
+inside the schedule bin {\tt EVOL}. MoL expects that every GF that it
+knows about is allocated, initialized and lives at the same instant of
+computational time. MoL also expects the ghost zones and boundaries to
+be set correctly. Wherever possible the first two are checked. MoL
+expects that the driver has rotated the timelevels so that the last
+set of complete, consistent data is stored in ${\bf q}\_p$. MoL also
+knows that the dependent variables may or may not have been evolved by
+the time the MoL evolution group is executed.
+
+\begin{figure}[ht]
+\begin{center}
+\includegraphics[width=3cm]{MoLdia1}
+\includegraphics[width=3cm]{MoLdia2}
+\includegraphics[width=3cm]{MoLdia3}
+\end{center}
+\caption{How MoL treats the three different types of variables. The
+ MoL step is performed at evolution after the driver has rotated the
+ timelevels, which occurs right at the start of every {\tt
+ CCTK\_EVOL} step. The physics thorns expect the most recent data
+ to be at the current time level (the top solid line). So the first
+ step for most types of variable is to copy or pointer switch the
+ data from the previous time level (bottom solid line) where the most
+ recent data exists after rotation. Figure (a) shows the {\it
+ evolved} variables. At each intermediate step the data is updated
+ into the current time level and, if necessary, stored in scratch
+ space. Figure (b) shows the {\it primitive} variables. As these are
+ set by the physics thorns into the current time level all that is
+ required is the initial copy. Figure (c) shows the {\it dependent}
+ variables for which we cannot know whether these variables are
+ evolved before or after MoL at evolution, and hence whether the
+ current data is already filled before MoL starts, we must store the
+ current data in scratch space first, then do the copy from the
+ previous level, and then at the end of the MoL step return the data
+ to the initial state.}
+\label{MoLvariables}
+\end{figure}
+
+MoL plays around with the timelevels during the intermediate
+steps. This is required so that the latest level in the MoL evolution
+is always stored in the same place so that the user thorns can easily
+access them. This place is the current time level ${\bf q}$. This
+ensures that MoL works correctly with all the standard boundary
+condition routines and minimizes the effort of porting non timelevel
+aware thorns (I hope!).
+
+An outline of the schedule is as follows:
+\begin{equation}
+ \label{eq:schedoutline}
+ \begin{array}[l]{l}
+ \texttt{MoL\_StartStep} \\
+ \texttt{MoL\_Step WHILE counter \{} \\
+ \begin{array}[l]{l}
+ \texttt{MoL\_CalcRHS \{ \}} \\
+ \texttt{MoL\_Add} \\
+ \texttt{MoL\_PostStep \{ \}} \\
+ \end{array} \\
+ \texttt{\}} \\
+ \texttt{MoL\_EndStep \{ \}}
+ \end{array}
+\end{equation}
+
+Each different type of variable is treated slightly differently by
+MoL. Each is assumed to have at least 2 timelevels (although this is
+checked, a fatal error occurs otherwise). Before entering the loop
+over the intermediate steps MoL will first copy (pointer switch?) the
+data into the current time levels. Before doing this the current
+timelevel of any {\it dependent} variables is copied to scratch space,
+as it may have already been updated. During the loop over the
+intermediate steps only the {\it evolved} variables are directly
+altered by MoL. When all user thorns have given their right hand side
+GFs the evolved variables are updated into the current time level.
+This data may also be copied to scratch space if required for later.
+The primitive variables are assumed to be set by the user thorn,
+either in the calculation of the RHS or during {\tt MoL\_PostStep} at
+the end of each intermediate step. The dependent variables are assumed
+to remain completely unchanged. After all the intermediate steps the
+data in the current and previous timelevels is ``correct'' and
+consistent for the evolved and the temporary variables. The data for
+the current timelevel for the dependent variables is recovered from
+scratch space. Precisely how the different variables are
+treated is shown in figure~\ref{MoLvariables}.
+
+\begin{itemize}
+\item {\tt MoL\_StartStep} This ensures that the integer keeping
+ track of where we are in the MoL step is set to the correct
+ value. It also copies the previous data ${\bf q}_p$ into the
+ current position ${\bf q}$ ready for the first step.
+\item {\tt MoL\_Step} This is the main part of the thorn. The scheduler
+ allows us to loop over this group the correct number of times to
+ complete a single Cactus evolution step. Contained within this group
+ are:
+ \begin{itemize}
+ \item {\tt MoL\_CalcRHS} The schedule group within which the user
+ thorns will schedule their routines. These routines should
+ calculate the GFs ${\bf L}({\bf q})$. The order these routines are
+ scheduled within this group should not matter.
+ \item {\tt MoL\_Add} This step performs the time integration
+ depending on where in the MoL step we are. Updates directly into
+ the current GF and copies to the scratch space if required.
+ \item {\tt MoL\_PostStep} Another schedule group within which the
+ user thorns can schedule such things as primitive variable
+ recovery, boundary conditions, etc.
+ \item {\tt MoL\_End} Just alters the scalar tracking the position in
+ the MoL loop.
+ \end{itemize}
+\end{itemize}
+
+Finally, there are the routines {\tt MoL\_FreeScratch} and {\tt
+ MoL\_RKFree} which free up the memory that was explicitly taken. For
+the moment these routines are scheduled at postevol.
+
+
+\section{Adding new numerical integrators}
+\label{sec:newmeth}
+
+There are two obvious ways of adding new ODE integrators into MoL. The
+first is to follow the route used in the efficient RK2 and ICN
+methods. That is, you let the underlying infrastructure define the
+scratch space but you do all the addition yourself. It's probably best
+if you model your integrator on one of the efficient routines to start
+with.
+
+The alternative is to use the generic integrator. To use this you just
+need to add the correct set of $\alpha$ and $\beta$ coefficients so
+that the generic routine can perform the additions. You'll also have
+to set up the keyword parameters and so on.
+
+\section{To do list}
+\label{sec:todo}
+
+\begin{itemize}
+\item The documentation must be improved, especially inside the code
+ itself.
+\item Errors are currently not handled well (if at all). This must be
+ fixed.
+\item A test suite is required. I'm not sure how to do this without
+ using WaveMoL, but we could try.
+\item In order to make the code work with a Mesh Refinement driver,
+ the scratch spaces must be changed to be grid functions. This is
+ currently impossible, but Tom Goodale will add the appropriate bits
+ to the flesh to make it possible to do. At that point the entire
+ code will probably be rewritten.
+\end{itemize}
+
+\section{Functions provided by MoL}
+\label{sec:molfns}
+
+{\bf Note for Cactus people: I'd really like there to be a generic
+ style file so that I could use the same function environments as in
+ the User's Guide. It would also be nice if the parsing of the
+ interface files recognized function aliasing when that appears, but
+ that's a long distant wish}.
+
+All the functions listed below return error codes in theory. However
+at this current point in time they always return 0 (success). Any
+failure to register or change a GF is assumed fatal and MoL will
+issue a level 0 warning stopping the code. This may change in future,
+in which case negative return values will indicate errors.
+
+\subsection*{MoL\_RegisterVar}
+
+Tells MoL that the given GF is in the evolved category with the
+associated update GF.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_RegisterVar(CCTK\_INT varindex,
+ CCTK\_INT rhsindex) \\
+ & {\bf Fortran} & MoL\_RegisterVar(CCTK\_INT ierr, CCTK\_INT varindex,
+ CCTK\_INT rhsindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the GF to be evolved \\
+ & {\bf rhsindex} & - & Index of the associated update GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_Register}.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_RegisterVar(CCTK\_VarIndex("wavetoymol::phi"), \\
+ && \qquad CCTK\_VarIndex("wavetoymol::phirhs")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``wavetoymol::phi'')
+ \\
+ && call CCTK\_VarIndex(rhsindex, ``wavetoymol::phirhs'') \\
+ && call MoL\_RegisterVar(ierr, varindex, rhsindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterDepends, MoL\_RegisterPrimitive, \\
+ & MoL\_ChangeVarToEvolved.
+\end{tabular}
+
+
+\subsection*{MoL\_RegisterDepends}
+
+Tells MoL that the given GF is in the dependent category.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_RegisterDepends(CCTK\_INT varindex) \\
+ & {\bf Fortran} & MoL\_RegisterDepends(CCTK\_INT ierr, CCTK\_INT varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the dependent GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_Register}.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_RegisterDepends(CCTK\_VarIndex("einstein::alp")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'')
+ \\
+ && call MoL\_RegisterDepends(ierr, varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterVar, MoL\_RegisterPrimitive, \\
+ & MoL\_ChangeVarToDependent.
+\end{tabular}
+
+
+\subsection*{MoL\_RegisterPrimitive}
+
+Tells MoL that the given GF is in the primitive category.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_RegisterPrimitive(CCTK\_INT varindex) \\
+ & {\bf Fortran} & MoL\_RegisterPrimitive(CCTK\_INT ierr, CCTK\_INT varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the primitive GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_Register}.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_RegisterPrimitive(CCTK\_VarIndex("einstein::alp")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'')
+ \\
+ && call MoL\_RegisterPrimitive(ierr, varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterVar, MoL\_RegisterDepends, \\
+ & MoL\_ChangeVarToPrimitive.
+\end{tabular}
+
+
+\subsection*{MoL\_ChangeVarToEvolved}
+
+Sets a GF to belong to the evolved category, with the associated
+update GF. Not used for the initial setting.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_ChangeVarToEvolved(CCTK\_INT varindex, CCTK\_INT
+ rhsindex) \\
+ & {\bf Fortran} & MoL\_ChangeVarToEvolved(CCTK\_INT ierr, CCTK\_INT varindex,
+ CCTK\_INT rhsindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the GF to be evolved. \\
+ & {\bf rhsindex} & - & Index of the associated update GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_PreStep}. \\
+ & Note that this function was designed to allow mixed slicings for
+ thorn Einstein. \\
+ & This set of functions is largely untested and should be used with
+ great care.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_ChangeVarToEvolved(CCTK\_VarIndex("einstein::alp"),\\
+ && \qquad CCTK\_VarIndex(``adm\_bssn::adm\_bs\_salp'')); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'') \\
+ && call CCTK\_VarIndex(rhsindex, ``adm\_bssn::adm\_bs\_salp'') \\
+ && call MoL\_ChangeVarToEvolved(ierr, varindex, rhsindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterVar, MoL\_ChangeVarToDependent, \\
+ & MoL\_ChangeVarToPrimitive, MoL\_ChangeVarToNone.
+\end{tabular}
+
+
+\subsection*{MoL\_ChangeVarToDependent}
+
+Sets a GF to belong to the dependent category. Not used for the
+initial setting.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_ChangeVarToDependent(CCTK\_INT varindex) \\
+ & {\bf Fortran} & MoL\_ChangeVarToDependent(CCTK\_INT ierr, CCTK\_INT varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the dependent GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_PreStep}. \\
+ & Note that this function was designed to allow mixed slicings for
+ thorn Einstein. \\
+ & This set of functions is largely untested and should be used with
+ great care.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_ChangeVarToDependent(CCTK\_VarIndex("einstein::alp")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'') \\
+ && call MoL\_ChangeVarToDependent(ierr, varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterDepends, MoL\_ChangeVarToEvolved, \\
+ & MoL\_ChangeVarToPrimitive, MoL\_ChangeVarToNone.
+\end{tabular}
+
+\subsection*{MoL\_ChangeVarToPrimitive}
+
+Sets a GF to belong to the primitive category. Not used for the
+initial setting.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_ChangeVarToPrimitive(CCTK\_INT varindex) \\
+ & {\bf Fortran} & MoL\_ChangeVarToPrimitive(CCTK\_INT ierr, CCTK\_INT varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the primitive GF.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_PreStep}. \\
+ & Note that this function was designed to allow mixed slicings for
+ thorn Einstein. \\
+ & This set of functions is largely untested and should be used with
+ great care.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_ChangeVarToPrimitive(CCTK\_VarIndex("einstein::alp")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'') \\
+ && call MoL\_ChangeVarToPrimitive(ierr, varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_RegisterPrimitive, MoL\_ChangeVarToEvolved, \\
+ & MoL\_ChangeVarToDependent, MoL\_ChangeVarToNone.
+\end{tabular}
+
+\subsection*{MoL\_ChangeVarToNone}
+
+Sets a GF to belong to the ``unknown'' category. Not used for the
+initial setting.
+
+\vskip 3mm
+
+\begin{tabular}[l]{l l l}
+ {\bf Synopsis} && \\
+ & {\bf C} & CCTK\_INT ierr = MoL\_ChangeVarToNone(CCTK\_INT varindex) \\
+ & {\bf Fortran} & MoL\_ChangeVarToNone(CCTK\_INT ierr, CCTK\_INT varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l c l}
+ {\bf Arguments} &&& \\
+ & {\bf varindex} & - & Index of the GF to be unset.
+\end{tabular}
+
+\begin{tabular}[l]{l l}
+ {\bf Discussion} & \\
+ & Should be called in a function scheduled in {\tt MoL\_PreStep}. \\
+ & Note that this function was designed to allow mixed slicings for
+ thorn Einstein. \\
+ & This set of functions is largely untested and should be used with
+ great care.
+\end{tabular}
+
+\begin{tabular}[l]{l l l}
+ {\bf Examples} && \\
+ & {\bf C} & ierr =
+ MoL\_ChangeVarToNone(CCTK\_VarIndex("einstein::alp")); \\
+ & {\bf Fortran} & call CCTK\_VarIndex(varindex, ``einstein::alp'') \\
+ && call MoL\_RegisterNone(ierr, varindex)
+\end{tabular}
+
+\begin{tabular}[l]{l l }
+ {\bf See Also} & \\
+ & CCTK\_VarIndex, MoL\_ChangeVarToEvolved, MoL\_ChangeVarToDependent, \\
+ & MoL\_ChangeVarToPrimitive.
+\end{tabular}
+
+
+
+
+\begin{thebibliography}{1}
+
+\bibitem{jt1}
+J. Thornburg.
+\newblock {N}umerical {R}elativity in {B}lack {H}ole {S}pacetimes.
+\newblock Unpublished thesis, University of British Columbia.
+\newblock 1993.
+\newblock Available from \mbox{\tt
+ http://www.aei.mpg.de/\~{}jthorn/phd/html/phd.html}.
+
+\bibitem{jt2}
+J. Thornburg.
+\newblock A {3+1} {C}omputational {S}cheme for {D}ynamic {S}pherically
+{S}ymmetric {B}lack {H}ole {S}pacetimes -- {II}: {T}ime {E}volution.
+\newblock Preprint {\tt gr-qc/9906022}, submitted to {\em Phys. Rev.}
+{\bf D}.
+
+\bibitem{shu}
+C. Shu.
+\newblock {H}igh {O}rder {ENO} and {WENO} {S}chemes for
+{C}omputational {F}luid {D}ynamics.
+\newblock In T.~J. Barth and H. Deconinck, editors {\em High-Order
+ Methods for Computational Physics}. Springer, 1999.
+\newblock A related online version can be found under {\em Essentially
+ {N}on-{O}scillatory and {W}eighted {E}ssentially {N}on-{O}scillatory
+ {S}chemes for {H}yperbolic {C}onservation {L}aws} at {\tt
+ http://www.icase.edu/library/reports/rdp/97/97-65RDP.tex.refer.html}.
+
+\bibitem{nc}
+D.~W. Neilsen and M.~W. Choptuik.
+\newblock Ultrarelativistic fluid dynamics.
+\newblock {\em Class. Quantum Grav.}, {\bf 17}:\penalty0 733--759, 2000.
+
+\end{thebibliography}
+
+\include{interface}
+\include{param}
+\include{schedule}
+
+\end{document}
diff --git a/interface.ccl b/interface.ccl
new file mode 100644
index 0000000..ace52c1
--- /dev/null
+++ b/interface.ccl
@@ -0,0 +1,71 @@
+# Interface definition for thorn MoL2
+# $Header$
+
+implements: MethodOfLines
+
+inherits: nanchecker
+
+INCLUDE HEADER: MoLFunctions.h IN MoLFunctions.h
+INCLUDE HEADER: MoL.h IN MoL.h
+USES INCLUDE: NaNChecker.h
+
+CCTK_INT FUNCTION MoLRegisterEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex)
+CCTK_INT FUNCTION MoLRegisterConstrained(CCTK_INT ConstrainedIndex)
+CCTK_INT FUNCTION MoLRegisterSaveAndRestore(CCTK_INT SandRIndex)
+CCTK_INT FUNCTION MoLRegisterEvolvedGroup(CCTK_INT EvolvedIndex, \
+ CCTK_INT RHSIndex)
+CCTK_INT FUNCTION MoLRegisterConstrainedGroup(CCTK_INT ConstrainedIndex)
+CCTK_INT FUNCTION MoLRegisterSaveAndRestoreGroup(CCTK_INT SandRIndex)
+CCTK_INT FUNCTION MoLChangeToEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex)
+CCTK_INT FUNCTION MoLChangeToConstrained(CCTK_INT ConstrainedIndex)
+CCTK_INT FUNCTION MoLChangeToSaveAndRestore(CCTK_INT SandRIndex)
+CCTK_INT FUNCTION MoLChangeToNone(CCTK_INT RemoveIndex)
+
+PROVIDES FUNCTION MoLRegisterEvolved WITH MoL_RegisterEvolved LANGUAGE C
+PROVIDES FUNCTION MoLRegisterConstrained WITH MoL_RegisterConstrained \
+ LANGUAGE C
+PROVIDES FUNCTION MoLRegisterSaveAndRestore WITH MoL_RegisterSaveAndRestore \
+ LANGUAGE C
+PROVIDES FUNCTION MoLRegisterEvolvedGroup WITH MoL_RegisterEvolvedGroup \
+ LANGUAGE C
+PROVIDES FUNCTION MoLRegisterConstrainedGroup WITH \
+ MoL_RegisterConstrainedGroup LANGUAGE C
+PROVIDES FUNCTION MoLRegisterSaveAndRestoreGroup WITH \
+ MoL_RegisterSaveAndRestoreGroup LANGUAGE C
+PROVIDES FUNCTION MoLChangeToEvolved WITH MoL_ChangeToEvolved LANGUAGE C
+PROVIDES FUNCTION MoLChangeToConstrained WITH MoL_ChangeToConstrained \
+ LANGUAGE C
+PROVIDES FUNCTION MoLChangeToSaveAndRestore WITH MoL_ChangeToSaveAndRestore \
+ LANGUAGE C
+PROVIDES FUNCTION MoLChangeToNone WITH MoL_ChangeToNone LANGUAGE C
+
+private:
+
+CCTK_REAL RKAlphaCoefficients TYPE=ARRAY DIM=2 SIZE=MoL_Intermediate_Steps,MoL_Num_Scratch_Levels+1 DISTRIB=CONSTANT
+{
+ RKAlphaCoefficients
+} "The alpha coefficients used by the generic Runge-Kutta integrators"
+
+CCTK_REAL RKBetaCoefficients TYPE=ARRAY DIM=1 SIZE=MoL_Intermediate_Steps DISTRIB=CONSTANT
+{
+ RKBetaCoefficients
+} "The beta coefficients used by the generic Runge-Kutta integrators"
+
+CCTK_INT MoL_Counters TYPE = SCALAR
+{
+ MoL_Intermediate_Step
+} "The counter for the time integration method"
+
+CCTK_REAL MoL_Original_Time TYPE = SCALAR
+{
+ Original_Time
+ Original_Delta_Time
+} "The original time and delta time which are reset by MoL during evolution"
+
+# This is extremely unforgiving - it doesn't allow whitespace in the
+# arithmetic expressions.
+
+CCTK_REAL ScratchSpace[MoL_Num_Evolved_Vars*MoL_Num_Scratch_Levels+1] TYPE = GF Timelevels = 1
+
+CCTK_REAL SandRScratchSpace[MoL_Num_SaveAndRestore_Vars+1] TYPE = GF Timelevels = 1
+
diff --git a/par/CarpetTest.th b/par/CarpetTest.th
new file mode 100644
index 0000000..fffc731
--- /dev/null
+++ b/par/CarpetTest.th
@@ -0,0 +1,159 @@
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+AlphaThorns/Nice
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/Boundary
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/CartGrid3D
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/IOBasic
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/IOUtil
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/Time
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusElliptic/EllBase
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusUtils/NaNChecker
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /arrangements
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusEOS/EOS_Base
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /arrangements
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusEOS/EOS_Ideal_Fluid
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+AEIDevelopment/FishEye
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/MoL2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/MoL2
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/WaveMoL2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/WaveMoL2
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/IDScalarWaveMoLC2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/IDScalarWaveMoLC2
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMConstraints
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMCoupling
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMBase
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/StaticConformal
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/SpaceMask
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/CoordGauge
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMMacros
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/IDAnalyticBH
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/Extract
+
+!REPOSITORY_LOCATION cvs.eu-network.org
+!REPOSITORY_NAME /EUNetwork
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+EUHydro/EOS_Polytrope
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /arrangements
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+Carpet/Carpet
+Carpet/CarpetLib
+Carpet/CarpetSlab
+Carpet/CarpetRegrid
+Carpet/CarpetReduce
+Carpet/CarpetIOASCII
+
+
diff --git a/par/PUGHTest.th b/par/PUGHTest.th
new file mode 100644
index 0000000..022f7ca
--- /dev/null
+++ b/par/PUGHTest.th
@@ -0,0 +1,176 @@
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+AlphaThorns/Nice
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/Boundary
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/CartGrid3D
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/IOBasic
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/IOUtil
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/Time
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusElliptic/EllBase
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusUtils/NaNChecker
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /arrangements
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusEOS/EOS_Base
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /arrangements
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusEOS/EOS_Ideal_Fluid
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+AEIDevelopment/FishEye
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/MoL2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/MoL2
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/WaveMoL2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/WaveMoL2
+
+!REPOSITORY_LOCATION cvs.aei.mpg.de
+!REPOSITORY_MODULE HawkeCVS/CactusMoL2/IDScalarWaveMoLC2
+!REPOSITORY_NAME /numrelcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusMoL2/IDScalarWaveMoLC2
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMConstraints
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMCoupling
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMBase
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/StaticConformal
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/SpaceMask
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/CoordGauge
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/ADMMacros
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/IDAnalyticBH
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+CactusEinstein/Extract
+
+!REPOSITORY_LOCATION cvs.eu-network.org
+!REPOSITORY_NAME /EUNetwork
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER hawke
+EUHydro/EOS_Polytrope
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusPUGH/PUGH
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusPUGH/PUGHReduce
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusPUGH/PUGHSlab
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusPUGH/PUGHInterp
+
+!REPOSITORY_LOCATION cvs.cactuscode.org
+!REPOSITORY_NAME /cactusdevcvs
+!REPOSITORY_TYPE pserver
+!REPOSITORY_USER cvs_anon
+CactusBase/IOASCII
diff --git a/param.ccl b/param.ccl
new file mode 100644
index 0000000..755b870
--- /dev/null
+++ b/param.ccl
@@ -0,0 +1,53 @@
+# Parameter definitions for thorn MoL2
+# $Header$
+
+restricted:
+
+CCTK_INT MoL_Num_Evolved_Vars "The maximum number of variables to be evolved by MoL" ACCUMULATOR = (x+y)
+{
+ (0:* :: "Anything non negative. Added to by other thorns."
+} 1
+
+CCTK_INT MoL_Num_Constrained_Vars "The maximum number of constrained variables with timelevels that MoL needs to know about" ACCUMULATOR = (x+y)
+{
+ (0:* :: "Anything non negative. Added to by other thorns."
+} 1
+
+CCTK_INT MoL_Num_SaveAndRestore_Vars "The maximum number of variables to be evolved outside of MoL but that MoL needs to know about" ACCUMULATOR = (x+y)
+{
+ (0:* :: "Anything non negative. Added to by other thorns."
+} 1
+
+CCTK_INT MoL_Num_Scratch_Levels "Number of scratch levels required by the ODE method"
+{
+ 0:* :: "Anything non negative"
+} 0
+
+private:
+
+KEYWORD MoL_ODE_Method "The ODE method use by MoL to do time integration"
+{
+ "Generic" :: "Generic Shu-Osher Runga-Kutta type"
+ "ICN" :: "Iterative Crank Nicholson"
+ "RK2" :: "Efficient RK2"
+} "ICN"
+
+KEYWORD Generic_Type "If using the generic method, which sort"
+{
+ "RK" :: "One of the standard TVD Runga-Kutta methods"
+ "ICN" :: "Iterative Crank Nicholson as a generic method"
+} "RK"
+
+CCTK_INT MoL_Intermediate_Steps "Number of intermediate steps taken by the ODE method"
+{
+ 1:* :: "Anything greater than 1"
+} 3
+
+BOOLEAN MoL_Memory_Always_On "Do we keep the scratch arrays allocated all the time?"
+{
+} "yes"
+
+CCTK_REAL MoL_Tiny "Effective local machine zero; required by generic solvers"
+{
+ 0:* :: "Defaults to 1.e-15"
+} 1.e-15
diff --git a/schedule.ccl b/schedule.ccl
new file mode 100644
index 0000000..bdf13ef
--- /dev/null
+++ b/schedule.ccl
@@ -0,0 +1,257 @@
+# Schedule definitions for thorn MoL2
+# $Header$
+
+##########################################################
+### Always require storage for the counters and time ###
+##########################################################
+
+STORAGE: MoL_Counters, MoL_Original_Time
+
+########################################################
+### Storage for the scratch space if memory hungry ###
+########################################################
+
+if (MoL_Memory_Always_On)
+{
+ STORAGE: ScratchSpace
+ STORAGE: SandRScratchSpace
+}
+
+############################################################
+### If using the generic Runge-Kutta solver, switch on ###
+### storage for the coefficient arrays ###
+############################################################
+
+if (CCTK_Equals(MoL_ODE_Method,"Generic"))
+{
+ STORAGE: RKAlphaCoefficients
+ STORAGE: RKBetaCoefficients
+}
+
+#############################
+### The actual routines ###
+#############################
+
+########################
+### Startup banner ###
+########################
+
+schedule MoL_Startup AT Startup
+{
+ LANG: C
+} "Startup banner"
+
+#####################################
+### Parameter checking routine. ###
+#####################################
+
+schedule MoL_ParamCheck AT ParamCheck
+{
+ LANG: C
+} "Basic parameter checking"
+
+#################################################
+### Allocate the arrays for the GF indexes. ###
+#################################################
+
+schedule MoL_SetupIndexArrays AT Initial
+{
+ LANG: C
+} "Set up the MoL bookkeeping index arrays"
+
+################################################
+### Initialize the coefficients for the RK ###
+### arrays if required ###
+################################################
+
+if (CCTK_Equals(MoL_ODE_Method,"Generic"))
+{
+ schedule MoL_SetupRKCoefficients AT Initial
+ {
+ LANG: C
+ STORAGE: RKAlphaCoefficients
+ STORAGE: RKBetaCoefficients
+ } "Initialize the generic Runge-Kutta coefficients"
+}
+
+#################################################
+### The group where physics thorns call the ###
+### registration functions ###
+#################################################
+
+schedule GROUP MoL_Register AT PostInitial
+{
+ LANG:C
+} "The group where physics thorns register variables with MoL"
+
+schedule MoL_FillAllLevels AT PostInitial AFTER MoL_Register
+{
+ LANG:C
+} "A bad routine. Fills all previous timelevels with data copied from the current."
+
+######################################################
+### The evolution step. This is almost a self ###
+### contained EVOL step with PRE and POST steps ###
+### to allow changing the type of the variables, ###
+### boundary enforcement and so on. ###
+######################################################
+
+schedule GROUP MoL_Evolution AT Evol
+{
+ LANG: C
+ STORAGE: ScratchSpace
+ STORAGE: SandRScratchSpace
+} "A single Cactus evolution step using MoL"
+
+######################################################
+### StartStep contains the routines that just do ###
+### internal MoL stuff; setting the counter, and ###
+### changing the time and timestep if required. ###
+######################################################
+
+schedule GROUP MoL_StartStep IN MoL_Evolution
+{
+ LANG: C
+} "MoL internal setup for the evolution step"
+
+schedule MoL_SetCounter IN MoL_StartStep
+{
+ LANG: C
+} "Set the counter for the ODE method to loop over"
+
+########################################################
+### Note that the option GLOBAL here is to ensure ###
+### that the time is set once per refinement level ###
+### and not once overall. ###
+### I think with current implementations this is ###
+### not required. ###
+########################################################
+
+schedule MoL_SetTime IN MoL_StartStep
+{
+ LANG: C
+ ### OPTION: GLOBAL
+} "Ensure the correct time and timestep are used"
+
+#################################################################
+### PreStep is where physics thorns can do their own setup. ###
+### This would include scheduling the function calls to ###
+### change the type of variable. ###
+#################################################################
+
+schedule GROUP MoL_PreStep IN MoL_Evolution AFTER MoL_StartStep BEFORE MoL_Step
+{
+ LANG: C
+} "Physics thorns can schedule preloop setup routines in here"
+
+#######################################################################
+### Check to see if any type changing functions have been called, ###
+### and if so do the necessary bookkeeping. ###
+### Right now, I think this is unnecessary, now that we don't ###
+### reallocate any scratch space. ###
+#######################################################################
+
+#schedule MoL_CheckVariableType IN MoL_Evolution AFTER MoL_PreStep BEFORE MoL_Step
+#{
+# LANG: C
+#} "If a physics thorn wants to change the type of a variable, do the bookkeeping"
+
+#################################################################
+### Copy (ouch) the data into the correct timelevel so that ###
+### the physics thorn knows where to find it. ###
+#################################################################
+
+schedule MoL_InitialCopy IN MoL_Evolution AFTER MoL_PreStep BEFORE MoL_Step
+{
+ LANG: C
+} "Ensure the data is in the correct timelevel"
+
+#################################################
+### The actual loop which updates the data. ###
+#################################################
+
+schedule GROUP MoL_Step WHILE MoL2::MoL_Intermediate_Step IN MoL_Evolution AFTER MoL_PreStep
+{
+ LANG: C
+} "The loop over the intermediate steps for the ODE integrator"
+
+#####################################################
+### The group where all the physics takes place ###
+#####################################################
+
+schedule GROUP MoL_CalcRHS IN MoL_Step
+{
+ LANG: C
+} "Physics thorns schedule the calculation of the discrete spatial operator in here"
+
+######################################################
+### The time integrator performs the update here ###
+######################################################
+
+if (CCTK_Equals(MoL_ODE_Method,"Generic"))
+{
+ schedule MoL_GenericRKAdd AS MoL_Add IN MoL_Step AFTER MoL_CalcRHS BEFORE MoL_PostStep
+ {
+ LANG: C
+ } "Updates calculated with a generic method"
+}
+else if (CCTK_Equals(MoL_ODE_Method,"RK2"))
+{
+ schedule MoL_RK2Add AS MoL_Add IN MoL_Step AFTER MoL_CalcRHS BEFORE MoL_PostStep
+ {
+ LANG: C
+ } "Updates calculated with the efficient Runge-Kutta 2 method"
+}
+else if (CCTK_Equals(MoL_ODE_Method,"ICN"))
+{
+ schedule MoL_ICNAdd AS MoL_Add IN MoL_Step AFTER MoL_CalcRHS BEFORE MoL_PostStep
+ {
+ LANG: C
+ } "Updates calculated with the efficient ICN method"
+}
+
+##################################################
+### Physics thorns can apply boundaries and ###
+### recalculate constrained variables and so ###
+### on in PostStep ###
+##################################################
+
+schedule GROUP MoL_PostStep IN MoL_Step AFTER MoL_Add
+{
+ LANG: C
+} "The group for physics thorns to schedule boundary calls etc."
+
+#################################################
+### Final internal MoL stuff; decrement the ###
+### counter, change time and timestep ###
+#################################################
+
+schedule MoL_DecrementCounter IN MoL_Step AFTER MoL_Step BEFORE MoL_PostStep
+{
+ LANG: C
+} "Alter the counter number"
+
+schedule MoL_ResetTime IN MoL_Step AFTER MoL_DecrementCounter BEFORE MoL_PostStep
+{
+ LANG: C
+} "If necessary, change the time and timestep"
+
+##################################################
+### Finally, restore any SaveAndRestore type ###
+### variables to their original state. ###
+##################################################
+
+schedule MoL_RestoreSandR IN MoL_Evolution AFTER MoL_PostStep
+{
+ LANG: C
+} "Restoring the Save and Restore variables to the original state"
+
+################################################################
+### At the end (but before driver terminate to avoid those ###
+### irritating segfaults) free the index arrays. ###
+################################################################
+
+schedule MoL_FreeIndexArrays AT Terminate BEFORE Driver_Terminate
+{
+ LANG: C
+} "Free the MoL bookkeeping index arrays"
diff --git a/src/ChangeType.c b/src/ChangeType.c
new file mode 100644
index 0000000..0894361
--- /dev/null
+++ b/src/ChangeType.c
@@ -0,0 +1,572 @@
+ /*@@
+ @file ChangeType.c
+ @date Thu May 30 16:16:40 2002
+ @author Ian Hawke
+ @desc
+ The external functions called (via function aliasing) by physics
+ thorns to tell MoL that they want these GFs to be treated as a
+ different type to the original declaration
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_ChangeType_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+#define MOL_UNKNOWN_VARTYPE 0
+#define MOL_EVOLVED_VARTYPE 1
+#define MOL_CONSTRAINED_VARTYPE 2
+#define MOL_SANDR_VARTYPE 3
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+CCTK_INT MoL_ChangeToEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+
+CCTK_INT MoL_ChangeToConstrained(CCTK_INT ConstrainedIndex);
+
+CCTK_INT MoL_ChangeToSaveAndRestore(CCTK_INT SandRIndex);
+
+CCTK_INT MoL_ChangeToNone(CCTK_INT RemoveIndex);
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_ChangeToEvolved
+ @date Thu May 30 16:45:30 2002
+ @author Ian Hawke
+ @desc
+ Changes a variable to evolved type. Checks to see which type it was
+ before and does the bookkeeping on the index arrays.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_ChangeToEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex)
+{
+
+ CCTK_INT index, usedindex;
+ CCTK_INT vartype; /* See the defines at the top of file */
+ CCTK_INT timelevs;
+
+ vartype = 0;
+ usedindex = -1;
+
+ for (index = 0; (index < MoLNumEvolvedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_EVOLVED_VARTYPE *
+ (EvolvedVariableIndex[index] == EvolvedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumConstrainedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_CONSTRAINED_VARTYPE *
+ (ConstrainedVariableIndex[index] == EvolvedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumSandRVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_SANDR_VARTYPE *
+ (SandRVariableIndex[index] == EvolvedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ switch (vartype)
+ {
+
+ case MOL_UNKNOWN_VARTYPE:
+
+ {
+ timelevs = CCTK_NumTimeLevelsFromVarI(EvolvedIndex);
+ if (timelevs < 1)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved.", EvolvedIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ else if (timelevs == 1)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved.", EvolvedIndex);
+ CCTK_WARN(0, "The index passed only has a single timelevel.");
+ }
+ timelevs = CCTK_NumTimeLevelsFromVarI(RHSIndex);
+ if (timelevs < 1) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved (RHS GF).", RHSIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ EvolvedVariableIndex[MoLNumEvolvedVariables] = EvolvedIndex;
+ RHSVariableIndex[MoLNumEvolvedVariables] = RHSIndex;
+ MoLNumEvolvedVariables++;
+ break;
+ }
+
+ case MOL_EVOLVED_VARTYPE:
+
+ {
+ RHSVariableIndex[usedindex] = RHSIndex;
+ break;
+ }
+
+ case MOL_CONSTRAINED_VARTYPE:
+
+ {
+ timelevs = CCTK_NumTimeLevelsFromVarI(RHSIndex);
+ if (timelevs < 1) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved type from constrained.", RHSIndex);
+ CCTK_WARN(0, "The RHS index passed does not correspond to a GF.");
+ }
+ for (index = usedindex; index < MoLNumConstrainedVariables - 1; index++)
+ {
+ ConstrainedVariableIndex[index] = ConstrainedVariableIndex[index+1];
+ }
+ MoLNumConstrainedVariables--;
+ EvolvedVariableIndex[index] = EvolvedIndex;
+ RHSVariableIndex[index] = RHSIndex;
+ MoLNumEvolvedVariables++;
+ break;
+ }
+
+ case MOL_SANDR_VARTYPE:
+
+ {
+ timelevs = CCTK_NumTimeLevelsFromVarI(RHSIndex);
+ if (timelevs < 1) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved type from save and restore.", RHSIndex);
+ CCTK_WARN(0, "The RHS index passed does not correspond to a GF.");
+ }
+ for (index = usedindex; index < MoLNumSandRVariables - 1; index++)
+ {
+ SandRVariableIndex[index] = SandRVariableIndex[index+1];
+ }
+ MoLNumSandRVariables--;
+ EvolvedVariableIndex[index] = EvolvedIndex;
+ RHSVariableIndex[index] = RHSIndex;
+ MoLNumEvolvedVariables++;
+ break;
+ }
+
+ default:
+
+ {
+ CCTK_WARN(0, "Something is seriously wrong in ChangeType.c! Case out of range in switch statement.");
+ }
+
+ }
+
+ return 0;
+
+}
+
+ /*@@
+ @routine MoL_ChangeToConstrained
+ @date Thu May 30 16:47:08 2002
+ @author Ian Hawke
+ @desc
+ Changes a variable to be constrained.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_ChangeToConstrained(CCTK_INT ConstrainedIndex)
+{
+
+ CCTK_INT index, usedindex;
+ CCTK_INT vartype; /* See the defines at the top of file */
+ CCTK_INT timelevs;
+
+ vartype = 0;
+ usedindex = -1;
+
+ for (index = 0; (index < MoLNumEvolvedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_EVOLVED_VARTYPE *
+ (EvolvedVariableIndex[index] == ConstrainedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumConstrainedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_CONSTRAINED_VARTYPE *
+ (ConstrainedVariableIndex[index] == ConstrainedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumSandRVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_SANDR_VARTYPE *
+ (SandRVariableIndex[index] == ConstrainedIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ switch (vartype)
+ {
+
+ case MOL_UNKNOWN_VARTYPE:
+
+ {
+ timelevs = CCTK_NumTimeLevelsFromVarI(ConstrainedIndex);
+ if (timelevs < 1)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved.", ConstrainedIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ else if (timelevs == 1)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to evolved.", ConstrainedIndex);
+ CCTK_WARN(0, "The index passed only has a single timelevel.");
+ }
+ ConstrainedVariableIndex[MoLNumConstrainedVariables] = ConstrainedIndex;
+ MoLNumConstrainedVariables++;
+ break;
+ }
+
+ case MOL_EVOLVED_VARTYPE:
+
+ {
+
+ break;
+ }
+
+ case MOL_CONSTRAINED_VARTYPE:
+
+ {
+ break;
+ }
+
+ case MOL_SANDR_VARTYPE:
+
+ {
+ for (index = usedindex; index < MoLNumSandRVariables - 1; index++)
+ {
+ SandRVariableIndex[index] = SandRVariableIndex[index+1];
+ }
+ MoLNumSandRVariables--;
+ ConstrainedVariableIndex[index] = ConstrainedIndex;
+ MoLNumConstrainedVariables++;
+ break;
+ }
+
+ default:
+
+ {
+ CCTK_WARN(0, "Something is seriously wrong in ChangeType.c! Case out of range in switch statement.");
+ }
+
+ }
+
+ return 0;
+
+}
+
+ /*@@
+ @routine MoL_ChangeToSaveAndRestore
+ @date Thu May 30 16:50:36 2002
+ @author Ian Hawke
+ @desc
+ Changes the variable type to save and restore.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_ChangeToSaveAndRestore(CCTK_INT SandRIndex)
+{
+
+ CCTK_INT index, usedindex;
+ CCTK_INT vartype; /* See the defines at the top of file */
+ CCTK_INT timelevs;
+
+ vartype = 0;
+ usedindex = -1;
+
+ for (index = 0; (index < MoLNumEvolvedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_EVOLVED_VARTYPE *
+ (EvolvedVariableIndex[index] == SandRIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumConstrainedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_CONSTRAINED_VARTYPE *
+ (ConstrainedVariableIndex[index] == SandRIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumSandRVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_SANDR_VARTYPE *
+ (SandRVariableIndex[index] == SandRIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ switch (vartype)
+ {
+
+ case MOL_UNKNOWN_VARTYPE:
+
+ {
+ timelevs = CCTK_NumTimeLevelsFromVarI(SandRIndex);
+ if (timelevs < 1)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning whilst trying to change variable index %i to save and restore.", SandRIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ SandRVariableIndex[MoLNumSandRVariables] = SandRIndex;
+ MoLNumSandRVariables++;
+ break;
+ }
+
+ case MOL_EVOLVED_VARTYPE:
+
+ {
+
+ break;
+ }
+
+ case MOL_CONSTRAINED_VARTYPE:
+
+ {
+ for (index = usedindex; index < MoLNumConstrainedVariables - 1; index++)
+ {
+ ConstrainedVariableIndex[index] = ConstrainedVariableIndex[index+1];
+ }
+ MoLNumConstrainedVariables--;
+ SandRVariableIndex[index] = SandRIndex;
+ MoLNumSandRVariables++;
+ break;
+ }
+
+ case MOL_SANDR_VARTYPE:
+
+ {
+ break;
+ }
+
+ default:
+
+ {
+ CCTK_WARN(0, "Something is seriously wrong in ChangeType.c! Case out of range in switch statement.");
+ }
+
+ }
+
+ return 0;
+
+}
+
+ /*@@
+ @routine MoL_ChangeToNone
+ @date Thu May 30 16:53:46 2002
+ @author Ian Hawke
+ @desc
+ Changes a variable type to none (i.e., MoL no longer considers it).
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_ChangeToNone(CCTK_INT RemoveIndex)
+{
+
+ CCTK_INT index, usedindex;
+ CCTK_INT vartype; /* See the defines at the top of file */
+ CCTK_INT timelevs;
+
+ vartype = 0;
+ usedindex = -1;
+
+ for (index = 0; (index < MoLNumEvolvedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_EVOLVED_VARTYPE *
+ (EvolvedVariableIndex[index] == RemoveIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumConstrainedVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_CONSTRAINED_VARTYPE *
+ (ConstrainedVariableIndex[index] == RemoveIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ for (index = 0; (index < MoLNumSandRVariables)&&(!vartype); index++)
+ {
+ vartype = MOL_SANDR_VARTYPE *
+ (SandRVariableIndex[index] == RemoveIndex);
+ if (vartype)
+ {
+ usedindex = index;
+ }
+ }
+
+ switch (vartype)
+ {
+
+ case MOL_UNKNOWN_VARTYPE:
+
+ {
+ break;
+ }
+
+ case MOL_EVOLVED_VARTYPE:
+
+ {
+ for (index = usedindex; index < MoLNumEvolvedVariables - 1; index++)
+ {
+ EvolvedVariableIndex[index] = EvolvedVariableIndex[index+1];
+ RHSVariableIndex[index] = RHSVariableIndex[index+1];
+ }
+ MoLNumEvolvedVariables--;
+ break;
+ }
+
+ case MOL_CONSTRAINED_VARTYPE:
+
+ {
+ for (index = usedindex; index < MoLNumConstrainedVariables - 1; index++)
+ {
+ ConstrainedVariableIndex[index] = ConstrainedVariableIndex[index+1];
+ }
+ MoLNumConstrainedVariables--;
+ break;
+ }
+
+ case MOL_SANDR_VARTYPE:
+
+ {
+ for (index = usedindex; index < MoLNumSandRVariables - 1; index++)
+ {
+ SandRVariableIndex[index] = SandRVariableIndex[index+1];
+ }
+ MoLNumSandRVariables--;
+ break;
+ }
+
+ default:
+
+ {
+ CCTK_WARN(0, "Something is seriously wrong in ChangeType.c! Case out of range in switch statement.");
+ }
+
+ }
+
+ return 0;
+
+}
+
+
+
+/*
+ Fortran wrappers for the above functions.
+ Should be replaced by using function aliasing eventually.
+ */
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeToEvolved)(int *ierr,
+ CCTK_INT *EvolvedIndex,
+ CCTK_INT *RHSIndex)
+{
+ *ierr = MoL_ChangeToEvolved(*EvolvedIndex, *RHSIndex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeToConstrained)(int *ierr,
+ CCTK_INT *ConstrainedIndex)
+{
+ *ierr = MoL_ChangeToConstrained(*ConstrainedIndex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeToSaveAndRestore)(int *ierr,
+ CCTK_INT *EvolvedIndex)
+{
+ *ierr = MoL_ChangeToSaveAndRestore(*EvolvedIndex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeToNone)(int *ierr,
+ CCTK_INT *EvolvedIndex)
+{
+ *ierr = MoL_ChangeToNone(*EvolvedIndex);
+ return;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/Counter.c b/src/Counter.c
new file mode 100644
index 0000000..9483e94
--- /dev/null
+++ b/src/Counter.c
@@ -0,0 +1,110 @@
+ /*@@
+ @file Counter.c
+ @date Mon May 20 09:52:33 2002
+ @author Ian Hawke
+ @desc
+ Routines setting and altering the loop counter.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_Counter_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+int MoL_SetCounter(CCTK_ARGUMENTS);
+
+int MoL_DecrementCounter(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_SetCounter
+ @date Mon May 20 09:54:39 2002
+ @author Ian Hawke
+ @desc
+ Initially set the counter to the number of intermediate steps.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_SetCounter(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_REAL *Var;
+
+ /*
+ // Var = CCTK_VarDataPtr(cctkGH,0,"adm_bssn::ADM_BS_gxx");
+ Var = CCTK_VarDataPtr(cctkGH,0,"wavetoymol::phi");
+ printf("MoL:Counter. Level %d. Variable %g\n",cctk_levfac[0],Var[0]);
+ // Var = CCTK_VarDataPtr(cctkGH,1,"adm_bssn::ADM_BS_gxx");
+ Var = CCTK_VarDataPtr(cctkGH,1,"wavetoymol::phi");
+ printf("\n\nMoL:Counter. Level %d. Variable %g\n\n",cctk_levfac[0],Var[0]);
+ */
+ *MoL_Intermediate_Step = MoL_Intermediate_Steps;
+
+ return 0;
+}
+
+ /*@@
+ @routine MoL_DecrementCounter
+ @date Mon May 20 09:55:13 2002
+ @author Ian Hawke
+ @desc
+ During the loop decrement the counter
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_DecrementCounter(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+
+ (*MoL_Intermediate_Step) --;
+
+ return 0;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/ExternalVariables.h b/src/ExternalVariables.h
new file mode 100644
index 0000000..db4ea8f
--- /dev/null
+++ b/src/ExternalVariables.h
@@ -0,0 +1,26 @@
+ /*@@
+ @file ExternalVariables.h
+ @date Wed May 22 02:32:10 2002
+ @author Ian Hawke
+ @desc
+ The header file containing the local variables used across routines.
+ These are the arrays containing GF indexes for all types of variables,
+ and the number of each type of variable currently in use (the
+ parameters only give the maximum possible number).
+ No function prototypes are defined in this file, so we do not protect
+ it with an ifdef so that we can do inclusion within multiple routines
+ in the same file.
+ @enddesc
+ @version $Header$
+ @@*/
+
+
+extern CCTK_INT *EvolvedVariableIndex;
+extern CCTK_INT *RHSVariableIndex;
+extern CCTK_INT *ConstrainedVariableIndex;
+extern CCTK_INT *SandRVariableIndex;
+
+
+extern CCTK_INT MoLNumEvolvedVariables;
+extern CCTK_INT MoLNumConstrainedVariables;
+extern CCTK_INT MoLNumSandRVariables;
diff --git a/src/GenericRK.c b/src/GenericRK.c
new file mode 100644
index 0000000..52dc1f4
--- /dev/null
+++ b/src/GenericRK.c
@@ -0,0 +1,204 @@
+ /*@@
+ @file GenericRK.c
+ @date Sun May 26 03:47:15 2002
+ @author Ian Hawke
+ @desc
+ This routine performs a generic Runge-Kutta type integration
+ given the set of coefficients defined in the RKAlphaCoefficients
+ and RKBetaCoefficients arrays. See the article by Shu referenced
+ in the documentation for more details.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_GenericRK_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+CCTK_INT AlphaIndex(CCTK_INT Step_Number, CCTK_INT Scratch_Level);
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_GenericRKAdd(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_GenericRKAdd
+ @date Sun May 26 03:50:44 2002
+ @author Ian Hawke
+ @desc
+ Performs a single step of a generic Runge-Kutta type time
+ integration.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_GenericRKAdd(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT index, var, scratchstep, alphaindex, scratchindex;
+ CCTK_INT totalsize;
+ CCTK_REAL alpha, beta;
+ CCTK_REAL *UpdateVar;
+ CCTK_REAL *RHSVar;
+ CCTK_REAL *ScratchVar;
+
+ totalsize = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];
+
+ beta = RKBetaCoefficients[MoL_Intermediate_Steps -
+ (*MoL_Intermediate_Step)];
+
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+
+ UpdateVar = (CCTK_REAL *)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ RHSVar = (CCTK_REAL *)CCTK_VarDataPtrI(cctkGH, 0,
+ RHSVariableIndex[var]);
+
+ /*
+ printf("In generic RK. Variable %d (%s). RHS %d (%s).\n",
+ EvolvedVariableIndex[var],
+ CCTK_VarName(EvolvedVariableIndex[var]),
+ RHSVariableIndex[var],
+ CCTK_VarName(RHSVariableIndex[var]));
+ */
+
+ for (index = 0; index < totalsize; index++)
+ {
+ UpdateVar[index] = (*Original_Delta_Time) * beta * RHSVar[index];
+ /* UpdateVar[index] = CCTK_DELTA_TIME * beta * RHSVar[index];*/
+ /* UpdateVar[index] = CCTK_DELTA_TIME * RHSVar[index];*/
+ /*
+ printf("Variable: %d. Index: %d. dt: %f. beta %f. RHS: %f. q: %f.\n",
+ var, index, (*Original_Delta_Time), beta, RHSVar[index],
+ UpdateVar[index]);
+ */
+ /*
+ if (EvolvedVariableIndex[var]==CCTK_VarIndex("admbase::alp"))
+ {
+
+ printf("RK: Index: %d. dt: %f. beta %f. RHS: %f (%s). q: %f.\n",
+ index, (*Original_Delta_Time), beta, RHSVar[index],
+ CCTK_VarName(RHSVariableIndex[var]),UpdateVar[index]);
+ }
+ */
+ }
+
+ for (scratchstep = 0;
+ scratchstep < MoL_Intermediate_Steps - (*MoL_Intermediate_Step) + 1;
+ scratchstep++)
+ {
+
+ alphaindex = AlphaIndex(*MoL_Intermediate_Step, scratchstep);
+ scratchindex = scratchstep - 1;
+
+ alpha = RKAlphaCoefficients[alphaindex];
+
+ if (scratchstep)
+ {
+ ScratchVar = &ScratchSpace[(var * MoL_Num_Scratch_Levels +
+ scratchindex) * totalsize];
+ /*
+ printf("Reading from scratch space, initial address %ld index %d\n",
+ ScratchVar, (var * MoL_Num_Scratch_Levels +
+ scratchindex) * totalsize);
+ */
+ }
+ else
+ {
+ ScratchVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ EvolvedVariableIndex[var]);
+ }
+
+ if ( (alpha > MoL_Tiny)||(alpha < -MoL_Tiny) )
+ {
+ for (index = 0; index < totalsize; index++)
+ {
+ UpdateVar[index] += alpha * ScratchVar[index];
+ /*
+ printf("Variable: %d. Index: %d. step: %d. alpha: %f. Scratch: %f. q: %f.\n",
+ var, index, (*MoL_Intermediate_Step), alpha, ScratchVar[index], UpdateVar[index]);
+ */
+ }
+ }
+
+ }
+
+ }
+
+ if (*MoL_Intermediate_Step > 1)
+ {
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+ UpdateVar = (CCTK_REAL *)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ ScratchVar = &ScratchSpace[(var * MoL_Num_Scratch_Levels +
+ MoL_Intermediate_Steps -
+ (*MoL_Intermediate_Step)) * totalsize];
+ /*
+ printf("Writing to scratch space, initial address %ld, index %d \n",
+ ScratchVar, (var * MoL_Num_Scratch_Levels +
+ MoL_Intermediate_Steps -
+ (*MoL_Intermediate_Step)) * totalsize);
+ */
+ for (index = 0; index < totalsize; index++)
+ {
+ ScratchVar[index] = UpdateVar[index];
+ /*
+ printf("Variable: %d. Index: %d. step: %d. Scratch: %f.\n",
+ var, index, (*MoL_Intermediate_Step), ScratchVar[index]);
+ */
+ }
+ }
+ }
+
+ return;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
+
+CCTK_INT AlphaIndex(CCTK_INT Step_Number, CCTK_INT Scratch_Level)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ return (MoL_Intermediate_Steps - Step_Number) * MoL_Intermediate_Steps +
+ Scratch_Level;
+}
diff --git a/src/ICN.c b/src/ICN.c
new file mode 100644
index 0000000..a39c547
--- /dev/null
+++ b/src/ICN.c
@@ -0,0 +1,120 @@
+ /*@@
+ @file ICN.c
+ @date Sun May 26 04:29:07 2002
+ @author Ian Hawke
+ @desc
+ This implements the more efficient Iterative Crank Nicholson integrator.
+ This follows the implementation of ICN in all AEI codes and is
+ equivalent to (but hopefully more efficient than) the generic ICN
+ integrator also implemented by MoL.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_ICN_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_ICNAdd(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_ICNAdd
+ @date Sun May 26 04:17:23 2002
+ @author Ian Hawke
+ @desc
+ Performs Iterative Crank Nicholson time integration. The number of
+ steps is arbitrary.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_ICNAdd(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT index, var;
+ CCTK_INT totalsize;
+ CCTK_REAL *OldVar;
+ CCTK_REAL *UpdateVar;
+ CCTK_REAL *RHSVar;
+
+ /*
+ printf("Inside ICN.\nProcessor %d.\nStep %d.\nRefinement %d.\nTimestep %g.\nSpacestep %g.\nTime %g\n",
+ CCTK_MyProc(cctkGH),
+ MoL_Intermediate_Steps - *MoL_Intermediate_Step + 1,
+ *cctk_levfac,
+ cctk_delta_time,
+ CCTK_DELTA_SPACE(0),
+ cctk_time);
+ */
+
+ totalsize = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];
+ /*
+ printf("MoL: the ICN routine says dt = %f.\n", CCTK_DELTA_TIME);
+ */
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+ OldVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ EvolvedVariableIndex[var]);
+ UpdateVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ RHSVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ RHSVariableIndex[var]);
+
+ for (index = 0; index < totalsize; index++)
+ {
+ UpdateVar[index] = OldVar[index] + CCTK_DELTA_TIME * RHSVar[index];
+ /*
+ if (CCTK_VarIndex("wavetoymol::phi") == EvolvedVariableIndex[var]){
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL",
+ "ICN: proc %d index %d, dt %g, oldvar %g, rhs %g, new %g\n",
+ CCTK_MyProc(cctkGH), index,CCTK_DELTA_TIME,
+ OldVar[index], RHSVar[index], UpdateVar[index]);
+ }*/
+ }
+ }
+
+ return;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/IndexArrays.c b/src/IndexArrays.c
new file mode 100644
index 0000000..93d2347
--- /dev/null
+++ b/src/IndexArrays.c
@@ -0,0 +1,211 @@
+ /*@@
+ @file IndexArrays.c
+ @date Mon Jun 3 13:15:30 2002
+ @author Ian Hawke
+ @desc
+ Routines for dealing with the index arrays in
+ @seefile ExternalVariables.h
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_IndexArrays_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_SetupIndexArrays(CCTK_ARGUMENTS);
+
+void MoL_FreeIndexArrays();
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_SetupIndexArrays
+ @date Mon Jun 3 13:24:05 2002
+ @author Ian Hawke
+ @desc
+ Allocates sufficient space for the index arrays.
+ These arrays are defined in the external file
+ @seefile ExternalVariables.h
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_SetupIndexArrays(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ char *infoline;
+
+ /*
+ We only want to set up the index arrays once.
+ With mesh refinement this routine could be scheduled
+ multiple times, leading to multiple copies of the
+ index arrays used at different times!!!
+ */
+
+ if (EvolvedVariableIndex)
+ {
+ return;
+ }
+
+ EvolvedVariableIndex = (CCTK_INT *)malloc(MoL_Num_Evolved_Vars *
+ sizeof(CCTK_INT));
+ if (!EvolvedVariableIndex)
+ {
+ CCTK_WARN(0,"Failed to allocate the evolved variable index array");
+ }
+
+ RHSVariableIndex = (CCTK_INT *)malloc(MoL_Num_Evolved_Vars *
+ sizeof(CCTK_INT));
+ if (!RHSVariableIndex)
+ {
+ CCTK_WARN(0,"Failed to allocate the RHS variable index array");
+ }
+
+ ConstrainedVariableIndex = (CCTK_INT *)malloc(MoL_Num_Constrained_Vars *
+ sizeof(CCTK_INT));
+ if (!ConstrainedVariableIndex)
+ {
+ CCTK_WARN(0,"Failed to allocate the constrained variable index array");
+ }
+
+ SandRVariableIndex = (CCTK_INT *)malloc(MoL_Num_SaveAndRestore_Vars *
+ sizeof(CCTK_INT));
+ if (!SandRVariableIndex)
+ {
+ CCTK_WARN(0,"Failed to allocate the save and restore variable index array");
+ }
+
+ infoline = (char *)malloc(100*sizeof(char));
+ if (!infoline)
+ {
+ CCTK_WARN(0, "Failed to malloc 100 characters!");
+ }
+ if (CCTK_EQUALS(MoL_ODE_Method,"Generic"))
+ {
+ if (CCTK_EQUALS(Generic_Type,"ICN"))
+ {
+ sprintf(infoline,"Generic Iterative Crank Nicholson with %i iterations",
+ MoL_Intermediate_Steps);
+ }
+ else if (CCTK_EQUALS(Generic_Type,"RK"))
+ {
+ sprintf(infoline, "Generic Runge-Kutta %i",MoL_Intermediate_Steps);
+ }
+ else
+ {
+ CCTK_WARN(0, "Generic_Type not recognized!");
+ }
+ }
+ else if (CCTK_EQUALS(MoL_ODE_Method,"RK2"))
+ {
+ sprintf(infoline, "Runge-Kutta 2");
+ }
+ else if (CCTK_EQUALS(MoL_ODE_Method,"ICN"))
+ {
+ sprintf(infoline, "Iterative Crank Nicholson with %i iterations",
+ MoL_Intermediate_Steps);
+ }
+ else
+ {
+ CCTK_WARN(0, "MoL_ODE_Method not recognized!");
+ }
+
+ CCTK_VInfo(CCTK_THORNSTRING, "Using %s as the time integrator.", infoline);
+
+ free(infoline);
+ infoline = NULL;
+
+ return;
+
+}
+
+ /*@@
+ @routine MoL_FreeIndexArrays
+ @date Mon Jun 3 13:26:15 2002
+ @author Ian Hawke
+ @desc
+ Frees the external index arrays.
+ These arrays are defined in the external file
+ @seefile ExternalVariables.h
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_FreeIndexArrays()
+{
+
+ if (EvolvedVariableIndex)
+ {
+ free(EvolvedVariableIndex);
+ EvolvedVariableIndex = NULL;
+ }
+
+ if (RHSVariableIndex)
+ {
+ free(RHSVariableIndex);
+ RHSVariableIndex = NULL;
+ }
+
+ if (ConstrainedVariableIndex)
+ {
+ free(ConstrainedVariableIndex);
+ ConstrainedVariableIndex = NULL;
+ }
+
+ if (SandRVariableIndex)
+ {
+ free(SandRVariableIndex);
+ SandRVariableIndex = NULL;
+ }
+
+ return;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/InitialCopy.c b/src/InitialCopy.c
new file mode 100644
index 0000000..9d3c19a
--- /dev/null
+++ b/src/InitialCopy.c
@@ -0,0 +1,312 @@
+ /*@@
+ @file InitialCopy.c
+ @date Sun May 26 04:43:06 2002
+ @author Ian Hawke
+ @desc
+ Performs the initial copy from the previous timelevel to the
+ current. This is required because the driver has rotated the
+ timelevels, but the physics thorns are expecting data in the
+ current.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_InitialCopy_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_InitialCopy(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+void MoL_InitialCopy(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_PARAMETERS
+
+ CCTK_INT var;
+ CCTK_INT index;
+ CCTK_INT i,j,k;
+ CCTK_INT totalsize;
+
+ CCTK_REAL *CurrentVar;
+ CCTK_REAL *PreviousVar;
+ CCTK_REAL *ScratchVar;
+ CCTK_INT StorageOn;
+
+ totalsize = cctk_lsh[0]*cctk_lsh[1]*cctk_lsh[2];
+
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+
+ StorageOn = CCTK_QueryGroupStorage(cctkGH,
+ CCTK_GroupNameFromVarI(EvolvedVariableIndex[var]));
+
+ if (StorageOn < 0)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for index %i",
+ EvolvedVariableIndex[var]);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ else if (StorageOn == 0) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for GF %s",
+ CCTK_VarName(EvolvedVariableIndex[var]));
+ CCTK_WARN(0, "The grid function does not have storage assigned.");
+ }
+
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ EvolvedVariableIndex[var]);
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ /*
+ if (EvolvedVariableIndex[var] == CCTK_VarIndex("adm_bssn::ADM_BS_gxx"))
+ {
+ printf("Initial copy: Pointer to time levels %ld %ld\n",PreviousVar,
+ CurrentVar);
+ printf("Level %d:First point of first two levels is %g and %g.\n",
+ cctk_levfac[0],PreviousVar[0],CurrentVar[0]);
+ }
+ */
+ if (PreviousVar && CurrentVar)
+ {
+ memcpy(CurrentVar, PreviousVar, totalsize * sizeof(CCTK_REAL));
+ }
+ else
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"MoL","Null pointer for variable %s",
+ CCTK_VarName(EvolvedVariableIndex[var]));
+ }
+
+ /*
+ // if (EvolvedVariableIndex[var] == CCTK_VarIndex("adm_bssn::adm_bs_gxx"))
+ if (EvolvedVariableIndex[var] == CCTK_VarIndex("wavetoymol::phi"))
+ {
+ printf("Init copy: Lev %d Current %g.\n",cctk_levfac[0],
+ CurrentVar[0]);
+ }
+ */
+ }
+
+ /*
+ Now the Save and Restore variables. Shift the data in the
+ current level to the scratch space, then do the copy
+ */
+
+ for (var = 0; var < MoLNumSandRVariables; var++)
+ {
+
+ StorageOn = CCTK_QueryGroupStorage(cctkGH,
+ CCTK_GroupNameFromVarI(SandRVariableIndex[var]));
+
+ if (StorageOn < 0)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for index %i",
+ SandRVariableIndex[var]);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ else if (StorageOn == 0) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for GF %s",
+ CCTK_VarName(SandRVariableIndex[var]));
+ CCTK_WARN(0, "The grid function does not have storage assigned.");
+ }
+
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ SandRVariableIndex[var]);
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ SandRVariableIndex[var]);
+ /* ScratchVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ SandRScratchSpace[var]);
+ */
+ ScratchVar = &SandRScratchSpace[var*totalsize];
+ /*
+ printf("Pointers for the SandR vars are to %ld, %ld and %ld.\n",
+ PreviousVar, CurrentVar, ScratchVar);
+
+ printf("Init1:Variable %s, current %g, previous %g, scratch %g\n",
+ CCTK_VarName(SandRVariableIndex[var]), CurrentVar[0],
+ PreviousVar[0], ScratchVar[0]);
+ */
+ if (PreviousVar && CurrentVar && ScratchVar)
+ {
+ memcpy(ScratchVar, CurrentVar, totalsize * sizeof(CCTK_REAL));
+ memcpy(CurrentVar, PreviousVar, totalsize * sizeof(CCTK_REAL));
+ }
+ else
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"MoL","Null pointer for variable %s",
+ CCTK_VarName(SandRScratchSpace[var]));
+ }
+ /*
+ printf("Init2:Variable %s, current %g, previous %g, scratch %g\n",
+ CCTK_VarName(SandRVariableIndex[var]), CurrentVar[0],
+ PreviousVar[0], ScratchVar[0]);
+ */
+ }
+
+ /*
+ Now do the constrained variables.
+ */
+
+ for (var = 0; var < MoLNumConstrainedVariables; var++)
+ {
+
+ StorageOn = CCTK_QueryGroupStorage(cctkGH,
+ CCTK_GroupNameFromVarI(ConstrainedVariableIndex[var]));
+
+ if (StorageOn < 0)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for index %i",
+ ConstrainedVariableIndex[var]);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+ else if (StorageOn == 0) {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for GF %s",
+ CCTK_VarName(ConstrainedVariableIndex[var]));
+ CCTK_WARN(0, "The grid function does not have storage assigned.");
+ }
+
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ ConstrainedVariableIndex[var]);
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ ConstrainedVariableIndex[var]);
+
+ if (PreviousVar && CurrentVar)
+ {
+ memcpy(CurrentVar, PreviousVar, totalsize * sizeof(CCTK_REAL));
+ }
+ else
+ {
+ CCTK_VWarn(0,__LINE__,__FILE__,"MoL","Null pointer for variable %s",
+ CCTK_VarName(ConstrainedVariableIndex[var]));
+ }
+
+ }
+
+ return;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
+
+/*
+Hack
+*/
+
+void MoL_FillAllLevels(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS
+ DECLARE_CCTK_PARAMETERS
+
+ CCTK_INT var, level;
+ CCTK_INT totalsize;
+
+ CCTK_REAL *CurrentVar;
+ CCTK_REAL *PreviousVar;
+
+ totalsize = cctk_lsh[0]*cctk_lsh[1]*cctk_lsh[2];
+
+// printf("\n\n Fill all levels \n\n");
+
+
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ for (level = 1; level < CCTK_NumTimeLevelsFromVarI(EvolvedVariableIndex[var]); level++)
+ {
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, level,
+ EvolvedVariableIndex[var]);
+ if (PreviousVar)
+ {
+ memcpy(PreviousVar, CurrentVar, totalsize * sizeof(CCTK_REAL));
+ }
+ /*
+ if (EvolvedVariableIndex[var] == CCTK_VarIndex("wavetoymol::phi"))
+ {
+ printf("All levels copy: Lev %d tl %d Current %g.\n",cctk_levfac[0],
+ level,PreviousVar[0]);
+ }
+ */
+ }
+ }
+
+
+ for (var = 0; var < MoLNumConstrainedVariables; var++)
+ {
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ ConstrainedVariableIndex[var]);
+ for (level = 1; level < CCTK_QueryGroupStorage(cctkGH,
+ CCTK_GroupNameFromVarI(ConstrainedVariableIndex[var])); level++)
+ {
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, level,
+ ConstrainedVariableIndex[var]);
+ if (PreviousVar)
+ {
+ memcpy(CurrentVar, PreviousVar, totalsize * sizeof(CCTK_REAL));
+ }
+ }
+ }
+
+
+ for (var = 0; var < MoLNumSandRVariables; var++)
+ {
+ CurrentVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ SandRVariableIndex[var]);
+ for (level = 1; level < CCTK_QueryGroupStorage(cctkGH,
+ CCTK_GroupNameFromVarI(SandRVariableIndex[var])); level++)
+ {
+ PreviousVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, level,
+ SandRVariableIndex[var]);
+ if (PreviousVar)
+ {
+ memcpy(CurrentVar, PreviousVar, totalsize * sizeof(CCTK_REAL));
+ }
+ }
+ }
+
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "The maximum number of evolved variables is %d. %d are registered",
+ MoL_Num_Evolved_Vars,MoLNumEvolvedVariables);
+
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "The maximum number of constrained variables is %d. %d are registered",
+ MoL_Num_Constrained_Vars,MoLNumConstrainedVariables);
+
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "The maximum number of SandR variables is %d. %d are registered",
+ MoL_Num_SaveAndRestore_Vars,MoLNumSandRVariables);
+
+
+ return;
+}
diff --git a/src/MoL.h b/src/MoL.h
new file mode 100644
index 0000000..2135870
--- /dev/null
+++ b/src/MoL.h
@@ -0,0 +1,51 @@
+ /*@@
+ @file MoL.h
+ @date Thu Jun 13 22:17:32 2002
+ @author Ian Hawke
+ @desc
+ A header file with the definitions of the functions to be
+ called by other thorns. This will exist until the function
+ aliasing is sorted out.
+ @enddesc
+ @@*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MOL_ACTIVE
+#define MOL_ACTIVE
+#endif
+
+#ifdef CCODE
+
+CCTK_INT MoL_RegisterEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+CCTK_INT MoL_RegisterConstrained(CCTK_INT ConstrainedIndex);
+CCTK_INT MoL_RegisterSaveAndRestore(CCTK_INT SandRIndex);
+CCTK_INT MoL_ChangeToEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+CCTK_INT MoL_ChangeToConstrained(CCTK_INT ConstrainedIndex);
+CCTK_INT MoL_ChangeToSaveAndRestore(CCTK_INT SandRIndex);
+CCTK_INT MoL_ChangeToNone(CCTK_INT RemoveIndex);
+CCTK_INT MoL_RegisterEvolvedGroup(CCTK_INT EvolvedGroupIndex,
+ CCTK_INT RHSGroupIndex);
+CCTK_INT MoL_RegisterConstrainedGroup(CCTK_INT ConstrainedGroupIndex);
+CCTK_INT MoL_RegisterSaveAndRestoreGroup(CCTK_INT SandRGroupIndex);
+
+/* Old functions from MoL1 for compatibility */
+
+CCTK_INT MoL_RegisterVar(CCTK_INT molvarindex,CCTK_INT molrhsvarindex);
+CCTK_INT MoL_RegisterPrimitive(CCTK_INT primitiveindex);
+CCTK_INT MoL_RegisterDepends(CCTK_INT dependsindex);
+CCTK_INT MoL_RegisterVarGroup(CCTK_INT groupindex,CCTK_INT rhsgroupindex);
+CCTK_INT MoL_RegisterPrimitiveGroup(CCTK_INT groupindex);
+CCTK_INT MoL_RegisterDependsGroup(CCTK_INT groupindex);
+CCTK_INT MoL_ChangeVarToEvolved(CCTK_INT varindex, CCTK_INT rhsindex);
+CCTK_INT MoL_ChangeVarToDependent(CCTK_INT dependsindex);
+CCTK_INT MoL_ChangeVarToPrimitive(CCTK_INT primitiveindex);
+CCTK_INT MoL_ChangeVarToNone(CCTK_INT removeindex);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/MoLFunctions.h b/src/MoLFunctions.h
new file mode 100644
index 0000000..9f99e73
--- /dev/null
+++ b/src/MoLFunctions.h
@@ -0,0 +1,27 @@
+ /*@@
+ @file MoLFunctions.h
+ @date Thu Jun 13 22:17:32 2002
+ @author Ian Hawke
+ @desc
+ A header file with the definitions of the functions to be
+ called by other thorns. This will exist until the function
+ aliasing is sorted out.
+ @enddesc
+ @@*/
+
+#ifndef MOL_FUNCTIONS_H
+#define MOL_FUNCTIONS_H
+
+CCTK_INT MoL_RegisterEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+CCTK_INT MoL_RegisterConstrained(CCTK_INT ConstrainedIndex);
+CCTK_INT MoL_RegisterSaveAndRestore(CCTK_INT SandRIndex);
+CCTK_INT MoL_ChangeToEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+CCTK_INT MoL_ChangeToConstrained(CCTK_INT ConstrainedIndex);
+CCTK_INT MoL_ChangeToSaveAndRestore(CCTK_INT SandRIndex);
+CCTK_INT MoL_ChangeToNone(CCTK_INT RemoveIndex);
+CCTK_INT MoL_RegisterEvolvedGroup(CCTK_INT EvolvedGroupIndex,
+ CCTK_INT RHSGroupIndex);
+CCTK_INT MoL_RegisterConstrainedGroup(CCTK_INT ConstrainedGroupIndex);
+CCTK_INT MoL_RegisterSaveAndRestoreGroup(CCTK_INT SandRGroupIndex);
+
+#endif
diff --git a/src/ParamCheck.c b/src/ParamCheck.c
new file mode 100644
index 0000000..87ac4ca
--- /dev/null
+++ b/src/ParamCheck.c
@@ -0,0 +1,84 @@
+ /*@@
+ @file ParamCheck.c
+ @date Mon May 20 09:50:55 2002
+ @author Ian Hawke
+ @desc
+ Basic parameter checking for thorn MoL.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_ParamCheck_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+int ParamCheck(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_ParamCheck
+ @date Mon May 20 09:56:05 2002
+ @author Ian Hawke
+ @desc
+ Basic parameter checking.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_ParamCheck(CCTK_ARGUMENTS)
+{
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ if (CCTK_Equals(MoL_ODE_Method, "Generic"))
+ {
+ if (MoL_Num_Scratch_Levels < MoL_Intermediate_Steps - 1)
+ {
+ CCTK_PARAMWARN("When using a generic solver the number of scratch levels must be at least the number of intermediate steps - 1");
+ }
+ }
+
+ if ( (CCTK_Equals(MoL_ODE_Method, "RK2"))&&(!(MoL_Intermediate_Steps == 2)) )
+ {
+ CCTK_PARAMWARN("When using the efficient RK2 evolver the number of intermediate steps must be 2");
+ }
+
+ return 0;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/RK2.c b/src/RK2.c
new file mode 100644
index 0000000..34aa068
--- /dev/null
+++ b/src/RK2.c
@@ -0,0 +1,140 @@
+ /*@@
+ @file RK2.c
+ @date Sun May 26 04:13:45 2002
+ @author Ian Hawke
+ @desc
+ A specialized second order Runge-Kutta time integrator. This is
+ the integrator that Shu refers to as the optimal TVD second
+ order method (see reference in documentation). It is equivalent
+ to Heun's predictor-corrector method, or the MacCormack method.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_RK2_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_RK2Add(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_RK2Add
+ @date Sun May 26 04:17:23 2002
+ @author Ian Hawke
+ @desc
+ Performs second order Runge-Kutta time integration.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_RK2Add(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT index, var;
+ CCTK_INT totalsize;
+ CCTK_REAL *OldVar;
+ CCTK_REAL *UpdateVar;
+ CCTK_REAL *RHSVar;
+
+ /*
+ printf("Inside RK2.\nStep %d.\nRefinement %d.\nTimestep %g.\nSpacestep %g.\nTime %g\n",
+ MoL_Intermediate_Steps - *MoL_Intermediate_Step + 1,
+ *cctk_levfac,
+ cctk_delta_time,
+ CCTK_DELTA_SPACE(0),
+ cctk_time);
+ */
+
+ totalsize = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];
+
+ switch (*MoL_Intermediate_Step)
+ {
+
+ case 2:
+ {
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+ UpdateVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ RHSVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ RHSVariableIndex[var]);
+
+ for (index = 0; index < totalsize; index++)
+ {
+ UpdateVar[index] += CCTK_DELTA_TIME * RHSVar[index];
+ }
+ }
+ break;
+ }
+ case 1:
+ {
+ for (var = 0; var < MoLNumEvolvedVariables; var++)
+ {
+ OldVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 1,
+ EvolvedVariableIndex[var]);
+ UpdateVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ EvolvedVariableIndex[var]);
+ RHSVar = (CCTK_REAL*)CCTK_VarDataPtrI(cctkGH, 0,
+ RHSVariableIndex[var]);
+
+ for (index = 0; index < totalsize; index++)
+ {
+ UpdateVar[index] = 0.5 * (OldVar[index] + UpdateVar[index]) +
+ CCTK_DELTA_TIME * RHSVar[index];
+ }
+ }
+ break;
+ }
+ default:
+ {
+ CCTK_WARN(0, "RK2 expects MoL_Intermediate_Step to be in [1,2]. This should be caught at ParamCheck - bug Ian!");
+ break;
+ }
+
+ }
+
+ return;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/RKCoefficients.c b/src/RKCoefficients.c
new file mode 100644
index 0000000..dae0361
--- /dev/null
+++ b/src/RKCoefficients.c
@@ -0,0 +1,159 @@
+ /*@@
+ @file RKCoefficients.c
+ @date Tue May 21 02:46:51 2002
+ @author Ian Hawke
+ @desc
+ The routine setting up the coefficients for the generic Runge-Kutta
+ style integrator. At some point this should be extended so that
+ these can be set from the parameter file.
+ @version $Header$
+ @enddesc
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_RKCoefficients_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+int MoL_SetupRKCoefficients(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_SetupRKCoefficients
+ @date Tue May 21 02:49:06 2002
+ @author Ian Hawke
+ @desc
+ Sets up the coefficients of the RKAlpha and Beta arrays. These
+ are currently set "by hand" for the Runge-Kutta and generic ICN
+ methods. Should add the ability to set from a parameter file.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_SetupRKCoefficients(CCTK_ARGUMENTS)
+{
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT i, j;
+
+ if (CCTK_Equals(Generic_Type,"ICN"))
+ {
+ for (i = 0; i < MoL_Intermediate_Steps; i++)
+ {
+ RKAlphaCoefficients[i * MoL_Intermediate_Steps] = 1.0;
+ for (j = 1; j < MoL_Num_Scratch_Levels + 1; j++)
+ {
+ RKAlphaCoefficients[i * MoL_Intermediate_Steps + j] = 0.0;
+ }
+ if (i == MoL_Intermediate_Steps-1)
+ {
+ RKBetaCoefficients[i] = 1.0;
+ }
+ else
+ {
+ RKBetaCoefficients[i] = 0.5;
+ }
+ }
+ }
+ else if (CCTK_Equals(Generic_Type,"RK"))
+ {
+ if (MoL_Num_Scratch_Levels < MoL_Intermediate_Steps - 1)
+ {
+ CCTK_WARN(0, "For generic RK methods, MoL_Num_Scratch_Levels should be at least MoL_Intermediate_Steps - 1");
+ }
+ for (i = 0; i < MoL_Intermediate_Steps; i++)
+ {
+ for (j = 0; j < MoL_Num_Scratch_Levels + 1; j++)
+ {
+ RKAlphaCoefficients[i * MoL_Intermediate_Steps + j] = 0.0;
+ }
+ RKBetaCoefficients[i] = 0.0;
+ }
+ if (MoL_Intermediate_Steps == 1)
+ {
+ RKAlphaCoefficients[0] = 1.0;
+ RKBetaCoefficients[0] = 1.0;
+ }
+ else if (MoL_Intermediate_Steps == 2)
+ {
+ RKAlphaCoefficients[0] = 1.0;
+ RKAlphaCoefficients[2] = 0.5;
+ RKAlphaCoefficients[3] = 0.5;
+ RKBetaCoefficients[0] = 1.0;
+ RKBetaCoefficients[1] = 0.5;
+
+ }
+ else if (MoL_Intermediate_Steps == 3)
+ {
+ RKAlphaCoefficients[0] = 1.0;
+ RKAlphaCoefficients[3] = 0.75;
+ RKAlphaCoefficients[4] = 0.25;
+ RKAlphaCoefficients[6] = 1.0 / 3.0;
+ RKAlphaCoefficients[8] = 2.0 / 3.0;
+ RKBetaCoefficients[0] = 1.0;
+ RKBetaCoefficients[1] = 0.25;
+ RKBetaCoefficients[2] = 2.0 / 3.0;
+ }
+ else if (MoL_Intermediate_Steps == 4)
+ {
+ RKAlphaCoefficients[0] = 1.0;
+ RKAlphaCoefficients[4] = 1.0;
+ RKAlphaCoefficients[8] = 1.0;
+ RKAlphaCoefficients[12] = -1.0 / 3.0;
+ RKAlphaCoefficients[13] = 1.0 / 3.0;
+ RKAlphaCoefficients[14] = 2.0 / 3.0;
+ RKAlphaCoefficients[15] = 1.0 / 3.0;
+ RKBetaCoefficients[0] = 0.5;
+ RKBetaCoefficients[1] = 0.5;
+ RKBetaCoefficients[2] = 1.0;
+ RKBetaCoefficients[3] = 1.0 / 6.0;
+ }
+ else
+ {
+ CCTK_WARN(0, "RKCoefficients cannot do generic RK methods with MoL_Intermediate_Steps greater than 4");
+ }
+ }
+ else
+ {
+ CCTK_WARN(0, "RKCoefficients does not recognize the value of Generic_Type");
+ }
+
+ return 0;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/Registration.c b/src/Registration.c
new file mode 100644
index 0000000..7152304
--- /dev/null
+++ b/src/Registration.c
@@ -0,0 +1,599 @@
+ /*@@
+ @file Registration.c
+ @date Thu May 30 11:21:44 2002
+ @author Ian Hawke
+ @desc
+ The external functions called (via function aliasing) by physics
+ thorns to tell MoL that they want these GFs to be treated as a
+ given type.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_Registration_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+CCTK_INT MoL_RegisterEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex);
+
+CCTK_INT MoL_RegisterConstrained(CCTK_INT ConstrainedIndex);
+
+CCTK_INT MoL_RegisterSaveAndRestore(CCTK_INT SandRIndex);
+
+CCTK_INT MoL_RegisterEvolvedGroup(CCTK_INT EvolvedGroupIndex,
+ CCTK_INT RHSGroupIndex);
+
+CCTK_INT MoL_RegisterConstrainedGroup(CCTK_INT ConstrainedGroupIndex);
+
+CCTK_INT MoL_RegisterSaveAndRestoreGroup(CCTK_INT SandRGroupIndex);
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_RegisterEvolved
+ @date Thu May 30 11:36:59 2002
+ @author Ian Hawke
+ @desc
+ Given the index of the GF to be evolved and the RHS GF, it stores
+ the indexes for later use together with various error checking.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_RegisterEvolved(CCTK_INT EvolvedIndex, CCTK_INT RHSIndex)
+{
+
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT ierr, index, varused, numtimelevs1, numtimelevs2;
+
+ /*
+ printf("Arrived in MoLRegisterEvolved \n");
+ printf("The indexes are %d and %d.\n",EvolvedIndex, RHSIndex);
+ printf("These correspond to variables %s and %s.\n",
+ CCTK_VarName(EvolvedIndex),CCTK_VarName(RHSIndex));
+ printf("The pointer to EvolvedVariableIndex: %p\n",
+ EvolvedVariableIndex);
+ */
+
+ numtimelevs1 = CCTK_NumTimeLevelsFromVarI(EvolvedIndex);
+ numtimelevs2 = CCTK_NumTimeLevelsFromVarI(RHSIndex);
+
+ if ( (numtimelevs1 < 0) || (numtimelevs2 < 0) )
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for variable index %i", EvolvedIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+ }
+
+ if (numtimelevs1 < 2)
+ {
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for variable index %i name %s", EvolvedIndex, CCTK_VarName(EvolvedIndex));
+ CCTK_WARN(0, "The GF passed only has one timelevel. It must have at least two.");
+ }
+
+ varused = 0;
+
+ for (index = 0; (index < MoLNumEvolvedVariables)&&(!varused); index++)
+ {
+ varused = (EvolvedIndex == EvolvedVariableIndex[index]);
+ /*
+ printf("Registering %d. Checking index %d which is %d\n",EvolvedIndex,
+ index,EvolvedVariableIndex[index]);
+ */
+ }
+
+ if (varused)
+ {
+
+ CCTK_VWarn(2,__LINE__,__FILE__,"MoL",
+ "The GF %s has already been registered as an evolved variable with RHS GF %s. The attempt to register with RHS GF %s will be ignored",
+ CCTK_VarName(EvolvedIndex),
+ CCTK_VarName(RHSVariableIndex[index-1]),
+ CCTK_VarName(RHSIndex));
+
+ }
+ else
+ {
+
+ EvolvedVariableIndex[MoLNumEvolvedVariables] = EvolvedIndex;
+ RHSVariableIndex[MoLNumEvolvedVariables] = RHSIndex;
+
+ MoLNumEvolvedVariables++;
+
+ if (MoLNumEvolvedVariables > MoL_Num_Evolved_Vars)
+ {
+ CCTK_WARN(0,"You have tried to register more evolved variables than the accumulator parameter MoL_Num_Evolved_Variables allows. Check that you are accumulating onto this parameter correctly");
+ }
+
+ }
+
+ varused = 0;
+
+ for (index = 0; (index < MoLNumConstrainedVariables)&&(!varused); index++)
+ {
+ varused = (EvolvedIndex == ConstrainedVariableIndex[index]);
+ }
+
+ if (varused)
+ {
+ for (index = varused; index < MoLNumConstrainedVariables-1; index++)
+ {
+ ConstrainedVariableIndex[index] = ConstrainedVariableIndex[index+1];
+ }
+ MoLNumConstrainedVariables--;
+ }
+
+ varused = 0;
+
+ for (index = 0; (index < MoLNumSandRVariables)&&(!varused); index++)
+ {
+ varused = (EvolvedIndex == SandRVariableIndex[index]);
+ }
+
+ if (varused)
+ {
+ for (index = varused; index < MoLNumSandRVariables-1; index++)
+ {
+ SandRVariableIndex[index] = SandRVariableIndex[index+1];
+ }
+ MoLNumSandRVariables--;
+ }
+
+ return 0;
+
+}
+
+ /*@@
+ @routine MoL_RegisterConstrained
+ @date Thu May 30 12:35:58 2002
+ @author Ian Hawke
+ @desc
+ Given the index of the GF, register it as a constrained variable.
+ If there's only one timelevel then ignore it as there will be no
+ rotation and so MoL doesn't have to do anything.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_RegisterConstrained(CCTK_INT ConstrainedIndex)
+{
+
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT numtimelevs, varused, evolved, index;
+
+ numtimelevs = CCTK_NumTimeLevelsFromVarI(ConstrainedIndex);
+
+ if (numtimelevs < 1) {
+
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for constrained variable index %i", ConstrainedIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+
+ }
+ else if (numtimelevs > 1) {
+
+ varused = 0;
+
+ for (evolved = 0; (evolved < MoLNumEvolvedVariables)&&(!varused); evolved++)
+ {
+ varused = (EvolvedVariableIndex[evolved] == ConstrainedIndex);
+ }
+
+ for (evolved = 0; (evolved < MoLNumConstrainedVariables)&&(!varused); evolved++)
+ {
+ varused = (ConstrainedVariableIndex[evolved] == ConstrainedIndex);
+ }
+
+ if (!varused)
+ {
+ ConstrainedVariableIndex[MoLNumConstrainedVariables] = ConstrainedIndex;
+ MoLNumConstrainedVariables++;
+
+ if (MoLNumConstrainedVariables > MoL_Num_Constrained_Vars)
+ {
+ CCTK_WARN(0,"You have tried to register more evolved variables than the accumulator parameter MoL_Num_Evolved_Variables allows. Check that you are accumulating onto this parameter correctly");
+ }
+
+ }
+
+ varused = 0;
+
+ for (evolved = 0; (evolved < MoLNumSandRVariables)&&(!varused); evolved++)
+ {
+ varused = (SandRVariableIndex[evolved] == ConstrainedIndex);
+ }
+
+ if (varused)
+ {
+ for (index = evolved; index < MoLNumSandRVariables-1; index++)
+ {
+ SandRVariableIndex[index] = SandRVariableIndex[index+1];
+ }
+ MoLNumSandRVariables--;
+ }
+
+ }
+ else
+ {
+
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "MoL will not treat variable %s as a constrained variable at it has only one timelevel. This should not cause problems with the evolution.\n",
+ CCTK_VarName(ConstrainedIndex));
+
+ }
+
+ return 0;
+
+}
+
+ /*@@
+ @routine MoL_RegisterSaveAndRestore
+ @date Thu May 30 12:37:40 2002
+ @author Ian Hawke
+ @desc
+ Given a GF index store it for later use as a save and restore type.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+CCTK_INT MoL_RegisterSaveAndRestore(CCTK_INT SandRIndex)
+{
+
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT numtimelevs, varused, evolved;
+
+ numtimelevs = CCTK_NumTimeLevelsFromVarI(SandRIndex);
+
+ if (numtimelevs < 1) {
+
+ CCTK_VWarn(1,__LINE__,__FILE__,"MoL","Warning for save and restore variable index %i", SandRIndex);
+ CCTK_WARN(0, "The index passed does not correspond to a GF.");
+
+ }
+ else if (numtimelevs > 1) {
+
+ varused = 0;
+
+ for (evolved = 0; (evolved < MoLNumEvolvedVariables)&&(!varused); evolved++)
+ {
+ varused = (EvolvedVariableIndex[evolved] == SandRIndex);
+ }
+
+ for (evolved = 0; (evolved < MoLNumConstrainedVariables)&&(!varused); evolved++)
+ {
+ varused = (ConstrainedVariableIndex[evolved] == SandRIndex);
+ }
+
+ for (evolved = 0; (evolved < MoLNumSandRVariables)&&(!varused); evolved++)
+ {
+ varused = (SandRVariableIndex[evolved] == SandRIndex);
+ }
+
+ if (!varused)
+ {
+ SandRVariableIndex[MoLNumSandRVariables] = SandRIndex;
+ MoLNumSandRVariables++;
+
+ if (MoLNumSandRVariables > MoL_Num_SaveAndRestore_Vars)
+ {
+ CCTK_WARN(0,"You have tried to register more evolved variables than the accumulator parameter MoL_Num_Evolved_Variables allows. Check that you are accumulating onto this parameter correctly");
+ }
+
+ }
+
+ }
+ else
+ {
+
+ CCTK_VInfo(CCTK_THORNSTRING,
+ "MoL will not treat variable %s as a save and restore variable at it has only one timelevel. This should not cause problems with the evolution.\n",
+ CCTK_VarName(SandRIndex));
+
+ }
+
+ return 0;
+
+}
+
+CCTK_INT MoL_RegisterEvolvedGroup(CCTK_INT EvolvedGroupIndex,
+ CCTK_INT RHSGroupIndex)
+{
+
+ CCTK_INT EvolvedGroupFirstVar, RHSGroupFirstVar, GroupNumVars, retval;
+ CCTK_INT EvolvedVar, RHSVar;
+
+ EvolvedGroupFirstVar = CCTK_FirstVarIndexI(EvolvedGroupIndex);
+ if (EvolvedGroupFirstVar < 0)
+ {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Evolved group index %i is not a real group index.",
+ EvolvedGroupIndex);
+ }
+
+ RHSGroupFirstVar = CCTK_FirstVarIndexI(RHSGroupIndex);
+ if (RHSGroupFirstVar < 0)
+ {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "RHS group index %d is not a real group index.",
+ RHSGroupIndex);
+ }
+
+ GroupNumVars = CCTK_NumVarsInGroupI(EvolvedGroupIndex);
+ if (CCTK_NumVarsInGroupI(RHSGroupIndex) != GroupNumVars)
+ {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "There are a different number of variables in evolved group %d and RHS group %d.", EvolvedGroupIndex, RHSGroupIndex);
+ }
+
+ retval = 0;
+
+ for (EvolvedVar = EvolvedGroupFirstVar, RHSVar = RHSGroupFirstVar;
+ EvolvedVar < EvolvedGroupFirstVar + GroupNumVars;
+ EvolvedVar++, RHSVar++)
+ {
+ retval += MoLRegisterEvolved(EvolvedVar, RHSVar);
+ }
+
+ return retval;
+}
+
+
+CCTK_INT MoL_RegisterConstrainedGroup(CCTK_INT ConstrainedGroupIndex)
+{
+
+ CCTK_INT ConstrainedGroupFirstVar, GroupNumVars, retval;
+ CCTK_INT ConstrainedVar;
+
+ ConstrainedGroupFirstVar = CCTK_FirstVarIndexI(ConstrainedGroupIndex);
+ if (ConstrainedGroupFirstVar < 0)
+ {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Constrained group index %i is not a real group index.",
+ ConstrainedGroupIndex);
+ }
+
+ GroupNumVars = CCTK_NumVarsInGroupI(ConstrainedGroupIndex);
+
+ retval = 0;
+
+ for (ConstrainedVar = ConstrainedGroupFirstVar;
+ ConstrainedVar < ConstrainedGroupFirstVar + GroupNumVars;
+ ConstrainedVar++)
+ {
+ retval += MoLRegisterConstrained(ConstrainedVar);
+ }
+
+ return retval;
+}
+
+CCTK_INT MoL_RegisterSaveAndRestoreGroup(CCTK_INT SandRGroupIndex)
+{
+
+ CCTK_INT SandRGroupFirstVar, GroupNumVars, retval;
+ CCTK_INT SandRVar;
+
+ SandRGroupFirstVar = CCTK_FirstVarIndexI(SandRGroupIndex);
+ if (SandRGroupFirstVar < 0)
+ {
+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Save and Restore group index %i is not a real group index.",
+ SandRGroupIndex);
+ }
+
+ GroupNumVars = CCTK_NumVarsInGroupI(SandRGroupIndex);
+
+ retval = 0;
+
+ for (SandRVar = SandRGroupFirstVar;
+ SandRVar < SandRGroupFirstVar + GroupNumVars;
+ SandRVar++)
+ {
+ retval += MoLRegisterSaveAndRestore(SandRVar);
+ }
+
+ return retval;
+}
+
+/*
+ Old function names. Just calls the new version.
+ Included for compatibility
+*/
+
+CCTK_INT MoL_RegisterVar(CCTK_INT molvarindex,CCTK_INT molrhsvarindex)
+{
+ return MoL_RegisterEvolved(molvarindex, molrhsvarindex);
+}
+
+CCTK_INT MoL_RegisterPrimitive(CCTK_INT primitiveindex)
+{
+ return MoL_RegisterConstrained(primitiveindex);
+}
+
+CCTK_INT MoL_RegisterDepends(CCTK_INT dependsindex)
+{
+ return MoL_RegisterSaveAndRestore(dependsindex);
+}
+
+CCTK_INT MoL_RegisterVarGroup(CCTK_INT groupindex,CCTK_INT rhsgroupindex)
+{
+ return MoL_RegisterEvolvedGroup(groupindex, rhsgroupindex);
+}
+
+CCTK_INT MoL_RegisterPrimitiveGroup(CCTK_INT groupindex)
+{
+ return MoL_RegisterConstrainedGroup(groupindex);
+}
+
+CCTK_INT MoL_RegisterDependsGroup(CCTK_INT groupindex)
+{
+ return MoL_RegisterConstrainedGroup(groupindex);
+}
+
+CCTK_INT MoL_ChangeVarToEvolved(CCTK_INT varindex, CCTK_INT rhsindex)
+{
+ return MoL_ChangeToEvolved(varindex, rhsindex);
+}
+
+CCTK_INT MoL_ChangeVarToDependent(CCTK_INT dependsindex)
+{
+ return MoL_ChangeToSaveAndRestore(dependsindex);
+}
+
+CCTK_INT MoL_ChangeVarToPrimitive(CCTK_INT primitiveindex)
+{
+ return MoL_ChangeToConstrained(primitiveindex);
+}
+
+CCTK_INT MoL_ChangeVarToNone(CCTK_INT removeindex)
+{
+ return MoL_ChangeToNone(removeindex);
+}
+
+/*
+ Fortran wrappers for the above functions.
+ Should be replaced by using function aliasing eventually.
+*/
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterEvolved)(int *ierr,
+ CCTK_INT *EvolvedIndex,
+ CCTK_INT *RHSIndex)
+{
+ *ierr = MoL_RegisterEvolved(*EvolvedIndex, *RHSIndex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterConstrained)(int *ierr,
+ CCTK_INT *EvolvedIndex)
+{
+ *ierr = MoL_RegisterConstrained(*EvolvedIndex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterSaveAndRestore)(int *ierr,
+ CCTK_INT *EvolvedIndex)
+{
+ *ierr = MoL_RegisterSaveAndRestore(*EvolvedIndex);
+ return;
+}
+
+/* And for MoL compatibility... */
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterVar)(int *ierr,
+ CCTK_INT *molvarindex,
+ CCTK_INT *molrhsvarindex)
+{
+ *ierr = MoL_RegisterVar(*molvarindex, *molrhsvarindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterDepends)(int *ierr,
+ CCTK_INT *moldependsindex)
+{
+ *ierr = MoL_RegisterDepends(*moldependsindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterPrimitive)(int *ierr,
+ CCTK_INT *molprimitiveindex)
+{
+ *ierr = MoL_RegisterPrimitive(*molprimitiveindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterVarGroup)(int *ierr,
+ CCTK_INT *groupindex,
+ CCTK_INT *rhsgroupindex)
+{
+ *ierr = MoL_RegisterVarGroup(*groupindex, *rhsgroupindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterPrimitiveGroup)(int *ierr,
+ CCTK_INT *groupindex)
+{
+ *ierr = MoL_RegisterPrimitiveGroup(*groupindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_RegisterDependsGroup)(int *ierr,
+ CCTK_INT *groupindex)
+{
+ *ierr = MoL_RegisterDependsGroup(*groupindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeVarToEvolved)(int *ierr,
+ CCTK_INT *varindex,
+ CCTK_INT *rhsindex)
+{
+ *ierr = MoL_ChangeVarToEvolved(*varindex, *rhsindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeVarToDependent)(int *ierr,
+ CCTK_INT *dependsindex)
+{
+ *ierr = MoL_ChangeVarToDependent(*dependsindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeVarToPrimitive)(int *ierr,
+ CCTK_INT *primitiveindex)
+{
+ *ierr = MoL_ChangeVarToPrimitive(*primitiveindex);
+ return;
+}
+
+void CCTK_FCALL CCTK_FNAME(MoL_ChangeVarToNone)(int *ierr,
+ CCTK_INT *removeindex)
+{
+ *ierr = MoL_ChangeVarToNone(*removeindex);
+ return;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/SandR.c b/src/SandR.c
new file mode 100644
index 0000000..733eee8
--- /dev/null
+++ b/src/SandR.c
@@ -0,0 +1,109 @@
+ /*@@
+ @file SandR.c
+ @date Sun May 26 03:35:58 2002
+ @author Ian Hawke
+ @desc
+ Restores the Save and Restore variables to their original positions.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_SandR_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+void MoL_RestoreSandR(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_RestoreSandR
+ @date Sun May 26 03:39:02 2002
+ @author Ian Hawke
+ @desc
+ Save and Restore variables are those that the physics thorn may
+ need to know to calculate the RHS, but which may be evolved by
+ something other than MoL. In order to get the timelevels correct,
+ the previous timelevel is copied to the current before the MoL step.
+ As we do not know whether the variable will be evolved before or
+ after MoL we must save the data that was in the current timelevel,
+ and then restore it at the end of the MoL timestep. This routine
+ restores the variables.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+void MoL_RestoreSandR(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_INT index, var;
+ CCTK_INT totalsize;
+ CCTK_INT vectorstart;
+ CCTK_REAL *SandRDataArray;
+
+ totalsize = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];
+
+ for (var = 0; var < MoLNumSandRVariables; var++)
+ {
+
+ SandRDataArray = (CCTK_REAL *)CCTK_VarDataPtrI(cctkGH, 0,
+ SandRVariableIndex[var]);
+
+ vectorstart = var * totalsize;
+ /*
+ printf("Restore:Variable %s, first entry %g, scratch %g\n",
+ CCTK_VarName(SandRVariableIndex[var]), SandRDataArray[0], SandRScratchSpace[vectorstart]);
+ */
+ /*
+ for (index = 0; index < totalsize; index++)
+ {
+ SandRDataArray[index] = SandRScratchSpace[vectorstart + index];
+ }
+ */
+ memcpy(SandRDataArray, &SandRScratchSpace[vectorstart],
+ totalsize * sizeof(CCTK_REAL));
+ }
+
+ return;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/SetTime.c b/src/SetTime.c
new file mode 100644
index 0000000..be06650
--- /dev/null
+++ b/src/SetTime.c
@@ -0,0 +1,231 @@
+ /*@@
+ @file SetTime.c
+ @date Mon May 20 09:45:45 2002
+ @author Ian Hawke
+ @desc
+ Sets the time and dt depending on the ODE method and
+ position in the loop.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_SetTime_c);
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+int MoL_SetTime(CCTK_ARGUMENTS);
+
+int MoL_ResetTime(CCTK_ARGUMENTS);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_SetTime
+ @date Mon May 20 09:48:55 2002
+ @author Ian Hawke
+ @desc
+ Sets the time and timestep before the MoL evolution loop starts.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_SetTime(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+ /*
+ CCTK_INT i,j,k;
+ CCTK_REAL *Var0,*Var1,*Var2;
+
+ Var0 = (CCTK_REAL*)CCTK_VarDataPtr(cctkGH, 0,
+ "wavetoymol::phi");
+ Var1 = (CCTK_REAL*)CCTK_VarDataPtr(cctkGH, 1,
+ "wavetoymol::phi");
+ Var2 = (CCTK_REAL*)CCTK_VarDataPtr(cctkGH, 2,
+ "wavetoymol::phi");
+ printf("Grid %d: Pointer to time levels %ld %ld %ld\n",
+ cctkGH->cctk_levfac[0], Var0,Var1,Var2);
+ printf("First point of first two levels is %g and %g.\n",
+ Var0[0],Var1[0]);*/
+ /*
+ for (k=0;k<cctk_lsh[2];k++)
+ {
+ for (j=0;j<cctk_lsh[1];j++)
+ {
+ for (i=0;i<cctk_lsh[0];i++)
+ {
+ printf("Set time: %d %d %d %d %g\n", cctk_levfac[0],
+ i, j, k,
+ Var1[CCTK_GFINDEX3D(cctkGH, i, j, k)]);
+ }
+ }
+ }*/
+
+
+ *Original_Time = cctkGH->cctk_time;
+ *Original_Delta_Time = cctkGH->CCTK_DELTA_TIME;
+ cctkGH->cctk_time -= cctkGH->CCTK_DELTA_TIME;
+ /*
+ CCTK_VInfo(CCTK_THORNSTRING,"Original time was %g. Reset to %g",
+ *Original_Time,cctkGH->cctk_time);
+ */
+ /* if ( (CCTK_EQUALS(MoL_ODE_Method,"ICN")) ||
+ ( (CCTK_EQUALS(MoL_ODE_Method,"Generic")) &&
+ ( (MoL_Intermediate_Steps == 4))
+ || CCTK_EQUALS(Generic_Type,"ICN") ) )*/
+ if ( (CCTK_EQUALS(MoL_ODE_Method,"ICN")) ||
+ ( (CCTK_EQUALS(MoL_ODE_Method,"Generic")) &&
+ CCTK_EQUALS(Generic_Type,"ICN") ) )
+ {
+ cctkGH->CCTK_DELTA_TIME = 0.5*(*Original_Delta_Time);
+ }
+
+ return 0;
+}
+
+ /*@@
+ @routine MoL_ResetTime
+ @date Mon May 20 09:49:41 2002
+ @author Ian Hawke
+ @desc
+ Sets the time and timestep during the MoL evolution loop.
+ At the last time all methods should end up with the original
+ values for time and timestep.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_ResetTime(CCTK_ARGUMENTS)
+{
+
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+
+ if (*MoL_Intermediate_Step == 0)
+ {
+ cctkGH->cctk_time = (*Original_Time);
+ cctkGH->CCTK_DELTA_TIME = (*Original_Delta_Time);
+ }
+ else if (*MoL_Intermediate_Step == 1)
+ {
+ if ( (CCTK_EQUALS(MoL_ODE_Method,"Generic"))
+ &&(CCTK_EQUALS(Generic_Type,"RK")) )
+ {
+ if (MoL_Intermediate_Steps == 2)
+ {
+ cctkGH->cctk_time = (*Original_Time);
+ /* cctkGH->CCTK_DELTA_TIME = 0.5 * (*Original_Delta_Time);*/
+ }
+ /* else if (MoL_Intermediate_Steps == 3)
+ {
+ cctkGH->CCTK_DELTA_TIME = 2.0 / 3.0 * (*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time) - 0.5 * (*Original_Delta_Time);
+ }
+ else if (MoL_Intermediate_Steps == 4)
+ {
+ cctkGH->CCTK_DELTA_TIME = (*Original_Delta_Time) / 6.0;
+ cctkGH->cctk_time = (*Original_Time);
+ }*/
+ }
+ else if ( ((CCTK_EQUALS(MoL_ODE_Method,"Generic"))&&
+ (CCTK_EQUALS(Generic_Type,"ICN"))) ||
+ (CCTK_EQUALS(MoL_ODE_Method,"ICN")) )
+ {
+ cctkGH->CCTK_DELTA_TIME = *Original_Delta_Time;
+ cctkGH->cctk_time = (*Original_Time)-0.5*(*Original_Delta_Time);
+ }
+ else if ( CCTK_EQUALS(MoL_ODE_Method,"RK2") )
+ {
+ cctkGH->CCTK_DELTA_TIME = 0.5 * (*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time);
+ }
+ }
+ else if (*MoL_Intermediate_Step == 2)
+ {
+ if ( (CCTK_EQUALS(MoL_ODE_Method,"Generic"))
+ &&(CCTK_EQUALS(Generic_Type,"RK")) )
+ {
+ /* if (MoL_Intermediate_Steps == 3)
+ {
+ cctkGH->CCTK_DELTA_TIME = 0.25 * (*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time);
+ }
+ else if (MoL_Intermediate_Steps == 4)
+ {
+ cctkGH->CCTK_DELTA_TIME = (*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time);
+ }*/
+ }
+ else if ( ((CCTK_EQUALS(MoL_ODE_Method,"Generic"))&&
+ (CCTK_EQUALS(Generic_Type,"ICN"))) ||
+ (CCTK_EQUALS(MoL_ODE_Method,"ICN")) )
+ {
+ cctkGH->CCTK_DELTA_TIME = 0.5*(*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time)-0.5*(*Original_Delta_Time);
+ }
+ }
+ else if (*MoL_Intermediate_Step == 3)
+ {
+ /* if ( (CCTK_EQUALS(MoL_ODE_Method,"Generic"))
+ &&(CCTK_EQUALS(Generic_Type,"RK")) )
+ {
+ if (MoL_Intermediate_Steps == 4)
+ {
+ cctkGH->CCTK_DELTA_TIME = 0.5 * (*Original_Delta_Time);
+ cctkGH->cctk_time = (*Original_Time) - 0.5 * (*Original_Delta_Time);
+ }
+ }*/
+ }
+ /*
+ CCTK_VInfo(CCTK_THORNSTRING,"Time has been reset to %g",
+ cctkGH->cctk_time);
+ */
+ /*
+ printf("MoL has once more reset t: %f: and dt: %f.\n", cctkGH->cctk_time,
+ cctkGH->CCTK_DELTA_TIME);
+ */
+
+ return 0;
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/Startup.c b/src/Startup.c
new file mode 100644
index 0000000..096d6b0
--- /dev/null
+++ b/src/Startup.c
@@ -0,0 +1,89 @@
+ /*@@
+ @file Startup.c
+ @date Wed May 22 02:09:19 2002
+ @author
+ @desc
+ Register the startup banner.
+ The external variables are also declared here. These are
+ the arrays containing the variable indexes and right hand sides,
+ and the number of each type of variable currently in use (the
+ parameters only give the maximum possible for each type).
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "cctk.h"
+#include "ExternalVariables.h"
+
+static const char *rcsid = "$Header$";
+
+CCTK_FILEVERSION(CactusMoL2_MoL2_Startup_c);
+
+/********************************************************************
+ ******************** External Variables **********************
+ ********************************************************************/
+
+CCTK_INT *EvolvedVariableIndex = NULL;
+CCTK_INT *RHSVariableIndex = NULL;
+CCTK_INT *ConstrainedVariableIndex = NULL;
+CCTK_INT *SandRVariableIndex = NULL;
+
+CCTK_INT MoLNumEvolvedVariables = 0;
+CCTK_INT MoLNumConstrainedVariables = 0;
+CCTK_INT MoLNumSandRVariables = 0;
+
+/********************************************************************
+ ********************* Local Data Types ***********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ***************** Scheduled Routine Prototypes *********************
+ ********************************************************************/
+
+int MoL_Startup(void);
+
+/********************************************************************
+ ********************* Other Routine Prototypes *********************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* Local Data *****************************
+ ********************************************************************/
+
+/********************************************************************
+ ********************* External Routines **********************
+ ********************************************************************/
+
+ /*@@
+ @routine MoL_Startup
+ @date Wed May 22 02:17:17 2002
+ @author Ian Hawke
+ @desc
+ Register the startup banner with the flesh.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+
+int MoL_Startup(void)
+{
+
+ const char *banner = "MoL: Generalized time integration.";
+
+ CCTK_RegisterBanner(banner);
+
+ return 0;
+
+}
+
+/********************************************************************
+ ********************* Local Routines *************************
+ ********************************************************************/
diff --git a/src/make.code.defn b/src/make.code.defn
new file mode 100644
index 0000000..2ac20b2
--- /dev/null
+++ b/src/make.code.defn
@@ -0,0 +1,21 @@
+# Main make.code.defn file for thorn MoL2
+# $Header$
+
+# Source files in this directory
+SRCS = ChangeType.c \
+ Counter.c \
+ GenericRK.c \
+ ICN.c \
+ IndexArrays.c \
+ InitialCopy.c \
+ ParamCheck.c \
+ RK2.c \
+ Registration.c \
+ RKCoefficients.c \
+ SandR.c \
+ SetTime.c \
+ Startup.c
+
+# Subdirectories containing source files
+SUBDIRS =
+