diff options
-rw-r--r-- | README | 14 | ||||
-rw-r--r-- | doc/MoLdia1.eps | 451 | ||||
-rw-r--r-- | doc/MoLdia2.eps | 397 | ||||
-rw-r--r-- | doc/MoLdia3.eps | 409 | ||||
-rw-r--r-- | doc/documentation.tex | 898 | ||||
-rw-r--r-- | interface.ccl | 71 | ||||
-rw-r--r-- | par/CarpetTest.th | 159 | ||||
-rw-r--r-- | par/PUGHTest.th | 176 | ||||
-rw-r--r-- | param.ccl | 53 | ||||
-rw-r--r-- | schedule.ccl | 257 | ||||
-rw-r--r-- | src/ChangeType.c | 572 | ||||
-rw-r--r-- | src/Counter.c | 110 | ||||
-rw-r--r-- | src/ExternalVariables.h | 26 | ||||
-rw-r--r-- | src/GenericRK.c | 204 | ||||
-rw-r--r-- | src/ICN.c | 120 | ||||
-rw-r--r-- | src/IndexArrays.c | 211 | ||||
-rw-r--r-- | src/InitialCopy.c | 312 | ||||
-rw-r--r-- | src/MoL.h | 51 | ||||
-rw-r--r-- | src/MoLFunctions.h | 27 | ||||
-rw-r--r-- | src/ParamCheck.c | 84 | ||||
-rw-r--r-- | src/RK2.c | 140 | ||||
-rw-r--r-- | src/RKCoefficients.c | 159 | ||||
-rw-r--r-- | src/Registration.c | 599 | ||||
-rw-r--r-- | src/SandR.c | 109 | ||||
-rw-r--r-- | src/SetTime.c | 231 | ||||
-rw-r--r-- | src/Startup.c | 89 | ||||
-rw-r--r-- | src/make.code.defn | 21 |
27 files changed, 5950 insertions, 0 deletions
@@ -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 = + |