aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore10
-rw-r--r--Carpet/Carpet/README6
-rw-r--r--Carpet/Carpet/configuration.ccl6
-rw-r--r--Carpet/Carpet/interface.ccl42
-rw-r--r--Carpet/Carpet/param.ccl52
-rw-r--r--Carpet/Carpet/schedule.ccl1
-rw-r--r--Carpet/Carpet/src/AllGatherString.cc69
-rw-r--r--Carpet/Carpet/src/CallFunction.cc28
-rw-r--r--Carpet/Carpet/src/CarpetBasegrid.cc8
-rw-r--r--Carpet/Carpet/src/CarpetParamCheck.cc8
-rw-r--r--Carpet/Carpet/src/CarpetStartup.cc12
-rw-r--r--Carpet/Carpet/src/Checksum.cc124
-rw-r--r--Carpet/Carpet/src/Comm.cc124
-rw-r--r--Carpet/Carpet/src/Cycle.cc40
-rw-r--r--Carpet/Carpet/src/Evolve.cc120
-rw-r--r--Carpet/Carpet/src/Initialise.cc112
-rw-r--r--Carpet/Carpet/src/MultiModel.cc61
-rw-r--r--Carpet/Carpet/src/OutputGH.cc18
-rw-r--r--Carpet/Carpet/src/Poison.cc152
-rw-r--r--Carpet/Carpet/src/Recompose.cc1037
-rw-r--r--Carpet/Carpet/src/Requirements.cc25
-rw-r--r--Carpet/Carpet/src/Restrict.cc24
-rw-r--r--Carpet/Carpet/src/ScheduleWrapper.cc8
-rw-r--r--Carpet/Carpet/src/SetupGH.cc437
-rw-r--r--Carpet/Carpet/src/Shutdown.cc23
-rw-r--r--Carpet/Carpet/src/Storage.cc85
-rw-r--r--Carpet/Carpet/src/Timers.cc34
-rw-r--r--Carpet/Carpet/src/Timers.hh31
-rw-r--r--Carpet/Carpet/src/Timing.cc119
-rw-r--r--Carpet/Carpet/src/carpet.hh14
-rw-r--r--Carpet/Carpet/src/carpet_public.h22
-rw-r--r--Carpet/Carpet/src/functions.hh59
-rw-r--r--Carpet/Carpet/src/helpers.cc108
-rw-r--r--Carpet/Carpet/src/make.code.defn4
-rw-r--r--Carpet/Carpet/src/modes.cc404
-rw-r--r--Carpet/Carpet/src/modes.hh87
-rw-r--r--Carpet/Carpet/src/variables.cc9
-rw-r--r--Carpet/Carpet/src/variables.hh24
-rw-r--r--Carpet/Carpet/test/small.par16
-rw-r--r--Carpet/CarpetEvolutionMask/README11
-rw-r--r--Carpet/CarpetIOASCII/README6
-rw-r--r--Carpet/CarpetIOASCII/src/ioascii.cc671
-rw-r--r--Carpet/CarpetIOASCII/src/ioascii.hh89
-rw-r--r--Carpet/CarpetIOASCII/src/make.configuration.deps2
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetIOASCII/src/util/Carpet2ygraph.pl0
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetIOASCII/src/util/Carpet2ygraphCat.pl0
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetIOASCII/src/util/mergeCarpetIOASCII.pl0
-rw-r--r--Carpet/CarpetIOBasic/README7
-rw-r--r--Carpet/CarpetIOHDF5/README6
-rw-r--r--Carpet/CarpetIOHDF5/doc/documentation.tex5
-rw-r--r--Carpet/CarpetIOHDF5/interface.ccl20
-rw-r--r--Carpet/CarpetIOHDF5/make.configuration.defn2
-rw-r--r--Carpet/CarpetIOHDF5/param.ccl305
-rw-r--r--Carpet/CarpetIOHDF5/schedule.ccl1
-rw-r--r--Carpet/CarpetIOHDF5/src/CarpetIOHDF5.cc80
-rw-r--r--Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh109
-rw-r--r--Carpet/CarpetIOHDF5/src/Input.cc131
-rw-r--r--Carpet/CarpetIOHDF5/src/Output.cc99
-rw-r--r--Carpet/CarpetIOHDF5/src/OutputSlice.cc1458
-rw-r--r--Carpet/CarpetIOHDF5/src/make.code.defn2
-rw-r--r--Carpet/CarpetIOHDF5/src/make.configuration.defn4
-rw-r--r--Carpet/CarpetIOHDF5/src/make.configuration.deps2
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetIOHDF5/src/util/SubstituteDeprecatedParameters.pl0
-rw-r--r--Carpet/CarpetIOHDF5/src/util/hdf5_recombiner.cc253
-rw-r--r--Carpet/CarpetIOHDF5/src/util/hdf5toascii_slicer.cc7
-rw-r--r--Carpet/CarpetIOHDF5/src/util/hdf5tobinary_slicer.cc814
-rw-r--r--Carpet/CarpetIOScalar/README7
-rw-r--r--Carpet/CarpetIOScalar/src/ioscalar.cc45
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl0
-rw-r--r--Carpet/CarpetIOStreamedHDF5/README7
-rw-r--r--Carpet/CarpetInterp/README7
-rw-r--r--Carpet/CarpetInterp/param.ccl4
-rw-r--r--Carpet/CarpetInterp/src/interp.cc677
-rw-r--r--Carpet/CarpetInterp/test/waveinterp-1p.par3
-rw-r--r--Carpet/CarpetInterp/test/waveinterp-2p.par3
-rw-r--r--Carpet/CarpetInterp2/README7
-rw-r--r--Carpet/CarpetInterp2/interface.ccl51
-rw-r--r--Carpet/CarpetInterp2/src/fasterp.cc41
-rw-r--r--Carpet/CarpetInterp2/src/fasterp.hh16
-rw-r--r--Carpet/CarpetInterp2/src/interp2.cc185
-rw-r--r--Carpet/CarpetLib/README6
-rw-r--r--Carpet/CarpetLib/interface.ccl3
-rw-r--r--Carpet/CarpetLib/param.ccl61
-rw-r--r--Carpet/CarpetLib/schedule.ccl4
-rw-r--r--Carpet/CarpetLib/src/bbox.cc58
-rw-r--r--Carpet/CarpetLib/src/bbox.hh19
-rw-r--r--Carpet/CarpetLib/src/bboxset.cc51
-rw-r--r--Carpet/CarpetLib/src/bboxset.hh102
-rw-r--r--Carpet/CarpetLib/src/commstate.cc710
-rw-r--r--Carpet/CarpetLib/src/commstate.hh135
-rw-r--r--Carpet/CarpetLib/src/copy_3d.cc2
-rw-r--r--Carpet/CarpetLib/src/copy_4d.cc142
-rw-r--r--Carpet/CarpetLib/src/data.cc418
-rw-r--r--Carpet/CarpetLib/src/data.hh30
-rw-r--r--Carpet/CarpetLib/src/defs.cc163
-rw-r--r--Carpet/CarpetLib/src/defs.hh302
-rw-r--r--Carpet/CarpetLib/src/dh.cc1232
-rw-r--r--Carpet/CarpetLib/src/dh.hh123
-rw-r--r--Carpet/CarpetLib/src/dist.cc212
-rw-r--r--Carpet/CarpetLib/src/dist.hh295
-rw-r--r--Carpet/CarpetLib/src/fulltree.cc46
-rw-r--r--Carpet/CarpetLib/src/fulltree.hh4
-rw-r--r--Carpet/CarpetLib/src/gdata.cc198
-rw-r--r--Carpet/CarpetLib/src/gdata.hh43
-rw-r--r--Carpet/CarpetLib/src/gf.cc12
-rw-r--r--Carpet/CarpetLib/src/gf.hh12
-rw-r--r--Carpet/CarpetLib/src/ggf.cc174
-rw-r--r--Carpet/CarpetLib/src/ggf.hh22
-rw-r--r--Carpet/CarpetLib/src/gh.cc136
-rw-r--r--Carpet/CarpetLib/src/gh.hh51
-rw-r--r--Carpet/CarpetLib/src/interpolate_3d_2tl.cc2
-rw-r--r--Carpet/CarpetLib/src/interpolate_3d_3tl.cc2
-rw-r--r--Carpet/CarpetLib/src/interpolate_3d_4tl.cc2
-rw-r--r--Carpet/CarpetLib/src/interpolate_3d_5tl.cc2
-rw-r--r--Carpet/CarpetLib/src/interpolate_eno_3d_3tl.cc2
-rw-r--r--Carpet/CarpetLib/src/limits.cc (renamed from Carpet/Carpet/src/Limits.cc)8
-rw-r--r--Carpet/CarpetLib/src/limits.hh8
-rw-r--r--Carpet/CarpetLib/src/make.code.defn12
-rw-r--r--Carpet/CarpetLib/src/mem.cc101
-rw-r--r--Carpet/CarpetLib/src/mem.hh11
-rw-r--r--Carpet/CarpetLib/src/mpi_string.cc480
-rw-r--r--Carpet/CarpetLib/src/mpi_string.hh55
-rw-r--r--Carpet/CarpetLib/src/operator_prototypes.hh241
-rw-r--r--Carpet/CarpetLib/src/operator_prototypes_3d.hh305
-rw-r--r--Carpet/CarpetLib/src/operator_prototypes_4d.hh92
-rw-r--r--Carpet/CarpetLib/src/operators.hh4
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_cc_o0_rf2.cc320
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_cc_o1_rf2.cc390
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_cc_o2_rf2.cc545
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_cc_rf2.cc45
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o11_rf2.cc44
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o1_rf2.cc44
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o3_rf2.cc46
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o5_monotone_rf2.cc851
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o5_rf2.cc44
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o7_rf2.cc44
-rw-r--r--Carpet/CarpetLib/src/prolongate_3d_o9_rf2.cc44
-rw-r--r--Carpet/CarpetLib/src/prolongate_4d_o1_rf2.cc602
-rw-r--r--Carpet/CarpetLib/src/region.cc99
-rw-r--r--Carpet/CarpetLib/src/region.hh50
-rw-r--r--Carpet/CarpetLib/src/restrict_3d_cc_rf2.cc2
-rw-r--r--Carpet/CarpetLib/src/restrict_3d_rf2.cc2
-rw-r--r--Carpet/CarpetLib/src/restrict_4d_rf2.cc141
-rw-r--r--Carpet/CarpetLib/src/startup_time.cc82
-rw-r--r--Carpet/CarpetLib/src/startup_time.hh6
-rw-r--r--Carpet/CarpetLib/src/th.cc27
-rw-r--r--Carpet/CarpetLib/src/th.hh15
-rw-r--r--Carpet/CarpetLib/src/timestat.cc175
-rw-r--r--Carpet/CarpetLib/src/vect.cc39
-rw-r--r--Carpet/CarpetLib/src/vect.hh286
-rw-r--r--Carpet/CarpetLib/src/vect_helpers.hh184
-rw-r--r--Carpet/CarpetMask/README7
-rw-r--r--Carpet/CarpetMask/configuration.ccl5
-rw-r--r--Carpet/CarpetMask/schedule.ccl6
-rw-r--r--Carpet/CarpetMask/src/mask_excluded.cc39
-rw-r--r--Carpet/CarpetMask/src/mask_surface.cc33
-rw-r--r--Carpet/CarpetMask/src/mask_surface.hh2
-rw-r--r--Carpet/CarpetReduce/README6
-rw-r--r--Carpet/CarpetReduce/src/mask_carpet.cc5
-rw-r--r--Carpet/CarpetReduce/src/reduce.cc469
-rw-r--r--Carpet/CarpetRegrid/README6
-rw-r--r--Carpet/CarpetRegrid2/README7
-rw-r--r--Carpet/CarpetRegrid2/interface.ccl1
-rw-r--r--Carpet/CarpetRegrid2/src/regrid.cc15
-rw-r--r--Carpet/CarpetSlab/README6
-rw-r--r--Carpet/CarpetSlab/src/GetHyperslab.cc14
-rw-r--r--Carpet/CarpetSlab/src/slab.cc14
-rw-r--r--Carpet/CarpetTest/README6
-rw-r--r--Carpet/CarpetTracker/README7
-rw-r--r--Carpet/CarpetWeb/CarpetMonth/index.html6
-rw-r--r--Carpet/CarpetWeb/contributors.html6
-rw-r--r--Carpet/CarpetWeb/design-walkthrough.html4
-rw-r--r--Carpet/CarpetWeb/feature-requests.html4
-rw-r--r--Carpet/CarpetWeb/get-carpet.html8
-rw-r--r--Carpet/CarpetWeb/index.html352
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetWeb/logo/Sierpinski.pl0
-rw-r--r--Carpet/CarpetWeb/olds.html215
-rw-r--r--Carpet/CarpetWeb/publications.html1040
-rw-r--r--Carpet/CarpetWeb/publications/Makefile46
-rw-r--r--Carpet/CarpetWeb/publications/apsrev-titles-manyauthors.bst2410
-rw-r--r--Carpet/CarpetWeb/publications/bib2xhtml1254
-rw-r--r--Carpet/CarpetWeb/publications/carpet-publications.aux7
-rw-r--r--Carpet/CarpetWeb/publications/carpet-publications.bib2040
-rw-r--r--Carpet/CarpetWeb/publications/carpet-publications.log214
-rw-r--r--Carpet/CarpetWeb/publications/carpet-publications.pdfbin0 -> 99221 bytes
-rw-r--r--Carpet/CarpetWeb/publications/carpet-publications.tex81
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.aux15
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.bbl53
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.bib49
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.bibitems51
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.log197
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.pdfbin0 -> 81385 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-background.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.aux13
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.bbl34
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.bib19
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.bibitems32
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.log192
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.pdfbin0 -> 65000 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-book.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.aux87
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.bbl1188
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.bib1324
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.bibitems1186
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.log198
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.pdfbin0 -> 106463 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-refereed.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.aux35
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.bbl292
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.bib296
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.bibitems290
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.log193
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.pdfbin0 -> 84284 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-report.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.aux24
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.bbl101
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.bib132
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.bibitems99
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.log206
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.pdfbin0 -> 80328 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-thesis.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.aux14
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.bbl23
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.bib12
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.bibitems21
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.blg46
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.html-updated0
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.log193
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.pdfbin0 -> 47024 bytes
-rw-r--r--Carpet/CarpetWeb/publications/citations-webpage.tex15
-rw-r--r--Carpet/CarpetWeb/publications/citations.template15
-rw-r--r--Carpet/CarpetWeb/publications/html-n.bst1312
-rw-r--r--Carpet/CarpetWeb/publications/html-nr.bst1313
-rw-r--r--Carpet/CarpetWeb/publications/html-u.bst1043
-rw-r--r--Carpet/CarpetWeb/publications/old/background.tex18
-rw-r--r--Carpet/CarpetWeb/publications/old/refereed.tex78
-rw-r--r--Carpet/CarpetWeb/publications/old/reports.tex39
-rw-r--r--Carpet/CarpetWeb/publications/publications.html1251
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetWeb/scaling-amr/minimise.sh0
-rw-r--r--Carpet/CarpetWeb/scaling-improved/KL9_CCT_vacuum.asc15
-rw-r--r--Carpet/CarpetWeb/scaling-improved/Makefile36
-rw-r--r--Carpet/CarpetWeb/scaling-improved/openmp-ranger.out45
-rw-r--r--Carpet/CarpetWeb/scaling-improved/openmp.eps1207
-rw-r--r--Carpet/CarpetWeb/scaling-improved/openmp.gnuplot31
-rw-r--r--Carpet/CarpetWeb/scaling-improved/openmp.pdfbin0 -> 18377 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-best.eps854
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-best.gnuplot28
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-best.pdfbin0 -> 5264 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-best.pngbin0 -> 10224 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-franklin.out61
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-hlrb2.out85
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-kraken.out155
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-kraken.out.old155
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-old.gnuplot28
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-openmp-node.gnuplot30
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-openmp-procs.gnuplot24
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-queenbee.out64
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-node.out20
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-procs.out20
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-ranger.out731
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-scaled.gnuplot40
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-sicortex.gnuplot24
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-sicortex.out73
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-surveyor.gnuplot24
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-surveyor.out27
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-whatif-bw.out12
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-whatif-bwlat.out12
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-whatif-orig.out12
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results-whatif.gnuplot32
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results.gnuplot48
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results2openmp19
-rw-r--r--Carpet/CarpetWeb/scaling-improved/results2whatif16
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetWeb/scaling-ranger/findrow0
-rw-r--r--[-rwxr-xr-x]Carpet/CarpetWeb/scaling-ranger/loopprocs0
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/Makefile36
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/results-surveyor.eps764
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/results-surveyor.gnuplot26
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/results-surveyor.out83
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/results-surveyor.pdfbin0 -> 4690 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-surveyor/results-surveyor.pngbin0 -> 7927 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/Makefile36
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-ranger.out731
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif-bw.out12
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif-bwlat.out12
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif-orig.out12
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif.eps813
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif.gnuplot33
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif.pdfbin0 -> 4669 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results-whatif.pngbin0 -> 8546 bytes
-rw-r--r--Carpet/CarpetWeb/scaling-whatif/results2whatif16
-rw-r--r--Carpet/CarpetWeb/sicortex/results-hlrb2.out85
-rw-r--r--Carpet/CarpetWeb/sicortex/results-kraken.out243
-rw-r--r--Carpet/CarpetWeb/sicortex/results-queenbee.out64
-rw-r--r--Carpet/CarpetWeb/sicortex/results-ranger.out731
-rw-r--r--Carpet/CarpetWeb/sicortex/results-scaled.eps844
-rw-r--r--Carpet/CarpetWeb/sicortex/results-scaled.gnuplot36
-rw-r--r--Carpet/CarpetWeb/sicortex/results-scaled.pdfbin0 -> 5057 bytes
-rw-r--r--Carpet/CarpetWeb/sicortex/results-scaled.pngbin0 -> 10529 bytes
-rw-r--r--Carpet/CarpetWeb/sicortex/results-sicortex.out73
-rw-r--r--Carpet/CarpetWeb/status-reports.html4
-rw-r--r--Carpet/CarpetWeb/version-3.html4
-rw-r--r--Carpet/CarpetWeb/version-4.html4
-rw-r--r--Carpet/CarpetWeb/visualisation-tools.html4
-rw-r--r--Carpet/CarpetWeb/work-with-darcs.html4
-rw-r--r--Carpet/CarpetWeb/work-with-git.html4
-rw-r--r--Carpet/LoopControl/README7
-rw-r--r--Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.hill.par132
-rw-r--r--Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.legacy.par132
-rw-r--r--Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.par132
-rw-r--r--Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.standard.par132
-rw-r--r--Carpet/LoopControl/src/loopcontrol.h24
-rw-r--r--Carpet/doc/documentation.tex6
-rw-r--r--Carpet/doc/scheduling.aux45
-rw-r--r--Carpet/doc/scheduling.bbl38
-rw-r--r--Carpet/doc/scheduling.blg45
-rw-r--r--Carpet/doc/scheduling.log355
-rw-r--r--Carpet/doc/scheduling.pdfbin0 -> 153691 bytes
-rw-r--r--Carpet/doxygen/Doxyfile1081
-rw-r--r--Carpet/doxygen/README14
-rw-r--r--[-rwxr-xr-x]CarpetAttic/Cart3dTest/utils/cmptest0
-rw-r--r--[-rwxr-xr-x]CarpetAttic/Cart3dTest/utils/mptest0
-rw-r--r--CarpetDev/CarpetIOF5/README26
-rw-r--r--CarpetDev/CarpetIOF5/configuration.ccl2
-rw-r--r--CarpetDev/CarpetIOF5/interface.ccl22
-rw-r--r--CarpetDev/CarpetIOF5/par/wavetoy-cc-ref.par244
-rw-r--r--CarpetDev/CarpetIOF5/par/wavetoy-cc-uni.par230
-rw-r--r--CarpetDev/CarpetIOF5/par/wavetoy-vc-ref.par244
-rw-r--r--CarpetDev/CarpetIOF5/par/wavetoy-vc-uni.par245
-rw-r--r--CarpetDev/CarpetIOF5/param.ccl40
-rw-r--r--CarpetDev/CarpetIOF5/src/IOF5.cc181
-rw-r--r--CarpetDev/CarpetIOF5/src/coordinate_system.cc29
-rw-r--r--CarpetDev/CarpetIOF5/src/coordinate_system.hh3
-rw-r--r--CarpetDev/CarpetIOF5/src/data_region.cc121
-rw-r--r--CarpetDev/CarpetIOF5/src/data_region.hh33
-rw-r--r--CarpetDev/CarpetIOF5/src/extending.cc1
-rw-r--r--CarpetDev/CarpetIOF5/src/f5writer.cc445
-rw-r--r--CarpetDev/CarpetIOF5/src/f5writer.hh74
-rw-r--r--CarpetDev/CarpetIOF5/src/file.cc292
-rw-r--r--CarpetDev/CarpetIOF5/src/file.hh61
-rw-r--r--CarpetDev/CarpetIOF5/src/make.code.defn18
-rw-r--r--CarpetDev/CarpetIOF5/src/meta_data_region.cc70
-rw-r--r--CarpetDev/CarpetIOF5/src/meta_data_region.hh15
-rw-r--r--CarpetDev/CarpetIOF5/src/physical_quantity.cc30
-rw-r--r--CarpetDev/CarpetIOF5/src/physical_quantity.hh7
-rw-r--r--CarpetDev/CarpetIOF5/src/simulation.cc28
-rw-r--r--CarpetDev/CarpetIOF5/src/simulation.hh3
-rw-r--r--CarpetDev/CarpetIOF5/src/tensor_component.cc136
-rw-r--r--CarpetDev/CarpetIOF5/src/tensor_component.hh25
-rw-r--r--CarpetDev/CarpetIOF5/src/timestep.cc35
-rw-r--r--CarpetDev/CarpetIOF5/src/timestep.hh3
-rw-r--r--CarpetDev/CarpetIOF5/src/topology.cc32
-rw-r--r--CarpetDev/CarpetIOF5/src/topology.hh4
-rw-r--r--CarpetDev/CarpetIOF5/src/utils.cc84
-rw-r--r--CarpetDev/CarpetIOF5/src/utils.hh28
-rw-r--r--CarpetDev/CarpetIOF5/src/writer-old.cc511
-rw-r--r--CarpetDev/CarpetIOF5/src/writer.cc245
-rw-r--r--CarpetDev/CarpetIOF5/src/writer.hh28
-rw-r--r--CarpetExtra/ReductionTest3/README9
-rw-r--r--CarpetExtra/ReductionTest3/doc/documentation.tex144
-rw-r--r--CarpetExtra/ReductionTest3/interface.ccl20
-rw-r--r--CarpetExtra/ReductionTest3/par/reductiontest.par186
-rw-r--r--CarpetExtra/ReductionTest3/param.ccl11
-rw-r--r--CarpetExtra/ReductionTest3/schedule.ccl49
-rw-r--r--CarpetExtra/ReductionTest3/src/CoM.c99
-rw-r--r--CarpetExtra/ReductionTest3/src/make.code.defn8
-rw-r--r--CarpetExtra/ReductionTest3/test/reductiontest.par210
-rw-r--r--[-rwxr-xr-x]test-carpet0
377 files changed, 46872 insertions, 7463 deletions
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index ba05b638e..000000000
--- a/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-# Lines starting with '#' are considered comments.
-
-.DS_Store
-*.[oa]
-*.aux
-*.bbl
-*.blg
-*.log
-*~
-.#*
diff --git a/Carpet/Carpet/README b/Carpet/Carpet/README
index 03ce32952..75caae781 100644
--- a/Carpet/Carpet/README
+++ b/Carpet/Carpet/README
@@ -1,8 +1,10 @@
Cactus Code Thorn Carpet
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides a parallel AMR (adaptive mesh refinement) driver
with MPI.
diff --git a/Carpet/Carpet/configuration.ccl b/Carpet/Carpet/configuration.ccl
index a80a319df..a7294fc09 100644
--- a/Carpet/Carpet/configuration.ccl
+++ b/Carpet/Carpet/configuration.ccl
@@ -2,10 +2,8 @@
PROVIDES Carpet
{
- SCRIPT
- LANG
}
-REQUIRES IOUtil CarpetLib
+REQUIRES IOUtil CarpetLib LoopControl
-REQUIRES THORNS: IOUtil CarpetLib
+REQUIRES THORNS: IOUtil CarpetLib LoopControl
diff --git a/Carpet/Carpet/interface.ccl b/Carpet/Carpet/interface.ccl
index 87c44e941..a61f22fc6 100644
--- a/Carpet/Carpet/interface.ccl
+++ b/Carpet/Carpet/interface.ccl
@@ -7,6 +7,10 @@ include header: carpet_public.h in carpet.h
include header: Timers.hh in CarpetTimers.hh
+uses include header: loopcontrol.h
+
+uses include header: mpi_string.hh
+
uses include header: defs.hh
uses include header: dist.hh
@@ -217,6 +221,21 @@ PROVIDES FUNCTION GetRefinementLevels \
+# Get pointer to grid variable for a specific map and refinement level
+CCTK_POINTER FUNCTION \
+ VarDataPtrI \
+ (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_INT IN map, \
+ CCTK_INT IN reflevel, \
+ CCTK_INT IN component, \
+ CCTK_INT IN timelevel, \
+ CCTK_INT IN varindex)
+PROVIDES FUNCTION VarDataPtrI \
+ WITH Carpet_VarDataPtrI \
+ LANGUAGE C
+
+
+
# The true prototype of the routine below:
# int Carpet_Regrid (const cGH * cctkGH,
# gh::rregs * superregss,
@@ -249,11 +268,32 @@ REQUIRES FUNCTION IO_TruncateOutputFiles
+# TODO: make this somehow public, e.g. by moving it into its own thorn
+
+CCTK_INT point_classification TYPE=gf TAGS='checkpoint="no" prolongation="none"'
+{
+ point_class
+ # negative: needs to be set explicitly (e.g. boundary)
+ # zero: unused (e.g. ghost)
+ # positive: needs to be evolved
+ # -1: boundary point (needs to be set explicitly)
+ # 0: unused (e.g. ghost point, or restriction target)
+ # n=1..N: evolved, used for integrator substeps i<=n
+ # (i=N..1, counting backwards; see MoL documentation)
+ # i.e.: n=1: used between time steps (i.e., should be visualised)
+ # n>1: used only while time stepping (e.g. buffer zones)
+} "Grid point classification"
+
+
+
CCTK_REAL timing TAGS='checkpoint="no"'
{
physical_time_per_hour
+ current_physical_time_per_hour
+
+ time_total time_evolution time_computing time_communicating time_io
- time_total time_computing time_communicating time_io
+ evolution_steps_count
local_grid_points_per_second total_grid_points_per_second
local_grid_point_updates_count total_grid_point_updates_count
diff --git a/Carpet/Carpet/param.ccl b/Carpet/Carpet/param.ccl
index d4887cec7..d221d2158 100644
--- a/Carpet/Carpet/param.ccl
+++ b/Carpet/Carpet/param.ccl
@@ -171,21 +171,12 @@ STRING model "Model name for multi-model simulations -- the model name is used t
CCTK_INT prolongation_order_space "Order of prolongation operator in space" STEERABLE=recover
{
- 1 :: "first order (linear)"
- 3 :: "third order (cubic)"
- 5 :: "fifth order"
- 7 :: "seventh order"
- 9 :: "ninth order"
- 11 :: "eleventh order (one more than tenth)"
+ 0:* :: "vertex centred orders must be odd"
} 1
CCTK_INT prolongation_order_time "Order of prolongation operator in time" STEERABLE=recover
{
- 0 :: "zeroth order (constant)"
- 1 :: "first order (linear)"
- 2 :: "second order (quadratic)"
- 3 :: "third order (cubic)"
- 4 :: "fourth order (quartic)"
+ 0:* :: ""
} 1
@@ -291,21 +282,20 @@ BOOLEAN enable_all_storage "Enable storage for all grid functions" STEERABLE=rec
{
} "no"
+BOOLEAN enable_no_storage "Exit before beginning to enable storage for grid functions" STEERABLE=recover
+{
+} "no"
+
BOOLEAN poison_new_timelevels "Try to catch uninitialised grid elements by setting new timelevels to values that will catch your attention" STEERABLE=always
{
-} "no"
+} "yes"
BOOLEAN check_for_poison "Explicitely check for the poison value after every time step" STEERABLE=always
{
} "no"
-CCTK_INT poison_value "Integer value (0..255) used to poison new timelevels (with memset)" STEERABLE=always
-{
- 0:255 :: "Must fit into a byte. Use 0 for zero, 255 for nan, and e.g. 113 for a large value."
-} 255
-
CCTK_INT max_poison_locations "Maximum number of poison locations that are printed to the screen" STEERABLE=always
{
-1 :: "print all locations"
@@ -314,13 +304,6 @@ CCTK_INT max_poison_locations "Maximum number of poison locations that are print
-CCTK_INT deadbeef "A strange integer value that indicates that something has gone wrong; the integer equivalent of a nan"
-{
- *:* :: "should be large and positive"
-} 666 # 7353315
-
-
-
BOOLEAN checksum_timelevels "Try to catch unintentionally changed timelevels by taking checksums and comparing against these" STEERABLE=always
{
} "no"
@@ -357,6 +340,11 @@ BOOLEAN output_internal_data "Periodically print internal data to the screen for
{
} "no"
+REAL timing_average_window_minutes "Time interval (in wall time minutes) for calculating the current physics time per hour" STEERABLE=always
+{
+ (0.0:* :: ""
+} 10.0
+
INT print_timestats_every "Print interesting timing statistics periodically" STEERABLE=always
{
-1 :: "don't report"
@@ -377,21 +365,15 @@ STRING timer_file "File name in which detailed timing statistics are collected"
"^.+$" :: "file name"
} "carpet-timing-statistics"
-INT max_core_size_MB "Maximum size of a core file" STEERABLE=recover
+BOOLEAN timers_verbose "Output (debug) messages when a timer is started or stopped" STEERABLE=always
{
- -2 :: "unchanged"
- -1 :: "unlimited"
- 0:* :: "limited"
-} -2
+} "no"
-INT max_memory_size_MB "Maximum amount of memory per MPI process" STEERABLE=recover
-{
- -2 :: "unchanged"
- -1 :: "unlimited"
- 0:* :: "limited"
-} -2
+BOOLEAN recompose_verbose "Output debug information during recomposing" STEERABLE=ALWAYS
+{
+} "no"
KEYWORD processor_topology "How to determine the processor topology" STEERABLE=recover
{
diff --git a/Carpet/Carpet/schedule.ccl b/Carpet/Carpet/schedule.ccl
index 3c9322b5f..0f839a5c8 100644
--- a/Carpet/Carpet/schedule.ccl
+++ b/Carpet/Carpet/schedule.ccl
@@ -1,5 +1,6 @@
# Schedule definitions for thorn Carpet
+storage: point_classification
storage: timing timing2
schedule CarpetMultiModelStartup at STARTUP as MultiModel_Startup before Driver_Startup
diff --git a/Carpet/Carpet/src/AllGatherString.cc b/Carpet/Carpet/src/AllGatherString.cc
deleted file mode 100644
index 5efa96114..000000000
--- a/Carpet/Carpet/src/AllGatherString.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <cassert>
-#include <cstring>
-//#include <iostream>
-//#include <map>
-#include <string>
-#include <vector>
-
-#include <mpi.h>
-
-#include "cctk.h"
-
-#include "functions.hh"
-
-
-
-namespace Carpet
-{
-
- using namespace std;
-
-
-
- vector <string>
- AllGatherString (MPI_Comm const world,
- string const & data)
- {
- // Get the total number of processors
- int num_procs;
- MPI_Comm_size (world, & num_procs);
-
- // Gather the lengths of the data strings
- int const length = data.length();
- vector <int> lengths (num_procs);
-
- MPI_Allgather (const_cast <int *> (& length), 1, MPI_INT,
- & lengths.front(), 1, MPI_INT,
- world);
-
- // Allocate space for all data strings
- vector <int> offsets (num_procs + 1);
- offsets.at(0) = 0;
- for (int n = 0; n < num_procs; ++ n)
- {
- offsets.at(n + 1) = offsets.at(n) + lengths.at(n);
- }
- int const total_length = offsets.at(num_procs);
-
- // Gather all data strings
- vector <char> alldata_buffer (total_length);
-
- MPI_Allgatherv (const_cast <char *> (data.c_str()), length, MPI_CHAR,
- & alldata_buffer.front(),
- const_cast <int *> (& lengths.front()),
- const_cast <int *> (& offsets.front()),
- MPI_CHAR,
- world);
-
- // Convert data buffer with C strings to C++ strings
- vector <string> alldata (num_procs);
- for (int n = 0; n < num_procs; ++ n)
- {
- alldata.at(n) =
- string (& alldata_buffer.at (offsets.at(n)), lengths.at(n));
- }
-
- return alldata;
- }
-
-} // namespace Carpet
diff --git a/Carpet/Carpet/src/CallFunction.cc b/Carpet/Carpet/src/CallFunction.cc
index 696b5ce49..054ea6808 100644
--- a/Carpet/Carpet/src/CallFunction.cc
+++ b/Carpet/Carpet/src/CallFunction.cc
@@ -8,8 +8,8 @@
#include <gh.hh>
-#include "carpet.hh"
-#include "Timers.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -76,13 +76,13 @@ namespace Carpet {
BEGIN_META_MODE(cctkGH) {
BEGIN_MGLEVEL_LOOP(cctkGH) {
BEGIN_REFLEVEL_LOOP(cctkGH) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
("Meta time local mode",
function, attribute, data, user_timer);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
sync_timer.start();
SyncGroupsInScheduleBlock (attribute, cctkGH) ;
sync_timer.stop();
@@ -159,13 +159,13 @@ namespace Carpet {
if (attribute->loop_local) {
BEGIN_GLOBAL_MODE(cctkGH) {
BEGIN_REFLEVEL_LOOP(cctkGH) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
("Global time local mode",
function, attribute, data, user_timer);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
sync_timer.start();
SyncGroupsInScheduleBlock (attribute, cctkGH) ;
sync_timer.stop();
@@ -213,13 +213,13 @@ namespace Carpet {
// Level operation: call once per refinement level
if (attribute->loop_local) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
("Level time local mode",
function, attribute, data, user_timer);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} else if (attribute->loop_singlemap) {
BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
@@ -239,13 +239,13 @@ namespace Carpet {
// Single map operation: call once per refinement level and map
if (attribute->loop_local) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
("Singlemap time local mode",
function, attribute, data, user_timer);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} else {
BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
@@ -260,13 +260,13 @@ namespace Carpet {
} else {
// Local operation: call once per component
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
CallScheduledFunction
("Local mode",
function, attribute, data, user_timer);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
sync_timer.start();
SyncGroupsInScheduleBlock (attribute, cctkGH) ;
sync_timer.stop();
@@ -274,6 +274,7 @@ namespace Carpet {
}
if (schedule_barriers) {
+#if 0
static unsigned int magic = 0xe8932329UL; // a random starting value
unsigned int recv = magic;
Checkpoint ("About to Bcast %u", magic);
@@ -287,6 +288,9 @@ namespace Carpet {
Checkpoint ("About to Barrier");
MPI_Barrier (dist::comm());
Checkpoint ("Finished Barrier");
+#endif
+ static int id = 513400912; // arbitrary starting value
+ CCTK_NamedBarrier (NULL, id++);
}
total_timer.stop();
diff --git a/Carpet/Carpet/src/CarpetBasegrid.cc b/Carpet/Carpet/src/CarpetBasegrid.cc
index c2dc45f81..7e3ab4ae0 100644
--- a/Carpet/Carpet/src/CarpetBasegrid.cc
+++ b/Carpet/Carpet/src/CarpetBasegrid.cc
@@ -1,10 +1,10 @@
#include <limits>
-#include "cctk.h"
-#include "cctk_Arguments.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Arguments.h>
+#include <cctk_Parameters.h>
-#include "carpet.hh"
+#include <carpet.hh>
diff --git a/Carpet/Carpet/src/CarpetParamCheck.cc b/Carpet/Carpet/src/CarpetParamCheck.cc
index fb9b40861..cf3d861ed 100644
--- a/Carpet/Carpet/src/CarpetParamCheck.cc
+++ b/Carpet/Carpet/src/CarpetParamCheck.cc
@@ -1,11 +1,11 @@
#include <cassert>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Arguments.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Arguments.h>
+#include <cctk_Parameters.h>
-#include "carpet.hh"
+#include <carpet.hh>
diff --git a/Carpet/Carpet/src/CarpetStartup.cc b/Carpet/Carpet/src/CarpetStartup.cc
index 822c03845..07677c80d 100644
--- a/Carpet/Carpet/src/CarpetStartup.cc
+++ b/Carpet/Carpet/src/CarpetStartup.cc
@@ -1,12 +1,12 @@
#include <cassert>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "carpet.hh"
+#include <dist.hh>
-#include "dist.hh"
+#include <carpet.hh>
@@ -19,8 +19,11 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
comm_universe = MPI_COMM_WORLD;
+ // cerr << "QQQ: CarpetMultiModelStartup[1]" << endl;
SplitUniverse (comm_universe, model, comm_world, true);
+ // cerr << "QQQ: CarpetMultiModelStartup[2]" << endl;
dist::pseudoinit (comm_world);
+ // cerr << "QQQ: CarpetMultiModelStartup[3]" << endl;
return 0;
}
@@ -46,6 +49,7 @@ namespace Carpet {
CCTK_OverloadEnableGroupComm (EnableGroupComm);
CCTK_OverloadDisableGroupComm (DisableGroupComm);
CCTK_OverloadBarrier (Barrier);
+ CCTK_OverloadNamedBarrier (NamedBarrier);
CCTK_OverloadExit (Exit);
CCTK_OverloadAbort (Abort);
CCTK_OverloadMyProc (MyProc);
diff --git a/Carpet/Carpet/src/Checksum.cc b/Carpet/Carpet/src/Checksum.cc
index e65710038..139ba1555 100644
--- a/Carpet/Carpet/src/Checksum.cc
+++ b/Carpet/Carpet/src/Checksum.cc
@@ -2,12 +2,14 @@
#include <cstdlib>
#include <vector>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
+#include <util_ErrorCodes.h>
+#include <util_Table.h>
-#include "gh.hh"
+#include <gh.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -20,7 +22,7 @@ namespace Carpet {
// Checksum information
struct ckdesc {
bool valid;
- unsigned int sum;
+ unsigned long sum;
};
// Helper class
@@ -33,6 +35,30 @@ namespace Carpet {
+ // Calculate the internet checksum (see RFC 1071)
+ static unsigned short
+ internet_checksum (void const * restrict const addr,
+ size_t const len)
+ {
+ unsigned long chk = 0;
+#pragma omp parallel for reduction (+: chk)
+ for (ptrdiff_t i=0; i<(ptrdiff_t)len; i+=2) {
+ unsigned long const lb = ((unsigned char const*)addr)[i];
+ unsigned long const ub = ((unsigned char const*)addr)[i+1];
+ chk += lb + (ub << 8);
+ }
+ if (len % 1) {
+ unsigned long const lb = ((unsigned char const*)addr)[len-1];
+ chk += lb;
+ }
+ while (chk >> 16) {
+ chk = (chk & 0xffffUL) + (chk >> 16);
+ }
+ return ~chk;
+ }
+
+
+
// The parameter where specifies which time levels should be
// poisoned. what specifies what kind of grid variables should be
// poisoned.
@@ -52,11 +78,11 @@ namespace Carpet {
const int grouptype = CCTK_GroupTypeI(group);
if (reflevel == 0 or grouptype == CCTK_GF) {
checksums.at(reflevel).at(mglevel).at(group).a.resize(arrdata.at(group).size());
- BEGIN_MAP_LOOP(cgh, grouptype) {
- checksums.at(reflevel).at(mglevel).at(group).a.at(map).resize(arrdata.at(group).at(map).hh->components(reflevel));
+ BEGIN_LOCAL_MAP_LOOP(cgh, grouptype) {
+ checksums.at(reflevel).at(mglevel).at(group).a.at(map).resize(arrdata.at(group).at(map).hh->local_components(reflevel));
BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
const int nvars = CCTK_NumVarsInGroupI(group);
- checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).resize(nvars);
+ checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).resize(nvars);
if (nvars > 0) {
const int n0 = CCTK_FirstVarIndexI(group);
@@ -70,30 +96,48 @@ namespace Carpet {
}
const int np = prod(size);
+ int const table = CCTK_GroupTagsTableI (group);
+ assert (table >= 0);
+ bool persistent;
+ char buf[100];
+ int const ilen =
+ Util_TableGetString (table, sizeof buf, buf, "Persistent");
+ if (ilen > 0) {
+ if (CCTK_EQUALS(buf, "yes")) {
+ persistent = true;
+ } else if (CCTK_EQUALS(buf, "no")) {
+ persistent = false;
+ } else {
+ assert (0);
+ }
+ } else if (ilen == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ // default
+ persistent = true;
+ } else {
+ assert (0);
+ }
+
const int num_tl = CCTK_NumTimeLevelsFromVarI(n0);
assert (num_tl>0);
- const int min_tl = min_timelevel(where, num_tl);
- const int max_tl = max_timelevel(where, num_tl);
+ const int min_tl = min_timelevel(where, num_tl, persistent);
+ const int max_tl = max_timelevel(where, num_tl, persistent);
for (int var=0; var<nvars; ++var) {
- checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).resize(num_tl);
+ checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).resize(num_tl);
for (int tl=min_tl; tl<=max_tl; ++tl) {
const int n = n0 + var;
const void* data = cgh->data[n][tl];
- unsigned int chk = 0;
- for (int i=0; i<np*sz/(int)sizeof chk; ++i) {
- chk += ((const unsigned int*)data)[i];
- }
+ unsigned long const chk = internet_checksum (data, np*sz);
- checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).at(tl).sum = chk;
- checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).at(tl).valid = true;
+ checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).at(tl).sum = chk;
+ checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).at(tl).valid = true;
} // for tl
} // for var
} // if group has vars
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} // if grouptype fits
} // if storage
} // for group
@@ -118,11 +162,11 @@ namespace Carpet {
const int grouptype = CCTK_GroupTypeI(group);
if (reflevel == 0 or grouptype == CCTK_GF) {
assert (checksums.at(reflevel).at(mglevel).at(group).a.size()==arrdata.at(group).size());
- BEGIN_MAP_LOOP(cgh, grouptype) {
- assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).size()==arrdata.at(group).at(map).hh->components(reflevel));
+ BEGIN_LOCAL_MAP_LOOP(cgh, grouptype) {
+ assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).size()==arrdata.at(group).at(map).hh->local_components(reflevel));
BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
const int nvars = CCTK_NumVarsInGroupI(group);
- assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).size()==nvars);
+ assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).size()==nvars);
if (nvars > 0) {
const int n0 = CCTK_FirstVarIndexI(group);
@@ -136,24 +180,42 @@ namespace Carpet {
}
const int np = prod(size);
+ int const table = CCTK_GroupTagsTableI (group);
+ assert (table >= 0);
+ bool persistent;
+ char buf[100];
+ int const ilen =
+ Util_TableGetString (table, sizeof buf, buf, "Persistent");
+ if (ilen > 0) {
+ if (CCTK_EQUALS(buf, "yes")) {
+ persistent = true;
+ } else if (CCTK_EQUALS(buf, "no")) {
+ persistent = false;
+ } else {
+ assert (0);
+ }
+ } else if (ilen == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ // default
+ persistent = true;
+ } else {
+ assert (0);
+ }
+
const int num_tl = CCTK_NumTimeLevelsFromVarI(n0);
assert (num_tl>0);
- const int min_tl = min_timelevel(where, num_tl);
- const int max_tl = max_timelevel(where, num_tl);
+ const int min_tl = min_timelevel(where, num_tl, persistent);
+ const int max_tl = max_timelevel(where, num_tl, persistent);
for (int var=0; var<nvars; ++var) {
- assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).size()==num_tl);
+ assert ((int)checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).size()==num_tl);
for (int tl=min_tl; tl<=max_tl; ++tl) {
- if (checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).at(tl).valid) {
+ if (checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).at(tl).valid) {
const int n = n0 + var;
const void* data = cgh->data[n][tl];
- unsigned int chk = 0;
- for (int i=0; i<np*sz/(int)sizeof chk; ++i) {
- chk += ((const unsigned int*)data)[i];
- }
+ unsigned long const chk = internet_checksum (data, np*sz);
const bool unexpected_change =
- chk != checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(component).at(var).at(tl).sum;
+ chk != checksums.at(reflevel).at(mglevel).at(group).a.at(map).at(local_component).at(var).at(tl).sum;
if (unexpected_change) {
char* fullname = CCTK_FullName(n);
@@ -168,7 +230,7 @@ namespace Carpet {
} // for var
} // if group has vars
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} // if grouptype fits
} // if storage
} // for group
diff --git a/Carpet/Carpet/src/Comm.cc b/Carpet/Carpet/src/Comm.cc
index 674d7a40c..64f2f0480 100644
--- a/Carpet/Carpet/src/Comm.cc
+++ b/Carpet/Carpet/src/Comm.cc
@@ -4,13 +4,14 @@
#include <cstdlib>
#include <iostream>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "ggf.hh"
-#include "gh.hh"
+#include <ggf.hh>
+#include <gh.hh>
-#include "carpet.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -75,10 +76,11 @@ namespace Carpet {
// check consistency of all groups:
// create a new set with empty and no-storage groups removed
vector<int> goodgroups;
- for (size_t g = 0; g < groups.size(); g++) {
- const int group = groups[g];
- const int grouptype = CCTK_GroupTypeI (group);
- char* groupname = CCTK_GroupName (group);
+ goodgroups.reserve (groups.size());
+ for (size_t group = 0; group < groups.size(); group++) {
+ const int g = groups.AT(group);
+ const int grouptype = CCTK_GroupTypeI (g);
+ char* const groupname = CCTK_GroupName (g);
Checkpoint ("SyncGroup \"%s\" time=%g",
groupname, (double) cctkGH->cctk_time);
@@ -102,7 +104,7 @@ namespace Carpet {
}
}
if (component != -1) {
- if (maps == 1 and vhh.at(map)->local_components(reflevel) == 1) {
+ if (maps == 1 and vhh.AT(map)->local_components(reflevel) == 1) {
CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
"Synchronising group \"%s\" in local mode",
groupname);
@@ -115,83 +117,39 @@ namespace Carpet {
}
}
- if (not CCTK_QueryGroupStorageI (cctkGH, group)) {
+ if (not CCTK_QueryGroupStorageI (cctkGH, g)) {
CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
"Cannot synchronise group \"%s\" because it has no storage",
groupname);
retval = -1;
}
- else if (CCTK_NumVarsInGroupI (group) > 0) {
- goodgroups.push_back(group);
+ else if (CCTK_NumVarsInGroupI (g) > 0) {
+ goodgroups.push_back(g);
}
free (groupname);
- }
+ } // for g
if (goodgroups.size() > 0) {
- bool local_do_prolongate;
- if (do_prolongate) {
- if (do_taper) {
- if (reflevel == 0) {
- local_do_prolongate = true;
- } else { // on a fine level
-#warning "TODO: Check iteration number instead -- this is wrong while regridding"
- CCTK_REAL mytime;
- CCTK_REAL parenttime;
- if (map == -1) {
- mytime = vtt.at(0)->time (0, reflevel, mglevel);
- parenttime = vtt.at(0)->time (0, reflevel - 1, mglevel);
- } else {
- mytime = vtt.at(map)->time (0, reflevel, mglevel);
- parenttime = vtt.at(map)->time (0, reflevel - 1, mglevel);
- }
- CCTK_REAL const eps = 1.0e-12;
- bool const in_sync =
- abs (mytime - parenttime) <= eps * abs (delta_time);
-#if 0
- int const parent_do_every =
- ipow(mgfact, mglevel) *
- (maxtimereflevelfact / timereffacts.at(reflevel-1));
- bool const parent_is_active =
- cctkGH->cctk_iteration == 0 or
- (cctkGH->cctk_iteration-1) % parent_do_every == 0;
- int const do_every =
- ipow(mgfact, mglevel) *
- (maxtimereflevelfact / timereffacts.at(reflevel));
- bool const is_active =
- cctkGH->cctk_iteration == 0 or
- (cctkGH->cctk_iteration-1) % do_every == 0;
- bool const new_in_sync = is_active and parent_is_active;
-#warning "just for testing"
-#warning "if this breaks, fix also CarpetRegrid2"
- assert (new_in_sync == in_sync);
- if (not (new_in_sync == in_sync)) {
- CCTK_WARN (CCTK_WARN_ABORT, "assert (new_in_sync == in_sync)");
- }
-#endif
- local_do_prolongate = in_sync;
- }
- } else { // no tapered grids
- local_do_prolongate = true;
- }
- } else { // not do_prolongate
- local_do_prolongate = false;
- }
-
// prolongate boundaries
+ bool const local_do_prolongate = do_prolongate and not do_taper;
if (local_do_prolongate) {
- if (reflevel > 0) {
- ProlongateGroupBoundaries (cctkGH, cctk_initial_time, goodgroups);
- }
+ static Timer timer ("Evolve::Prolongate");
+ timer.start();
+ ProlongateGroupBoundaries (cctkGH, cctk_initial_time, goodgroups);
+ timer.stop();
}
// synchronise ghostzones
if (sync_during_time_integration or local_do_prolongate) {
+ static Timer timer ("Evolve::Sync");
+ timer.start();
SyncGroups (cctkGH, goodgroups);
+ timer.stop();
}
- } // for g
+ }
return retval;
}
@@ -204,10 +162,16 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
const int tl = 0;
- // use the current time here (which may be modified by the user)
- const CCTK_REAL time
- = (cctkGH->cctk_time - initial_time) / delta_time;
+ if (reflevel == 0) return;
+
+ Checkpoint ("ProlongateGroups");
+ assert (groups.size() > 0);
+
+ // use the current time here (which may be modified by the user)
+ const CCTK_REAL time =
+ (cctkGH->cctk_time - initial_time) / delta_time;
+
for (comm_state state; not state.done(); state.step()) {
for (int group = 0; group < (int)groups.size(); ++group) {
const int g = groups.AT(group);
@@ -216,10 +180,10 @@ namespace Carpet {
continue;
}
assert (reflevel>=0 and reflevel<reflevels);
-
- for (int m = 0; m < (int)arrdata.at(g).size(); ++m) {
- for (int v = 0; v < (int)arrdata.at(g).at(m).data.size(); ++v) {
- ggf *const gv = arrdata.at(g).at(m).data.at(v);
+
+ for (int m = 0; m < (int)arrdata.AT(g).size(); ++m) {
+ for (int v = 0; v < (int)arrdata.AT(g).AT(m).data.size(); ++v) {
+ ggf *const gv = arrdata.AT(g).AT(m).data.AT(v);
gv->ref_bnd_prolongate_all (state, tl, reflevel, mglevel, time);
}
}
@@ -234,18 +198,20 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
const int tl = 0;
+ Checkpoint ("SyncGroups");
+
assert (groups.size() > 0);
for (comm_state state; not state.done(); state.step()) {
for (int group = 0; group < (int)groups.size(); ++group) {
- const int g = groups[group];
+ const int g = groups.AT(group);
const int grouptype = CCTK_GroupTypeI (g);
const int ml = grouptype == CCTK_GF ? mglevel : 0;
const int rl = grouptype == CCTK_GF ? reflevel : 0;
- for (int m = 0; m < (int)arrdata.at(g).size(); ++m) {
- for (int v = 0; v < (int)arrdata.at(g).at(m).data.size(); ++v) {
- arrdesc& array = arrdata.at(g).at(m);
- array.data.at(v)->sync_all (state, tl, rl, ml);
+ for (int m = 0; m < (int)arrdata.AT(g).size(); ++m) {
+ for (int v = 0; v < (int)arrdata.AT(g).AT(m).data.size(); ++v) {
+ arrdesc& array = arrdata.AT(g).AT(m);
+ array.data.AT(v)->sync_all (state, tl, rl, ml);
}
}
}
diff --git a/Carpet/Carpet/src/Cycle.cc b/Carpet/Carpet/src/Cycle.cc
index 1a2931dd0..889f305f1 100644
--- a/Carpet/Carpet/src/Cycle.cc
+++ b/Carpet/Carpet/src/Cycle.cc
@@ -1,12 +1,12 @@
#include <cassert>
#include <cstdlib>
-#include "cctk.h"
+#include <cctk.h>
-#include "ggf.hh"
-#include "gh.hh"
+#include <ggf.hh>
+#include <gh.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -27,9 +27,9 @@ namespace Carpet {
case CCTK_GF:
assert (reflevel>=0 and reflevel<reflevels);
- for (int m=0; m<(int)arrdata.at(group).size(); ++m) {
+ for (int m=0; m<(int)arrdata.AT(group).size(); ++m) {
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(m).data.at(var)->
+ arrdata.AT(group).AT(m).data.AT(var)->
cycle_all (reflevel, mglevel);
}
}
@@ -41,15 +41,14 @@ namespace Carpet {
int const numtimelevels = CCTK_NumTimeLevelsI (group);
int const firstvarindex = CCTK_FirstVarIndexI (group);
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(0).data.at(var)->cycle_all (0, mglevel);
+ arrdata.AT(group).AT(0).data.AT(var)->cycle_all (0, mglevel);
{
int const varindex = firstvarindex + var;
- int const c = CCTK_MyProc(cgh);
for (int tl=0; tl<numtimelevels; ++tl) {
cgh->data[varindex][tl]
- = (tl < groupdata.at(group).info.activetimelevels
- ? ((*arrdata.at(group).at(0).data.at(var))
- (tl, 0, c, 0)->storage())
+ = (tl < groupdata.AT(group).info.activetimelevels
+ ? ((*arrdata.AT(group).AT(0).data.AT(var))
+ (tl, 0, 0, 0)->storage())
: NULL);
}
}
@@ -77,9 +76,9 @@ namespace Carpet {
case CCTK_GF:
assert (reflevel>=0 and reflevel<reflevels);
- for (int m=0; m<(int)arrdata.at(group).size(); ++m) {
+ for (int m=0; m<(int)arrdata.AT(group).size(); ++m) {
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(m).data.at(var)->
+ arrdata.AT(group).AT(m).data.AT(var)->
flip_all (reflevel, mglevel);
}
}
@@ -91,15 +90,14 @@ namespace Carpet {
int const numtimelevels = CCTK_NumTimeLevelsI (group);
int const firstvarindex = CCTK_FirstVarIndexI (group);
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(0).data.at(var)->flip_all (0, mglevel);
+ arrdata.AT(group).AT(0).data.AT(var)->flip_all (0, mglevel);
{
int const varindex = firstvarindex + var;
- int const c = CCTK_MyProc(cgh);
for (int tl=0; tl<numtimelevels; ++tl) {
cgh->data[varindex][tl]
- = (tl < groupdata.at(group).info.activetimelevels
- ? ((*arrdata.at(group).at(0).data.at(var))
- (tl, 0, c, 0)->storage())
+ = (tl < groupdata.AT(group).info.activetimelevels
+ ? ((*arrdata.AT(group).AT(0).data.AT(var))
+ (tl, 0, 0, 0)->storage())
: NULL);
}
}
@@ -127,9 +125,9 @@ namespace Carpet {
case CCTK_GF:
assert (reflevel>=0 and reflevel<reflevels);
- for (int m=0; m<(int)arrdata.at(group).size(); ++m) {
+ for (int m=0; m<(int)arrdata.AT(group).size(); ++m) {
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(m).data.at(var)->
+ arrdata.AT(group).AT(m).data.AT(var)->
fill_all (reflevel, mglevel);
}
}
@@ -139,7 +137,7 @@ namespace Carpet {
case CCTK_ARRAY:
if (do_global_mode) {
for (int var=0; var<CCTK_NumVarsInGroupI(group); ++var) {
- arrdata.at(group).at(0).data.at(var)->fill_all (0, mglevel);
+ arrdata.AT(group).AT(0).data.AT(var)->fill_all (0, mglevel);
}
}
break;
diff --git a/Carpet/Carpet/src/Evolve.cc b/Carpet/Carpet/src/Evolve.cc
index 5b9d8ff96..103221088 100644
--- a/Carpet/Carpet/src/Evolve.cc
+++ b/Carpet/Carpet/src/Evolve.cc
@@ -16,8 +16,8 @@
#include <dist.hh>
#include <th.hh>
-#include "carpet.hh"
-#include "Timers.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -53,27 +53,21 @@ namespace Carpet {
int const convlev = 0;
cGH* cctkGH = fc->GH[convlev];
- // Tapered grids
- do_taper = use_tapered_grids;
-
// Main loop
- BeginTiming (cctkGH);
+ BeginTimingEvolution (cctkGH);
static Timer timer ("Evolve");
timer.start();
while (not do_terminate (cctkGH)) {
AdvanceTime (cctkGH);
{
- int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1);
+ int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1);
if ((cctkGH->cctk_iteration - 1) % do_every == 0) {
- bool const old_do_taper = do_taper;
- do_taper = false;
ENTER_GLOBAL_MODE (cctkGH, 0) {
BEGIN_REFLEVEL_LOOP (cctkGH) {
CallRegrid (cctkGH);
} END_REFLEVEL_LOOP;
} LEAVE_GLOBAL_MODE;
- do_taper = old_do_taper;
}
}
CallEvol (cctkGH);
@@ -83,7 +77,7 @@ namespace Carpet {
// Print timer values
{
- int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1);
+ int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1);
if (output_timers_every > 0 and
cctkGH->cctk_iteration % output_timers_every == 0 and
cctkGH->cctk_iteration % do_every == 0)
@@ -99,9 +93,9 @@ namespace Carpet {
for (int ml=0; ml<mglevels; ++ml) {
for (int rl=0; rl<reflevels; ++rl) {
int const do_every =
- ipow (mgfact, ml) * (maxtimereflevelfact / timereffacts.at(rl));
+ ipow (mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl));
if (cctkGH->cctk_iteration % do_every == 0) {
- assert (abs (leveltimes.at(ml).at(rl) - global_time) <=
+ assert (abs (leveltimes.AT(ml).AT(rl) - global_time) <=
eps * global_time);
}
}
@@ -111,8 +105,6 @@ namespace Carpet {
} // end main loop
timer.stop();
- do_taper = false;
-
Waypoint ("Done with evolution loop");
return 0;
@@ -132,7 +124,7 @@ namespace Carpet {
// Do not test on non-active reflevels to save the call to
// MPI_Allreduce below
- int const do_every = maxtimereflevelfact / timereffacts.at(reflevels-1);
+ int const do_every = maxtimereflevelfact / timereffacts.AT(reflevels-1);
if (cctkGH->cctk_iteration % do_every != 0)
{
@@ -228,7 +220,7 @@ namespace Carpet {
}
if ((cctkGH->cctk_iteration-1)
- % (maxtimereflevelfact / timereffacts.at(reflevels-1)) == 0) {
+ % (maxtimereflevelfact / timereffacts.AT(reflevels-1)) == 0) {
Waypoint ("Evolving iteration %d at t=%g",
cctkGH->cctk_iteration, (double)cctkGH->cctk_time);
}
@@ -273,25 +265,31 @@ namespace Carpet {
// Regrid
Checkpoint ("Regrid");
int const oldreflevels = reflevels;
- bool const did_regrid = Regrid (cctkGH, false);
+ bool const did_regrid = Regrid (cctkGH, false, true);
bool const did_remove_level = reflevels < oldreflevels;
assert (not did_remove_level or did_regrid);
if (did_regrid) {
+ bool did_any_recompose = false;
BEGIN_META_MODE (cctkGH) {
for (int rl=0; rl<reflevels; ++rl) {
bool const did_recompose = Recompose (cctkGH, rl, true);
+ did_any_recompose = did_any_recompose or did_recompose;
// Do not omit the global mode call when the finest level
// does not change:
// if (did_recompose or (did_remove_level and rl == reflevels - 1)) {
- if (did_recompose or rl == reflevels - 1) {
+ if (did_recompose or
+ ((did_remove_level or did_any_recompose) and
+ rl == reflevels - 1))
+ {
BEGIN_MGLEVEL_LOOP (cctkGH) {
ENTER_LEVEL_MODE (cctkGH, rl) {
do_early_global_mode = reflevel==0;
do_late_global_mode = reflevel==reflevels-1;
- do_early_meta_mode = do_early_global_mode and mglevel==mglevels-1;
+ do_early_meta_mode =
+ do_early_global_mode and mglevel==mglevels-1;
do_late_meta_mode = do_late_global_mode and mglevel==0;
do_global_mode = do_late_global_mode;
do_meta_mode = do_late_meta_mode;
@@ -309,17 +307,17 @@ namespace Carpet {
// Rewind times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
CCTK_REAL const old_cctk_time = cctkGH->cctk_time;
@@ -330,7 +328,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
cctkGH->cctk_time +=
@@ -352,6 +350,8 @@ namespace Carpet {
} END_META_MODE;
} // if did_regrid
+ RegridFree (cctkGH, true);
+
do_global_mode = old_do_global_mode;
do_early_global_mode = old_do_early_global_mode;
do_late_global_mode = old_do_late_global_mode;
@@ -380,7 +380,7 @@ namespace Carpet {
for (int rl=0; rl<reflevels; ++rl) {
int const do_every
- = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.at(rl));
+ = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl));
if ((cctkGH->cctk_iteration-1) % do_every == 0) {
ENTER_GLOBAL_MODE (cctkGH, ml) {
ENTER_LEVEL_MODE (cctkGH, rl) {
@@ -395,6 +395,15 @@ namespace Carpet {
have_done_global_mode |= do_global_mode;
have_done_anything = true;
+ if (use_tapered_grids and reflevel > 0) {
+ int const parent_do_every =
+ ipow(mgfact, mglevel) *
+ (maxtimereflevelfact / timereffacts.AT(reflevel-1));
+ bool const parent_is_active =
+ (cctkGH->cctk_iteration-1) % parent_do_every == 0;
+ do_taper = not parent_is_active;
+ }
+
// Advance times
cctkGH->cctk_time
= (global_time
@@ -402,7 +411,7 @@ namespace Carpet {
+ delta_time * mglevelfact / timereflevelfact);
CCTK_REAL const carpet_time = cctkGH->cctk_time / delta_time;
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
if (not adaptive_stepsize) {
#if 0
// We must not perform this check, since the
@@ -413,7 +422,7 @@ namespace Carpet {
static_assert (abs(0.1) > 0,
"Function CarpetLib::abs has wrong signature");
CCTK_REAL const level_time =
- vtt.at(m)->get_time (reflevel, mglevel);
+ vtt.AT(m)->get_time (reflevel, mglevel);
if (not (abs (level_time - carpet_time) <=
eps * max (carpet_time, 1.0))) {
int const oldprecision = cerr.precision();
@@ -429,15 +438,16 @@ namespace Carpet {
assert (abs (level_time - carpet_time) <=
eps * max (carpet_time, 1.0));
#endif
- vtt.at(m)->set_time (reflevel, mglevel, carpet_time);
+ vtt.AT(m)->set_time (reflevel, mglevel, carpet_time);
}
}
CycleTimeLevels (cctkGH);
- Waypoint ("Evolution I at iteration %d time %g%s%s",
+ Waypoint ("Evolution I at iteration %d time %g%s%s%s",
cctkGH->cctk_iteration, (double)cctkGH->cctk_time,
(do_global_mode ? " (global)" : ""),
- (do_meta_mode ? " (meta)" : ""));
+ (do_meta_mode ? " (meta)" : ""),
+ (do_taper ? " (tapering)" : ""));
// Checking
CalculateChecksums (cctkGH, allbutcurrenttime);
@@ -451,7 +461,9 @@ namespace Carpet {
PoisonCheck (cctkGH, currenttime);
// Timing statistics
- StepTiming (cctkGH);
+ StepTimingEvolution (cctkGH);
+
+ do_taper = false;
} LEAVE_LEVEL_MODE;
} LEAVE_GLOBAL_MODE;
@@ -476,7 +488,7 @@ namespace Carpet {
for (int ml=mglevels-1; ml>=0; --ml) {
for (int rl=reflevels-1; rl>=0; --rl) {
int const do_every
- = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.at(rl));
+ = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl));
if (cctkGH->cctk_iteration % do_every == 0) {
ENTER_GLOBAL_MODE (cctkGH, ml) {
ENTER_LEVEL_MODE (cctkGH, rl) {
@@ -513,7 +525,7 @@ namespace Carpet {
for (int rl=0; rl<reflevels; ++rl) {
int const do_every
- = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.at(rl));
+ = ipow(mgfact, ml) * (maxtimereflevelfact / timereffacts.AT(rl));
if (cctkGH->cctk_iteration % do_every == 0) {
ENTER_GLOBAL_MODE (cctkGH, ml) {
ENTER_LEVEL_MODE (cctkGH, rl) {
@@ -528,10 +540,20 @@ namespace Carpet {
have_done_global_mode |= do_global_mode;
have_done_anything = true;
- Waypoint ("Evolution II at iteration %d time %g%s%s",
+ if (use_tapered_grids and reflevel > 0) {
+ int const parent_do_every =
+ ipow(mgfact, mglevel) *
+ (maxtimereflevelfact / timereffacts.AT(reflevel-1));
+ bool const parent_is_active =
+ (cctkGH->cctk_iteration-1) % parent_do_every == 0;
+ do_taper = not parent_is_active;
+ }
+
+ Waypoint ("Evolution II at iteration %d time %g%s%s%s",
cctkGH->cctk_iteration, (double)cctkGH->cctk_time,
(do_global_mode ? " (global)" : ""),
- (do_meta_mode ? " (meta)" : ""));
+ (do_meta_mode ? " (meta)" : ""),
+ (do_taper ? " (tapering)" : ""));
if (reflevel < reflevels-1) {
ScheduleTraverse (where, "CCTK_POSTRESTRICT", cctkGH);
@@ -566,6 +588,8 @@ namespace Carpet {
PrintTimingStats (cctkGH);
}
+ do_taper = false;
+
} LEAVE_LEVEL_MODE;
} LEAVE_GLOBAL_MODE;
} // if do_every
@@ -607,15 +631,27 @@ namespace Carpet {
void ScheduleTraverse (char const * const where, char const * const name,
cGH * const cctkGH)
{
+ // Obtain the set of timers, creating it explicitly if it does not
+ // yet exist
+ typedef std::map <string, Timer *> timers_t;
+ // static timers_t timers;
+ static timers_t * timersp = NULL;
+ if (not timersp) timersp = new timers_t;
+ timers_t & timers = * timersp;
+
+ // Obtain timer, creating a new one if it does not yet exist
ostringstream timernamebuf;
timernamebuf << where << "::" << name;
string const timername = timernamebuf.str();
- static std::map <string, Timer *> timers;
- Timer * & mapped = timers[timername];
- if (not mapped) {
- mapped = new Timer (timername.c_str());
+ timers_t::iterator ti = timers.find (timername);
+ if (ti == timers.end()) {
+ pair <string, Timer *> const
+ newtimer (timername, new Timer (timername.c_str()));
+ ti = timers.insert(newtimer).first;
+ // It is possible to find and insert with the same function
+ // call, but this makes the code significantly more complicated
}
- Timer & timer = * mapped;
+ Timer & timer = * ti->second;
timer.start();
ostringstream infobuf;
diff --git a/Carpet/Carpet/src/Initialise.cc b/Carpet/Carpet/src/Initialise.cc
index 836be8635..94bd24521 100644
--- a/Carpet/Carpet/src/Initialise.cc
+++ b/Carpet/Carpet/src/Initialise.cc
@@ -11,8 +11,8 @@
#include <cctki_ScheduleBindings.h>
#include <cctki_WarnLevel.h>
-#include "carpet.hh"
-#include "Timers.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -64,8 +64,8 @@ namespace Carpet {
global_time = cctk_initial_time;
delta_time = 1.0;
for (int ml = 0; ml < mglevel; ++ ml) {
- assert (leveltimes.at(ml).size() == 1);
- leveltimes.at(ml).at(0) = global_time;
+ assert (leveltimes.AT(ml).size() == 1);
+ leveltimes.AT(ml).AT(0) = global_time;
}
cctkGH->cctk_iteration = 0;
@@ -87,8 +87,8 @@ namespace Carpet {
#if 0
// Write grid structure to file
for (int m=0; m<maps; ++m) {
- OutputGridStructure (cctkGH, m, vhh.at(m)->regions);
- OutputGridCoordinates (cctkGH, m, vhh.at(m)->regions);
+ OutputGridStructure (cctkGH, m, vhh.AT(m)->regions);
+ OutputGridCoordinates (cctkGH, m, vhh.AT(m)->regions);
} // for m
#endif
@@ -332,15 +332,15 @@ namespace Carpet {
not CCTK_EQUALS (initial_data_setup_method, "init_single_level");
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
- (reflevel, mglevel, - vtt.at(m)->get_delta (reflevel, mglevel));
+ vtt.AT(m)->set_delta
+ (reflevel, mglevel, - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
- (reflevel, mglevel, - vtt.at(m)->get_delta (reflevel, mglevel));
+ vtt.AT(m)->set_delta
+ (reflevel, mglevel, - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
@@ -348,7 +348,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
cctkGH->cctk_time =
(+ global_time
@@ -468,7 +468,7 @@ namespace Carpet {
(do_meta_mode ? " (meta)" : ""));
int const do_every =
- ipow(mgfact, mglevel) * (maxtimereflevelfact / timereffacts.at(rl));
+ ipow(mgfact, mglevel) * (maxtimereflevelfact / timereffacts.AT(rl));
if (cctkGH->cctk_iteration % do_every == 0)
{
// Checkpoint
@@ -580,17 +580,17 @@ namespace Carpet {
// Rewind times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
CCTK_REAL const old_cctk_time = cctkGH->cctk_time;
@@ -601,7 +601,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
cctkGH->cctk_time +=
@@ -627,6 +627,10 @@ namespace Carpet {
} END_META_MODE;
} // if did_regrid
+ if (callregrid) {
+ RegridFree (cctkGH);
+ }
+
do_global_mode = old_do_global_mode;
do_meta_mode = old_do_meta_mode;
}
@@ -670,15 +674,15 @@ namespace Carpet {
// Rewind times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
- (reflevel, mglevel, - vtt.at(m)->get_delta (reflevel, mglevel));
+ vtt.AT(m)->set_delta
+ (reflevel, mglevel, - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
- (reflevel, mglevel, - vtt.at(m)->get_delta (reflevel, mglevel));
+ vtt.AT(m)->set_delta
+ (reflevel, mglevel, - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
CCTK_REAL const old_cctk_time = cctkGH->cctk_time;
@@ -689,7 +693,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
cctkGH->cctk_time +=
@@ -752,7 +756,7 @@ namespace Carpet {
// Regrid
Checkpoint ("Regrid");
- bool const did_regrid = Regrid (cctkGH, true);
+ bool const did_regrid = Regrid (cctkGH, true, prolongate_initial_data);
if (did_regrid) {
BEGIN_META_MODE (cctkGH) {
@@ -786,17 +790,17 @@ namespace Carpet {
// Rewind times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
CCTK_REAL const old_cctk_time = cctkGH->cctk_time;
@@ -807,7 +811,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
cctkGH->cctk_time +=
@@ -829,6 +833,8 @@ namespace Carpet {
} END_META_MODE;
} // if did_regrid
+ RegridFree (cctkGH, prolongate_initial_data);
+
do_global_mode = old_do_global_mode;
do_early_global_mode = old_do_early_global_mode;
do_late_global_mode = old_do_late_global_mode;
@@ -877,14 +883,18 @@ namespace Carpet {
// Regrid
Checkpoint ("Regrid");
- bool const did_regrid = Regrid (cctkGH, true);
+ bool const did_regrid = Regrid (cctkGH, true, prolongate_initial_data);
if (did_regrid) {
for (int rl=0; rl<reflevels; ++rl) {
- Recompose (cctkGH, rl, prolongate_initial_data);
+ if (not enable_no_storage) {
+ Recompose (cctkGH, rl, prolongate_initial_data);
+ }
} // for rl
} // if did_regrid
+ RegridFree (cctkGH, prolongate_initial_data);
+
} LEAVE_LEVEL_MODE;
} LEAVE_GLOBAL_MODE;
@@ -936,7 +946,7 @@ namespace Carpet {
// Regrid
Checkpoint ("Regrid");
- bool const did_regrid = Regrid (cctkGH, true);
+ bool const did_regrid = Regrid (cctkGH, true, prolongate_initial_data);
if (did_regrid) {
BEGIN_META_MODE (cctkGH) {
@@ -971,17 +981,17 @@ namespace Carpet {
// Rewind times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
for (int tl=0; tl<num_tl; ++tl) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
CycleTimeLevels (cctkGH);
}
- vtt.at(m)->set_delta
+ vtt.AT(m)->set_delta
(reflevel, mglevel,
- - vtt.at(m)->get_delta (reflevel, mglevel));
+ - vtt.AT(m)->get_delta (reflevel, mglevel));
FlipTimeLevels (cctkGH);
} // for m
CCTK_REAL const old_cctk_time = cctkGH->cctk_time;
@@ -992,7 +1002,7 @@ namespace Carpet {
// Advance times
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
cctkGH->cctk_time +=
@@ -1014,6 +1024,8 @@ namespace Carpet {
} END_META_MODE;
} // if did_regrid
+ RegridFree (cctkGH, prolongate_initial_data);
+
do_global_mode = old_do_global_mode;
do_early_global_mode = old_do_early_global_mode;
do_late_global_mode = old_do_late_global_mode;
@@ -1051,8 +1063,20 @@ namespace Carpet {
Waypoint ("Initialising three timelevels");
// TODO: ensure that there are 3 timelevels
+ if (not (prolongation_order_time == 2)) {
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "The 3 timelevel initialisation scheme (init_3_timelevels=yes) requires 3 timelevels and a temporal prolongation order of 2 (prolongation_order_time=2)");
+ }
assert (prolongation_order_time == 2);
+ for (int rl=0; rl<int(timereffacts.size()); ++rl) {
+ if (not (timereffacts.AT(rl) == ipow (2, rl))) {
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "The 3 timelevel initialisation scheme (init_3_timelevels=yes) requires temporal refinement factors of 2 for all refinement levels (time_refinement_factors[rl]=pow(2,rl))");
+ }
+ assert (timereffacts.AT(rl) == ipow (2, rl));
+ }
+
BEGIN_MGLEVEL_LOOP(cctkGH) {
BEGIN_REFLEVEL_LOOP(cctkGH) {
do_early_global_mode = reflevel==0;
@@ -1120,7 +1144,7 @@ namespace Carpet {
cctkGH->cctk_time
= global_time + delta_time * mglevelfact / timereflevelfact;
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
@@ -1236,7 +1260,7 @@ namespace Carpet {
cctkGH->cctk_time
= global_time + 2 * delta_time * mglevelfact / timereflevelfact;
for (int m=0; m<maps; ++m) {
- vtt.at(m)->advance_time (reflevel, mglevel);
+ vtt.AT(m)->advance_time (reflevel, mglevel);
}
CycleTimeLevels (cctkGH);
@@ -1275,7 +1299,7 @@ namespace Carpet {
cctkGH->cctk_time = global_time;
for (int m=0; m<maps; ++m) {
- vtt.at(m)->set_time (reflevel, mglevel, 0);
+ vtt.AT(m)->set_time (reflevel, mglevel, 0);
}
}
diff --git a/Carpet/Carpet/src/MultiModel.cc b/Carpet/Carpet/src/MultiModel.cc
index 975e48aec..c59eb44aa 100644
--- a/Carpet/Carpet/src/MultiModel.cc
+++ b/Carpet/Carpet/src/MultiModel.cc
@@ -7,9 +7,10 @@
#include <mpi.h>
-#include "cctk.h"
+#include <cctk.h>
-#include "functions.hh"
+#include <functions.hh>
+#include <mpi_string.hh>
@@ -22,8 +23,8 @@ namespace Carpet
vector <string> models; // Model id to model name
std::map <string, int> model_map; // Model name to model id
- vector <int> model_ids; // Processor to model id
- vector <vector <int> > model_procs; // Model id to processors
+ vector <int> model_ids; // Process to model id
+ vector <vector <int> > model_procs; // Model id to processes
@@ -65,14 +66,14 @@ namespace Carpet
SplitUniverse (MPI_Comm const world, string const model, MPI_Comm & comm,
bool const verbose)
{
- // Get the total number of processors
+ // Get the total number of processes
int num_procs;
MPI_Comm_size (world, & num_procs);
int my_proc;
MPI_Comm_rank (world, & my_proc);
// Gather all model names
- models = AllGatherString (world, model);
+ models = allgather_string (world, model);
// Map model strings to small integers
int num_models = 0;
@@ -80,81 +81,81 @@ namespace Carpet
model_map.clear ();
for (int n = 0; n < num_procs; ++ n)
{
- if (model_map.find (models.at(n)) != model_map.end())
+ if (model_map.find (models.AT(n)) != model_map.end())
{
- model_ids.at(n) = model_map[models.at(n)];
+ model_ids.AT(n) = model_map[models.AT(n)];
}
else
{
- model_map[models.at(n)] = num_models;
- model_ids.at(n) = num_models;
+ model_map[models.AT(n)] = num_models;
+ model_ids.AT(n) = num_models;
++ num_models;
}
}
- // Determine processors per model
+ // Determine processes per model
vector <int> num_model_procs (num_models, 0);
for (int n = 0; n < num_procs; ++ n)
{
- ++ num_model_procs.at (model_ids.at(n));
+ ++ num_model_procs.at (model_ids.AT(n));
}
model_procs.resize (num_models);
for (int m = 0; m < num_models; ++ m)
{
- model_procs.at(m).reserve (num_model_procs.at(m));
+ model_procs.AT(m).reserve (num_model_procs.AT(m));
}
for (int n = 0; n < num_procs; ++ n)
{
- model_procs.at (model_ids.at(n)).push_back (n);
+ model_procs.at (model_ids.AT(n)).push_back (n);
}
for (int m = 0; m < num_models; ++ m)
{
- assert (static_cast<int> (model_procs.at(m).size())
- == num_model_procs.at(m));
+ assert (static_cast<int> (model_procs.AT(m).size())
+ == num_model_procs.AT(m));
}
// Create a new communicator for each model
- MPI_Comm_split (world, model_ids.at(my_proc), my_proc, & comm);
+ MPI_Comm_split (world, model_ids.AT(my_proc), my_proc, & comm);
if (verbose)
{
CCTK_INFO ("Multi-Model listing:");
for (int m = 0; m < num_models; ++ m)
{
- cout << " model " << m << ": \"" << models.at(m) << "\"" << endl;
+ cout << " model " << m << ": \"" << models.AT(m) << "\"" << endl;
}
- CCTK_INFO ("Multi-Model processor distribution:");
+ CCTK_INFO ("Multi-Model process distribution:");
for (int n = 0; n < num_procs; ++ n)
{
- int const m = model_ids.at(n);
+ int const m = model_ids.AT(n);
bool const same_model_as_prev =
- n-1 >= 0 and model_ids.at(n-1) == m;
+ n-1 >= 0 and model_ids.AT(n-1) == m;
bool const same_model_as_next =
- n+1 < num_procs and model_ids.at(n+1) == m;
+ n+1 < num_procs and model_ids.AT(n+1) == m;
if (same_model_as_next) {
if (same_model_as_prev) {
// Output nothing
} else {
- // This processor has the same model as the next one:
+ // This process has the same model as the next one:
// output only a partial line
- cout << " processors " << n << "-";
+ cout << " processes " << n << "-";
}
} else {
if (same_model_as_prev) {
- // This processor has the same model as the previous one:
+ // This process has the same model as the previous one:
// finish a partial line
cout << n << ": "
- << "model " << m << " \"" << models.at(m) << "\"" << endl;
+ << "model " << m << " \"" << models.AT(m) << "\"" << endl;
} else {
- cout << " processor " << n << ": "
- << "model " << m << " \"" << models.at(m) << "\"" << endl;
+ cout << " process " << n << ": "
+ << "model " << m << " \"" << models.AT(m) << "\"" << endl;
}
}
}
- int const my_model = model_ids.at(my_proc);
+ int const my_model = model_ids.AT(my_proc);
CCTK_VInfo (CCTK_THORNSTRING,
- "Multi-Model: This is processor %d, model %d \"%s\"",
+ "Multi-Model: This is process %d, model %d \"%s\"",
my_proc, my_model, model.c_str());
}
}
diff --git a/Carpet/Carpet/src/OutputGH.cc b/Carpet/Carpet/src/OutputGH.cc
index 11b611754..52a877390 100644
--- a/Carpet/Carpet/src/OutputGH.cc
+++ b/Carpet/Carpet/src/OutputGH.cc
@@ -3,13 +3,13 @@
#include <cstdlib>
#include <sstream>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "dist.hh"
+#include <dist.hh>
-#include "carpet.hh"
-#include "Timers.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -42,18 +42,18 @@ namespace Carpet {
IOMethod const * const method = CCTK_IOMethod (handle);
assert (method);
- if (not timers.at(handle)) {
+ if (not timers.AT(handle)) {
ostringstream buf;
buf << "OutputGH"
<< "::" << method->implementation
<< "::" << method->name
<< " [" << handle << "]";
- timers.at(handle) = new Timer (buf.str().c_str());
+ timers.AT(handle) = new Timer (buf.str().c_str());
}
- timers.at(handle)->start();
+ timers.AT(handle)->start();
num_vars += method->OutputGH (cctkGH);
- timers.at(handle)->stop();
+ timers.AT(handle)->stop();
} // for handle
diff --git a/Carpet/Carpet/src/Poison.cc b/Carpet/Carpet/src/Poison.cc
index 2811b42e2..83b4650b5 100644
--- a/Carpet/Carpet/src/Poison.cc
+++ b/Carpet/Carpet/src/Poison.cc
@@ -2,10 +2,14 @@
#include <cstdlib>
#include <cstring>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
+#include <util_ErrorCodes.h>
+#include <util_Table.h>
-#include "carpet.hh"
+#include <defs.hh>
+
+#include <carpet.hh>
@@ -18,21 +22,25 @@ namespace Carpet {
// The parameter where specifies which time levels should be
// poisoned. what specifies what kind of grid variables should be
// poisoned.
- void Poison (const cGH* cgh, const checktimes where, const int what)
+ void
+ Poison (cGH const * const cctkGH,
+ checktimes const where, int const what)
{
DECLARE_CCTK_PARAMETERS;
- if (! poison_new_timelevels) return;
+ assert (what == 0 or what == CCTK_GF or what == CCTK_ARRAY);
+
+ if (not poison_new_timelevels) return;
for (int group=0; group<CCTK_NumGroups(); ++group) {
- if (CCTK_QueryGroupStorageI(cgh, group)) {
+ if (CCTK_QueryGroupStorageI(cctkGH, group)) {
int const grouptype = CCTK_GroupTypeI (group);
if (what == 0 or
(what == CCTK_GF and grouptype == CCTK_GF) or
(what == CCTK_ARRAY and (grouptype == CCTK_ARRAY or
grouptype == CCTK_SCALAR)))
{
- PoisonGroup (cgh, group, where);
+ PoisonGroup (cctkGH, group, where);
}
} // if has storage
} // for group
@@ -40,34 +48,56 @@ namespace Carpet {
- void PoisonGroup (const cGH* cgh, const int group, const checktimes where)
+ void
+ PoisonGroup (cGH const * const cctkGH,
+ int const group, checktimes const where)
{
DECLARE_CCTK_PARAMETERS;
assert (group>=0 and group<CCTK_NumGroups());
- if (! poison_new_timelevels) return;
+ if (not poison_new_timelevels) return;
- if (! CCTK_QueryGroupStorageI(cgh, group)) {
+ if (not CCTK_QueryGroupStorageI(cctkGH, group)) {
char * const groupname = CCTK_GroupName(group);
CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Cannot poison group \"%s\" because it has no storage",
- groupname);
+ "Cannot poison group \"%s\" because it has no storage",
+ groupname);
free (groupname);
return;
}
- const int nvar = CCTK_NumVarsInGroupI(group);
+ int const nvar = CCTK_NumVarsInGroupI(group);
if (nvar == 0) return;
- const int n0 = CCTK_FirstVarIndexI(group);
+ int const n0 = CCTK_FirstVarIndexI(group);
assert (n0>=0);
- const int sz = CCTK_VarTypeSize(CCTK_VarTypeI(n0));
+ int const sz = CCTK_VarTypeSize(CCTK_VarTypeI(n0));
assert (sz>0);
- const int num_tl = CCTK_ActiveTimeLevelsVI(cgh, n0);
+ int const table = CCTK_GroupTagsTableI (group);
+ assert (table >= 0);
+ bool persistent;
+ char buf[100];
+ int const ilen = Util_TableGetString (table, sizeof buf, buf, "Persistent");
+ if (ilen > 0) {
+ if (CCTK_EQUALS(buf, "yes")) {
+ persistent = true;
+ } else if (CCTK_EQUALS(buf, "no")) {
+ persistent = false;
+ } else {
+ assert (0);
+ }
+ } else if (ilen == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ // default
+ persistent = true;
+ } else {
+ assert (0);
+ }
+
+ int const num_tl = CCTK_ActiveTimeLevelsVI(cctkGH, n0);
assert (num_tl>0);
- const int min_tl = min_timelevel(where, num_tl);
- const int max_tl = max_timelevel(where, num_tl);
+ int const min_tl = min_timelevel(where, num_tl, persistent);
+ int const max_tl = max_timelevel(where, num_tl, persistent);
if (min_tl <= max_tl) {
@@ -77,76 +107,102 @@ namespace Carpet {
free (groupname);
}
- const int grouptype = CCTK_GroupTypeI(group);
+ CCTK_INT const poison_value = get_poison_value();
- BEGIN_MAP_LOOP(cgh, grouptype) {
- BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
+ int const grouptype = CCTK_GroupTypeI(group);
+
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, grouptype) {
+ BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, grouptype) {
ivect size(1);
- const int gpdim = groupdata.at(group).info.dim;
+ int const gpdim = groupdata.AT(group).info.dim;
for (int d=0; d<gpdim; ++d) {
- size[d] = groupdata.at(group).info.lsh[d];
+ size[d] = groupdata.AT(group).info.lsh[d];
}
- const int np = prod(size);
+ int const np = prod(size);
for (int var=0; var<nvar; ++var) {
- const int n = n0 + var;
+ int const n = n0 + var;
for (int tl=min_tl; tl<=max_tl; ++tl) {
- memset (cgh->data[n][tl], poison_value, np*sz);
+ memset (cctkGH->data[n][tl], poison_value, np*sz);
} // for tl
} // for var
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} // if tl
}
- void PoisonCheck (const cGH* cgh, const checktimes where)
+ void
+ PoisonCheck (cGH const * const cctkGH, checktimes const where)
{
DECLARE_CCTK_PARAMETERS;
- if (! check_for_poison) return;
+ if (not check_for_poison) return;
Checkpoint ("PoisonCheck");
for (int group=0; group<CCTK_NumGroups(); ++group) {
- const int nvar = CCTK_NumVarsInGroupI(group);
- if (nvar > 0 && CCTK_QueryGroupStorageI(cgh, group)) {
+ int const nvar = CCTK_NumVarsInGroupI(group);
+ if (nvar > 0 and CCTK_QueryGroupStorageI(cctkGH, group)) {
- const int grouptype = CCTK_GroupTypeI(group);
- const int n0 = CCTK_FirstVarIndexI(group);
+ int const grouptype = CCTK_GroupTypeI(group);
+ int const n0 = CCTK_FirstVarIndexI(group);
assert (n0>=0);
- const int tp = CCTK_VarTypeI(n0);
- const int gpdim = groupdata.at(group).info.dim;
+ int const tp = CCTK_VarTypeI(n0);
+ int const gpdim = groupdata.AT(group).info.dim;
+
+ int const table = CCTK_GroupTagsTableI (group);
+ assert (table >= 0);
+ bool persistent;
+ char buf[100];
+ int const ilen =
+ Util_TableGetString (table, sizeof buf, buf, "Persistent");
+ if (ilen > 0) {
+ if (CCTK_EQUALS(buf, "yes")) {
+ persistent = true;
+ } else if (CCTK_EQUALS(buf, "no")) {
+ persistent = false;
+ } else {
+ assert (0);
+ }
+ } else if (ilen == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ // default
+ persistent = true;
+ } else {
+ assert (0);
+ }
+
+ CCTK_INT const poison_value = get_poison_value();
- const int num_tl = CCTK_ActiveTimeLevelsVI(cgh, n0);
+ int const num_tl = CCTK_ActiveTimeLevelsVI(cctkGH, n0);
assert (num_tl>0);
- const int min_tl = min_timelevel(where, num_tl);
- const int max_tl = max_timelevel(where, num_tl);
+ int const min_tl = min_timelevel(where, num_tl, persistent);
+ int const max_tl = max_timelevel(where, num_tl, persistent);
- BEGIN_MAP_LOOP(cgh, grouptype) {
- BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, grouptype) {
+ BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, grouptype) {
ivect size(1);
for (int d=0; d<gpdim; ++d) {
- size[d] = groupdata.at(group).info.lsh[d];
+ size[d] = groupdata.AT(group).info.lsh[d];
}
- const int np = prod(size);
+ int const np = prod(size);
for (int var=0; var<nvar; ++var) {
- const int n = n0 + var;
+ int const n = n0 + var;
for (int tl=min_tl; tl<=max_tl; ++tl) {
- const void* const data = cgh->data[n][tl];
+ const void* const data = cctkGH->data[n][tl];
int numpoison=0;
for (int k=0; k<size[2]; ++k) {
for (int j=0; j<size[1]; ++j) {
for (int i=0; i<size[0]; ++i) {
- const int idx = i + size[0] * (j + size[1] * k);
+ int const idx = i + size[0] * (j + size[1] * k);
bool poisoned=false;
switch (tp) {
#define TYPECASE(N,T) \
@@ -169,7 +225,7 @@ namespace Carpet {
char* fullname = CCTK_FullName(n);
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"At iteration %d: timelevel %d, component %d, map %d, refinement level %d of the variable \"%s\" contains poison at [%d,%d,%d]",
- cgh->cctk_iteration,
+ cctkGH->cctk_iteration,
tl, component, map, reflevel,
fullname, i,j,k);
free (fullname);
@@ -182,7 +238,7 @@ namespace Carpet {
char* fullname = CCTK_FullName(n);
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"At iteration %d: timelevel %d, component %d, map %d, refinement level %d of the variable \"%s\" contains poison at %d of %d locations; not all locations were printed",
- cgh->cctk_iteration,
+ cctkGH->cctk_iteration,
tl, component, map, reflevel,
fullname, numpoison, np);
free (fullname);
@@ -195,7 +251,7 @@ namespace Carpet {
} // for tl
} // for var
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} // if has storage
} // for group
diff --git a/Carpet/Carpet/src/Recompose.cc b/Carpet/Carpet/src/Recompose.cc
index 958a5d058..f1f0b8834 100644
--- a/Carpet/Carpet/src/Recompose.cc
+++ b/Carpet/Carpet/src/Recompose.cc
@@ -15,21 +15,25 @@
#include <sys/stat.h>
#include <sys/types.h>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <mpi.h>
-#include "bbox.hh"
-#include "bboxset.hh"
-#include "defs.hh"
-#include "dh.hh"
-#include "gh.hh"
-#include "region.hh"
-#include "vect.hh"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "carpet.hh"
-#include "modes.hh"
+#include <loopcontrol.h>
-#define DEBUG false // false or true
+#include <bbox.hh>
+#include <bboxset.hh>
+#include <defs.hh>
+#include <dh.hh>
+#include <gh.hh>
+#include <region.hh>
+#include <vect.hh>
+
+#include <carpet.hh>
+#include <modes.hh>
+#include <variables.hh>
+#include <Timers.hh>
@@ -61,6 +65,11 @@ namespace Carpet {
static void
+ ClassifyPoints (cGH const * cctkGH, int rl);
+
+
+
+ static void
SplitRegionsMaps_Automatic_Recursively (bvect const & dims,
int const firstproc,
int const nprocs,
@@ -76,57 +85,68 @@ namespace Carpet {
void
CheckRegions (gh::mregs const & regsss)
{
+ char const * const where = "Carpet::CheckRegions";
+ static Timer timer (where);
+ timer.start();
+
// At least one multigrid level
if (regsss.size() == 0) {
CCTK_WARN (0, "I cannot set up a grid hierarchy with zero multigrid levels.");
}
assert (regsss.size() > 0);
// At least one refinement level
- if (regsss.at(0).size() == 0) {
+ if (regsss.AT(0).size() == 0) {
CCTK_WARN (0, "I cannot set up a grid hierarchy with zero refinement levels.");
}
- assert (regsss.at(0).size() > 0);
+ assert (regsss.AT(0).size() > 0);
// At most maxreflevels levels
- if ((int)regsss.at(0).size() > maxreflevels) {
+ if ((int)regsss.AT(0).size() > maxreflevels) {
CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
"I cannot set up a grid hierarchy with more than Carpet::max_refinement_levels refinement levels. I found Carpet::max_refinement_levels=%d, while %d levels were requested.",
- (int)maxreflevels, (int)regsss.at(0).size());
+ (int)maxreflevels, (int)regsss.AT(0).size());
}
- assert ((int)regsss.at(0).size() <= maxreflevels);
+ assert ((int)regsss.AT(0).size() <= maxreflevels);
for (int ml=0; ml<(int)regsss.size(); ++ml) {
int num_regions = 0;
- for (int rl=0; rl<(int)regsss.at(0).size(); ++rl) {
+ for (int rl=0; rl<(int)regsss.AT(0).size(); ++rl) {
// No empty levels
// (but allow some empty maps)
- // assert (regsss.at(ml).at(rl).size() > 0);
- num_regions += regsss.at(ml).at(rl).size();
- for (int c=0; c<(int)regsss.at(ml).at(rl).size(); ++c) {
+ // assert (regsss.AT(ml).AT(rl).size() > 0);
+ num_regions += regsss.AT(ml).AT(rl).size();
+ for (int c=0; c<(int)regsss.AT(ml).AT(rl).size(); ++c) {
// Check sizes
// (but allow processors with zero grid points)
- // assert (all(regsss.at(rl).at(c).at(ml).extent.lower() <=
- // regsss.at(rl).at(c).at(ml).extent.upper()));
+ // assert (all(regsss.AT(rl).AT(c).AT(ml).extent.lower() <=
+ // regsss.AT(rl).AT(c).AT(ml).extent.upper()));
// Check strides
ivect const str =
- (maxspacereflevelfact / spacereffacts.at(rl) * ipow(mgfact, ml));
- assert (all(regsss.at(ml).at(rl).at(c).extent.stride() % str == 0));
+ (maxspacereflevelfact / spacereffacts.AT(rl) * ipow(mgfact, ml));
+ assert (all(regsss.AT(ml).AT(rl).AT(c).extent.stride() % str == 0));
// Check alignments
- assert (all(regsss.at(ml).at(rl).at(c).extent.lower() % str == 0));
- assert (all(regsss.at(ml).at(rl).at(c).extent.upper() % str == 0));
+ assert (all(regsss.AT(ml).AT(rl).AT(c).extent.lower() % str == 0));
+ assert (all(regsss.AT(ml).AT(rl).AT(c).extent.upper() % str == 0));
}
}
// No empty levels
assert (num_regions > 0);
}
+
+ timer.stop();
}
bool
Regrid (cGH const * const cctkGH,
- bool const force_recompose)
+ bool const force_recompose,
+ bool const do_init)
{
DECLARE_CCTK_PARAMETERS;
+ char const * const where = "Carpet::Regrid";
+ static Timer timer (where);
+ timer.start();
+
Checkpoint ("Regridding level %d...", reflevel);
assert (is_level_mode());
@@ -141,6 +161,7 @@ namespace Carpet {
CCTK_WARN (2, "The regridding routine Carpet_Regrid has not been provided. There will be no regridding. Maybe you forgot to activate a regridding thorn?");
didtell = true;
}
+ timer.stop();
return false;
}
@@ -150,7 +171,7 @@ namespace Carpet {
CCTK_WARN (2, "The regridding routine Carpet_RegridMaps has not been provided. Regridding will be performed in singlemap mode instead of level mode.");
didtell = true;
}
- }
+ }
@@ -160,7 +181,7 @@ namespace Carpet {
BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
- gh::rregs superregss = vhh.at(map)->superregions;
+ gh::rregs superregss = vhh.AT(map)->superregions;
gh::mregs regsss;
// Check whether to recompose
@@ -170,7 +191,7 @@ namespace Carpet {
did_change = did_change or do_recompose;
if (do_recompose) {
- RegridMap (cctkGH, map, superregss, regsss);
+ RegridMap (cctkGH, map, superregss, regsss, do_init);
}
} END_MAP_LOOP;
@@ -180,20 +201,28 @@ namespace Carpet {
vector<gh::rregs> superregsss (maps);
vector<gh::mregs> regssss (maps);
BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
- superregsss.at(map) = vhh.at(map)->superregions;
+ superregsss.AT(map) = vhh.AT(map)->superregions;
} END_MAP_LOOP;
// Check whether to recompose
CCTK_INT const do_recompose =
Carpet_RegridMaps (cctkGH, & superregsss, & regssss, force_recompose);
assert (do_recompose >= 0);
+#warning "TODO"
+#if 1 // #ifdef CARPET_DEBUG
+ {
+ int ival = do_recompose;
+ MPI_Bcast (& ival, 1, MPI_INT, 0, dist::comm());
+ assert (ival == do_recompose);
+ }
+#endif
did_change = did_change or do_recompose;
if (do_recompose) {
BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
- gh::rregs const & superregss = superregsss.at(map);
- gh::mregs const & regsss = regssss.at(map);
- RegridMap (cctkGH, map, superregss, regsss);
+ gh::rregs const & superregss = superregsss.AT(map);
+ gh::mregs const & regsss = regssss.AT(map);
+ RegridMap (cctkGH, map, superregss, regsss, do_init);
} END_MAP_LOOP;
}
@@ -208,6 +237,14 @@ namespace Carpet {
} // if did change
+
+ timer.stop();
+
+ if (enable_no_storage) {
+ CCTK_WARN (CCTK_WARN_ALERT,
+ "Carpet completed its internal setup, and would now normally go on to allocate memory. Since the parameter Carpet::enable_no_storage has been set, Carpet will exit instead.");
+ CCTK_Exit (cctkGH, 0);
+ }
return did_change;
}
@@ -218,12 +255,16 @@ namespace Carpet {
RegridMap (cGH const * const cctkGH,
int const m,
gh::rregs const & superregss,
- gh::mregs const & regsss)
+ gh::mregs const & regsss,
+ bool const do_init)
{
DECLARE_CCTK_PARAMETERS;
+ char const * const where = "Carpet::RegridMap";
+ static Timer timer (where);
+ timer.start();
+
Waypoint ("Regridding map %d...", m);
-
#warning "TODO: keep levels fixed here"
#if 0
@@ -239,15 +280,15 @@ namespace Carpet {
int const do_every =
use_tapered_grids ?
- maxtimereflevelfact / timereffacts.at(max(0,rl-1)):
- maxtimereflevelfact / timereffacts.at( rl );
+ maxtimereflevelfact / timereffacts.AT(max(0,rl-1)):
+ maxtimereflevelfact / timereffacts.AT( rl );
bool const regrid_this_level =
(cctkGH->cctk_iteration - 1) % do_every == 0;
if (not regrid_this_level) {
// Set regions from current grid structure
- regions.at(rl) = ...;
+ regions.AT(rl) = ...;
}
}
#endif
@@ -258,18 +299,18 @@ namespace Carpet {
// not change
// Regrid
- vhh.at(m)->regrid (superregss, regsss);
+ vhh.AT(m)->regrid (superregss, regsss, do_init);
+
+ // Output grid structure to screen
+ OutputSuperregions (cctkGH, m, * vhh.AT(m), superregss);
+ OutputGrids (cctkGH, m, * vhh.AT(m), * vdd.AT(m));
// Write grid structure to file
OutputGridStructure (cctkGH, m, regsss);
OutputGridCoordinates (cctkGH, m, regsss);
-#warning "TODO: output superregss"
-
- if (verbose or veryverbose) {
- OutputGrids (cctkGH, m, * vhh.at(m), * vdd.at(m));
- }
Waypoint ("Done regridding map %d.", m);
+ timer.stop();
}
@@ -279,13 +320,27 @@ namespace Carpet {
{
DECLARE_CCTK_PARAMETERS;
+ char const * const where = "Carpet::PostRegrid";
+ static Timer timer (where);
+ timer.start();
+
// Calculate new number of levels
int const oldreflevels = reflevels;
- reflevels = vhh.at(0)->reflevels();
+ reflevels = vhh.AT(0)->reflevels();
for (int m=0; m<maps; ++m) {
- assert (vhh.at(m)->reflevels() == reflevels);
+ assert (vhh.AT(m)->reflevels() == reflevels);
}
+#warning "TODO"
+#if 1 // #ifdef CARPET_DEBUG
+ {
+ // All processes must use the same number of levels
+ int ival = reflevels;
+ MPI_Bcast (& ival, 1, MPI_INT, 0, dist::comm());
+ assert (ival == reflevels);
+ }
+#endif
+
// One cannot switch off the current level
assert (reflevels > reflevel);
@@ -294,19 +349,23 @@ namespace Carpet {
int const grouptype = CCTK_GroupTypeI (n);
if (grouptype == CCTK_GF) {
for (int ml=0; ml<mglevels; ++ml) {
- groupdata.at(n).activetimelevels.at(ml).resize
- (reflevels, groupdata.at(n).activetimelevels.at(ml).at(0));
+ groupdata.AT(n).activetimelevels.AT(ml).resize
+ (reflevels, groupdata.AT(n).activetimelevels.AT(ml).AT(0));
}
}
}
// Set new level times
for (int ml=0; ml<mglevels; ++ml) {
- leveltimes.at(ml).resize
- (reflevels, leveltimes.at(ml).at(oldreflevels-1));
+ leveltimes.AT(ml).resize
+ (reflevels, leveltimes.AT(ml).AT(oldreflevels-1));
}
+ ++ regridding_epoch;
+
OutputGridStatistics (cctkGH);
+
+ timer.stop();
}
@@ -316,200 +375,291 @@ namespace Carpet {
int const rl,
bool const do_init)
{
+ char const * const where = "Carpet::Recompose";
+ static Timer timer (where);
+ timer.start();
+
bool did_recompose = false;
for (int m=0; m<maps; ++m) {
Waypoint ("Recomposing the grid hierarchy for map %d level %d...", m, rl);
- assert (rl>=0 and rl<vhh.at(m)->reflevels());
- did_recompose |= vhh.at(m)->recompose (rl, do_init);
+ assert (rl>=0 and rl<vhh.AT(m)->reflevels());
+ did_recompose |= vhh.AT(m)->recompose (rl, do_init);
Waypoint ("Done recomposing the grid hierarchy for map %d level %d.",
m, rl);
}
+
+ ClassifyPoints (cctkGH, rl);
+
+ timer.stop();
return did_recompose;
}
void
- OutputGrids (cGH const * const cctkGH,
- int const m,
- gh const & hh,
- dh const & dd)
+ RegridFree (cGH const * const cctkGH,
+ bool const do_init)
{
- CCTK_INFO ("Grid structure (grid points):");
- for (int ml=0; ml<hh.mglevels(); ++ml) {
- for (int rl=0; rl<hh.reflevels(); ++rl) {
- for (int c=0; c<hh.components(rl); ++c) {
- const int convfact = ipow(mgfact, ml);
- const ivect levfact = spacereffacts.at(rl);
- const ibbox ext = hh.extent(ml,rl,c);
- const ivect & lower = ext.lower();
- const ivect & upper = ext.upper();
- const ivect & stride = ext.stride();
- assert (all(lower * levfact % maxspacereflevelfact == 0));
- assert (all(upper * levfact % maxspacereflevelfact == 0));
- assert (all(((upper - lower) * levfact / maxspacereflevelfact)
- % convfact == 0));
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " exterior: "
- << "proc "
- << hh.processor(rl,c)
- << " "
- << lower / stride
- << " : "
- << upper / stride
- << " ("
- << (upper - lower) / stride + 1
- << ") "
- << prod ((upper - lower) / stride + 1)
- << endl;
- }
- }
+ char const * const where = "Carpet::RegridFree";
+ static Timer timer (where);
+ timer.start();
+
+ Checkpoint ("Freeing after regridding level %d...", reflevel);
+
+ assert (is_level_mode());
+
+ // Free old grid structure
+ for (int m=0; m<maps; ++m) {
+ vhh.AT(m)->regrid_free (do_init);
}
- CCTK_INFO ("Grid structure (boundaries):");
- for (int rl=0; rl<hh.reflevels(); ++rl) {
- for (int c=0; c<hh.components(rl); ++c) {
+ timer.stop();
+ }
+
+
+
+ void
+ OutputSuperregions (cGH const * const cctkGH,
+ int const m,
+ gh const & hh,
+ gh::rregs const & superregss)
+ {
+ CCTK_INFO ("Grid structure (superregions, grid points):");
+ for (int rl=0; rl<(int)superregss.size(); ++rl) {
+ assert (rl < hh.reflevels());
+ for (int c=0; c<(int)superregss.AT(rl).size(); ++c) {
+ const ivect & levfact = spacereffacts.AT(rl);
+ const ibbox & ext = superregss.AT(rl).AT(c).extent;
+ const ivect & lower = ext.lower();
+ const ivect & upper = ext.upper();
+ const ivect & stride = ext.stride();
+ assert (all(lower * levfact % maxspacereflevelfact == 0));
+ assert (all(upper * levfact % maxspacereflevelfact == 0));
cout << " [" << rl << "][" << m << "][" << c << "]"
- << " bbox: "
- << hh.outer_boundaries(rl,c)
- << endl;
+ << " exterior: "
+ << lower / stride
+ << " : "
+ << upper / stride
+ << " ("
+ << (upper - lower) / stride + 1
+ << ") "
+ << prod ((upper - lower) / stride + 1)
+ << eol;
}
}
- CCTK_INFO ("Grid structure (coordinates):");
- for (int ml=0; ml<hh.mglevels(); ++ml) {
- for (int rl=0; rl<hh.reflevels(); ++rl) {
- for (int c=0; c<hh.components(rl); ++c) {
- const rvect origin = domainspecs.at(m).exterior_min;
- const rvect delta = (domainspecs.at(m).exterior_max - domainspecs.at(m).exterior_min) / rvect (domainspecs.at(m).npoints - 1);
- const ibbox ext = hh.extent(ml,rl,c);
- const ivect & lower = ext.lower();
- const ivect & upper = ext.upper();
- const int convfact = ipow(mgfact, ml);
- const ivect levfact = spacereffacts.at(rl);
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " exterior: "
- << origin + delta * rvect(lower) / rvect(maxspacereflevelfact)
- << " : "
- << origin + delta * rvect(upper) / rvect(maxspacereflevelfact)
- << " : "
- << delta * rvect(convfact) / rvect(levfact) << endl;
- }
+ CCTK_INFO ("Grid structure (superregions, coordinates):");
+ for (int rl=0; rl<(int)superregss.size(); ++rl) {
+ assert (rl < hh.reflevels());
+ for (int c=0; c<(int)superregss.AT(rl).size(); ++c) {
+ const rvect origin = domainspecs.AT(m).exterior_min;
+ const rvect delta = (domainspecs.AT(m).exterior_max - domainspecs.AT(m).exterior_min) / rvect (domainspecs.AT(m).npoints - 1);
+ const ibbox & ext = superregss.AT(rl).AT(c).extent;
+ const ivect & lower = ext.lower();
+ const ivect & upper = ext.upper();
+ const ivect & levfact = spacereffacts.AT(rl);
+ cout << " [" << rl << "][" << m << "][" << c << "]"
+ << " exterior: "
+ << origin + delta * rvect(lower) / rvect(maxspacereflevelfact)
+ << " : "
+ << origin + delta * rvect(upper) / rvect(maxspacereflevelfact)
+ << " : "
+ << delta / rvect(levfact) << eol;
}
}
- CCTK_INFO ("Grid structure (coordinates, including ghosts):");
- for (int ml=0; ml<hh.mglevels(); ++ml) {
- for (int rl=0; rl<hh.reflevels(); ++rl) {
- for (int c=0; c<hh.components(rl); ++c) {
- const rvect origin = domainspecs.at(m).exterior_min;
- const rvect delta = (domainspecs.at(m).exterior_max - domainspecs.at(m).exterior_min) / rvect (domainspecs.at(m).npoints - 1);
- const ivect lower = dd.boxes.at(ml).at(rl).at(c).exterior.lower();
- const ivect upper = dd.boxes.at(ml).at(rl).at(c).exterior.upper();
- const int convfact = ipow(mgfact, ml);
- const ivect levfact = spacereffacts.at(rl);
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " exterior: "
- << origin + delta * rvect(lower) / rvect(maxspacereflevelfact)
- << " : "
- << origin + delta * rvect(upper) / rvect(maxspacereflevelfact)
- << " : "
- << delta * rvect(convfact) / rvect(levfact) << endl;
+ fflush (stdout);
+ }
+
+
+
+ void
+ OutputGrids (cGH const * const cctkGH,
+ int const m,
+ gh const & hh,
+ dh const & dd)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose) {
+
+ CCTK_INFO ("Grid structure (grid points):");
+ for (int ml=0; ml<hh.mglevels(); ++ml) {
+ for (int rl=0; rl<hh.reflevels(); ++rl) {
+ for (int c=0; c<hh.components(rl); ++c) {
+ const int convfact = ipow(mgfact, ml);
+ const ivect levfact = spacereffacts.AT(rl);
+ const ibbox ext = hh.extent(ml,rl,c);
+ const ivect & lower = ext.lower();
+ const ivect & upper = ext.upper();
+ const ivect & stride = ext.stride();
+ assert (all(lower * levfact % maxspacereflevelfact == 0));
+ assert (all(upper * levfact % maxspacereflevelfact == 0));
+ assert (all(((upper - lower) * levfact / maxspacereflevelfact)
+ % convfact == 0));
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " exterior: "
+ << "proc "
+ << hh.processor(rl,c)
+ << " "
+ << lower / stride
+ << " : "
+ << upper / stride
+ << " ("
+ << (upper - lower) / stride + 1
+ << ") "
+ << prod ((upper - lower) / stride + 1)
+ << eol;
+ }
}
}
- }
-
- CCTK_INFO ("Grid statistics:");
- const int oldprecision = cout.precision();
- const ios_base::fmtflags oldflags = cout.flags();
- cout.setf (ios::fixed);
- for (int ml=0; ml<hh.mglevels(); ++ml) {
- CCTK_REAL coarsevolume = 0;
+
+ CCTK_INFO ("Grid structure (boundaries):");
for (int rl=0; rl<hh.reflevels(); ++rl) {
-
- const CCTK_REAL basevolume = hh.baseextents.AT(0).AT(0).size();
- CCTK_REAL countvolume = 0;
- CCTK_REAL totalvolume = 0;
- CCTK_REAL totalvolume2 = 0;
-
for (int c=0; c<hh.components(rl); ++c) {
- const CCTK_REAL volume = hh.extent(ml,rl,c).size();
- ++ countvolume;
- totalvolume += volume;
- totalvolume2 += ipow(volume, 2);
+ cout << " [" << rl << "][" << m << "][" << c << "]"
+ << " bbox: "
+ << hh.outer_boundaries(rl,c)
+ << eol;
}
-
- const CCTK_REAL avgvolume = totalvolume / countvolume;
- const CCTK_REAL stddevvolume
- = sqrt (max (CCTK_REAL(0),
- totalvolume2 / countvolume - ipow (avgvolume, 2)));
-
- for (int c=0; c<hh.components(rl); ++c) {
- const CCTK_REAL volume = hh.extent(ml,rl,c).size();
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " volume: " << setprecision(0) << volume
- << " of parent: " << setprecision(1) << 100 * volume / totalvolume << "%"
- << " of domain: " << setprecision(1) << 100 * volume / basevolume << "%"
- << endl;
+ }
+
+ CCTK_INFO ("Grid structure (coordinates):");
+ for (int ml=0; ml<hh.mglevels(); ++ml) {
+ for (int rl=0; rl<hh.reflevels(); ++rl) {
+ for (int c=0; c<hh.components(rl); ++c) {
+ const rvect origin = domainspecs.AT(m).exterior_min;
+ const rvect delta = (domainspecs.AT(m).exterior_max - domainspecs.AT(m).exterior_min) / rvect (domainspecs.AT(m).npoints - 1);
+ const ibbox ext = hh.extent(ml,rl,c);
+ const ivect & lower = ext.lower();
+ const ivect & upper = ext.upper();
+ const int convfact = ipow(mgfact, ml);
+ const ivect levfact = spacereffacts.AT(rl);
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " exterior: "
+ << origin + delta * rvect(lower) / rvect(maxspacereflevelfact)
+ << " : "
+ << origin + delta * rvect(upper) / rvect(maxspacereflevelfact)
+ << " : "
+ << delta * rvect(convfact) / rvect(levfact) << eol;
+ }
}
-
- cout << " [" << ml << "][" << rl << "][" << m << "]"
- << " average volume: " << setprecision(0) << avgvolume
- << " of parent: " << setprecision(1) << 100 * avgvolume / totalvolume << "%"
- << " of domain: " << setprecision(1) << 100 * avgvolume / basevolume << "%"
- << endl;
- cout << " [" << ml << "][" << rl << "][" << m << "]"
- << " standard deviation: " << setprecision(0) << stddevvolume
- << " of parent: " << setprecision(1) << 100 * stddevvolume / totalvolume << "%"
- << " of domain: " << setprecision(1) << 100 * stddevvolume / basevolume << "%"
- << endl;
-
- // TODO: ghost points vs. interior points (and boundary
- // points)
-
- CCTK_REAL countquadrupole = 0;
- CCTK_REAL minquadrupole = 1;
- CCTK_REAL totalquadrupole = 0;
- CCTK_REAL totalquadrupole2 = 0;
-
- for (int c=0; c<hh.components(rl); ++c) {
- const ibbox ext = hh.extent(ml,rl,c);
- const ivect shape = ext.shape();
- const ivect stride = ext.stride();
- const CCTK_REAL minlength = minval (rvect (shape) / rvect (stride));
- const CCTK_REAL maxlength = maxval (rvect (shape) / rvect (stride));
- const CCTK_REAL quadrupole = minlength / maxlength;
- ++ countquadrupole;
- minquadrupole = min (minquadrupole, quadrupole);
- totalquadrupole += quadrupole;
- totalquadrupole2 += ipow (quadrupole, 2);
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " length ratio: " << setprecision(3) << quadrupole
- << endl;
+ }
+
+ CCTK_INFO ("Grid structure (coordinates, including ghosts):");
+ for (int ml=0; ml<hh.mglevels(); ++ml) {
+ for (int rl=0; rl<hh.reflevels(); ++rl) {
+ for (int c=0; c<hh.components(rl); ++c) {
+ const rvect origin = domainspecs.AT(m).exterior_min;
+ const rvect delta = (domainspecs.AT(m).exterior_max - domainspecs.AT(m).exterior_min) / rvect (domainspecs.AT(m).npoints - 1);
+ const ivect lower = dd.boxes.AT(ml).AT(rl).AT(c).exterior.lower();
+ const ivect upper = dd.boxes.AT(ml).AT(rl).AT(c).exterior.upper();
+ const int convfact = ipow(mgfact, ml);
+ const ivect levfact = spacereffacts.AT(rl);
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " exterior: "
+ << origin + delta * rvect(lower) / rvect(maxspacereflevelfact)
+ << " : "
+ << origin + delta * rvect(upper) / rvect(maxspacereflevelfact)
+ << " : "
+ << delta * rvect(convfact) / rvect(levfact) << eol;
+ }
+ }
+ }
+
+ CCTK_INFO ("Grid statistics:");
+ const int oldprecision = cout.precision();
+ const ios_base::fmtflags oldflags = cout.flags();
+ cout.setf (ios::fixed);
+ for (int ml=0; ml<hh.mglevels(); ++ml) {
+ CCTK_REAL coarsevolume = 0;
+ for (int rl=0; rl<hh.reflevels(); ++rl) {
+
+ const CCTK_REAL basevolume = hh.baseextents.AT(0).AT(0).size();
+ CCTK_REAL countvolume = 0;
+ CCTK_REAL totalvolume = 0;
+ CCTK_REAL totalvolume2 = 0;
+
+ for (int c=0; c<hh.components(rl); ++c) {
+ const CCTK_REAL volume = hh.extent(ml,rl,c).size();
+ ++ countvolume;
+ totalvolume += volume;
+ totalvolume2 += ipow(volume, 2);
+ }
+
+ const CCTK_REAL avgvolume = totalvolume / countvolume;
+ const CCTK_REAL stddevvolume
+ = sqrt (max (CCTK_REAL(0),
+ totalvolume2 / countvolume - ipow (avgvolume, 2)));
+
+ for (int c=0; c<hh.components(rl); ++c) {
+ const CCTK_REAL volume = hh.extent(ml,rl,c).size();
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " volume: " << setprecision(0) << volume
+ << " of parent: " << setprecision(1) << 100 * volume / totalvolume << "%"
+ << " of domain: " << setprecision(1) << 100 * volume / basevolume << "%"
+ << eol;
+ }
+
+ cout << " [" << ml << "][" << rl << "][" << m << "]"
+ << " average volume: " << setprecision(0) << avgvolume
+ << " of parent: " << setprecision(1) << 100 * avgvolume / totalvolume << "%"
+ << " of domain: " << setprecision(1) << 100 * avgvolume / basevolume << "%"
+ << eol;
+ cout << " [" << ml << "][" << rl << "][" << m << "]"
+ << " standard deviation: " << setprecision(0) << stddevvolume
+ << " of parent: " << setprecision(1) << 100 * stddevvolume / totalvolume << "%"
+ << " of domain: " << setprecision(1) << 100 * stddevvolume / basevolume << "%"
+ << eol;
+
+ // TODO: ghost points vs. interior points (and boundary
+ // points)
+
+ CCTK_REAL countquadrupole = 0;
+ CCTK_REAL minquadrupole = 1;
+ CCTK_REAL totalquadrupole = 0;
+ CCTK_REAL totalquadrupole2 = 0;
+
+ for (int c=0; c<hh.components(rl); ++c) {
+ const ibbox ext = hh.extent(ml,rl,c);
+ const ivect shape = ext.shape();
+ const ivect stride = ext.stride();
+ const CCTK_REAL minlength = minval (rvect (shape) / rvect (stride));
+ const CCTK_REAL maxlength = maxval (rvect (shape) / rvect (stride));
+ const CCTK_REAL quadrupole = minlength / maxlength;
+ ++ countquadrupole;
+ minquadrupole = min (minquadrupole, quadrupole);
+ totalquadrupole += quadrupole;
+ totalquadrupole2 += ipow (quadrupole, 2);
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " length ratio: " << setprecision(3) << quadrupole
+ << eol;
+ }
+
+ const CCTK_REAL avgquadrupole = totalquadrupole / countquadrupole;
+ const CCTK_REAL stddevquadrupole
+ = sqrt (max (CCTK_REAL(0),
+ (totalquadrupole2 / countquadrupole
+ - ipow (avgquadrupole, 2))));
+
+ cout << " [" << ml << "][" << rl << "][" << m << "]"
+ << " average length ratio: " << setprecision(3) << avgquadrupole
+ << " standard deviation: " << setprecision(3) << stddevquadrupole
+ << eol;
+
+ // TODO: processor distribution, average load, std deviation
+
+ coarsevolume = totalvolume * prod (rvect (spacereflevelfact));
}
-
- const CCTK_REAL avgquadrupole = totalquadrupole / countquadrupole;
- const CCTK_REAL stddevquadrupole
- = sqrt (max (CCTK_REAL(0),
- (totalquadrupole2 / countquadrupole
- - ipow (avgquadrupole, 2))));
-
- cout << " [" << ml << "][" << rl << "][" << m << "]"
- << " average length ratio: " << setprecision(3) << avgquadrupole
- << " standard deviation: " << setprecision(3) << stddevquadrupole
- << endl;
-
- // TODO: processor distribution, average load, std deviation
-
- coarsevolume = totalvolume * prod (rvect (spacereflevelfact));
}
+ cout.precision (oldprecision);
+ cout.setf (oldflags);
+
+ fflush (stdout);
}
- cout.precision (oldprecision);
- cout.setf (oldflags);
-
}
@@ -561,14 +711,14 @@ namespace Carpet {
file << "maps " << maps << eol;
file << m << " mglevels " << regsss.size() << eol;
for (int ml=0; ml<(int)regsss.size(); ++ml) {
- file << m << " " << ml << " reflevels " << regsss.at(ml).size() << eol;
- for (int rl=0; rl<(int)regsss.at(ml).size(); ++rl) {
- file << m << " " << ml << " " << rl << " components " << regsss.at(ml).at(rl).size() << eol;
- for (int c=0; c<(int)regsss.at(ml).at(rl).size(); ++c) {
+ file << m << " " << ml << " reflevels " << regsss.AT(ml).size() << eol;
+ for (int rl=0; rl<(int)regsss.AT(ml).size(); ++rl) {
+ file << m << " " << ml << " " << rl << " components " << regsss.AT(ml).AT(rl).size() << eol;
+ for (int c=0; c<(int)regsss.AT(ml).AT(rl).size(); ++c) {
file << m << " " << ml << " " << rl << " " << c << " "
- << regsss.at(ml).at(rl).at(c).processor << " "
- << regsss.at(ml).at(rl).at(c).extent << " "
- << regsss.at(ml).at(rl).at(c).outer_boundaries << eol;
+ << regsss.AT(ml).AT(rl).AT(c).processor << " "
+ << regsss.AT(ml).AT(rl).AT(c).extent << " "
+ << regsss.AT(ml).AT(rl).AT(c).outer_boundaries << eol;
}
}
}
@@ -668,7 +818,7 @@ namespace Carpet {
// Affine transformation between index space and coordinate space
rvect const origin = exterior_lower;
rvect const scale =
- rvect (vhh.at(m)->baseextents.at(0).at(0).stride()) / spacing;
+ rvect (vhh.AT(m)->baseextents.AT(0).AT(0).stride()) / spacing;
@@ -676,11 +826,11 @@ namespace Carpet {
file << "maps " << maps << eol;
file << m << " mglevels " << regsss.size() << eol;
for (int ml=0; ml<(int)regsss.size(); ++ml) {
- file << m << " " << ml << " reflevels " << regsss.at(ml).size() << eol;
- for (int rl=0; rl<(int)regsss.at(ml).size(); ++rl) {
+ file << m << " " << ml << " reflevels " << regsss.AT(ml).size() << eol;
+ for (int rl=0; rl<(int)regsss.AT(ml).size(); ++rl) {
ibset extents;
- for (int c=0; c<(int)regsss.at(ml).at(rl).size(); ++c) {
- extents += regsss.at(ml).at(rl).at(c).extent;
+ for (int c=0; c<(int)regsss.AT(ml).AT(rl).size(); ++c) {
+ extents += regsss.AT(ml).AT(rl).AT(c).extent;
}
extents.normalize();
file << m << " " << ml << " " << rl << " regions " << extents.setsize() << eol;
@@ -690,12 +840,12 @@ namespace Carpet {
{
#if 0
ibbox const & ext = * bi;
- ibbox const & baseext = vhh.at(m)->baseextents.at(ml).at(rl);
- ibbox const & coarseext = vhh.at(m)->baseextents.at(ml).at(0 );
+ ibbox const & baseext = vhh.AT(m)->baseextents.AT(ml).AT(rl);
+ ibbox const & coarseext = vhh.AT(m)->baseextents.AT(ml).AT(0 );
// This is nice, but is wrong since CartGrid3D has not yet
// initialised the coordinates
- ivect const cctk_levfac = spacereffacts.at(rl);
+ ivect const cctk_levfac = spacereffacts.AT(rl);
ivect const cctk_levoff = baseext.lower() - coarseext.lower();
ivect const cctk_levoffdenom = baseext.stride();
@@ -705,9 +855,9 @@ namespace Carpet {
(ext.upper() - baseext.lower()) / ext.stride();
rvect const cctk_origin_space =
- origin_space.at(m).at(ml);
+ origin_space.AT(m).AT(ml);
rvect const cctk_delta_space =
- delta_space.at(m) * rvect (ipow (mgfact, ml));
+ delta_space.AT(m) * rvect (ipow (mgfact, ml));
rvect const CCTK_ORIGIN_SPACE =
cctk_origin_space +
@@ -773,28 +923,35 @@ namespace Carpet {
OutputGridStatistics (cGH const * const cctkGH)
{
// Grid array statistics
- int num_gfs = 0;
int num_arrays = 0;
+ int num_gfs = 0;
+ int size_gfs = 0;
CCTK_REAL num_active_array_points = 0;
CCTK_REAL num_total_array_points = 0;
+ CCTK_REAL size_total_array_points = 0;
for (int g=0; g<CCTK_NumGroups(); ++g) {
+ cGroup gdata;
+ check (not CCTK_GroupData (g, &gdata));
int const num_tl = CCTK_ActiveTimeLevelsGI (cctkGH, g);
- switch (CCTK_GroupTypeI(g)) {
+ int const num_vars = gdata.numvars;
+ int const size_vars = gdata.numvars * CCTK_VarTypeSize (gdata.vartype);
+ switch (gdata.grouptype) {
case CCTK_SCALAR:
case CCTK_ARRAY: {
- int const num_vars = CCTK_NumVarsInGroupI (g);
num_arrays += num_tl * num_vars;
gh const * const hh = arrdata.AT(g).AT(0).hh;
dh const * const dd = arrdata.AT(g).AT(0).dd;
for (int c=0; c<hh->components(0); ++c) {
dh::dboxes const & b = dd->boxes.AT(0).AT(0).AT(c);
- num_active_array_points += num_tl * num_vars * b.active.size();
- num_total_array_points += num_tl * num_vars * b.exterior.size();
+ num_active_array_points += num_tl * num_vars * b.active_size;
+ num_total_array_points += num_tl * num_vars * b.exterior_size;
+ size_total_array_points += num_tl * size_vars * b.exterior_size;
}
break;
}
case CCTK_GF:
- num_gfs += num_tl;
+ num_gfs += num_tl * num_vars;
+ size_gfs += num_tl * size_vars;
break;
default:
assert (0);
@@ -807,6 +964,7 @@ namespace Carpet {
CCTK_REAL num_active_mem_points = 0;
CCTK_REAL num_owned_mem_points = 0;
CCTK_REAL num_total_mem_points = 0;
+ CCTK_REAL size_total_mem_points = 0;
CCTK_REAL num_active_cpu_points = 0;
CCTK_REAL num_owned_cpu_points = 0;
CCTK_REAL num_total_cpu_points = 0;
@@ -822,12 +980,13 @@ namespace Carpet {
for (int c=0; c<hh->components(rl); ++c) {
++ num_comps;
dh::dboxes const & b = dd->boxes.AT(ml).AT(rl).AT(c);
- num_active_mem_points += num_gfs * b.active.size();
- num_owned_mem_points += num_gfs * b.owned.size();
- num_total_mem_points += num_gfs * b.exterior.size();
- num_active_cpu_points += trf * b.active.size();
- num_owned_cpu_points += trf * b.owned.size();
- num_total_cpu_points += trf * b.exterior.size();
+ num_active_mem_points += num_gfs * b.active_size;
+ num_owned_mem_points += num_gfs * b.owned_size;
+ num_total_mem_points += num_gfs * b.exterior_size;
+ size_total_mem_points += size_gfs * b.exterior_size;
+ num_active_cpu_points += trf * b.active_size;
+ num_owned_cpu_points += trf * b.owned_size;
+ num_total_cpu_points += trf * b.exterior_size;
}
}
}
@@ -841,27 +1000,30 @@ namespace Carpet {
"Grid structure statistics:");
CCTK_VInfo (CCTK_THORNSTRING,
"GF: rhs: %.0fk active, %.0fk owned (+%.0f%%), %.0fk total (+%.0f%%), %.3g steps/time",
- double (num_active_cpu_points / 1000),
- double (num_owned_cpu_points / 1000),
+ double (num_active_cpu_points / 1e+3),
+ double (num_owned_cpu_points / 1e+3),
double (num_owned_cpu_points / num_active_cpu_points * 100 - 100),
- double (num_total_cpu_points / 1000),
+ double (num_total_cpu_points / 1e+3),
double (num_total_cpu_points / num_owned_cpu_points * 100 - 100),
double (num_steps / delta_time));
CCTK_VInfo (CCTK_THORNSTRING,
"GF: vars: %d, pts: %.0fM active, %.0fM owned (+%.0f%%), %.0fM total (+%.0f%%), %.1f comp/proc",
num_gfs,
- double (num_active_mem_points / 1000000),
- double (num_owned_mem_points / 1000000),
+ double (num_active_mem_points / 1e+6),
+ double (num_owned_mem_points / 1e+6),
double (num_owned_mem_points / num_active_mem_points * 100 - 100),
- double (num_total_mem_points / 1000000),
+ double (num_total_mem_points / 1e+6),
double (num_total_mem_points / num_owned_mem_points * 100 - 100),
double (num_comps / (reflevels * CCTK_nProcs (cctkGH))));
CCTK_VInfo (CCTK_THORNSTRING,
"GA: vars: %d, pts: %.0fM active, %.0fM total (+%.0f%%)",
num_arrays,
- double (num_active_array_points / 1000000),
- double (num_total_array_points / 1000000),
+ double (num_active_array_points / 1e+6),
+ double (num_total_array_points / 1e+6),
double (num_total_array_points / num_active_array_points * 100 - 100));
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Total required memory: %.3f GByte (for GAs and currently active GFs)",
+ double ((size_total_array_points + size_total_mem_points) / 1e+9));
// After this, we will begin to allocate memory for the grid
// structure. If we run out of memory, ensure that this output
@@ -902,16 +1064,16 @@ namespace Carpet {
regs = superregs;
if (nprocs == 1) {
- regs.at(0).processor = 0;
- pseudoregion_t const preg (regs.at(0).extent, regs.at(0).processor);
- assert (superregs.at(0).processors == NULL);
- superregs.at(0).processors = new ipfulltree (preg);
+ regs.AT(0).processor = 0;
+ pseudoregion_t const preg (regs.AT(0).extent, regs.AT(0).processor);
+ assert (superregs.AT(0).processors == NULL);
+ superregs.AT(0).processors = new ipfulltree (preg);
return;
}
assert (dir>=0 and dir<dim);
- region_t const & reg0 = regs.at(0);
+ region_t const & reg0 = regs.AT(0);
const ivect rstr0 = reg0.extent.stride();
const ivect rlb0 = reg0.extent.lower();
const ivect rub0 = reg0.extent.upper() + rstr0;
@@ -933,7 +1095,7 @@ namespace Carpet {
if (cub[dir] > rub0[dir]) cub[dir] = rub0[dir];
assert (clb[dir] <= cub[dir]);
assert (cub[dir] <= rub0[dir]);
- region_t & reg = regs.at(c);
+ region_t & reg = regs.AT(c);
ibbox & ext = reg.extent;
b2vect & obnd = reg.outer_boundaries;
int & proc = reg.processor;
@@ -943,16 +1105,16 @@ namespace Carpet {
obnd[1][dir] &= cub[dir] == rub0[dir];
proc = c;
pseudoregion_t const preg (reg.extent, c);
- bounds.at(c) = reg.extent.lower()[dir];
- subtrees.at(c) = new ipfulltree (preg);
+ bounds.AT(c) = reg.extent.lower()[dir];
+ subtrees.AT(c) = new ipfulltree (preg);
}
- bounds.at(nprocs) = rub0[dir] + rstr0[dir];
+ bounds.AT(nprocs) = rub0[dir] + rstr0[dir];
- assert (superregs.at(0).processors == NULL);
- superregs.at(0).processors = new ipfulltree (dir, bounds, subtrees);
+ assert (superregs.AT(0).processors == NULL);
+ superregs.AT(0).processors = new ipfulltree (dir, bounds, subtrees);
for (int c=0; c<(int)regs.size(); ++c) {
- assert (regs.at(c).processor == c);
+ assert (regs.AT(c).processor == c);
}
}
@@ -968,9 +1130,9 @@ namespace Carpet {
vector<vector<region_t> > regss (1);
SplitRegionsMaps_Automatic (cctkGH, superregss, regss);
assert (superregss.size() == 1);
- superregs = regss.at(0);
+ superregs = superregss.AT(0);
assert (regss.size() == 1);
- regs = regss.at(0);
+ regs = regss.AT(0);
}
@@ -993,7 +1155,7 @@ namespace Carpet {
assert (superregs.size() == 1);
- region_t const & reg0 = superregs.at(0);
+ region_t const & reg0 = superregs.AT(0);
const ivect rstr0 = reg0.extent.stride();
const ivect rlb0 = reg0.extent.lower();
const ivect rub0 = reg0.extent.upper() + rstr0;
@@ -1052,7 +1214,7 @@ namespace Carpet {
assert (all (cub <= rub0));
assert (all (not (ipos==0) or clb==rlb0));
assert (all (not (ipos==nprocs_dir-1) or cub==rub0));
- region_t & reg = regs.at(c);
+ region_t & reg = regs.AT(c);
ibbox & ext = reg.extent;
b2vect & obnd = reg.outer_boundaries;
int & proc = reg.processor;
@@ -1063,21 +1225,21 @@ namespace Carpet {
proc = c;
pseudoregion_t preg (reg.extent, c);
- subtreesx.at(i) = new ipfulltree (preg);
+ subtreesx.AT(i) = new ipfulltree (preg);
}
- boundsx.at(nprocs_dir[0]) = rub0[0] + rstr0[0];
- subtreesy.at(j) = new ipfulltree (0, boundsx, subtreesx);
+ boundsx.AT(nprocs_dir[0]) = rub0[0] + rstr0[0];
+ subtreesy.AT(j) = new ipfulltree (0, boundsx, subtreesx);
}
- boundsy.at(nprocs_dir[1]) = rub0[1] + rstr0[1];
- subtreesz.at(k) = new ipfulltree (1, boundsy, subtreesy);
+ boundsy.AT(nprocs_dir[1]) = rub0[1] + rstr0[1];
+ subtreesz.AT(k) = new ipfulltree (1, boundsy, subtreesy);
}
- boundsz.at(nprocs_dir[2]) = rub0[2] + rstr0[2];
+ boundsz.AT(nprocs_dir[2]) = rub0[2] + rstr0[2];
- assert (superregs.at(0).processors == NULL);
- superregs.at(0).processors = new ipfulltree (2, boundsz, subtreesz);
+ assert (superregs.AT(0).processors == NULL);
+ superregs.AT(0).processors = new ipfulltree (2, boundsz, subtreesz);
for (int c=0; c<(int)regs.size(); ++c) {
- assert (regs.at(c).processor == c);
+ assert (regs.AT(c).processor == c);
}
}
@@ -1121,7 +1283,9 @@ namespace Carpet {
region_t & superreg,
vector<region_t> & newregs)
{
- if (DEBUG) cout << "SRMAR enter" << endl;
+ DECLARE_CCTK_PARAMETERS;
+
+ if (recompose_verbose) cout << "SRMAR enter" << endl;
// Check preconditions
assert (nprocs >= 1);
@@ -1130,7 +1294,7 @@ namespace Carpet {
// Are we done?
if (all(dims)) {
- if (DEBUG) cout << "SRMAR bottom" << endl;
+ if (recompose_verbose) cout << "SRMAR bottom" << endl;
// Check precondition
assert (nprocs == 1);
@@ -1145,30 +1309,57 @@ namespace Carpet {
// Check postcondition
assert (newregs.size() == oldsize + nprocs);
- if (DEBUG) cout << "SRMAR exit" << endl;
+ if (recompose_verbose) cout << "SRMAR exit" << endl;
return;
}
// Special case
if (superreg.extent.empty()) {
- if (DEBUG) cout << "SRMAR empty" << endl;
+ if (recompose_verbose) cout << "SRMAR empty" << endl;
+
+ // Choose a direction
+ int mydim = -1;
+ for (int d=0; d<dim; ++d) {
+ if (not dims[d]) {
+ mydim = d;
+ break;
+ }
+ }
+ assert (mydim>=0 and mydim<dim);
// Create a new region
region_t newreg (superreg);
newreg.outer_boundaries = b2vect(false);
- if (DEBUG) cout << "SRMAR newreg " << newreg << endl;
+ if (recompose_verbose) cout << "SRMAR newreg " << newreg << endl;
+#if 0
// Store
for (int p=0; p<nprocs; ++p) {
newreg.processor = firstproc + p;
newregs.push_back (newreg);
}
+ assert (superreg.processors == NULL);
superreg.processors = new ipfulltree ();
+#endif
+
+ // Store
+ vector<int> bounds (nprocs+1);
+ vector<ipfulltree *> subtrees (nprocs);
+ for (int p=0; p<nprocs; ++p) {
+ newreg.processor = firstproc + p;
+ newregs.push_back (newreg);
+ bounds.AT(p) = newreg.extent.lower()[mydim];
+ pseudoregion_t const preg (newreg.extent, newreg.processor);
+ subtrees.AT(p) = new ipfulltree (preg);
+ }
+ bounds.AT(nprocs) = newreg.extent.lower()[mydim];
+ assert (superreg.processors == NULL);
+ superreg.processors = new ipfulltree (mydim, bounds, subtrees);
// Check postcondition
assert (newregs.size() == oldsize + nprocs);
- if (DEBUG) cout << "SRMAR exit" << endl;
+ if (recompose_verbose) cout << "SRMAR exit" << endl;
return;
}
@@ -1177,7 +1368,7 @@ namespace Carpet {
CCTK_REAL const rfact = pow (nprocs / prod(rcost), CCTK_REAL(1)/dim);
rcost *= rfact;
assert (abs (prod (rcost) - nprocs) <= 1.0e-6);
- if (DEBUG) cout << "SRMA shapes " << rcost << endl;
+ if (recompose_verbose) cout << "SRMA shapes " << rcost << endl;
// Choose a direction
int mydim = -1;
@@ -1198,22 +1389,20 @@ namespace Carpet {
}
assert (mydim>=0 and mydim<dim);
assert (mycost>=0);
- if (DEBUG) cout << "SRMAR mydim " << mydim << endl;
- if (DEBUG) cout << "SRMAR mycost " << mycost << endl;
+ if (recompose_verbose) cout << "SRMAR mydim " << mydim << endl;
+ if (recompose_verbose) cout << "SRMAR mycost " << mycost << endl;
// Mark this direction as done
assert (not dims[mydim]);
bvect const newdims = dims.replace(mydim, true);
// Choose a number of slices for this direction
- int const nslices
- = min (nprocs,
- int (floor (mycost * pow(nprocs / totalcost,
- CCTK_REAL(1) / alldims) +
- CCTK_REAL(0.5))));
+ CCTK_REAL const mycost1 =
+ mycost * pow(nprocs / totalcost, CCTK_REAL(1) / alldims);
+ int const nslices = min (nprocs, int (floor (mycost1 + CCTK_REAL(0.5))));
assert (nslices <= nprocs);
- if (DEBUG) cout << "SRMAR " << mydim << " nprocs " << nprocs << endl;
- if (DEBUG) cout << "SRMAR " << mydim << " nslices " << nslices << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " nprocs " << nprocs << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " nslices " << nslices << endl;
// Split the remaining processors
vector<int> mynprocs(nslices);
@@ -1221,11 +1410,11 @@ namespace Carpet {
int const mynprocs_left = nprocs - nslices * mynprocs_base;
int sum_mynprocs = 0;
for (int n=0; n<nslices; ++n) {
- mynprocs.at(n) = mynprocs_base + int (n < mynprocs_left);
- sum_mynprocs += mynprocs.at(n);
+ mynprocs.AT(n) = mynprocs_base + int (n < mynprocs_left);
+ sum_mynprocs += mynprocs.AT(n);
}
assert (sum_mynprocs == nprocs);
- if (DEBUG) cout << "SRMAR " << mydim << " mynprocs " << mynprocs << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " mynprocs " << mynprocs << endl;
// Split the region
vector<int> mynpoints(nslices);
@@ -1237,20 +1426,22 @@ namespace Carpet {
int npoints_left = npoints;
int nprocs_left = nprocs;
for (int n=0; n<nslices; ++n) {
- mynpoints.at(n) = int (floor (CCTK_REAL(1) * npoints_left * mynprocs.at(n)
- / nprocs_left + CCTK_REAL(0.5)));
- assert (mynprocs .at(n) > 0);
- npoints_left -= mynpoints.at(n);
- nprocs_left -= mynprocs.at(n);
+ assert (nprocs_left > 0);
+ CCTK_REAL const npoints1 =
+ CCTK_REAL(1) * npoints_left * mynprocs.AT(n) / nprocs_left;
+ mynpoints.AT(n) = int (floor (npoints1 + CCTK_REAL(0.5)));
+ assert (mynpoints.AT(n) >= 0 and mynpoints.AT(n) <= npoints_left);
+ npoints_left -= mynpoints.AT(n);
+ nprocs_left -= mynprocs.AT(n);
assert (npoints_left >= 0);
assert (nprocs_left >= 0);
}
assert (npoints_left == 0);
assert (nprocs_left == 0);
- if (DEBUG) cout << "SRMAR " << mydim << " mynpoints " << mynpoints << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " mynpoints " << mynpoints << endl;
// Create the regions and recurse
- if (DEBUG) cout << "SRMAR " << mydim << ": create bboxes" << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << ": create bboxes" << endl;
ivect lo = superreg.extent.lower();
ivect up = superreg.extent.upper();
ivect const str = superreg.extent.stride();
@@ -1258,41 +1449,41 @@ namespace Carpet {
vector<int> bounds (nslices+1);
vector<ipfulltree *> subtrees (nslices);
for (int n=0; n<nslices; ++n) {
- if (DEBUG) cout << "SRMAR " << mydim << " n " << n << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " n " << n << endl;
// Create a new region
- up[mydim] = lo[mydim] + (mynpoints.at(n) - 1) * str[mydim];
+ up[mydim] = lo[mydim] + (mynpoints.AT(n) - 1) * str[mydim];
b2vect newob (superreg.outer_boundaries);
if (n > 0) {
newob[0][mydim] = false;
}
if (n < nslices-1) {
- up[mydim] = lo[mydim] + (mynpoints.at(n) - 1) * str[mydim];
+ up[mydim] = lo[mydim] + (mynpoints.AT(n) - 1) * str[mydim];
newob[1][mydim] = false;
}
region_t newreg (superreg);
newreg.extent = ibbox(lo, up, str);
newreg.outer_boundaries = newob;
- if (DEBUG) cout << "SRMAR " << mydim << " newreg " << newreg << endl;
+ if (recompose_verbose) cout << "SRMAR " << mydim << " newreg " << newreg << endl;
// Recurse
- bounds.at(n) = lo[mydim];
+ bounds.AT(n) = lo[mydim];
SplitRegionsMaps_Automatic_Recursively
- (newdims, p, mynprocs.at(n), newreg, newregs);
- if (DEBUG) cout << "SRMAR " << mydim << " newregs " << newregs << endl;
+ (newdims, p, mynprocs.AT(n), newreg, newregs);
+ if (recompose_verbose) cout << "SRMAR " << mydim << " newregs " << newregs << endl;
assert (newreg.processors != NULL);
- subtrees.at(n) = newreg.processors;
+ subtrees.AT(n) = newreg.processors;
newreg.processors = NULL;
newreg.processor = p;
// Next slice
lo[mydim] = up[mydim] + str[mydim];
- p += mynprocs.at(n);
+ p += mynprocs.AT(n);
}
assert (up[mydim] == superreg.extent.upper()[mydim]);
assert (p == firstproc + nprocs);
- bounds.at(nslices) = up[mydim] + str[mydim];
+ bounds.AT(nslices) = up[mydim] + str[mydim];
// Create tree
assert (superreg.processors == NULL);
@@ -1301,7 +1492,7 @@ namespace Carpet {
// Check postcondition
assert (newregs.size() == oldsize + nprocs);
- if (DEBUG) cout << "SRMAR exit" << endl;
+ if (recompose_verbose) cout << "SRMAR exit" << endl;
}
@@ -1313,20 +1504,20 @@ namespace Carpet {
{
DECLARE_CCTK_PARAMETERS;
- if (DEBUG) cout << "SRMA enter" << endl;
+ if (recompose_verbose) cout << "SRMA enter" << endl;
int const nmaps = superregss.size();
int minmap = 1000000000;
for (int m=0; m<nmaps; ++m) {
- for (int r=0; r<int(superregss.at(m).size()); ++r) {
- minmap = min (minmap, superregss.at(m).at(r).map);
+ for (int r=0; r<int(superregss.AT(m).size()); ++r) {
+ minmap = min (minmap, superregss.AT(m).AT(r).map);
}
}
int nregs = 0;
for (int m=0; m<nmaps; ++m) {
- nregs += superregss.at(m).size();
+ nregs += superregss.AT(m).size();
}
- if (DEBUG) cout << "SRMA nregs " << nregs << endl;
+ if (recompose_verbose) cout << "SRMA nregs " << nregs << endl;
// Something to do?
if (nregs == 0) {
@@ -1337,7 +1528,7 @@ namespace Carpet {
vector<region_t> superregs;
{
for (int m=0; m<nmaps; ++m) {
- combine_regions (superregss.at(m), superregs);
+ combine_regions (superregss.AT(m), superregs);
}
nregs = superregs.size();
@@ -1351,14 +1542,13 @@ namespace Carpet {
reg.extent = ibbox (ivect (0), ivect (-1), ivect (1));
reg.outer_boundaries = b2vect (bvect (true), bvect (true));
reg.map = 0;
- reg.processor = -1;
superregs.push_back (reg);
nregs = superregs.size();
}
}
int const real_nprocs = CCTK_nProcs (cctkGH);
- if (DEBUG) cout << "SRMA real_nprocs " << real_nprocs << endl;
+ if (recompose_verbose) cout << "SRMA real_nprocs " << real_nprocs << endl;
// Deactivate some processors if there are too many
int nprocs;
@@ -1367,109 +1557,155 @@ namespace Carpet {
} else {
CCTK_REAL mycost = 0;
for (int r=0; r<nregs; ++r) {
- mycost += prod (cost (superregs.at(r)));
+ mycost += prod (cost (superregs.AT(r)));
}
int const goodnprocs = int (floor (mycost / min_points_per_proc));
nprocs = max (1, min (real_nprocs, goodnprocs));
}
- if (DEBUG) cout << "SRMA nprocs " << nprocs << endl;
+ if (recompose_verbose) cout << "SRMA nprocs " << nprocs << endl;
// ncomps: number of components per processor
int const ncomps = (nregs + nprocs - 1) / nprocs;
- if (DEBUG) cout << "SRMA ncomps " << ncomps << endl;
+ if (recompose_verbose) cout << "SRMA ncomps " << ncomps << endl;
assert (ncomps > 0);
int const newnregs = nprocs * ncomps;
- if (DEBUG) cout << "SRMA newnregs " << newnregs << endl;
+ if (recompose_verbose) cout << "SRMA newnregs " << newnregs << endl;
- if (DEBUG) cout << "SRMA: distributing processors to regions" << endl;
+ if (recompose_verbose) cout << "SRMA: distributing processors to regions" << endl;
vector<CCTK_REAL> mycosts(nregs);
for (int r=0; r<nregs; ++r) {
- mycosts.at(r) = prod (cost (superregs.at(r)));
+ mycosts.AT(r) = prod (cost (superregs.AT(r)));
}
int nregs_left = newnregs;
vector<int> mynprocs(nregs);
for (int r=0; r<nregs; ++r) {
- mynprocs.at(r) = 1;
+ mynprocs.AT(r) = 1;
-- nregs_left;
}
#warning "TODO: split regions if necessary"
while (nregs_left > 0) {
- if (DEBUG) cout << "SRMA nregs_left " << nregs_left << endl;
+ if (recompose_verbose) cout << "SRMA nregs_left " << nregs_left << endl;
int maxr = -1;
CCTK_REAL maxratio = -1;
for (int r=0; r<nregs; ++r) {
- CCTK_REAL const ratio = mycosts.at(r) / mynprocs.at(r);
+ CCTK_REAL const ratio = mycosts.AT(r) / mynprocs.AT(r);
if (ratio > maxratio) { maxr=r; maxratio=ratio; }
}
assert (maxr>=0 and maxr<nregs);
- ++ mynprocs.at(maxr);
- if (DEBUG) cout << "SRMA maxr " << maxr << endl;
- if (DEBUG) cout << "SRMA mynprocs[maxr] " << mynprocs.at(maxr) << endl;
+ ++ mynprocs.AT(maxr);
+ if (recompose_verbose) cout << "SRMA maxr " << maxr << endl;
+ if (recompose_verbose) cout << "SRMA mynprocs[maxr] " << mynprocs.AT(maxr) << endl;
-- nregs_left;
}
assert (nregs_left == 0);
int sum_nprocs = 0;
for (int r=0; r<nregs; ++r) {
- sum_nprocs += mynprocs.at(r);
+ sum_nprocs += mynprocs.AT(r);
}
assert (sum_nprocs == newnregs);
- if (DEBUG) cout << "SRMA mynprocs " << mynprocs << endl;
+ if (recompose_verbose) cout << "SRMA mynprocs " << mynprocs << endl;
- if (DEBUG) cout << "SRMA: splitting work units" << endl;
+ if (recompose_verbose) cout << "SRMA: splitting work units" << endl;
#warning "TODO: rename newregs to regs"
#warning "TODO: rename nregs to nsuperregs"
#warning "TODO: rename newnregs to nregs"
vector<region_t> newregs;
newregs.reserve (newnregs);
- for (int r=0, p=0; r<nregs; p+=mynprocs.at(r), ++r) {
- if (DEBUG) cout << "SRMA superreg[" << r << "] " << superregs.at(r) << endl;
+ for (int r=0, p=0; r<nregs; p+=mynprocs.AT(r), ++r) {
+ if (recompose_verbose) cout << "SRMA superreg[" << r << "] " << superregs.AT(r) << endl;
bvect const dims = false;
SplitRegionsMaps_Automatic_Recursively
- (dims, p, mynprocs.at(r), superregs.at(r), newregs);
+ (dims, p, mynprocs.AT(r), superregs.AT(r), newregs);
} // for r
- if (DEBUG) cout << "SRMA newregs " << newregs << endl;
+ if (recompose_verbose) cout << "SRMA newregs " << newregs << endl;
assert (int(newregs.size()) == newnregs);
// Count components per map
vector<int> myncomps(nmaps, 0);
+#if 0
vector<int> empty_comps(nmaps, 0);
+#endif
for (int r=0; r<newnregs; ++r) {
- int const m = newregs.at(r).map - minmap;
+ int const m = newregs.AT(r).map - minmap;
assert (m>=0 and m<nmaps);
- if (not newregs.at(r).extent.empty()) {
+#if 0
+ if (not newregs.AT(r).extent.empty()) {
// Ignore empty regions, which may come from empty grid arrays
- ++ myncomps.at(m);
+ ++ myncomps.AT(m);
} else {
- ++ empty_comps.at(m);
+ ++ empty_comps.AT(m);
}
+#endif
+ ++ myncomps.AT(m);
}
vector<int> mynregs(nmaps, 0);
+#if 0
+ vector<int> empty_regs(nmaps, 0);
+#endif
for (int r=0; r<nregs; ++r) {
- int const m = superregs.at(r).map - minmap;
+ int const m = superregs.AT(r).map - minmap;
assert (m>=0 and m<nmaps);
- ++ mynregs.at(m);
+ ++ mynregs.AT(m);
+#if 0
+ if (not superregs.AT(r).extent.empty()) {
+ // Ignore empty regions, which may come from empty grid arrays
+ ++ mynregs.AT(m);
+ } else {
+ ++ empty_regs.AT(m);
+ }
+#endif
}
// Convert virtual to real processors
for (int r=0; r<newnregs; ++r) {
- newregs.at(r).processor /= ncomps;
- assert (newregs.at(r).processor >= 0 and
- newregs.at(r).processor < nprocs);
+ newregs.AT(r).processor /= ncomps;
+ assert (newregs.AT(r).processor >= 0 and
+ newregs.AT(r).processor < nprocs);
}
{
vector<int> tmpncomps(nmaps, 0);
for (int r=0; r<nregs; ++r) {
- int const m = superregs.at(r).map - minmap;
- ipfulltree * const regf = superregs.at(r).processors;
+ int const m = superregs.AT(r).map - minmap;
+ ipfulltree * const regf = superregs.AT(r).processors;
assert (regf != NULL);
for (ipfulltree::iterator fti (* regf); not fti.done(); ++ fti) {
pseudoregion_t & preg = (* fti).payload();
- preg.component = tmpncomps.at(m)++;
+ preg.component = tmpncomps.AT(m)++;
}
}
for (int m=0; m<nmaps; ++m) {
- assert (tmpncomps.at(m) == myncomps.at(m));
+#warning "TODO"
+ if (not (tmpncomps.AT(m) == myncomps.AT(m))) {
+ cout << "Recompose.cc" << endl
+ << "superregss=" << superregss << endl
+ << "regss=" << regss << endl
+ << "nregs=" << nregs << endl
+ << "newregs=" << newregs << endl
+ << "newnregs=" << newnregs << endl
+ << "m=" << m << endl
+ << "tmpncomps.AT(m)=" << tmpncomps.AT(m) << endl
+ << "myncomps.AT(m)=" << myncomps.AT(m) << endl;
+ cout << "newregs:" << endl;
+ for (int r=0; r<newnregs; ++r) {
+ int const m = newregs.AT(r).map - minmap;
+ assert (m>=0 and m<nmaps);
+ cout << "r=" << r << endl
+ << "newregs=" << newregs.at(r) << endl
+ << "newregs.extent.size()=" << newregs.at(r).extent.size() << endl
+ << "newregs.extent.empty()=" << newregs.at(r).extent.empty() << endl;
+ }
+ cout << "*regf:" << endl;
+ for (int r=0; r<nregs; ++r) {
+ int const m = superregs.AT(r).map - minmap;
+ ipfulltree * const regf = superregs.AT(r).processors;
+ cout << "r=" << r << endl
+ << "m=" << m << endl;
+ cout << "*regf=" << *regf << endl;
+ }
+ cout.flush();
+ }
+ assert (tmpncomps.AT(m) == myncomps.AT(m));
}
}
@@ -1477,34 +1713,37 @@ namespace Carpet {
// Allocate regions
assert ((int)regss.size() == nmaps);
for (int m=0; m<nmaps; ++m) {
- assert (regss.at(m).empty());
- regss.at(m).reserve (myncomps.at(m));
- superregss.at(m).clear();
- superregss.at(m).reserve (mynregs.at(m));
+ assert (regss.AT(m).empty());
+ regss.AT(m).reserve (myncomps.AT(m));
+ superregss.AT(m).clear();
+ superregss.AT(m).reserve (mynregs.AT(m));
}
// Assign regions
for (int r=0; r<newnregs; ++r) {
- int const m = newregs.at(r).map - minmap;
+ int const m = newregs.AT(r).map - minmap;
assert (m>=0 and m<nmaps);
- regss.at(m).push_back (newregs.at(r));
+ regss.AT(m).push_back (newregs.AT(r));
}
for (int r=0; r<nregs; ++r) {
- int const m = superregs.at(r).map - minmap;
+ int const m = superregs.AT(r).map - minmap;
assert (m>=0 and m<nmaps);
- superregss.at(m).push_back (superregs.at(r));
+ superregss.AT(m).push_back (superregs.AT(r));
}
// Output regions
- if (DEBUG) {
+ if (recompose_verbose) {
cout << "SRMA superregss " << superregss << endl;
cout << "SRMA regss " << regss << endl;
}
// Check sizes
for (int m=0; m<nmaps; ++m) {
- assert (int(regss.at(m).size()) == myncomps.at(m) + empty_comps.at(m));
- assert (int(superregss.at(m).size()) == mynregs.at(m));
+#if 0
+ assert (int(regss.AT(m).size()) == myncomps.AT(m) + empty_comps.AT(m));
+#endif
+ assert (int(regss.AT(m).size()) == myncomps.AT(m));
+ assert (int(superregss.AT(m).size()) == mynregs.AT(m));
}
- if (DEBUG) cout << "SRMA exit" << endl;
+ if (recompose_verbose) cout << "SRMA exit" << endl;
}
@@ -1547,30 +1786,30 @@ namespace Carpet {
}
}
vector<ibbox> bases(mglevels);
- bases.at(0) = base;
+ bases.AT(0) = base;
for (int ml=1; ml<mglevels; ++ml) {
// next finer base
- ivect const fbaselo = bases.at(ml-1).lower();
- ivect const fbasehi = bases.at(ml-1).upper();
- ivect const fbasestr = bases.at(ml-1).stride();
+ ivect const fbaselo = bases.AT(ml-1).lower();
+ ivect const fbasehi = bases.AT(ml-1).upper();
+ ivect const fbasestr = bases.AT(ml-1).stride();
// this base
ivect const basestr = fbasestr * mgfact;
ivect const baselo = fbaselo + (xpose(offset)[0] - ivect(mgfact) * xpose(offset)[0]) * fbasestr;
ivect const basehi = fbasehi + (xpose(offset)[1] - ivect(mgfact) * xpose(offset)[1]) * fbasestr;
ivect const baselo1 = baselo;
ivect const basehi1 = baselo1 + (basehi - baselo1) / basestr * basestr;
- bases.at(ml) = ibbox(baselo1, basehi1, basestr);
+ bases.AT(ml) = ibbox(baselo1, basehi1, basestr);
// next finer grid
- ivect const flo = regs.at(ml-1).extent.lower();
- ivect const fhi = regs.at(ml-1).extent.upper();
- ivect const fstr = regs.at(ml-1).extent.stride();
+ ivect const flo = regs.AT(ml-1).extent.lower();
+ ivect const fhi = regs.AT(ml-1).extent.upper();
+ ivect const fstr = regs.AT(ml-1).extent.stride();
// this grid
ivect const str = fstr * mgfact;
ivect const lo = flo + either (reg.outer_boundaries[0], (xpose(offset)[0] - ivect(mgfact) * xpose(offset)[0]) * fstr, ivect(0));
ivect const hi = fhi + either (reg.outer_boundaries[1], - (xpose(offset)[1] - ivect(mgfact) * xpose(offset)[1]) * fstr, ivect(0));
ivect const lo1 = baselo1 + (lo - baselo1 + str - 1) / str * str;
ivect const hi1 = lo1 + (hi - lo1) / str * str;
- regs.at(ml).extent = ibbox(lo1, hi1, str);
+ regs.AT(ml).extent = ibbox(lo1, hi1, str);
}
}
}
@@ -1583,25 +1822,25 @@ namespace Carpet {
{
regsss.resize (mglevels);
for (int ml=0; ml<mglevels; ++ml) {
- regsss.at(ml).resize (regss.size());
+ regsss.AT(ml).resize (regss.size());
for (int rl=0; rl<(int)regss.size(); ++rl) {
- regsss.at(ml).at(rl).resize (regss.at(rl).size());
+ regsss.AT(ml).AT(rl).resize (regss.AT(rl).size());
}
}
for (int rl=0; rl<(int)regss.size(); ++rl) {
ibbox base;
- for (int c=0; c<(int)regss.at(rl).size(); ++c) {
- base = base.expanded_containing(regss.at(rl).at(c).extent);
+ for (int c=0; c<(int)regss.AT(rl).size(); ++c) {
+ base = base.expanded_containing(regss.AT(rl).AT(c).extent);
}
- for (int c=0; c<(int)regss.at(rl).size(); ++c) {
+ for (int c=0; c<(int)regss.AT(rl).size(); ++c) {
vector<region_t> mg_regs;
- MakeMultigridBoxes (cctkGH, m, base, regss.at(rl).at(c), mg_regs);
+ MakeMultigridBoxes (cctkGH, m, base, regss.AT(rl).AT(c), mg_regs);
assert ((int)mg_regs.size() == mglevels);
for (int ml=0; ml<mglevels; ++ml) {
- regsss.at(ml).at(rl).at(c) = mg_regs.at(ml);
+ regsss.AT(ml).AT(rl).AT(c) = mg_regs.AT(ml);
}
} // for c
@@ -1615,8 +1854,46 @@ namespace Carpet {
vector<vector<vector<vector<region_t> > > > & regssss)
{
for (int m = 0; m < maps; ++m) {
- MakeMultigridBoxes (cctkGH, m, regsss.at(m), regssss.at(m));
+ MakeMultigridBoxes (cctkGH, m, regsss.AT(m), regssss.AT(m));
} // for m
}
+
+
+ static
+ void
+ ClassifyPoints (cGH const * const cctkGH, int const rl)
+ {
+ // negative: needs to be set explicitly (e.g. boundary)
+ // zero: unused (e.g. ghost)
+ // positive: needs to be evolved
+ // -1: boundary point (needs to be set explicitly)
+ // 0: unused (e.g. ghost point, or restriction target)
+ // n=1..N: evolved, used for integrator substeps i<=n
+ // (i=N..1, counting backwards; see MoL documentation)
+ // i.e.: n=1: used between time steps (i.e., should be visualised)
+ // n>1: used only while time stepping (e.g. buffer zones)
+
+ BEGIN_META_MODE(cctkGH) {
+ BEGIN_MGLEVEL_LOOP (cctkGH) {
+ ENTER_LEVEL_MODE (cctkGH, rl) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
+ DECLARE_CCTK_ARGUMENTS;
+#pragma omp parallel
+ LC_LOOP3 (CarpetClassifyPoints,
+ i,j,k,
+ 0,0,0, cctk_lsh[0],cctk_lsh[1],cctk_lsh[2],
+ cctk_lsh[0],cctk_lsh[1],cctk_lsh[2])
+ {
+ int const ind = CCTK_GFINDEX3D (cctkGH, i, j, k);
+ point_class[ind] = 1;
+ } LC_ENDLOOP3(CarpetClassifyPoints);
+ } END_LOCAL_COMPONENT_LOOP;
+ } END_LOCAL_MAP_LOOP;
+ } LEAVE_LEVEL_MODE;
+ } END_MGLEVEL_LOOP;
+ } END_META_MODE;
+ }
+
} // namespace Carpet
diff --git a/Carpet/Carpet/src/Requirements.cc b/Carpet/Carpet/src/Requirements.cc
index 6a4a83ebc..da0beaf6b 100644
--- a/Carpet/Carpet/src/Requirements.cc
+++ b/Carpet/Carpet/src/Requirements.cc
@@ -8,7 +8,7 @@
#include <cctki_GHExtensions.h>
#include <cctki_Schedule.h>
-#include "carpet.hh"
+#include <carpet.hh>
using namespace std;
@@ -21,6 +21,14 @@ using namespace std;
typedef enum {sched_none, sched_group, sched_function} iSchedType;
typedef enum {schedpoint_misc, schedpoint_analysis} iSchedPoint;
+typedef struct t_timer
+{
+ struct t_timer *next;
+ int timer_handle;
+ char *schedule_bin;
+ int has_been_output;
+} t_timer;
+
typedef struct
{
/* Static data */
@@ -41,8 +49,7 @@ typedef struct
int *comm_groups;
/* Timer data */
-
- int timer_handle;
+ t_timer *timers;
/* Dynamic data */
int *CommOnEntry;
@@ -68,6 +75,10 @@ namespace Carpet {
// 2. Things can be provided only once, not multiple times.
// Except when they are also provided.
+ // Keep track of which time levels contain good data; modify this
+ // while time level cycling; routine specify how many time levels
+ // they require/provide
+
int CheckEntry (void * attribute, void * data);
@@ -306,8 +317,8 @@ namespace Carpet {
CheckOneGroup (cctkGH, "CCTK_TERMINATE");
}
- }; // namespace Carpet
-}; // namespace Requirements
+ } // namespace Carpet
+} // namespace Requirements
@@ -324,8 +335,8 @@ namespace Carpet {
Checkpoint ("Skipping check of schedule requirements (no flesh support)");
// do nothing
}
- }; // namespace Carpet
-}; // namespace Requirements
+ } // namespace Carpet
+} // namespace Requirements
diff --git a/Carpet/Carpet/src/Restrict.cc b/Carpet/Carpet/src/Restrict.cc
index a0a94ddd4..bad055641 100644
--- a/Carpet/Carpet/src/Restrict.cc
+++ b/Carpet/Carpet/src/Restrict.cc
@@ -2,13 +2,13 @@
#include <cmath>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "ggf.hh"
-#include "gh.hh"
+#include <ggf.hh>
+#include <gh.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -58,7 +58,7 @@ namespace Carpet {
}
- // restricts a set of groups which all have the same vartype
+ // restrict a set of groups
static void RestrictGroups (const cGH* cctkGH, const vector<int>& groups) {
DECLARE_CCTK_PARAMETERS;
@@ -66,14 +66,14 @@ namespace Carpet {
for (comm_state state; not state.done(); state.step()) {
for (int group = 0; group < (int)groups.size(); ++group) {
- const int g = groups[group];
- for (int m=0; m<(int)arrdata.at(g).size(); ++m) {
+ const int g = groups.AT(group);
+ for (int m=0; m<(int)arrdata.AT(g).size(); ++m) {
// use background time here (which may not be modified
// by the user)
- const CCTK_REAL time = vtt.at(m)->time (tl, reflevel, mglevel);
+ const CCTK_REAL time = vtt.AT(m)->time (tl, reflevel, mglevel);
- const CCTK_REAL time1 = vtt.at(m)->time (0, reflevel, mglevel);
+ const CCTK_REAL time1 = vtt.AT(m)->time (0, reflevel, mglevel);
const CCTK_REAL time2 =
(cctkGH->cctk_time - cctk_initial_time) / delta_time;
const CCTK_REAL time0 =
@@ -81,8 +81,8 @@ namespace Carpet {
const CCTK_REAL eps = 1.0e-12;
assert (abs(time1 - time2) <= eps * time0);
- for (int v = 0; v < (int)arrdata.at(g).at(m).data.size(); ++v) {
- ggf *const gv = arrdata.at(g).at(m).data.at(v);
+ for (int v = 0; v < (int)arrdata.AT(g).AT(m).data.size(); ++v) {
+ ggf *const gv = arrdata.AT(g).AT(m).data.AT(v);
gv->ref_restrict_all (state, tl, reflevel, mglevel, time);
}
}
diff --git a/Carpet/Carpet/src/ScheduleWrapper.cc b/Carpet/Carpet/src/ScheduleWrapper.cc
index c782c0f91..624dacbf9 100644
--- a/Carpet/Carpet/src/ScheduleWrapper.cc
+++ b/Carpet/Carpet/src/ScheduleWrapper.cc
@@ -1,10 +1,12 @@
#include <cassert>
#include <list>
-#include "cctk.h"
-#include "cctk_Arguments.h"
+#include <cctk.h>
+#include <cctk_Arguments.h>
+
+#include <carpet.hh>
+
-#include "carpet.hh"
namespace Carpet {
diff --git a/Carpet/Carpet/src/SetupGH.cc b/Carpet/Carpet/src/SetupGH.cc
index e9f0df32f..6be1c7008 100644
--- a/Carpet/Carpet/src/SetupGH.cc
+++ b/Carpet/Carpet/src/SetupGH.cc
@@ -4,6 +4,7 @@
#include <cstdlib>
#include <cstring>
#include <iostream>
+#include <limits>
#include <sstream>
#include <stack>
#include <string>
@@ -13,7 +14,6 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-
#include <util_ErrorCodes.h>
#include <util_Network.h>
#include <util_Table.h>
@@ -23,10 +23,11 @@
#include <dist.hh>
#include <ggf.hh>
#include <gh.hh>
+#include <mpi_string.hh>
#include <region.hh>
#include <vect.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -181,9 +182,6 @@ namespace Carpet {
{
DECLARE_CCTK_PARAMETERS;
- // Check and/or modify system limits
- SetSystemLimits ();
-
// Some statistics
{
int const nprocs = dist::size();
@@ -191,14 +189,42 @@ namespace Carpet {
dist::set_num_threads (num_threads);
int const mynthreads = dist::num_threads();
int const nthreads_total = dist::total_num_threads();
+#ifdef CCTK_MPI
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "MPI is enabled");
CCTK_VInfo (CCTK_THORNSTRING,
"Carpet is running on %d processes", nprocs);
CCTK_VInfo (CCTK_THORNSTRING,
"This is process %d", myproc);
+#else
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "MPI is disabled");
+#endif
+ char const * const OMP_NUM_THREADS = getenv ("OMP_NUM_THREADS");
+#ifdef _OPENMP
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OpenMP is enabled");
+ if (not OMP_NUM_THREADS and num_threads == -1) {
+ CCTK_VWarn (CCTK_WARN_COMPLAIN, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Although OpenMP is enabled, neither the environment variable OMP_NUM_THREADS nor the parameter Carpet::num_threads are set. A system-specific default value is used instead.");
+ }
CCTK_VInfo (CCTK_THORNSTRING,
"This process contains %d threads", mynthreads);
CCTK_VInfo (CCTK_THORNSTRING,
"There are %d threads in total", nthreads_total);
+#else
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OpenMP is disabled");
+ int const omp_num_threads = OMP_NUM_THREADS ? atoi (OMP_NUM_THREADS) : 0;
+ if (omp_num_threads > 0) {
+ CCTK_VWarn (CCTK_WARN_ALERT, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Although OpenMP is disabled, the environment variable OMP_NUM_THREADS is set to %d. It will be ignored.", omp_num_threads);
+ }
+ if (num_threads > 0) {
+ CCTK_VWarn (CCTK_WARN_ALERT, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Although OpenMP is disabled, the parameter Carpet::num_threads is set to %d. It will be ignored.", num_threads);
+ }
+#endif
#if 0
// Do not call Util_GetHostName. Certain InfiniBand libraries
@@ -209,7 +235,7 @@ namespace Carpet {
char hostnamebuf[1000];
Util_GetHostName (hostnamebuf, sizeof hostnamebuf);
string const hostname (hostnamebuf);
- vector <string> hostnames = AllGatherString (dist::comm(), hostname);
+ vector <string> hostnames = allgather_string (dist::comm(), hostname);
// Collect process ids
int const mypid = getpid ();
vector <int> pids (nprocs);
@@ -227,7 +253,7 @@ namespace Carpet {
for (int n = 0; n < nprocs; ++ n) {
CCTK_VInfo (CCTK_THORNSTRING,
" %6d: %s, pid=%d, num_threads=%d",
- n, hostnames.at(n).c_str(), pids.at(n), nthreads.at(n));
+ n, hostnames.AT(n).c_str(), pids.AT(n), nthreads.AT(n));
}
}
#endif
@@ -240,6 +266,7 @@ namespace Carpet {
mc_grouptype = -1;
map = -1;
component = -1;
+ cctkGH->cctk_mode = CCTK_MODE_META;
// Say hello
Waypoint ("Setting up the grid hierarchy");
@@ -275,7 +302,9 @@ namespace Carpet {
do_warn_about_storage = false; // This is enabled later
if (enable_all_storage) {
- enable_storage_for_all_groups (cctkGH);
+ if (not enable_no_storage) {
+ enable_storage_for_all_groups (cctkGH);
+ }
}
Waypoint ("Done with setting up the grid hierarchy");
@@ -327,8 +356,11 @@ namespace Carpet {
if (CCTK_EQUALS (space_refinement_factors, "")) {
// Calculate them from the default refinement factor
spacereffacts.resize (maxreflevels);
- for (int n=0; n<maxreflevels; ++n) {
- spacereffacts.at(n) = ivect (ipow (int(refinement_factor), n));
+ assert (ipow (2, 0) == 1);
+ assert (ipow (3, 1) == 3);
+ assert (ipow (4, 2) == 16);
+ for (int rl=0; rl<maxreflevels; ++rl) {
+ spacereffacts.AT(rl) = ivect (ipow (int(refinement_factor), rl));
}
} else {
// Read them from the parameter
@@ -342,10 +374,10 @@ namespace Carpet {
}
// TODO: turn these into real error messages
assert (int(spacereffacts.size()) >= maxreflevels);
- assert (all (spacereffacts.front() == 1));
- for (int n=1; n<maxreflevels; ++n) {
- assert (all (spacereffacts.at(n) >= spacereffacts.at(n-1)));
- assert (all (spacereffacts.at(n) % spacereffacts.at(n-1) == 0));
+ assert (all (spacereffacts.AT(0) == 1));
+ for (int rl=1; rl<maxreflevels; ++rl) {
+ assert (all (spacereffacts.AT(rl) >= spacereffacts.AT(rl-1)));
+ assert (all (spacereffacts.AT(rl) % spacereffacts.AT(rl-1) == 0));
}
spacereffacts.resize (maxreflevels);
@@ -353,8 +385,8 @@ namespace Carpet {
if (CCTK_EQUALS (time_refinement_factors, "")) {
// Calculate them from the default refinement factor
timereffacts.resize (maxreflevels);
- for (int n=0; n<maxreflevels; ++n) {
- timereffacts.at(n) = ipow (int(refinement_factor), n);
+ for (int rl=0; rl<maxreflevels; ++rl) {
+ timereffacts.AT(rl) = ipow (int(refinement_factor), rl);
}
} else {
// Read them from the parameter
@@ -367,16 +399,16 @@ namespace Carpet {
}
// TODO: turn these into real error messages
assert (int(timereffacts.size()) >= maxreflevels);
- assert (timereffacts.front() == 1);
- for (int n=1; n<maxreflevels; ++n) {
- assert (timereffacts.at(n) >= timereffacts.at(n-1));
- assert (timereffacts.at(n) % timereffacts.at(n-1) == 0);
+ assert (timereffacts.AT(0) == 1);
+ for (int rl=1; rl<maxreflevels; ++rl) {
+ assert (timereffacts.AT(rl) >= timereffacts.AT(rl-1));
+ assert (timereffacts.AT(rl) % timereffacts.AT(rl-1) == 0);
}
timereffacts.resize (maxreflevels);
// Calculate the maximum refinement factors
- maxtimereflevelfact = timereffacts.at (maxreflevels-1);
- maxspacereflevelfact = spacereffacts.at (maxreflevels-1);
+ maxtimereflevelfact = timereffacts.AT(maxreflevels-1);
+ maxspacereflevelfact = spacereffacts.AT(maxreflevels-1);
}
@@ -502,7 +534,7 @@ namespace Carpet {
// Allocate grid hierarchy
vhh.resize(maps);
- vhh.at(m) = new gh (spacereffacts, refcentering,
+ vhh.AT(m) = new gh (spacereffacts, refcentering,
convergence_factor, mgcentering,
baseexts, nboundaryzones);
}
@@ -541,7 +573,7 @@ namespace Carpet {
assert (all (all (buffers >= 0)));
vdd.resize(maps);
- vdd.at(m) = new dh (* vhh.at(m),
+ vdd.AT(m) = new dh (* vhh.AT(m),
ghosts, buffers,
prolongation_order_space);
@@ -559,7 +591,7 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
vtt.resize (maps);
- vtt.at(m) = new th (* vhh.at(m),
+ vtt.AT(m) = new th (* vhh.AT(m),
timereffacts,
1.0);
}
@@ -573,7 +605,7 @@ namespace Carpet {
vector<vector<vector<region_t> > > superregsss (maps);
for (int m=0; m<maps; ++m) {
- set_base_extent (m, superregsss.at(m));
+ set_base_extent (m, superregsss.AT(m));
}
vector<vector<vector<vector<region_t> > > > regssss;
@@ -582,40 +614,45 @@ namespace Carpet {
for (int m=0; m<maps; ++m) {
// Check the regions
- CheckRegions (regssss.at(m));
+ CheckRegions (regssss.AT(m));
// Recompose grid hierarchy
- vhh.at(m)->regrid (superregsss.at(m), regssss.at(m));
+ vhh.AT(m)->regrid (superregsss.AT(m), regssss.AT(m), false);
int const rl = 0;
- vhh.at(m)->recompose (rl, false);
+ vhh.AT(m)->recompose (rl, false);
+ vhh.AT(m)->regrid_free (false);
} // for m
- CCTK_INFO ("Grid structure (grid points):");
- for (int ml=0; ml<mglevels; ++ml) {
- int const rl = 0;
- for (int m=0; m<maps; ++m) {
- for (int c=0; c<vhh.at(m)->components(rl); ++c) {
- ibbox const ext = vhh.at(m)->extent(ml,rl,c);
- ivect const lower = ext.lower();
- ivect const upper = ext.upper();
- int const convfact = ipow(mgfact, ml);
- assert (all(lower % maxspacereflevelfact == 0));
- assert (all(upper % maxspacereflevelfact == 0));
- assert (all(((upper - lower) / maxspacereflevelfact) % convfact == 0));
- cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
- << " exterior: "
- << "proc "
- << vhh.at(m)->processor(rl,c)
- << " "
- << lower / maxspacereflevelfact
- << " : "
- << upper / maxspacereflevelfact
- << " ("
- << (upper - lower) / maxspacereflevelfact / convfact + 1
- << ") "
- << prod ((upper - lower) / maxspacereflevelfact / convfact + 1)
- << endl;
+ regridding_epoch = 0;
+
+ if (verbose or veryverbose) {
+ CCTK_INFO ("Grid structure (grid points):");
+ for (int ml=0; ml<mglevels; ++ml) {
+ int const rl = 0;
+ for (int m=0; m<maps; ++m) {
+ for (int c=0; c<vhh.AT(m)->components(rl); ++c) {
+ ibbox const ext = vhh.AT(m)->extent(ml,rl,c);
+ ivect const lower = ext.lower();
+ ivect const upper = ext.upper();
+ int const convfact = ipow(mgfact, ml);
+ assert (all(lower % maxspacereflevelfact == 0));
+ assert (all(upper % maxspacereflevelfact == 0));
+ assert (all(((upper - lower) / maxspacereflevelfact) % convfact == 0));
+ cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]"
+ << " exterior: "
+ << "proc "
+ << vhh.AT(m)->processor(rl,c)
+ << " "
+ << lower / maxspacereflevelfact
+ << " : "
+ << upper / maxspacereflevelfact
+ << " ("
+ << (upper - lower) / maxspacereflevelfact / convfact + 1
+ << ") "
+ << prod ((upper - lower) / maxspacereflevelfact / convfact + 1)
+ << endl;
+ }
}
}
}
@@ -623,7 +660,7 @@ namespace Carpet {
// Assert that all maps have one refinement level
reflevels = 1;
for (int m=0; m<maps; ++m) {
- assert (vhh.at(m)->reflevels() == reflevels);
+ assert (vhh.AT(m)->reflevels() == reflevels);
}
}
@@ -638,13 +675,13 @@ namespace Carpet {
// Create one refinement level
int const rl = 0;
regss.resize(1);
- vector<region_t> & regs = regss.at(rl);
+ vector<region_t> & regs = regss.AT(rl);
if (CCTK_EQUALS (base_extents, "")) {
// Default: one grid component covering everything
region_t reg;
- reg.extent = vhh.at(m)->baseextents.at(0).at(0);
+ reg.extent = vhh.AT(m)->baseextents.AT(0).AT(0);
reg.outer_boundaries = b2vect (bvect (true));
reg.map = m;
regs.push_back (reg);
@@ -677,8 +714,8 @@ namespace Carpet {
for (size_t n=0; n<exts.size(); ++n) {
region_t reg;
- reg.extent = exts.at(n);
- reg.outer_boundaries = xpose(obs.at(n));
+ reg.extent = exts.AT(n);
+ reg.outer_boundaries = xpose(obs.AT(n));
reg.map = m;
regs.push_back (reg);
}
@@ -711,17 +748,17 @@ namespace Carpet {
assert (gdata.dim == dim);
// Set up one refinement level
- groupdata.at(group).activetimelevels.resize(mglevels);
+ groupdata.AT(group).activetimelevels.resize(mglevels);
for (int ml=0; ml<mglevels; ++ml) {
- groupdata.at(group).activetimelevels.at(ml).resize(1);
+ groupdata.AT(group).activetimelevels.AT(ml).resize(1);
}
// Grid function groups use the global grid descriptors
- arrdata.at(group).resize(maps);
+ arrdata.AT(group).resize(maps);
for (int m=0; m<maps; ++m) {
- arrdata.at(group).at(m).hh = vhh.at(m);
- arrdata.at(group).at(m).dd = vdd.at(m);
- arrdata.at(group).at(m).tt = vtt.at(m);
+ arrdata.AT(group).AT(m).hh = vhh.AT(m);
+ arrdata.AT(group).AT(m).dd = vdd.AT(m);
+ arrdata.AT(group).AT(m).tt = vtt.AT(m);
}
break;
@@ -735,13 +772,13 @@ namespace Carpet {
assert (gdata.dim >= 0 and gdata.dim <= dim);
// Use only one refinement level for grid arrays
- groupdata.at(group).activetimelevels.resize(mglevels);
+ groupdata.AT(group).activetimelevels.resize(mglevels);
for (int ml=0; ml<mglevels; ++ml) {
- groupdata.at(group).activetimelevels.at(ml).resize(1);
+ groupdata.AT(group).activetimelevels.AT(ml).resize(1);
}
// Use only one map for grid arrays
- arrdata.at(group).resize(1);
+ arrdata.AT(group).resize(1);
ivect sizes;
i2vect ghosts;
@@ -788,33 +825,33 @@ namespace Carpet {
ivect const str(1);
ibbox const baseext(lb, ub, str);
vector <vector <ibbox> > baseexts (1);
- baseexts.at(0).resize (1);
- baseexts.at(0).at(0) = baseext;
+ baseexts.AT(0).resize (1);
+ baseexts.AT(0).AT(0) = baseext;
i2vect const nboundaryzones(0);
// One refinement level
vector<int> grouptimereffacts(1);
- grouptimereffacts.at(0) = 1;
+ grouptimereffacts.AT(0) = 1;
vector<ivect> groupspacereffacts(1);
- groupspacereffacts.at(0) = ivect(1);
+ groupspacereffacts.AT(0) = ivect(1);
// There is only one map
- int const m=0;
+ int const m = 0;
- arrdata.at(group).at(m).hh =
+ arrdata.AT(group).AT(m).hh =
new gh (groupspacereffacts, vertex_centered,
convergence_factor, vertex_centered,
baseexts, nboundaryzones);
i2vect const buffers = i2vect (0);
int const my_prolongation_order_space = 0;
- arrdata.at (group).at(m).dd =
- new dh (*arrdata.at (group).at(m).hh,
+ arrdata.AT(group).AT(m).dd =
+ new dh (*arrdata.AT(group).AT(m).hh,
ghosts, buffers, my_prolongation_order_space);
CCTK_REAL const basedelta = 1.0;
- arrdata.at (group).at(m).tt =
- new th (*arrdata.at (group).at(m).hh, grouptimereffacts, basedelta);
+ arrdata.AT(group).AT(m).tt =
+ new th (*arrdata.AT(group).AT(m).hh, grouptimereffacts, basedelta);
}
@@ -826,15 +863,26 @@ namespace Carpet {
ivect const & convpowers,
ivect const & convoffsets)
{
+#if 0
+ // Do not set up anything for groups that have zero variables
+ // TODO: To do this, need to change modes.cc to provide illegal
+ // entries for GroupDynamicData
+ int const nvars = CCTK_NumVarsInGroupI (group);
+ assert (nvars >= 0);
+ if (nvars == 0) return;
+#endif
+
// Set refinement structure for scalars and arrays
vector<region_t> superregs(1);
int const m = 0;
int const rl = 0;
- int const c = 0;
- superregs.at(c).extent =
- arrdata.at(group).at(m).hh->baseextents.at(rl).at(c);
- superregs.at(c).outer_boundaries = b2vect(true);
- superregs.at(c).map = m;
+ {
+ int const c = 0;
+ superregs.AT(c).extent =
+ arrdata.AT(group).AT(m).hh->baseextents.AT(rl).AT(c);
+ superregs.AT(c).outer_boundaries = b2vect(true);
+ superregs.AT(c).map = m;
+ }
vector<region_t> regs;
// Split it into components, one for each processor
@@ -871,7 +919,7 @@ namespace Carpet {
region_t empty;
empty.extent = ebox;
empty.processor = c;
- regs.at(c) = empty;
+ regs.AT(c) = empty;
}
}
}
@@ -881,21 +929,21 @@ namespace Carpet {
int const nprocs = CCTK_nProcs (cctkGH);
vector<bool> used (nprocs, false);
for (int c=0; c<nprocs; ++c) {
- int const p = regs.at(c).processor;
+ int const p = regs.AT(c).processor;
assert (p >= 0 and p < nprocs);
- assert (not used.at(p));
- used.at(p) = true;
+ assert (not used.AT(p));
+ used.AT(p) = true;
}
for (int c=0; c<nprocs; ++c) {
- assert (used.at(c));
+ assert (used.AT(c));
}
}
// Only one refinement level
vector<vector<region_t> > superregss(1);
- superregss.at(rl) = superregs;
+ superregss.AT(rl) = superregs;
vector<vector<region_t> > regss(1);
- regss.at(rl) = regs;
+ regss.AT(rl) = regs;
// Create all multigrid levels
vector<vector<vector<region_t> > > regsss (mglevels);
@@ -906,32 +954,31 @@ namespace Carpet {
offset[0][d] = 0;
offset[1][d] = convoffsets[d];
}
- regsss.at(0) = regss;
+ regsss.AT(0) = regss;
for (int ml=1; ml<mglevels; ++ml) {
- int const rl = 0;
- for (int c=0; c<int(regss.at(rl).size()); ++c) {
+ for (int c=0; c<int(regss.AT(rl).size()); ++c) {
// this base
ivect const baselo = ivect(0);
ivect const baselo1 = baselo;
// next finer grid
- ivect const flo = regsss.at(ml-1).at(rl).at(c).extent.lower();
- ivect const fhi = regsss.at(ml-1).at(rl).at(c).extent.upper();
- ivect const fstr = regsss.at(ml-1).at(rl).at(c).extent.stride();
+ ivect const flo = regsss.AT(ml-1).AT(rl).AT(c).extent.lower();
+ ivect const fhi = regsss.AT(ml-1).AT(rl).AT(c).extent.upper();
+ ivect const fstr = regsss.AT(ml-1).AT(rl).AT(c).extent.stride();
// this grid
ivect const str = fstr * mgfact1;
ivect const lo = flo +
- either (regsss.at(ml-1).at(rl).at(c).outer_boundaries[0],
+ either (regsss.AT(ml-1).AT(rl).AT(c).outer_boundaries[0],
+ (offset[0] - mgfact1 * offset[0]) * fstr,
ivect(0));
ivect const hi = fhi +
- either (regsss.at(ml-1).at(rl).at(c).outer_boundaries[1],
+ either (regsss.AT(ml-1).AT(rl).AT(c).outer_boundaries[1],
- (offset[1] - mgfact1 * offset[1]) * fstr,
ivect(0));
ivect const lo1 = baselo1 + (lo - baselo1 + str - 1) / str * str;
ivect const hi1 = lo1 + (hi - lo1) / str * str;
- regsss.at(ml).at(rl).at(c) = regsss.at(ml-1).at(rl).at(c);
- regsss.at(ml).at(rl).at(c).extent = ibbox(lo1, hi1, str);
+ regsss.AT(ml).AT(rl).AT(c) = regsss.AT(ml-1).AT(rl).AT(c);
+ regsss.AT(ml).AT(rl).AT(c).extent = ibbox(lo1, hi1, str);
}
}
@@ -940,8 +987,9 @@ namespace Carpet {
char * const groupname = CCTK_GroupName (group);
assert (groupname);
Checkpoint ("Recomposing grid array group \"%s\"...", groupname);
- arrdata.at(group).at(0).hh->regrid (superregss, regsss);
- arrdata.at(group).at(0).hh->recompose (0, false);
+ arrdata.AT(group).AT(0).hh->regrid (superregss, regsss, false);
+ arrdata.AT(group).AT(0).hh->recompose (0, false);
+ arrdata.AT(group).AT(0).hh->regrid_free (false);
Checkpoint ("Done recomposing grid array group \"%s\".", groupname);
free (groupname);
}
@@ -957,25 +1005,25 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
// Initialise group information
- groupdata.at(group).info.dim = gdata.dim;
- groupdata.at(group).info.gsh = new int [dim];
- groupdata.at(group).info.lsh = new int [dim];
- groupdata.at(group).info.lbnd = new int [dim];
- groupdata.at(group).info.ubnd = new int [dim];
- groupdata.at(group).info.bbox = new int [2*dim];
- groupdata.at(group).info.nghostzones = new int [dim];
-
- groupdata.at(group).transport_operator =
+ groupdata.AT(group).info.dim = gdata.dim;
+ groupdata.AT(group).info.gsh = new int [dim];
+ groupdata.AT(group).info.lsh = new int [dim];
+ groupdata.AT(group).info.lbnd = new int [dim];
+ groupdata.AT(group).info.ubnd = new int [dim];
+ groupdata.AT(group).info.bbox = new int [2*dim];
+ groupdata.AT(group).info.nghostzones = new int [dim];
+
+ groupdata.AT(group).transport_operator =
get_transport_operator (cctkGH, group, gdata);
- groupdata.at(group).info.activetimelevels = 0;
+ groupdata.AT(group).info.activetimelevels = 0;
// Initialise group variables
- for (size_t m=0; m<arrdata.at(group).size(); ++m) {
+ for (size_t m=0; m<arrdata.AT(group).size(); ++m) {
- arrdata.at(group).at(m).data.resize(CCTK_NumVarsInGroupI(group));
- for (size_t var=0; var<arrdata.at(group).at(m).data.size(); ++var) {
- arrdata.at(group).at(m).data.at(var) = 0;
+ arrdata.AT(group).AT(m).data.resize(CCTK_NumVarsInGroupI(group));
+ for (size_t var=0; var<arrdata.AT(group).AT(m).data.size(); ++var) {
+ arrdata.AT(group).AT(m).data.AT(var) = 0;
}
}
@@ -989,14 +1037,14 @@ namespace Carpet {
// Allocate level times
leveltimes.resize (mglevels);
for (int ml=0; ml<mglevels; ++ml) {
- leveltimes.at(ml).resize (1);
+ leveltimes.AT(ml).resize (1);
}
// Allocate orgin and spacings
origin_space.resize (maps);
delta_space.resize (maps);
for (int m=0; m<maps; ++m) {
- origin_space.at(m).resize (mglevels);
+ origin_space.AT(m).resize (mglevels);
}
// Current state
@@ -1009,11 +1057,12 @@ namespace Carpet {
}
// Set up things as if in local mode
- mglevel = 0;
- reflevel = 0;
- mc_grouptype = CCTK_GF;
- map = 0;
- component = 0;
+ mglevel = 0;
+ reflevel = 0;
+ mc_grouptype = CCTK_GF;
+ map = 0;
+ component = 0;
+ local_component = -1;
// Leave everything, so that everything is set up correctly
leave_local_mode (cctkGH);
@@ -1402,17 +1451,36 @@ namespace Carpet {
// Sanity check
assert (all (npoints <= INT_MAX));
+#if 0
int max = INT_MAX;
for (int d=0; d<dim; ++d) {
assert (npoints[d] <= max);
max /= npoints[d];
}
+#endif
+ {
+ CCTK_REAL const total_npoints = prod(rvect(npoints));
+ CCTK_REAL const size_max = numeric_limits<ibbox::size_type>::max();
+ if (total_npoints > size_max) {
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The domain for map %d contains %g grid points. This number is larger than the maximum number supported by Carpet (%g).",
+ m, double(total_npoints), double(size_max));
+ }
+ CCTK_REAL const int_max = numeric_limits<int>::max();
+ if (total_npoints > int_max) {
+ if (dist::rank() == 0) {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "The domain for map %d contains %g grid points. This number is larger than the maximum number that can be represented as an integer (%g). This can lead to strange problems in thorns which try to calculate the total number of grid points.",
+ m, double(total_npoints), double(int_max));
+ }
+ }
+ }
// Save domain specification
domainspecs.resize(maps);
- domainspecs.at(m).exterior_min = exterior_min;
- domainspecs.at(m).exterior_max = exterior_max;
- domainspecs.at(m).npoints = npoints;
+ domainspecs.AT(m).exterior_min = exterior_min;
+ domainspecs.AT(m).exterior_max = exterior_max;
+ domainspecs.AT(m).npoints = npoints;
}
@@ -1432,26 +1500,53 @@ namespace Carpet {
assert (baseextents.empty());
baseextents.resize (num_convergence_levels);
for (int ml=0; ml<num_convergence_levels; ++ml) {
- baseextents.at(ml).resize (maxreflevels);
+ baseextents.AT(ml).resize (maxreflevels);
for (int rl=0; rl<maxreflevels; ++rl) {
if (ml == 0) {
if (rl == 0) {
// Use base extent
- baseextents.at(ml).at(rl) = baseextent;
+ baseextents.AT(ml).AT(rl) = baseextent;
} else {
// Refine next coarser refinement level
- assert (refcentering == vertex_centered);
- assert (not any (any (is_staggered)));
- i2vect const bnd_shift =
- (nboundaryzones - 1) * i2vect (not is_internal) + shiftout;
- ibbox const & cbox = baseextents.at(ml).at(rl-1);
- ibbox const cbox_phys = cbox.expand (- bnd_shift);
- assert (all (baseextent.stride() % spacereffacts.at(rl-1) == 0));
- ivect const fstride = baseextent.stride() / spacereffacts.at(rl);
- ibbox const fbox_phys =
- ibbox (cbox_phys.lower(), cbox_phys.upper(), fstride);
- ibbox const fbox = fbox_phys.expand (bnd_shift);
- baseextents.at(ml).at(rl) = fbox;
+ if (refcentering == vertex_centered) {
+ ibbox const & cbox = baseextents.AT(ml).AT(rl-1);
+ assert (not any (any (is_staggered)));
+ i2vect const bnd_shift =
+ (nboundaryzones - 1) * i2vect (not is_internal) + shiftout;
+ ibbox const cbox_phys = cbox.expand (- bnd_shift);
+ assert (all (baseextent.stride() % spacereffacts.AT(rl-1) == 0));
+ ivect const fstride = baseextent.stride() / spacereffacts.AT(rl);
+ ibbox const fbox_phys =
+ ibbox (cbox_phys.lower(), cbox_phys.upper(), fstride);
+ ibbox const fbox = fbox_phys.expand (bnd_shift);
+ baseextents.AT(ml).AT(rl) = fbox;
+ } else {
+ ibbox const & cbox = baseextents.AT(ml).AT(rl-1);
+ assert (all (all (is_staggered)));
+ ivect const cstride = cbox.stride();
+ assert (all (cstride % 2 == 0));
+ i2vect const bnd_shift_cstride =
+ + (cstride / 2 - i2vect (is_internal) * cstride)
+ + (nboundaryzones - 1) * i2vect (not is_internal) * cstride
+ + shiftout * cstride;
+ ibbox const cbox_phys
+ (cbox.lower() - (- bnd_shift_cstride[0]),
+ cbox.upper() + (- bnd_shift_cstride[1]),
+ cbox.stride());
+ assert (all (baseextent.stride() % spacereffacts.AT(rl-1) == 0));
+ ivect const fstride = baseextent.stride() / spacereffacts.AT(rl);
+ ibbox const fbox_phys =
+ ibbox (cbox_phys.lower(), cbox_phys.upper(), fstride);
+ assert (all (cstride % fstride == 0));
+ assert (all (all (bnd_shift_cstride % (cstride / fstride) == 0)));
+ i2vect const bnd_shift_fstride =
+ bnd_shift_cstride / (cstride / fstride);
+ ibbox const fbox
+ (fbox_phys.lower() - bnd_shift_fstride[0],
+ fbox_phys.upper() + bnd_shift_fstride[1],
+ fbox_phys.stride());
+ baseextents.AT(ml).AT(rl) = fbox;
+ }
}
} else {
// Coarsen next finer convergence level
@@ -1459,13 +1554,13 @@ namespace Carpet {
assert (not any (any (is_staggered)));
i2vect const bnd_shift =
(nboundaryzones - 1) * i2vect (not is_internal) + shiftout;
- ibbox const & fbox = baseextents.at(ml-1).at(rl);
+ ibbox const & fbox = baseextents.AT(ml-1).AT(rl);
ibbox const fbox_phys = fbox.expand (- bnd_shift);
ivect const cstride = fbox.stride() * int (convergence_factor);
ibbox const cbox_phys =
ibbox (fbox_phys.lower(), fbox_phys.upper(), cstride);
ibbox const cbox = cbox_phys.expand (bnd_shift);
- baseextents.at(ml).at(rl) = cbox;
+ baseextents.AT(ml).AT(rl) = cbox;
}
}
}
@@ -1493,10 +1588,10 @@ namespace Carpet {
vector<vector<region_t> > regss(1);
// Distribute onto the processors
- SplitRegions (cctkGH, superregsss.at(m).at(rl), regss.at(rl));
+ SplitRegions (cctkGH, superregsss.AT(m).AT(rl), regss.AT(rl));
// Create all multigrid levels
- MakeMultigridBoxes (cctkGH, m, regss, regssss.at(m));
+ MakeMultigridBoxes (cctkGH, m, regss, regssss.AT(m));
} // for m
} else {
@@ -1506,7 +1601,7 @@ namespace Carpet {
vector<vector<region_t> > superregss(maps);
for (int m=0; m<maps; ++m) {
- superregss.at(m) = superregsss.at(m).at(rl);
+ superregss.AT(m) = superregsss.AT(m).AT(rl);
}
vector<vector<region_t> > regss(maps);
@@ -1514,9 +1609,9 @@ namespace Carpet {
vector<vector<vector<region_t> > > regsss(maps);
for (int m=0; m<maps; ++m) {
- superregsss.at(m).at(rl) = superregss.at(m);
- regsss.at(m).resize(1);
- regsss.at(m).at(rl) = regss.at(m);
+ superregsss.AT(m).AT(rl) = superregss.AT(m);
+ regsss.AT(m).resize(1);
+ regsss.AT(m).AT(rl) = regss.AT(m);
}
// Create all multigrid levels
@@ -1583,8 +1678,7 @@ namespace Carpet {
ivect baseconvpowers = convpowers * int(basemglevel);
rvect real_sizes =
- (((rvect (sizes)
- - rvect (convoffsets))
+ (((rvect (sizes) - rvect (convoffsets))
/ ipow (rvect(convergence_factor), baseconvpowers))
+ rvect (convoffsets));
// Do not modify extra dimensions
@@ -1720,8 +1814,8 @@ namespace Carpet {
int num_gf_vars = 0;
vector<int> num_array_groups(dim+1), num_array_vars(dim+1);
for (int d=0; d<=dim; ++d) {
- num_array_groups.at(d) = 0;
- num_array_vars.at(d) = 0;
+ num_array_groups.AT(d) = 0;
+ num_array_vars.AT(d) = 0;
}
for (int group=0; group<CCTK_NumGroups(); ++group) {
@@ -1737,8 +1831,8 @@ namespace Carpet {
case CCTK_SCALAR:
case CCTK_ARRAY:
assert (gdata.dim<=dim);
- num_array_groups.at(gdata.dim) += 1;
- num_array_vars.at(gdata.dim) += gdata.numvars * gdata.numtimelevels;
+ num_array_groups.AT(gdata.dim) += 1;
+ num_array_vars.AT(gdata.dim) += gdata.numvars * gdata.numtimelevels;
break;
default:
assert (0);
@@ -1751,11 +1845,11 @@ namespace Carpet {
num_gf_vars, num_gf_groups);
CCTK_VInfo (CCTK_THORNSTRING,
" There are %d grid scalars in %d groups",
- num_array_vars.at(0), num_array_groups.at(0));
+ num_array_vars.AT(0), num_array_groups.AT(0));
for (int d=1; d<=dim; ++d) {
CCTK_VInfo (CCTK_THORNSTRING,
" There are %d %d-dimensional grid arrays in %d groups",
- num_array_vars.at(d), d, num_array_groups.at(d));
+ num_array_vars.AT(d), d, num_array_groups.AT(d));
}
CCTK_VInfo (CCTK_THORNSTRING,
" (The number of variables counts all time levels)");
@@ -1770,13 +1864,31 @@ namespace Carpet {
{
assert (group>=0 and group<CCTK_NumGroups());
- if (CCTK_GroupTypeI(group) != CCTK_GF) {
+ if (gdata.grouptype != CCTK_GF) {
// Ignore everything but true grid functions
- return op_error;
+ return op_copy;
}
bool const can_transfer = can_transfer_variable_type (cctkGH, group, gdata);
+ // Catch a common error (using the tag "prolongate" instead of
+ // "prolongation")
+ {
+ int const prolong_length = Util_TableGetString
+ (gdata.tagstable, 0, NULL, "Prolongate");
+ if (prolong_length >= 0) {
+ char * const groupname = CCTK_GroupName (group);
+ CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Group \"%s\" contains the illegal tag \"Prolongate\". (Did you mean \"Prolongation\" instead?)",
+ groupname);
+ free (groupname);
+ } else if (prolong_length == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ // good -- do nothing
+ } else {
+ assert (0);
+ }
+ }
+
// Get prolongation method
char prolong_string[1000];
bool have_prolong_string = false;
@@ -1861,6 +1973,7 @@ namespace Carpet {
if (not have_prolong_string) {
if (can_transfer) {
// Use the default
+#if 0
if (gdata.numtimelevels == 1) {
// Only one time level:
char * const groupname = CCTK_GroupName (group);
@@ -1873,6 +1986,8 @@ namespace Carpet {
// Several time levels: use the default
return op_Lagrange;
}
+#endif
+ return op_Lagrange;
} else {
if (gdata.grouptype == CCTK_GF) {
char * const groupname = CCTK_GroupName (group);
@@ -1895,6 +2010,8 @@ namespace Carpet {
return op_sync;
} else if (CCTK_Equals(prolong_string, "sync")) {
return op_sync;
+ } else if (CCTK_Equals(prolong_string, "restrict")) {
+ return op_restrict;
} else if (CCTK_Equals(prolong_string, "copy")) {
return op_copy;
} else if (CCTK_Equals(prolong_string, "Lagrange")) {
@@ -1903,6 +2020,8 @@ namespace Carpet {
return op_ENO;
} else if (CCTK_Equals(prolong_string, "WENO")) {
return op_WENO;
+ } else if (CCTK_Equals(prolong_string, "Lagrange_monotone")) {
+ return op_Lagrange_monotone;
} else {
char * const groupname = CCTK_GroupName (group);
CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
@@ -2170,7 +2289,7 @@ namespace Carpet {
DECLARE_CCTK_PARAMETERS;
int const prolongation_stencil_size
- = vdd.at(m)->prolongation_stencil_size();
+ = vdd.AT(m)->prolongation_stencil_size();
int const min_nghosts
= ((prolongation_stencil_size + refinement_factor - 1)
/ (refinement_factor - 1));
diff --git a/Carpet/Carpet/src/Shutdown.cc b/Carpet/Carpet/src/Shutdown.cc
index 4edf04374..6da0daf3e 100644
--- a/Carpet/Carpet/src/Shutdown.cc
+++ b/Carpet/Carpet/src/Shutdown.cc
@@ -1,13 +1,13 @@
#include <cstdio>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "dist.hh"
+#include <dist.hh>
-#include "carpet.hh"
-#include "Timers.hh"
+#include <carpet.hh>
+#include <Timers.hh>
@@ -52,6 +52,15 @@ namespace Carpet {
} END_REVERSE_MGLEVEL_LOOP;
} // for rl
+ // Stop all timers before shutdown, since timers may rely on data
+ // structures which are destroyed during shutdown
+ int const ierr = CCTK_TimerStop ("CCTK total time");
+ assert (not ierr);
+ timer.stop();
+ if (output_timers_every > 0) {
+ TimerSet::writeData (cctkGH, timer_file);
+ }
+
BEGIN_REVERSE_MGLEVEL_LOOP(cctkGH) {
do_early_global_mode = true;
do_late_global_mode = true;
@@ -65,10 +74,6 @@ namespace Carpet {
CCTK_ScheduleTraverse ("CCTK_SHUTDOWN", cctkGH, CallFunction);
} END_REVERSE_MGLEVEL_LOOP;
- timer.stop();
- if (output_timers_every > 0) {
- TimerSet::writeData (cctkGH, timer_file);
- }
// earlier checkpoint before finalising MPI
Waypoint ("Done with shutdown");
diff --git a/Carpet/Carpet/src/Storage.cc b/Carpet/Carpet/src/Storage.cc
index e038a261f..636247d20 100644
--- a/Carpet/Carpet/src/Storage.cc
+++ b/Carpet/Carpet/src/Storage.cc
@@ -1,14 +1,15 @@
#include <cassert>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
-#include "dh.hh"
-#include "gf.hh"
-#include "operators.hh"
+#include <defs.hh>
+#include <dh.hh>
+#include <gf.hh>
+#include <operators.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -94,16 +95,16 @@ namespace Carpet {
// Record previous number of allocated time levels
if (status) {
// Note: This remembers only the last level
- status[n] = groupdata.at(group).activetimelevels.at(ml).at(rl);
+ status[n] = groupdata.AT(group).activetimelevels.AT(ml).AT(rl);
}
// Only do something if the number of time levels actually
// needs to be changed -- do nothing otherwise
const bool do_increase
- = inc and timelevels[n] > groupdata.at(group).activetimelevels.at(ml).at(rl);
+ = inc and timelevels[n] > groupdata.AT(group).activetimelevels.AT(ml).AT(rl);
const bool do_decrease
- = not inc and timelevels[n] < groupdata.at(group).activetimelevels.at(ml).at(rl);
+ = not inc and timelevels[n] < groupdata.AT(group).activetimelevels.AT(ml).AT(rl);
if (do_increase or do_decrease) {
if (not can_do) {
@@ -127,13 +128,13 @@ namespace Carpet {
if (gp.grouptype == CCTK_GF) {
assert ((map == -1 or maps == 1)
and (component == -1
- or vhh.at(0)->local_components(reflevel) == 1));
+ or vhh.AT(0)->local_components(reflevel) == 1));
}
// Set the new number of active time levels
- groupdata.at(group).activetimelevels.at(ml).at(rl) = timelevels[n];
+ groupdata.AT(group).activetimelevels.AT(ml).AT(rl) = timelevels[n];
- for (int m=0; m<(int)arrdata.at(group).size(); ++m) {
+ for (int m=0; m<(int)arrdata.AT(group).size(); ++m) {
for (int var=0; var<gp.numvars; ++var) {
#ifdef CCTK_HAVE_CONTIGUOUS_GROUPS
bool const contiguous = gp.contiguous;
@@ -152,19 +153,19 @@ namespace Carpet {
assert (vectorlength>0 and vectorlength<=gp.numvars);
ggf* const vectorleader
= (vectorindex>0
- ? arrdata.at(group).at(m).data.at(var - vectorindex)
+ ? arrdata.AT(group).AT(m).data.AT(var - vectorindex)
: NULL);
const int varindex = firstvarindex + var;
#warning "TODO: allocate these in SetupGH, and after recomposing"
- if (not arrdata.at(group).at(m).data.at(var)) {
+ if (not arrdata.AT(group).AT(m).data.AT(var)) {
switch (gp.vartype) {
#define TYPECASE(N,T) \
case N: \
- arrdata.at(group).at(m).data.at(var) = new gf<T> \
+ arrdata.AT(group).AT(m).data.AT(var) = new gf<T> \
(varindex, \
- groupdata.at(group).transport_operator, \
- *arrdata.at(group).at(m).tt, \
- *arrdata.at(group).at(m).dd, \
+ groupdata.AT(group).transport_operator, \
+ *arrdata.AT(group).AT(m).tt, \
+ *arrdata.AT(group).AT(m).dd, \
prolongation_order_time, \
vectorlength, vectorindex, (gf<T>*)vectorleader); \
break;
@@ -175,18 +176,17 @@ namespace Carpet {
} // switch gp.vartype
} // if not allocated
- arrdata.at(group).at(m).data.at(var)->set_timelevels
+ arrdata.AT(group).AT(m).data.AT(var)->set_timelevels
(ml, rl, timelevels[n]);
// Set the data pointers for grid arrays
if (gp.grouptype != CCTK_GF) {
assert (rl==0 and m==0);
- int const c = CCTK_MyProc(cgh);
for (int tl=0; tl<gp.numtimelevels; ++tl) {
cgh->data[varindex][tl]
- = (tl < groupdata.at(group).activetimelevels.at(ml).at(rl)
- ? ((*arrdata.at(group).at(m).data.at(var))
- (tl, 0, c, 0)->storage())
+ = (tl < groupdata.AT(group).activetimelevels.AT(ml).AT(rl)
+ ? ((*arrdata.AT(group).AT(m).data.AT(var))
+ (tl, 0, 0, 0)->storage())
: NULL);
}
} // if grouptype != GF
@@ -202,7 +202,7 @@ namespace Carpet {
// Record current number of time levels
// Note: This adds the time levels of all refinement levels
total_num_timelevels
- += groupdata.at(group).activetimelevels.at(ml).at(rl);
+ += groupdata.AT(group).activetimelevels.AT(ml).AT(rl);
} // for rl
} // for ml
@@ -292,8 +292,9 @@ namespace Carpet {
if (groupdata.size() == 0) return -3;
int const rl = grouptype == CCTK_GF ? reflevel : 0;
// Return whether storage is allocated
- assert (groupdata.at(group).activetimelevels.at(mglevel).at(rl) != deadbeef);
- return groupdata.at(group).activetimelevels.at(mglevel).at(rl) > 0;
+ CCTK_INT const deadbeef = get_deadbeef();
+ assert (groupdata.AT(group).activetimelevels.AT(mglevel).AT(rl) != deadbeef);
+ return groupdata.AT(group).activetimelevels.AT(mglevel).AT(rl) > 0;
}
@@ -318,12 +319,12 @@ namespace Carpet {
return &error; // global or level mode for a GF
}
- const int gpdim = groupdata.at(group).info.dim;
+ const int gpdim = groupdata.AT(group).info.dim;
assert (dir>=0 and dir<gpdim);
if (CCTK_QueryGroupStorageI(cgh, group)) {
- return &groupdata.at(group).info.lsh[dir];
+ return &groupdata.AT(group).info.lsh[dir];
} else {
@@ -337,8 +338,19 @@ namespace Carpet {
int GroupDynamicData (const cGH* cgh, int group, cGroupDynamicData* data)
{
+ // Return values:
+ // 0 for success
+ // -1 if given pointer to data structure is NULL
+ // -3 if given GH pointer is invalid
+ // (-77 if group has zero variables)
+ // -78 if group does not exist
+ if (not cgh) return -3;
+ if (not (group>=0 and group<CCTK_NumGroups())) return -78;
+ if (not data) return -1;
+ assert (cgh);
assert (group>=0 and group<CCTK_NumGroups());
- *data = groupdata.at(group).info;
+ assert (data);
+ *data = groupdata.AT(group).info;
return 0;
}
@@ -358,12 +370,13 @@ namespace Carpet {
check (not CCTK_GroupData (group, & gp));
if (gp.grouptype == CCTK_GF) {
- if (groupdata.at(group).transport_operator != op_none and
- groupdata.at(group).transport_operator != op_sync and
- groupdata.at(group).transport_operator != op_copy)
+ if (groupdata.AT(group).transport_operator != op_none and
+ groupdata.AT(group).transport_operator != op_sync and
+ groupdata.AT(group).transport_operator != op_restrict and
+ groupdata.AT(group).transport_operator != op_copy)
{
- if (groupdata.at(group).activetimelevels.at(ml).at(rl) != 0 and
- (groupdata.at(group).activetimelevels.at(ml).at(rl) <
+ if (groupdata.AT(group).activetimelevels.AT(ml).AT(rl) != 0 and
+ (groupdata.AT(group).activetimelevels.AT(ml).AT(rl) <
prolongation_order_time+1))
{
static vector<bool> didwarn;
@@ -371,9 +384,9 @@ namespace Carpet {
if ((int)didwarn.size() < numgroups) {
didwarn.resize (numgroups, false);
}
- if (not didwarn.at(group)) {
+ if (not didwarn.AT(group)) {
// Warn only once per group
- didwarn.at(group) = true;
+ didwarn.AT(group) = true;
char * const groupname = CCTK_GroupName (group);
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"There are not enough time levels for the desired temporal prolongation order in the grid function group \"%s\". With Carpet::prolongation_order_time=%d, you need at least %d time levels.",
diff --git a/Carpet/Carpet/src/Timers.cc b/Carpet/Carpet/src/Timers.cc
index 265c2cd4c..c279bf0cc 100644
--- a/Carpet/Carpet/src/Timers.cc
+++ b/Carpet/Carpet/src/Timers.cc
@@ -3,10 +3,9 @@
#include <cstring>
#include <list>
-#include "cctk.h"
-#include "cctk_Parameters.h"
-
-#include "util_String.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
+#include <util_String.h>
#if HAVE_UNISTD_H
# include <fcntl.h>
@@ -15,7 +14,7 @@
#include <defs.hh>
-#include "Timers.hh"
+#include <Timers.hh>
@@ -236,6 +235,8 @@ namespace Carpet {
case val_double:
printf (" %g", timer->vals[i].val.d);
break;
+ case val_none:
+ break;
default:
assert (0);
}
@@ -245,4 +246,27 @@ namespace Carpet {
if (was_running) start();
}
+
+
+ // Output (debug) messages that a timer is starting or stopping
+ void
+ Timer::msgStart ()
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+ if (timers_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING, "Timer \"%s\" starting", name());
+ }
+ }
+
+ void
+ Timer::msgStop ()
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+ if (timers_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING, "Timer \"%s\" stopping", name());
+ }
+ }
+
} // namespace Carpet
diff --git a/Carpet/Carpet/src/Timers.hh b/Carpet/Carpet/src/Timers.hh
index 2c2543168..af887cb69 100644
--- a/Carpet/Carpet/src/Timers.hh
+++ b/Carpet/Carpet/src/Timers.hh
@@ -1,6 +1,7 @@
+#include <iostream>
#include <list>
-#include "cctk.h"
+#include <cctk.h>
@@ -79,6 +80,7 @@ namespace Carpet {
void
start ()
{
+ msgStart ();
running = true;
CCTK_TimerStartI (handle);
}
@@ -89,6 +91,7 @@ namespace Carpet {
{
CCTK_TimerStopI (handle);
running = false;
+ msgStop ();
}
// Reset the timer
@@ -107,6 +110,32 @@ namespace Carpet {
void
printData ();
+ private:
+
+ // Output (debug) messages that a timer is starting or stopping
+ void
+ msgStart ()
+ const;
+
+ void
+ msgStop ()
+ const;
+
};
+
+
+ // Macros for using timers in a convenient manner
+
+#define TIMING_BEGIN(name) \
+ { \
+ static Carpet::Timer timer (name); \
+ timer.start(); \
+ {
+
+#define TIMING_END \
+ } \
+ timer.stop(); \
+} while (0)
+
} // namespace Carpet
diff --git a/Carpet/Carpet/src/Timing.cc b/Carpet/Carpet/src/Timing.cc
index 6c4102733..2fd24f3bd 100644
--- a/Carpet/Carpet/src/Timing.cc
+++ b/Carpet/Carpet/src/Timing.cc
@@ -3,9 +3,9 @@
#include <cmath>
#include <cstdlib>
-#include "cctk.h"
-#include "cctk_Arguments.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_Arguments.h>
+#include <cctk_Parameters.h>
// IRIX wants this before <time.h>
#if HAVE_SYS_TYPES_H
@@ -27,10 +27,10 @@
# include <unistd.h>
#endif
-#include "defs.hh"
-#include "dist.hh"
+#include <defs.hh>
+#include <dist.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -77,17 +77,17 @@ namespace Carpet {
for (int m = 0; m < maps; ++ m) {
assert (reflevel >= 0);
int const rl = reflevel;
- for (int c = 0; c < vhh.at(m)->components(rl); ++ c) {
+ for (int c = 0; c < vhh.AT(m)->components(rl); ++ c) {
assert (mglevel >= 0);
int const ml = mglevel;
// Base region
- ibbox const ext = vhh.at(m)->extent(ml,rl,c);
+ ibbox const ext = vhh.AT(m)->extent(ml,rl,c);
// Count the grid points
CCTK_REAL const domainsize = ext.size();
- if (vhh.at(m)->is_local (rl, c)) {
+ if (vhh.AT(m)->is_local (rl, c)) {
local_num_grid_points += domainsize;
}
global_num_grid_points += domainsize;
@@ -117,7 +117,11 @@ namespace Carpet {
+ // Time at which the simulation started
+ CCTK_REAL startup_walltime; // in seconds
+
// Time at which the evolution started
+ bool in_evolution = false;
CCTK_REAL initial_walltime; // in seconds
CCTK_REAL initial_phystime;
@@ -136,13 +140,19 @@ namespace Carpet {
{
DECLARE_CCTK_ARGUMENTS;
- * physical_time_per_hour = 0.0;
+ startup_walltime = get_walltime();
+
+ * physical_time_per_hour = 0.0;
+ * current_physical_time_per_hour = 0.0;
* time_total = 0.0;
+ * time_evolution = 0.0;
* time_computing = 0.0;
* time_communicating = 0.0;
* time_io = 0.0;
+ * evolution_steps_count = 0.0;
+
* local_grid_points_per_second = 0.0;
* total_grid_points_per_second = 0.0;
* local_grid_point_updates_count = 0.0;
@@ -171,10 +181,11 @@ namespace Carpet {
// Begin timing (to be called after initialisation, just before the
// main evolution begins)
void
- BeginTiming (cGH const * const cctkGH)
+ BeginTimingEvolution (cGH const * const cctkGH)
{
DECLARE_CCTK_ARGUMENTS;
+ in_evolution = true;
initial_walltime = get_walltime();
initial_phystime = cctkGH->cctk_time;
}
@@ -184,15 +195,18 @@ namespace Carpet {
// Take a step on the current refinement and multigrid level (to be
// called when EVOL is scheduled)
void
- StepTiming (cGH const * const cctkGH)
+ StepTimingEvolution (cGH const * const cctkGH)
{
DECLARE_CCTK_ARGUMENTS;
+ assert (in_evolution);
assert (timing_state == state_computing);
CCTK_REAL local_updates, global_updates;
current_level_updates (cctkGH, local_updates, global_updates);
+ ++ * evolution_steps_count;
+
* local_grid_point_updates_count += local_updates;
* total_grid_point_updates_count += global_updates;
@@ -266,7 +280,9 @@ namespace Carpet {
assert (timing_state == state_computing);
// Measure the elapsed time
- * time_total = get_walltime() - initial_walltime;
+ double const walltime = get_walltime();
+ * time_total = walltime - startup_walltime;
+ * time_evolution = in_evolution ? walltime - initial_walltime : 0.0;
* time_computing = * time_total - (* time_communicating + * time_io);
}
@@ -327,12 +343,52 @@ namespace Carpet {
UpdatePhysicalTimePerHour (cGH const * const cctkGH)
{
DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ if (not in_evolution) {
+ * physical_time_per_hour = 0.0;
+ * current_physical_time_per_hour = 0.0;
+ return;
+ }
+
+ static int last_iteration = -1;
+ static size_t num_samples = 0;
+ static CCTK_REAL last_physical_time;
+ static CCTK_REAL last_time_evolution;
+ assert (cctk_iteration > last_iteration); // expect progress
// Calculate elapsed physical time
CCTK_REAL const physical_time = cctkGH->cctk_time - initial_phystime;
- // Calculate physical time per hour
- * physical_time_per_hour = 3600.0 * physical_time / max (* time_total, eps);
+ // Calculate average physical time per hour
+ * physical_time_per_hour =
+ 3600.0 * physical_time / max (* time_evolution, eps);
+
+ // Calculate current physical time per hour as moving average
+ if (last_iteration < 0) {
+ // No past data are available
+ * current_physical_time_per_hour = * physical_time_per_hour;
+ } else if (num_samples < 3 or
+ * time_evolution < 0.01 * timing_average_window_minutes * 60.0)
+ {
+ // Less than three previous samples are available, or less thatn
+ // one percent of a window of past data are available
+ * current_physical_time_per_hour = * physical_time_per_hour;
+ } else {
+ CCTK_REAL const window =
+ min (* time_evolution, timing_average_window_minutes * 60.0);
+ CCTK_REAL const alpha =
+ exp (- (* time_evolution - last_time_evolution) / window);
+ * current_physical_time_per_hour =
+ (1.0 - alpha) * * physical_time_per_hour +
+ ( alpha) * * current_physical_time_per_hour;
+ }
+
+ // Remember last iteration
+ last_iteration = cctk_iteration;
+ ++ num_samples;
+ last_physical_time = physical_time;
+ last_time_evolution = * time_evolution;
}
@@ -357,7 +413,13 @@ namespace Carpet {
DECLARE_CCTK_ARGUMENTS;
CCTK_VInfo (CCTK_THORNSTRING,
- "Total run time: %g h", double (* time_total / 3600.0));
+ "Total run time: %g h (iteration %d)",
+ double (* time_total / 3600.0),
+ cctk_iteration);
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Total evolution time: %g h (%d steps)",
+ double (* time_evolution / 3600.0),
+ int (* evolution_steps_count));
CCTK_VInfo (CCTK_THORNSTRING,
"(Comp, Comm, I/O) fractions = (%3.1f%%, %3.1f%%, %3.1f%%)",
double (100.0 * * time_computing /
@@ -461,7 +523,10 @@ namespace Carpet {
DECLARE_CCTK_ARGUMENTS;
CCTK_VInfo (CCTK_THORNSTRING,
- "Physical time per hour: %g",
+ "Current physical time per hour: %g",
+ double (* current_physical_time_per_hour));
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Average physical time per hour: %g",
double (* physical_time_per_hour));
}
@@ -479,25 +544,25 @@ namespace Carpet {
<< "Memory statistics:" << eol
<< " Grid hierarchy:" << eol;
for (int m = 0; m < Carpet::maps; ++ m) {
- cout << " gh[" << m << "]: " << PRINTMEM(*vhh.at(m)) << eol
- << " dh[" << m << "]: " << PRINTMEM(*vdd.at(m)) << eol
- << " th[" << m << "]: " << PRINTMEM(*vtt.at(m)) << eol;
+ cout << " gh[" << m << "]: " << PRINTMEM(*vhh.AT(m)) << eol
+ << " dh[" << m << "]: " << PRINTMEM(*vdd.AT(m)) << eol
+ << " th[" << m << "]: " << PRINTMEM(*vtt.AT(m)) << eol;
}
#if 0
for (int g = 0; g < (int)arrdata.size(); ++ g) {
if (CCTK_GroupTypeI(g) != CCTK_GF) {
char * const groupname = CCTK_GroupName(g);
- for (int m = 0; m < (int)arrdata.at(g).size(); ++ m) {
+ for (int m = 0; m < (int)arrdata.AT(g).size(); ++ m) {
cout << " Group " << groupname << ":" << eol
- << " gh[" << m << "]: " << PRINTMEM(*arrdata.at(g).at(m).hh) << eol
- << " dh[" << m << "]: " << PRINTMEM(*arrdata.at(g).at(m).dd) << eol
- << " th[" << m << "]: " << PRINTMEM(*arrdata.at(g).at(m).tt) << eol;
- for (int v = 0; v < (int)arrdata.at(g).at(m).data.size(); ++ v) {
+ << " gh[" << m << "]: " << PRINTMEM(*arrdata.AT(g).AT(m).hh) << eol
+ << " dh[" << m << "]: " << PRINTMEM(*arrdata.AT(g).AT(m).dd) << eol
+ << " th[" << m << "]: " << PRINTMEM(*arrdata.AT(g).AT(m).tt) << eol;
+ for (int v = 0; v < (int)arrdata.AT(g).AT(m).data.size(); ++ v) {
char * const fullname = CCTK_FullName(CCTK_FirstVarIndexI(g)+v);
cout << " Variable " << fullname << ":" << eol
<< " ggf[" << m << "]: ";
- if (arrdata.at(g).at(m).data.at(v)) {
- cout << PRINTMEM(*arrdata.at(g).at(m).data.at(v));
+ if (arrdata.AT(g).AT(m).data.AT(v)) {
+ cout << PRINTMEM(*arrdata.AT(g).AT(m).data.AT(v));
} else {
cout << "<null>";
}
diff --git a/Carpet/Carpet/src/carpet.hh b/Carpet/Carpet/src/carpet.hh
index 1a6ee0f3b..bbcb4296a 100644
--- a/Carpet/Carpet/src/carpet.hh
+++ b/Carpet/Carpet/src/carpet.hh
@@ -3,11 +3,11 @@
#include <vector>
-#include "cctk.h"
-#include "cctk_Arguments.h"
-#include "cctk_Functions.h"
+#include <cctk.h>
+#include <cctk_Arguments.h>
+#include <cctk_Functions.h>
-#include "gh.hh"
+#include <gh.hh>
#include "carpet_public.hh"
@@ -36,7 +36,7 @@ namespace Carpet {
int CallFunction (void* function, cFunctionData* attribute, void* data);
// Other functions
- bool Regrid (cGH const * cctkGH, bool force_recompose);
+ bool Regrid (cGH const * cctkGH, bool force_recompose, bool do_init);
void CycleTimeLevels (const cGH* cgh);
void FlipTimeLevels (const cGH* cgh);
@@ -52,8 +52,8 @@ namespace Carpet {
allbutcurrenttime,
alltimes };
- int min_timelevel (checktimes where, int num_tl);
- int max_timelevel (checktimes where, int num_tl);
+ int min_timelevel (checktimes where, int num_tl, bool persistent) CCTK_ATTRIBUTE_CONST;
+ int max_timelevel (checktimes where, int num_tl, bool persistent) CCTK_ATTRIBUTE_CONST;
void Poison (const cGH* cgh, checktimes where, int what = 0);
void PoisonGroup (const cGH* cgh, int group, checktimes where);
diff --git a/Carpet/Carpet/src/carpet_public.h b/Carpet/Carpet/src/carpet_public.h
index ce2faaad5..20a265848 100644
--- a/Carpet/Carpet/src/carpet_public.h
+++ b/Carpet/Carpet/src/carpet_public.h
@@ -3,7 +3,7 @@
#include <mpi.h>
-#include "cctk.h"
+#include <cctk.h>
@@ -76,7 +76,7 @@ namespace Carpet {
};
- struct CarpetGH const * GetCarpetGH (const cGH * const cgh);
+ struct CarpetGH const * GetCarpetGH (const cGH * const cgh) CCTK_ATTRIBUTE_CONST;
@@ -86,6 +86,16 @@ namespace Carpet {
+ /* Grid function access */
+ CCTK_POINTER Carpet_VarDataPtrI (CCTK_POINTER_TO_CONST const cctkGH,
+ CCTK_INT const m,
+ CCTK_INT const rl,
+ CCTK_INT const c,
+ CCTK_INT const tl,
+ CCTK_INT const varindex);
+
+
+
/* Call a schedule group */
int CallScheduleGroup (cGH * const cgh, const char * const group);
@@ -104,10 +114,10 @@ namespace Carpet {
/* Helper functions */
- MPI_Comm CarpetMPIComm (void);
- MPI_Datatype CarpetMPIDatatype (int vartype);
- MPI_Datatype CarpetSimpleMPIDatatype (int vartype);
- int CarpetSimpleMPIDatatypeLength (int vartype);
+ MPI_Comm CarpetMPIComm (void) CCTK_ATTRIBUTE_CONST;
+ MPI_Datatype CarpetMPIDatatype (int vartype) CCTK_ATTRIBUTE_CONST;
+ MPI_Datatype CarpetSimpleMPIDatatype (int vartype) CCTK_ATTRIBUTE_CONST;
+ int CarpetSimpleMPIDatatypeLength (int vartype) CCTK_ATTRIBUTE_CONST;
diff --git a/Carpet/Carpet/src/functions.hh b/Carpet/Carpet/src/functions.hh
index d8b508441..e1fd104b8 100644
--- a/Carpet/Carpet/src/functions.hh
+++ b/Carpet/Carpet/src/functions.hh
@@ -7,13 +7,13 @@
#include <mpi.h>
-#include "cctk.h"
-#include "cctk_Schedule.h"
+#include <cctk.h>
+#include <cctk_Schedule.h>
-#include "bbox.hh"
-#include "dh.hh"
-#include "gh.hh"
-#include "vect.hh"
+#include <bbox.hh>
+#include <dh.hh>
+#include <gh.hh>
+#include <vect.hh>
@@ -33,24 +33,20 @@ namespace Carpet {
int GroupStorageDecrease (const cGH* cgh, int n_groups, const int* groups,
const int* timelevels, int* status);
int Barrier (const cGH* cgh);
- int Exit (cGH* cgh, int retval);
- int Abort (cGH* cgh, int retval);
- int MyProc (const cGH* cgh);
- int nProcs (const cGH* cgh);
+ int NamedBarrier (const cGH* cgh, int id);
+ int Exit (const cGH* cgh, int retval);
+ int Abort (const cGH* cgh, int retval);
+ int MyProc (const cGH* cgh) CCTK_ATTRIBUTE_CONST;
+ int nProcs (const cGH* cgh) CCTK_ATTRIBUTE_CONST;
const int* ArrayGroupSizeB (const cGH* cgh, int dir, int group,
- const char* groupname);
- int QueryGroupStorageB (const cGH* cgh, int group, const char* groupname);
+ const char* groupname) CCTK_ATTRIBUTE_PURE;
+ int QueryGroupStorageB (const cGH* cgh, int group, const char* groupname) CCTK_ATTRIBUTE_PURE;
int GroupDynamicData (const cGH* cgh, int group, cGroupDynamicData* data);
void Restrict (const cGH* cgh);
- // Strings
- vector <string>
- AllGatherString (MPI_Comm const world,
- string const & data);
-
// Multi-Model
void
SplitUniverse (MPI_Comm const world, string const model, MPI_Comm & comm,
@@ -58,19 +54,19 @@ namespace Carpet {
// Model id to model name
vector <string> Models ();
- string Model (int id);
+ string Model (int id) CCTK_ATTRIBUTE_PURE;
// Model name to model id
std::map <string, int> ModelMap ();
- int ModelMap (string name);
+ int ModelMap (string name) CCTK_ATTRIBUTE_PURE;
// Processor to model id
vector <int> ModelIds ();
- int ModelId (int proc);
+ int ModelId (int proc) CCTK_ATTRIBUTE_PURE;
// Model id to processors
- vector <vector <int> > ModelProcs ();
- vector <int> ModelProcs (int proc);
+ vector <vector <int> > ModelProcs () CCTK_ATTRIBUTE_PURE;
+ vector <int> ModelProcs (int proc) CCTK_ATTRIBUTE_PURE;
extern "C" {
CCTK_POINTER_TO_CONST
@@ -90,10 +86,6 @@ namespace Carpet {
- void SetSystemLimits ();
-
-
-
// Helpers for storage
void GroupsStorageCheck (cGH const * const cctkGH);
@@ -102,18 +94,27 @@ namespace Carpet {
RegridMap (cGH const * cctkGH,
int m,
gh::rregs const & supeerregss,
- gh::mregs const & regsss);
+ gh::mregs const & regsss,
+ bool do_init);
void
PostRegrid (cGH const * cctkGH);
bool
Recompose (cGH const * cctkGH,
int rl,
bool do_init);
+ void
+ RegridFree (cGH const * cctkGH,
+ bool do_init);
void
CheckRegions (gh::mregs const & regsss);
void
+ OutputSuperregions (cGH const * cctkGH,
+ int m,
+ gh const & hh,
+ gh::rregs const & superregss);
+ void
OutputGrids (cGH const * cctkGH,
int const m,
gh const & hh,
@@ -177,8 +178,8 @@ namespace Carpet {
// Timing statistics functions
void InitTimingStats (cGH const * cctkGH);
- void BeginTiming (cGH const * cctkGH);
- void StepTiming (cGH const * cctkGH);
+ void BeginTimingEvolution (cGH const * cctkGH);
+ void StepTimingEvolution (cGH const * cctkGH);
void BeginTimingIO (cGH const * cctkGH);
void EndTimingIO (cGH const * cctkGH,
CCTK_REAL files, CCTK_REAL bytes, bool is_binary);
diff --git a/Carpet/Carpet/src/helpers.cc b/Carpet/Carpet/src/helpers.cc
index c799e07f4..d5b49fc61 100644
--- a/Carpet/Carpet/src/helpers.cc
+++ b/Carpet/Carpet/src/helpers.cc
@@ -6,15 +6,15 @@
#include <mpi.h>
-#include "cctk.h"
-#include "cctk_FortranString.h"
-#include "cctk_Parameters.h"
+#include <cctk.h>
+#include <cctk_FortranString.h>
+#include <cctk_Parameters.h>
-#include "defs.hh"
-#include "dist.hh"
-#include "ggf.hh"
+#include <defs.hh>
+#include <dist.hh>
+#include <ggf.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -64,9 +64,51 @@ namespace Carpet {
{
return do_prolongate;
}
-
-
-
+
+
+
+ // Get pointer to grid variable for a specific map and refinement level
+ CCTK_POINTER
+ Carpet_VarDataPtrI (CCTK_POINTER_TO_CONST const cctkGH,
+ CCTK_INT const m,
+ CCTK_INT const rl,
+ CCTK_INT const c,
+ CCTK_INT const tl,
+ CCTK_INT const varindex)
+ {
+ assert (cctkGH);
+ assert (varindex >= 0 and varindex < CCTK_NumVars());
+ int const groupindex = CCTK_GroupIndexFromVarI (varindex);
+ assert (groupindex >= 0);
+ int const grouptype = CCTK_GroupTypeI (groupindex);
+ assert (mglevel >= 0);
+ if (grouptype == CCTK_GF) {
+ assert (m >= 0 and m < maps);
+ assert (rl >= 0 and rl < reflevels);
+ assert (c >= 0 and c < arrdata.AT(groupindex).AT(m).hh->components(reflevel));
+ assert (arrdata.AT(groupindex).AT(m).hh->is_local(rl, c));
+ } else {
+ assert (m == 0);
+ assert (rl == 0);
+ assert (c == CCTK_MyProc (NULL));
+ }
+ int const maxtimelevels = CCTK_MaxTimeLevelsGI (groupindex);
+ assert (tl >= 0 and tl < maxtimelevels);
+
+ int const activetimelevels =
+ groupdata.AT(groupindex).activetimelevels.AT(mglevel).AT(rl);
+ if (tl < activetimelevels) {
+ int const var = varindex - CCTK_FirstVarIndexI (groupindex);
+ ggf * const ff = arrdata.AT(groupindex).AT(m).data.AT(var);
+ gdata * const data = (*ff) (tl, rl, c, mglevel);
+ return data->storage();
+ } else {
+ return NULL;
+ }
+ }
+
+
+
// Multi-Model
CCTK_POINTER_TO_CONST
Carpet_GetMPICommUniverse (CCTK_POINTER_TO_CONST const cctkGH)
@@ -106,13 +148,13 @@ namespace Carpet {
assert (size == dim);
- ibbox const & baseext = vhh.at(m)->baseextents.at(ml).at(0);
+ ibbox const & baseext = vhh.AT(m)->baseextents.AT(ml).AT(0);
ivect const igsh = baseext.shape() / baseext.stride();
for (int d = 0; d < dim; ++ d) {
gsh[d] = igsh[d];
- lower[d] = origin_space.at(m).at(ml)[d];
- delta[d] = delta_space.at(m)[d] * mglevelfact;
+ lower[d] = origin_space.AT(m).AT(ml)[d];
+ delta[d] = delta_space.AT(m)[d] * mglevelfact;
upper[d] = lower[d] + delta[d] * (gsh[d] - 1);
}
@@ -125,16 +167,37 @@ namespace Carpet {
int Barrier (const cGH* cgh)
{
- void *dummy = &dummy;
+ const void *dummy = &dummy;
dummy = &cgh;
MPI_Barrier (dist::comm());
return 0;
}
+ int NamedBarrier (const cGH* const cgh, const int id)
+ {
+ const void *dummy = &dummy;
+ dummy = &cgh;
+
+ assert (id >= 0);
+ const int root = 0;
+ int my_id = dist::rank()==root ? id : -1;
+ Checkpoint ("About to Bcast %d", id);
+ MPI_Bcast (&my_id, 1, MPI_INT, root, dist::comm());
+ Checkpoint ("Finished Bcast");
+ if (my_id != id) {
+ CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Wrong Barrier name: expected %d, found %d", id, my_id);
+ }
+ Checkpoint ("About to Barrier %d", id);
+ MPI_Barrier (dist::comm());
+ Checkpoint ("Finished Barrier");
+ return 0;
+ }
+
- int Exit (cGH* cgh, int retval)
+ int Exit (const cGH* cgh, int retval)
{
CCTK_Barrier (cgh);
dist::finalize();
@@ -142,7 +205,7 @@ namespace Carpet {
return -1;
}
- int Abort (cGH* cgh, int retval)
+ int Abort (const cGH* cgh, int retval)
{
void *dummy = &dummy;
dummy = &cgh;
@@ -189,7 +252,7 @@ namespace Carpet {
#define TYPECASE(N,T) \
case N: { \
T dummy; \
- return dist::datatype(dummy); \
+ return dist::mpi_datatype(dummy); \
}
#include "typecase"
#undef TYPECASE
@@ -266,15 +329,17 @@ namespace Carpet {
// Timelevels
- int min_timelevel (const checktimes where, const int num_tl)
+ int min_timelevel (const checktimes where, const int num_tl,
+ const bool persistent)
{
assert (num_tl>0);
switch (where) {
case currenttime:
return 0;
case currenttimebutnotifonly:
- // don't include current time if there is only one time level
- return num_tl>1 ? 0 : 1;
+ // don't include current time if there is only one (persistent)
+ // time level
+ return (not persistent or num_tl>1) ? 0 : 1;
case previoustime:
return 1;
case allbutlasttime:
@@ -290,7 +355,8 @@ namespace Carpet {
return -999;
}
- int max_timelevel (const checktimes where, const int num_tl)
+ int max_timelevel (const checktimes where, const int num_tl,
+ const bool persistent)
{
assert (num_tl>0);
switch (where) {
diff --git a/Carpet/Carpet/src/make.code.defn b/Carpet/Carpet/src/make.code.defn
index db03ff6d7..8edcaac69 100644
--- a/Carpet/Carpet/src/make.code.defn
+++ b/Carpet/Carpet/src/make.code.defn
@@ -1,8 +1,7 @@
# Main make.code.defn file for thorn Carpet -*-Makefile-*-
# Source files in this directory
-SRCS = AllGatherString.cc \
- CallFunction.cc \
+SRCS = CallFunction.cc \
CarpetBasegrid.cc \
CarpetParamCheck.cc \
CarpetStartup.cc \
@@ -11,7 +10,6 @@ SRCS = AllGatherString.cc \
Cycle.cc \
Evolve.cc \
Initialise.cc \
- Limits.cc \
MultiModel.cc \
OutputGH.cc \
Poison.cc \
diff --git a/Carpet/Carpet/src/modes.cc b/Carpet/Carpet/src/modes.cc
index 998f593ef..138842da4 100644
--- a/Carpet/Carpet/src/modes.cc
+++ b/Carpet/Carpet/src/modes.cc
@@ -11,7 +11,7 @@
#include <defs.hh>
#include <ggf.hh>
-#include "carpet.hh"
+#include <carpet.hh>
@@ -54,7 +54,7 @@ namespace Carpet {
// assert (mglevel>=0 and mglevel<mglevels);
// assert (reflevel>=0 and reflevel<reflevels);
// assert (map>=0 and map<maps);
-// assert (vhh.at(map)->local_components(reflevel)==1 or component==-1);
+// assert (vhh.AT(map)->local_components(reflevel)==1 or component==-1);
}
@@ -76,13 +76,16 @@ namespace Carpet {
// TODO: this could also just be "mglevel" instead
cctkGH->cctk_convlevel = basemglevel + mglevel;
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_GLOBAL;
+
// Set time delta
cctkGH->cctk_delta_time = delta_time * mglevelfact;
if (maps == 1) {
// Set space delta
for (int d=0; d<dim; ++d) {
- cctkGH->cctk_origin_space[d] = origin_space.at(0).at(mglevel)[d];
- cctkGH->cctk_delta_space[d] = delta_space.at(0)[d] * mglevelfact;
+ cctkGH->cctk_origin_space[d] = origin_space.AT(0).AT(mglevel)[d];
+ cctkGH->cctk_delta_space[d] = delta_space.AT(0)[d] * mglevelfact;
}
}
@@ -94,48 +97,48 @@ namespace Carpet {
const int rl = 0;
const int m = 0;
- const int c = CCTK_MyProc(cctkGH);
+ const int c = dist::rank();
- const ibbox& baseext = arrdata.at(group).at(m).hh->baseextents.at(ml).at(rl);
- const ibbox& ext = arrdata.at(group).at(m).dd->boxes.at(ml).at(rl).at(c).exterior;
- const b2vect& obnds = arrdata.at(group).at(m).hh->outer_boundaries(rl,c);
+ const ibbox& baseext = arrdata.AT(group).AT(m).hh->baseextents.AT(ml).AT(rl);
+ const ibbox& ext = arrdata.AT(group).AT(m).dd->boxes.AT(ml).AT(rl).AT(c).exterior;
+ const b2vect& obnds = arrdata.AT(group).AT(m).hh->outer_boundaries(rl,c);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.nghostzones))
- = arrdata.at(group).at(m).dd->ghost_width[0];
- ivect::ref(const_cast<int*>(groupdata.at(group).info.gsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.nghostzones))
+ = arrdata.AT(group).AT(m).dd->ghost_width[0];
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.gsh))
= baseext.shape() / baseext.stride();
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lsh))
= ext.shape() / ext.stride();
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lbnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lbnd))
= (ext.lower() - baseext.lower()) / ext.stride();
- ivect::ref(const_cast<int*>(groupdata.at(group).info.ubnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.ubnd))
= (ext.upper() - baseext.lower()) / ext.stride();
if (gp.disttype == CCTK_DISTRIB_CONSTANT) {
int const d = gp.dim==0 ? 0 : gp.dim-1;
- ivect & gsh = ivect::ref(const_cast<int*>(groupdata.at(group).info.gsh));
- ivect & lsh = ivect::ref(const_cast<int*>(groupdata.at(group).info.lsh));
- ivect & lbnd = ivect::ref(const_cast<int*>(groupdata.at(group).info.lbnd));
- ivect & ubnd = ivect::ref(const_cast<int*>(groupdata.at(group).info.ubnd));
+ ivect & gsh = ivect::ref(const_cast<int*>(groupdata.AT(group).info.gsh));
+ ivect & lsh = ivect::ref(const_cast<int*>(groupdata.AT(group).info.lsh));
+ ivect & lbnd = ivect::ref(const_cast<int*>(groupdata.AT(group).info.lbnd));
+ ivect & ubnd = ivect::ref(const_cast<int*>(groupdata.AT(group).info.ubnd));
gsh[d] = lsh[d];
lbnd[d] = 0;
ubnd[d] = lsh[d] - 1;
}
for (int d=0; d<dim; ++d) {
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d ] = obnds[0][d];
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d+1] = obnds[1][d];
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d ] = obnds[0][d];
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d+1] = obnds[1][d];
}
- groupdata.at(group).info.activetimelevels
- = groupdata.at(group).activetimelevels.at(mglevel).at(0);
+ groupdata.AT(group).info.activetimelevels
+ = groupdata.AT(group).activetimelevels.AT(mglevel).AT(0);
for (int d=0; d<dim; ++d) {
- assert (groupdata.at(group).info.lsh[d]>=0);
- assert (groupdata.at(group).info.lsh[d]<=groupdata.at(group).info.gsh[d]);
- assert (groupdata.at(group).info.lbnd[d]>=0);
- assert (groupdata.at(group).info.lbnd[d]<=groupdata.at(group).info.ubnd[d]+1);
- assert (groupdata.at(group).info.ubnd[d]<groupdata.at(group).info.gsh[d]);
- assert (groupdata.at(group).info.lbnd[d] + groupdata.at(group).info.lsh[d] - 1
- == groupdata.at(group).info.ubnd[d]);
- assert (groupdata.at(group).info.lbnd[d]<=groupdata.at(group).info.ubnd[d]+1);
+ assert (groupdata.AT(group).info.lsh[d]>=0);
+ assert (groupdata.AT(group).info.lsh[d]<=groupdata.AT(group).info.gsh[d]);
+ assert (groupdata.AT(group).info.lbnd[d]>=0);
+ assert (groupdata.AT(group).info.lbnd[d]<=groupdata.AT(group).info.ubnd[d]+1);
+ assert (groupdata.AT(group).info.ubnd[d]<groupdata.AT(group).info.gsh[d]);
+ assert (groupdata.AT(group).info.lbnd[d] + groupdata.AT(group).info.lsh[d] - 1
+ == groupdata.AT(group).info.ubnd[d]);
+ assert (groupdata.AT(group).info.lbnd[d]<=groupdata.AT(group).info.ubnd[d]+1);
}
const int numvars = CCTK_NumVarsInGroupI (group);
@@ -144,17 +147,18 @@ namespace Carpet {
assert (firstvar>=0);
const int max_tl = CCTK_MaxTimeLevelsGI (group);
assert (max_tl>=0);
- const int active_tl = groupdata.at(group).info.activetimelevels;
+ const int active_tl = groupdata.AT(group).info.activetimelevels;
assert (active_tl>=0 and active_tl<=max_tl);
- assert (arrdata.at(group).at(m).hh->is_local(rl,c));
+ assert (arrdata.AT(group).AT(m).hh->is_local(rl,c));
for (int var=0; var<numvars; ++var) {
assert (firstvar+var<CCTK_NumVars());
- ggf * const ff = arrdata.at(group).at(m).data.at(var);
+ ggf * const ff = arrdata.AT(group).AT(m).data.AT(var);
for (int tl=0; tl<max_tl; ++tl) {
if (ff and tl<active_tl) {
- gdata * const data = (*ff) (tl, rl, c, ml);
+ int const lc = 0;
+ gdata * const data = (*ff) (tl, rl, lc, ml);
assert (data);
cctkGH->data[firstvar+var][tl] = data->storage();
} else {
@@ -186,36 +190,38 @@ namespace Carpet {
if (maps == 1) {
// Save and unset space delta
for (int d=0; d<dim; ++d) {
- origin_space.at(0).at(mglevel)[d] = cctkGH->cctk_origin_space[d];
- delta_space.at(mglevel)[d] = cctkGH->cctk_delta_space[d] / mglevelfact;
+ origin_space.AT(0).AT(mglevel)[d] = cctkGH->cctk_origin_space[d];
+ delta_space.AT(mglevel)[d] = cctkGH->cctk_delta_space[d] / mglevelfact;
cctkGH->cctk_origin_space[d] = -424242.0;
cctkGH->cctk_delta_space[d] = -424242.0;
}
}
+ CCTK_INT const deadbeef = get_deadbeef();
+
// Set array information
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) != CCTK_GF) {
const int m = 0;
-// ivect::ref(const_cast<int*>(groupdata.at(group).info.nghostzones))
+// ivect::ref(const_cast<int*>(groupdata.AT(group).info.nghostzones))
// = deadbeef;
- ivect::ref(const_cast<int*>(groupdata.at(group).info.nghostzones))
- = arrdata.at(group).at(m).dd->ghost_width[0];
- ivect::ref(const_cast<int*>(groupdata.at(group).info.gsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.nghostzones))
+ = arrdata.AT(group).AT(m).dd->ghost_width[0];
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.gsh))
= deadbeef;
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lsh))
= deadbeef;
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lbnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lbnd))
= -deadbeef;
- ivect::ref(const_cast<int*>(groupdata.at(group).info.ubnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.ubnd))
= deadbeef;
for (int d=0; d<dim; ++d) {
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d ] = deadbeef;
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d+1] = deadbeef;
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d ] = deadbeef;
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d+1] = deadbeef;
}
- groupdata.at(group).info.activetimelevels = deadbeef;
+ groupdata.AT(group).info.activetimelevels = deadbeef;
const int numvars = CCTK_NumVarsInGroupI (group);
if (numvars>0) {
@@ -236,6 +242,9 @@ namespace Carpet {
} // if grouptype
} // for group
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_META;
+
mglevel = -1;
mglevelfact = -deadbeef;
cctkGH->cctk_convlevel = -deadbeef;
@@ -255,27 +264,30 @@ namespace Carpet {
assert (rl>=0 and rl<reflevels);
Checkpoint ("Entering level mode");
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_LEVEL;
+
reflevel = rl;
- timereflevelfact = timereffacts.at (reflevel);
- spacereflevelfact = spacereffacts.at (reflevel);
+ timereflevelfact = timereffacts.AT (reflevel);
+ spacereflevelfact = spacereffacts.AT (reflevel);
ivect::ref(cctkGH->cctk_levfac) = spacereflevelfact;
cctkGH->cctk_timefac = timereflevelfact;
// Set number of time levels
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- groupdata.at(group).info.activetimelevels
- = groupdata.at(group).activetimelevels.at(mglevel).at(reflevel);
+ groupdata.AT(group).info.activetimelevels
+ = groupdata.AT(group).activetimelevels.AT(mglevel).AT(reflevel);
}
}
// Set current time
assert (mglevel>=0 and mglevel<(int)leveltimes.size());
- assert (reflevel>=0 and reflevel<(int)leveltimes.at(mglevel).size());
+ assert (reflevel>=0 and reflevel<(int)leveltimes.AT(mglevel).size());
if (not adaptive_stepsize) {
- cctkGH->cctk_time = leveltimes.at(mglevel).at(reflevel);
+ cctkGH->cctk_time = leveltimes.AT(mglevel).AT(reflevel);
} else {
- leveltimes.at(mglevel).at(reflevel) = cctkGH->cctk_time;
+ leveltimes.AT(mglevel).AT(reflevel) = cctkGH->cctk_time;
}
assert (is_level_mode());
@@ -290,11 +302,13 @@ namespace Carpet {
if (reflevel == -1) return; // early return
Checkpoint ("Leaving level mode");
-
+
+ CCTK_INT const deadbeef = get_deadbeef();
+
// Save and unset current time
assert (mglevel>=0 and mglevel<(int)leveltimes.size());
- assert (reflevel>=0 and reflevel<(int)leveltimes.at(mglevel).size());
- leveltimes.at(mglevel).at(reflevel) = cctkGH->cctk_time;
+ assert (reflevel>=0 and reflevel<(int)leveltimes.AT(mglevel).size());
+ leveltimes.AT(mglevel).AT(reflevel) = cctkGH->cctk_time;
if (not adaptive_stepsize) {
cctkGH->cctk_time = global_time;
} else {
@@ -304,13 +318,16 @@ namespace Carpet {
// Unset number of time levels
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- groupdata.at(group).info.activetimelevels = deadbeef;
+ groupdata.AT(group).info.activetimelevels = deadbeef;
}
}
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_GLOBAL;
+
reflevel = -1;
- timereflevelfact = timereffacts.at (reflevels - 1);
- // TODO: use spacereffacts.at (reflevel - 1) instead?
+ timereflevelfact = timereffacts.AT (reflevels - 1);
+ // TODO: use spacereffacts.AT (reflevel - 1) instead?
spacereflevelfact = ivect(-deadbeef);
ivect::ref(cctkGH->cctk_levfac) = spacereflevelfact;
cctkGH->cctk_timefac = timereflevelfact;
@@ -332,6 +349,9 @@ namespace Carpet {
or grouptype == CCTK_GF);
Checkpoint ("Entering singlemap mode");
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_SINGLEMAP;
+
assert (mc_grouptype == -1);
mc_grouptype = grouptype;
carpetGH.map = map = m;
@@ -341,26 +361,26 @@ namespace Carpet {
if (maps > 1) {
// Set space delta
for (int d=0; d<dim; ++d) {
- cctkGH->cctk_origin_space[d] = origin_space.at(map).at(mglevel)[d];
- cctkGH->cctk_delta_space[d] = delta_space.at(map)[d] * mglevelfact;
+ cctkGH->cctk_origin_space[d] = origin_space.AT(map).AT(mglevel)[d];
+ cctkGH->cctk_delta_space[d] = delta_space.AT(map)[d] * mglevelfact;
}
}
// Set grid shape
- const ibbox& coarseext = vhh.at(map)->baseextents.at(mglevel).at(0 );
- const ibbox& baseext = vhh.at(map)->baseextents.at(mglevel).at(reflevel);
+ const ibbox& coarseext = vhh.AT(map)->baseextents.AT(mglevel).AT(0 );
+ const ibbox& baseext = vhh.AT(map)->baseextents.AT(mglevel).AT(reflevel);
// assert (all (baseext.lower() % baseext.stride() == 0));
ivect::ref(cctkGH->cctk_levoff) = baseext.lower() - coarseext.lower();
ivect::ref(cctkGH->cctk_levoffdenom) = baseext.stride();
ivect::ref(cctkGH->cctk_gsh) = baseext.shape() / baseext.stride();
- assert (all (vdd.at(map)->ghost_width[0] == vdd.at(map)->ghost_width[1]));
- ivect::ref(cctkGH->cctk_nghostzones) = vdd.at(map)->ghost_width[0];
+ assert (all (vdd.AT(map)->ghost_width[0] == vdd.AT(map)->ghost_width[1]));
+ ivect::ref(cctkGH->cctk_nghostzones) = vdd.AT(map)->ghost_width[0];
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- ivect::ref(const_cast<int*>(groupdata.at(group).info.gsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.gsh))
= ivect::ref(cctkGH->cctk_gsh);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.nghostzones))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.nghostzones))
= ivect::ref(cctkGH->cctk_nghostzones);
}
}
@@ -385,12 +405,14 @@ namespace Carpet {
if (mc_grouptype == CCTK_GF) {
+ CCTK_INT const deadbeef = get_deadbeef();
+
// Save space delta
// (Do this early and often, so that interpolation has access to
// the correct values right away.)
for (int d=0; d<dim; ++d) {
- origin_space.at(map).at(mglevel)[d] = cctkGH->cctk_origin_space[d];
- delta_space.at(map)[d] = cctkGH->cctk_delta_space[d] / mglevelfact;
+ origin_space.AT(map).AT(mglevel)[d] = cctkGH->cctk_origin_space[d];
+ delta_space.AT(map)[d] = cctkGH->cctk_delta_space[d] / mglevelfact;
}
if (maps > 1) {
// Unset space delta
@@ -405,19 +427,22 @@ namespace Carpet {
ivect::ref(cctkGH->cctk_levoffdenom) = 0;
ivect::ref(cctkGH->cctk_gsh) = deadbeef;
// ivect::ref(cctkGH->cctk_nghostzones) = deadbeef;
- ivect::ref(cctkGH->cctk_nghostzones) = vdd.at(map)->ghost_width[0];
+ ivect::ref(cctkGH->cctk_nghostzones) = vdd.AT(map)->ghost_width[0];
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- ivect::ref(const_cast<int*>(groupdata.at(group).info.gsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.gsh))
= ivect::ref(cctkGH->cctk_gsh);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.nghostzones))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.nghostzones))
= ivect::ref(cctkGH->cctk_nghostzones);
}
}
} // if mc_grouptype
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_LEVEL;
+
mc_grouptype = -1;
carpetGH.map = map = -1;
@@ -428,25 +453,32 @@ namespace Carpet {
// Set local mode
- void enter_local_mode (cGH * const cctkGH, int const c, int const grouptype)
+ void enter_local_mode (cGH * const cctkGH,
+ int const c, int const lc, int const grouptype)
{
assert (is_singlemap_mode());
if (mc_grouptype == CCTK_GF) {
- assert (c>=0 and c<vhh.at(map)->components(reflevel));
+ assert (c>=0 and c<vhh.AT(map)->components(reflevel));
+ assert (lc==-1 or (lc>=0 and lc<vhh.AT(map)->local_components(reflevel)));
} else {
- assert (c>=0 and c<CCTK_nProcs(cctkGH));
+ assert (c>=0 and c<dist::size());
+ assert (lc==-1 or lc==0);
}
Checkpoint ("Entering local mode");
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_LOCAL;
+
assert (grouptype == mc_grouptype);
component = c;
+ local_component = lc;
if (mc_grouptype == CCTK_GF) {
// Set cGH fields
- const ibbox& baseext = vhh.at(map)->baseextents.at(mglevel).at(reflevel);
- const ibbox& ext = vdd.at(map)->boxes.at(mglevel).at(reflevel).at(component).exterior;
- const b2vect& obnds = vhh.at(map)->outer_boundaries(reflevel,component);
+ const ibbox& baseext = vhh.AT(map)->baseextents.AT(mglevel).AT(reflevel);
+ const ibbox& ext = vdd.AT(map)->boxes.AT(mglevel).AT(reflevel).AT(component).exterior;
+ const b2vect& obnds = vhh.AT(map)->outer_boundaries(reflevel,component);
ivect::ref(cctkGH->cctk_lsh) = ext.shape() / ext.stride();
ivect::ref(cctkGH->cctk_lbnd)
@@ -484,44 +516,47 @@ namespace Carpet {
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lsh))
= ivect::ref(cctkGH->cctk_lsh);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lbnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lbnd))
= ivect::ref(cctkGH->cctk_lbnd);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.ubnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.ubnd))
= ivect::ref(cctkGH->cctk_ubnd);
for (int d=0; d<dim; ++d) {
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d ]
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d ]
= cctkGH->cctk_bbox[2*d ];
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d+1]
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d+1]
= cctkGH->cctk_bbox[2*d+1];
}
- const int numvars = CCTK_NumVarsInGroupI (group);
- if (numvars>0) {
- const int firstvar = CCTK_FirstVarIndexI (group);
- assert (firstvar>=0);
- const int max_tl = CCTK_MaxTimeLevelsGI (group);
- assert (max_tl>=0);
- const int active_tl = CCTK_ActiveTimeLevelsGI (cctkGH, group);
- assert (active_tl>=0 and active_tl<=max_tl);
- const int available_tl =
- do_allow_past_timelevels ? active_tl : min (1, active_tl);
-
- // assert (vhh.at(map)->is_local(reflevel,component));
-
- assert (group<(int)arrdata.size());
- for (int var=0; var<numvars; ++var) {
- assert (firstvar+var<CCTK_NumVars());
- ggf * const ff = arrdata.at(group).at(map).data.at(var);
- for (int tl=0; tl<max_tl; ++tl) {
- if (ff and tl<available_tl) {
- gdata * const data = (*ff) (tl, reflevel, component, mglevel);
- assert (data);
- cctkGH->data[firstvar+var][tl] = data->storage();
- } else {
- cctkGH->data[firstvar+var][tl] = NULL;
+ if (local_component != -1) {
+ const int numvars = CCTK_NumVarsInGroupI (group);
+ if (numvars>0) {
+ const int firstvar = CCTK_FirstVarIndexI (group);
+ assert (firstvar>=0);
+ const int max_tl = CCTK_MaxTimeLevelsGI (group);
+ assert (max_tl>=0);
+ const int active_tl = CCTK_ActiveTimeLevelsGI (cctkGH, group);
+ assert (active_tl>=0 and active_tl<=max_tl);
+ const int available_tl =
+ do_allow_past_timelevels ? active_tl : min (1, active_tl);
+
+ // assert (vhh.AT(map)->is_local(reflevel,component));
+
+ assert (group<(int)arrdata.size());
+ for (int var=0; var<numvars; ++var) {
+ assert (firstvar+var<CCTK_NumVars());
+ ggf * const ff = arrdata.AT(group).AT(map).data.AT(var);
+ for (int tl=0; tl<max_tl; ++tl) {
+ if (ff and tl<available_tl) {
+ gdata * const data =
+ (*ff) (tl, reflevel, local_component, mglevel);
+ assert (data);
+ cctkGH->data[firstvar+var][tl] = data->storage();
+ } else {
+ cctkGH->data[firstvar+var][tl] = NULL;
+ }
}
}
}
@@ -547,6 +582,8 @@ namespace Carpet {
if (mc_grouptype == CCTK_GF) {
+ CCTK_INT const deadbeef = get_deadbeef();
+
// Unset cGH fields
ivect::ref(cctkGH->cctk_lsh) = deadbeef;
ivect::ref(cctkGH->cctk_lbnd) = -deadbeef;
@@ -569,32 +606,34 @@ namespace Carpet {
for (int group=0; group<CCTK_NumGroups(); ++group) {
if (CCTK_GroupTypeI(group) == CCTK_GF) {
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lsh))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lsh))
= ivect::ref(cctkGH->cctk_lsh);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.lbnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.lbnd))
= ivect::ref(cctkGH->cctk_lbnd);
- ivect::ref(const_cast<int*>(groupdata.at(group).info.ubnd))
+ ivect::ref(const_cast<int*>(groupdata.AT(group).info.ubnd))
= ivect::ref(cctkGH->cctk_ubnd);
for (int d=0; d<dim; ++d) {
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d ]
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d ]
= cctkGH->cctk_bbox[2*d ];
- const_cast<int*>(groupdata.at(group).info.bbox)[2*d+1]
+ const_cast<int*>(groupdata.AT(group).info.bbox)[2*d+1]
= cctkGH->cctk_bbox[2*d+1];
}
- const int numvars = CCTK_NumVarsInGroupI (group);
- if (numvars>0) {
- const int firstvar = CCTK_FirstVarIndexI (group);
- assert (firstvar>=0);
- const int max_tl = CCTK_MaxTimeLevelsGI (group);
- assert (max_tl>=0);
-
- assert (group<(int)arrdata.size());
- for (int var=0; var<numvars; ++var) {
- assert (firstvar+var<CCTK_NumVars());
- for (int tl=0; tl<max_tl; ++tl) {
- cctkGH->data[firstvar+var][tl] = NULL;
+ if (local_component != -1) {
+ const int numvars = CCTK_NumVarsInGroupI (group);
+ if (numvars>0) {
+ const int firstvar = CCTK_FirstVarIndexI (group);
+ assert (firstvar>=0);
+ const int max_tl = CCTK_MaxTimeLevelsGI (group);
+ assert (max_tl>=0);
+
+ assert (group<(int)arrdata.size());
+ for (int var=0; var<numvars; ++var) {
+ assert (firstvar+var<CCTK_NumVars());
+ for (int tl=0; tl<max_tl; ++tl) {
+ cctkGH->data[firstvar+var][tl] = NULL;
+ }
}
}
}
@@ -604,7 +643,11 @@ namespace Carpet {
} // if mc_grouptype
+ // Set mode
+ cctkGH->cctk_mode = CCTK_MODE_SINGLEMAP;
+
component = -1;
+ local_component = -1;
assert (is_singlemap_mode());
}
@@ -749,7 +792,8 @@ namespace Carpet {
bool map_iterator::done () const
{
- return grouptype == CCTK_GF ? m >= maps : m >= 1;
+ int const maxm = grouptype == CCTK_GF ? maps : 1;
+ return m >= maxm;
}
void map_iterator::step ()
@@ -763,7 +807,46 @@ namespace Carpet {
- // Local mode iterator
+ // processor local map iterator
+
+ local_map_iterator::local_map_iterator (cGH const * const cctkGH_,
+ int const grouptype_)
+ : cctkGH(const_cast<cGH*>(cctkGH_)), grouptype(grouptype_), m(0)
+ {
+ assert (grouptype == CCTK_GF
+ or grouptype == CCTK_ARRAY or grouptype == CCTK_SCALAR);
+ enter_singlemap_mode (cctkGH, m, grouptype);
+ }
+
+ local_map_iterator::~local_map_iterator ()
+ {
+ leave_singlemap_mode (cctkGH);
+ }
+
+ bool local_map_iterator::done () const
+ {
+ int const maxm = grouptype == CCTK_GF ? maps : 1;
+ return m >= maxm;
+ }
+
+ void local_map_iterator::step ()
+ {
+ while (true) {
+ ++ m;
+ if (done()) break;
+ int const maxlc =
+ grouptype == CCTK_GF ? vhh.AT(m)->local_components(reflevel) : 1;
+ if (maxlc > 0) break;
+ }
+ if (not done()) {
+ leave_singlemap_mode (cctkGH);
+ enter_singlemap_mode (cctkGH, m, grouptype);
+ }
+ }
+
+
+
+ // local mode iterator
component_iterator::component_iterator (cGH const * const cctkGH_,
int const grouptype_)
@@ -771,7 +854,6 @@ namespace Carpet {
{
assert (grouptype == CCTK_GF
or grouptype == CCTK_ARRAY or grouptype == CCTK_SCALAR);
- assert (is_singlemap_mode());
step ();
}
@@ -793,17 +875,21 @@ namespace Carpet {
++ c;
if (not done()) {
leave_local_mode (cctkGH);
- enter_local_mode (cctkGH, c, grouptype);
+ int const lc =
+ (grouptype == CCTK_GF
+ ? vhh.AT(map)->get_local_component(reflevel, c)
+ : (c == dist::rank() ? 0 : -1));
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
}
- // Processor local mode iterator
+ // processor local mode iterator
local_component_iterator::local_component_iterator (cGH const * const cctkGH_,
int const grouptype_)
- : cctkGH(const_cast<cGH*>(cctkGH_)), grouptype(grouptype_), c(-1)
+ : cctkGH(const_cast<cGH*>(cctkGH_)), grouptype(grouptype_), lc(-1)
{
assert (grouptype == CCTK_GF
or grouptype == CCTK_ARRAY or grouptype == CCTK_SCALAR);
@@ -818,23 +904,21 @@ namespace Carpet {
bool local_component_iterator::done () const
{
- int const maxc = (grouptype == CCTK_GF
- ? vhh.AT(map)->components(reflevel)
- : dist::size());
- return c >= maxc;
+ int const maxlc = (grouptype == CCTK_GF
+ ? vhh.AT(map)->local_components(reflevel)
+ : 1);
+ return lc >= maxlc;
}
void local_component_iterator::step ()
{
- do {
- ++ c;
- } while (not done() and not (grouptype == CCTK_GF
- ? vhh.at(map)->is_local(reflevel, c)
- : c == CCTK_MyProc(cctkGH)));
-
+ ++ lc;
if (not done()) {
+ int const c = (grouptype == CCTK_GF
+ ? vhh.AT(map)->get_component(reflevel,lc)
+ : dist::rank());
leave_local_mode (cctkGH);
- enter_local_mode (cctkGH, c, grouptype);
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
}
@@ -847,7 +931,7 @@ namespace Carpet {
// Singlemap escape
singlemap_escape::singlemap_escape (cGH const * const cctkGH_)
- : cctkGH(const_cast<cGH*>(cctkGH_)), c(component)
+ : cctkGH(const_cast<cGH*>(cctkGH_)), c(component), lc(local_component)
{
assert (not is_meta_mode());
assert (not is_global_mode());
@@ -861,7 +945,7 @@ namespace Carpet {
{
assert (is_singlemap_mode());
if (c != -1) {
- enter_local_mode (cctkGH, c, mc_grouptype);
+ enter_local_mode (cctkGH, c, lc, mc_grouptype);
}
}
@@ -871,7 +955,7 @@ namespace Carpet {
level_escape::level_escape (cGH const * const cctkGH_)
: cctkGH(const_cast<cGH*>(cctkGH_)),
- grouptype(mc_grouptype), m(map), c(component)
+ grouptype(mc_grouptype), m(map), c(component), lc(local_component)
{
assert (not is_meta_mode());
assert (not is_global_mode());
@@ -889,7 +973,7 @@ namespace Carpet {
if (m != -1) {
enter_singlemap_mode (cctkGH, m, grouptype);
if (c != -1) {
- enter_local_mode (cctkGH, c, grouptype);
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
}
}
@@ -900,7 +984,8 @@ namespace Carpet {
global_escape::global_escape (cGH const * const cctkGH_)
: cctkGH(const_cast<cGH*>(cctkGH_)),
- rl(reflevel), grouptype(mc_grouptype), m(map), c(component)
+ rl(reflevel),
+ grouptype(mc_grouptype), m(map), c(component), lc(local_component)
{
assert (not is_meta_mode());
if (not is_global_mode()) {
@@ -922,7 +1007,7 @@ namespace Carpet {
if (m != -1) {
enter_singlemap_mode (cctkGH, m, grouptype);
if (c != -1) {
- enter_local_mode (cctkGH, c, grouptype);
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
}
}
@@ -934,7 +1019,8 @@ namespace Carpet {
meta_escape::meta_escape (cGH const * const cctkGH_)
: cctkGH(const_cast<cGH*>(cctkGH_)),
- ml(mglevel), rl(reflevel), grouptype(mc_grouptype), m(map), c(component)
+ ml(mglevel), rl(reflevel),
+ grouptype(mc_grouptype), m(map), c(component), lc(local_component)
{
if (not is_meta_mode()) {
if (not is_global_mode()) {
@@ -960,7 +1046,7 @@ namespace Carpet {
if (m != -1) {
enter_singlemap_mode (cctkGH, m, grouptype);
if (c != -1) {
- enter_local_mode (cctkGH, c, grouptype);
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
}
}
@@ -979,27 +1065,27 @@ namespace Carpet {
if (is_meta_mode()) {
BEGIN_MGLEVEL_LOOP(cctkGH) {
BEGIN_REFLEVEL_LOOP(cctkGH) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
function (cctkGH);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} END_REFLEVEL_LOOP;
} END_MGLEVEL_LOOP;
} else if (is_global_mode()) {
BEGIN_REFLEVEL_LOOP(cctkGH) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
function (cctkGH);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} END_REFLEVEL_LOOP;
} else if (is_level_mode()) {
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
function (cctkGH);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} else if (is_singlemap_mode()) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
function (cctkGH);
@@ -1140,7 +1226,13 @@ namespace Carpet {
: cctkGH(const_cast<cGH*>(cctkGH_))
{
assert (is_singlemap_mode());
- enter_local_mode (cctkGH, c, grouptype);
+ int const lc =
+ (c != -1
+ ? (grouptype == CCTK_GF
+ ? vhh.AT(map)->get_local_component(reflevel, c)
+ : (c == dist::rank() ? 0 : -1))
+ : -1);
+ enter_local_mode (cctkGH, c, lc, grouptype);
}
component_setter::~component_setter ()
diff --git a/Carpet/Carpet/src/modes.hh b/Carpet/Carpet/src/modes.hh
index 55a5cfd35..c2631d952 100644
--- a/Carpet/Carpet/src/modes.hh
+++ b/Carpet/Carpet/src/modes.hh
@@ -27,27 +27,27 @@ namespace Carpet {
// Mode indicators
- bool is_meta_mode ();
- bool is_global_mode ();
- bool is_level_mode ();
- bool is_singlemap_mode ();
- bool is_local_mode ();
+ bool is_meta_mode () CCTK_ATTRIBUTE_PURE;
+ bool is_global_mode () CCTK_ATTRIBUTE_PURE;
+ bool is_level_mode () CCTK_ATTRIBUTE_PURE;
+ bool is_singlemap_mode () CCTK_ATTRIBUTE_PURE;
+ bool is_local_mode () CCTK_ATTRIBUTE_PURE;
// Mode setting
- void enter_global_mode (cGH * const cctkGH, int const ml);
- void leave_global_mode (cGH * const cctkGH);
+ void enter_global_mode (cGH * cctkGH, int ml);
+ void leave_global_mode (cGH * cctkGH);
- void enter_level_mode (cGH * const cctkGH, int const rl);
- void leave_level_mode (cGH * const cctkGH);
+ void enter_level_mode (cGH * cctkGH, int rl);
+ void leave_level_mode (cGH * cctkGH);
- void enter_singlemap_mode (cGH * const cctkGH, int const m, int const grouptype);
- void leave_singlemap_mode (cGH * const cctkGH);
+ void enter_singlemap_mode (cGH * cctkGH, int m, int grouptype);
+ void leave_singlemap_mode (cGH * cctkGH);
- void enter_local_mode (cGH * const cctkGH, int const c, int const grouptype);
- void leave_local_mode (cGH * const cctkGH);
+ void enter_local_mode (cGH * cctkGH, int c, int lc, int grouptype);
+ void leave_local_mode (cGH * cctkGH);
@@ -57,7 +57,7 @@ namespace Carpet {
cGH * cctkGH;
int ml;
public:
- mglevel_iterator (cGH const * const cctkGH);
+ mglevel_iterator (cGH const * cctkGH);
~mglevel_iterator ();
bool done () const;
void step ();
@@ -67,7 +67,7 @@ namespace Carpet {
cGH * cctkGH;
int ml;
public:
- reverse_mglevel_iterator (cGH const * const cctkGH);
+ reverse_mglevel_iterator (cGH const * cctkGH);
~reverse_mglevel_iterator ();
bool done () const;
void step ();
@@ -77,7 +77,7 @@ namespace Carpet {
cGH * cctkGH;
int rl;
public:
- reflevel_iterator (cGH const * const cctkGH);
+ reflevel_iterator (cGH const * cctkGH);
~reflevel_iterator ();
bool done () const;
void step ();
@@ -87,7 +87,7 @@ namespace Carpet {
cGH * cctkGH;
int rl;
public:
- reverse_reflevel_iterator (cGH const * const cctkGH);
+ reverse_reflevel_iterator (cGH const * cctkGH);
~reverse_reflevel_iterator ();
bool done () const;
void step ();
@@ -103,12 +103,23 @@ namespace Carpet {
int grouptype;
int m;
public:
- map_iterator (cGH const * const cctkGH, int const grouptype);
+ map_iterator (cGH const * cctkGH, int grouptype);
~map_iterator ();
bool done () const;
void step ();
};
+ class local_map_iterator {
+ cGH * cctkGH;
+ int grouptype;
+ int m;
+ public:
+ local_map_iterator (cGH const * cctkGH, int grouptype);
+ ~local_map_iterator ();
+ bool done () const;
+ void step ();
+ };
+
// Loop over all components. If grouptype is CCTK_GF, then loop
// over grid function components. If grouptype is CCTK_ARRAY (or
// CCTK_SCALAR), then loop over grid array (or grid scalar)
@@ -120,7 +131,7 @@ namespace Carpet {
int grouptype;
int c;
public:
- component_iterator (cGH const * const cctkGH, int const grouptype);
+ component_iterator (cGH const * cctkGH, int grouptype);
~component_iterator ();
bool done () const;
void step ();
@@ -129,9 +140,9 @@ namespace Carpet {
class local_component_iterator {
cGH * cctkGH;
int grouptype;
- int c;
+ int lc;
public:
- local_component_iterator (cGH const * const cctkGH, int const grouptype);
+ local_component_iterator (cGH const * cctkGH, int grouptype);
~local_component_iterator ();
bool done () const;
void step ();
@@ -201,6 +212,18 @@ namespace Carpet {
map_loop_ = false; \
} while (false)
+#define BEGIN_LOCAL_MAP_LOOP(cctkGH, grouptype) \
+ do { \
+ bool local_map_loop_ = true; \
+ for (Carpet::local_map_iterator local_map_iter_(cctkGH, grouptype); \
+ not local_map_iter_.done(); \
+ local_map_iter_.step()) {
+#define END_LOCAL_MAP_LOOP \
+ } \
+ assert (local_map_loop_); \
+ local_map_loop_ = false; \
+ } while (false)
+
#define BEGIN_COMPONENT_LOOP(cctkGH, grouptype) \
do { \
bool component_loop_ = true; \
@@ -232,8 +255,9 @@ namespace Carpet {
class singlemap_escape {
cGH * cctkGH;
int c;
+ int lc;
public:
- singlemap_escape (cGH const * const cctkGH);
+ singlemap_escape (cGH const * cctkGH);
~singlemap_escape ();
};
@@ -242,8 +266,9 @@ namespace Carpet {
int grouptype;
int m;
int c;
+ int lc;
public:
- level_escape (cGH const * const cctkGH);
+ level_escape (cGH const * cctkGH);
~level_escape ();
};
@@ -253,8 +278,9 @@ namespace Carpet {
int grouptype;
int m;
int c;
+ int lc;
public:
- global_escape (cGH const * const cctkGH);
+ global_escape (cGH const * cctkGH);
~global_escape ();
};
@@ -265,8 +291,9 @@ namespace Carpet {
int grouptype;
int m;
int c;
+ int lc;
public:
- meta_escape (cGH const * const cctkGH);
+ meta_escape (cGH const * cctkGH);
~meta_escape ();
};
@@ -325,30 +352,28 @@ namespace Carpet {
class mglevel_setter {
cGH * cctkGH;
public:
- mglevel_setter (cGH const * const cctkGH, int const ml);
+ mglevel_setter (cGH const * cctkGH, int ml);
~mglevel_setter ();
};
class reflevel_setter {
cGH * cctkGH;
public:
- reflevel_setter (cGH const * const cctkGH, int const rl);
+ reflevel_setter (cGH const * cctkGH, int rl);
~reflevel_setter ();
};
class map_setter {
cGH * cctkGH;
public:
- map_setter (cGH const * const cctkGH,
- int const m, int const grouptype);
+ map_setter (cGH const * cctkGH, int m, int grouptype);
~map_setter ();
};
class component_setter {
cGH * cctkGH;
public:
- component_setter (cGH const * const cctkGH,
- int const c, int const grouptype);
+ component_setter (cGH const * cctkGH, int c, int grouptype);
~component_setter ();
};
diff --git a/Carpet/Carpet/src/variables.cc b/Carpet/Carpet/src/variables.cc
index a27a5bacb..0bf834ff4 100644
--- a/Carpet/Carpet/src/variables.cc
+++ b/Carpet/Carpet/src/variables.cc
@@ -1,5 +1,4 @@
-
-#include "variables.hh"
+#include <variables.hh>
@@ -51,6 +50,7 @@ namespace Carpet {
int mc_grouptype;
int map;
int component;
+ int local_component;
// Current refinement factors
int timereflevelfact;
@@ -90,9 +90,13 @@ namespace Carpet {
bool do_allow_past_timelevels;
// Is prolongation enabled?
+ // (This flag disables prolongation during MoL integration
+ // substeps.)
bool do_prolongate;
// Is tapering enabled?
+ // (This flag disables prolongation while the current refinement
+ // level is not aligned with the parent.)
bool do_taper;
// Should we warn about groups with insufficiently many time levels?
@@ -106,6 +110,7 @@ namespace Carpet {
vector<gh*> vhh; // [map]
vector<dh*> vdd; // [map]
vector<th*> vtt; // [map]
+ int regridding_epoch;
// Data for the groups
vector<groupdesc> groupdata; // [group]
diff --git a/Carpet/Carpet/src/variables.hh b/Carpet/Carpet/src/variables.hh
index 892664264..2746ec295 100644
--- a/Carpet/Carpet/src/variables.hh
+++ b/Carpet/Carpet/src/variables.hh
@@ -16,16 +16,16 @@
#include <mpi.h>
-#include "cctk.h"
+#include <cctk.h>
-#include "bbox.hh"
-#include "data.hh"
-#include "dh.hh"
-#include "ggf.hh"
-#include "gh.hh"
-#include "operators.hh"
-#include "th.hh"
-#include "vect.hh"
+#include <bbox.hh>
+#include <data.hh>
+#include <dh.hh>
+#include <ggf.hh>
+#include <gh.hh>
+#include <operators.hh>
+#include <th.hh>
+#include <vect.hh>
#include "carpet_public.h"
@@ -80,6 +80,7 @@ namespace Carpet {
extern int mc_grouptype; // -1, CCTK_SCALAR/CCTK_ARRAY, CCTK_GF
extern int map;
extern int component;
+ extern int local_component; // -1 for non-local
// Current refinement factors
extern int timereflevelfact;
@@ -126,9 +127,13 @@ namespace Carpet {
extern bool do_allow_past_timelevels;
// Is prolongation enabled?
+ // (This flag disables prolongation during MoL integration
+ // substeps.)
extern bool do_prolongate;
// Is tapering enabled?
+ // (This flag disables prolongation while the current refinement
+ // level is not aligned with the parent.)
extern bool do_taper;
// Should we warn about groups with insufficiently many time levels?
@@ -142,6 +147,7 @@ namespace Carpet {
extern vector<gh*> vhh; // [map]
extern vector<dh*> vdd; // [map]
extern vector<th*> vtt; // [map]
+ extern int regridding_epoch;
// Data for the groups
struct groupdesc {
diff --git a/Carpet/Carpet/test/small.par b/Carpet/Carpet/test/small.par
new file mode 100644
index 000000000..67b4aef5c
--- /dev/null
+++ b/Carpet/Carpet/test/small.par
@@ -0,0 +1,16 @@
+ActiveThorns = "
+ Boundary
+ CarpetLib
+ Carpet
+ CoordBase
+ IOUtil
+ InitBase
+ InterpToArray
+ LoopControl
+ SymBase
+"
+
+IO::out_dir = $parfile
+
+InterpToArray::nparrays1d = 1
+InterpToArray::parray1d_npoints_i = 1
diff --git a/Carpet/CarpetEvolutionMask/README b/Carpet/CarpetEvolutionMask/README
index dcb1e73b0..a94811ca6 100644
--- a/Carpet/CarpetEvolutionMask/README
+++ b/Carpet/CarpetEvolutionMask/README
@@ -1,11 +1,12 @@
Cactus Code Thorn CarpetEvolutionMask
-Thorn Author(s) : Christian D. Ott <cott@aei.mpg.de>
- Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Christian D. Ott <cott@aei.mpg.de>
- Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Christian D. Ott <cott@aei.mpg.de>
+ Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Christian D. Ott <cott@aei.mpg.de>
+ Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
Provide a grid function "evolution_mask" which is zero for all grid
points that do not need to be evolved because they are going to be
diff --git a/Carpet/CarpetIOASCII/README b/Carpet/CarpetIOASCII/README
index 35eabae48..3d942afef 100644
--- a/Carpet/CarpetIOASCII/README
+++ b/Carpet/CarpetIOASCII/README
@@ -1,7 +1,9 @@
Cactus Code Thorn CarpetIOASCII
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides ASCII output for Carpet.
diff --git a/Carpet/CarpetIOASCII/src/ioascii.cc b/Carpet/CarpetIOASCII/src/ioascii.cc
index 2e742a57f..de1c341e8 100644
--- a/Carpet/CarpetIOASCII/src/ioascii.cc
+++ b/Carpet/CarpetIOASCII/src/ioascii.cc
@@ -34,6 +34,10 @@ namespace Carpet {
}
+#define GetParameter(parameter) \
+ outdim == 0 ? out0D_##parameter : \
+ outdim == 1 ? out1D_##parameter : \
+ outdim == 2 ? out2D_##parameter : out3D_##parameter
namespace CarpetIOASCII {
@@ -154,7 +158,7 @@ namespace CarpetIOASCII {
DECLARE_CCTK_PARAMETERS;
// re-parse the 'IOASCII::out%dD_dir' parameter if it has changed
- const char* the_out_dir = GetStringParameter("out%dD_dir");
+ const char* the_out_dir = GetParameter(dir);
if (CCTK_EQUALS (the_out_dir, "")) {
the_out_dir = out_dir;
}
@@ -177,7 +181,7 @@ namespace CarpetIOASCII {
}
// re-parse the 'IOASCII::out%d_vars' parameter if it has changed
- const char* const out_vars = GetStringParameter("out%dD_vars");
+ const char* const out_vars = GetParameter(vars);
if (strcmp (out_vars, my_out_vars)) {
ostringstream parameter_name;
parameter_name << "IOASCII::out" << outdim << "D_vars";
@@ -191,7 +195,7 @@ namespace CarpetIOASCII {
int count = 0;
ostringstream msg;
msg << "Periodic " << outdim << "D AMR output requested for:";
- for (int vi=0; vi< CCTK_NumVars(); ++vi) {
+ for (int vi=0; vi<CCTK_NumVars(); ++vi) {
if (requests.at(vi)) {
++count;
char* const fullname = CCTK_FullName(vi);
@@ -218,7 +222,7 @@ namespace CarpetIOASCII {
static Carpet::Timer * timer = NULL;
if (not timer) {
ostringstream timer_name;
- timer_name << "CarpetIOASCII<" << outdim << ">::OutputVarAs";
+ timer_name << "CarpetIOASCII<" << outdim << ">::OutputGH";
timer = new Carpet::Timer (timer_name.str().c_str());
}
@@ -262,7 +266,7 @@ namespace CarpetIOASCII {
// check if output for this variable was requested individually by
// a "<varname>{ out_every = <number> }" option string
// this will overwrite the output criterion setting
- const char* myoutcriterion = GetStringParameter("out%dD_criterion");
+ const char* myoutcriterion = GetParameter(criterion);
if (CCTK_EQUALS(myoutcriterion, "default")) {
myoutcriterion = out_criterion;
}
@@ -278,7 +282,7 @@ namespace CarpetIOASCII {
bool output_this_iteration = false;
if (CCTK_EQUALS (myoutcriterion, "iteration")) {
- int myoutevery = GetIntParameter("out%dD_every");
+ int myoutevery = GetParameter(every);
if (myoutevery == -2) {
myoutevery = out_every;
}
@@ -295,7 +299,7 @@ namespace CarpetIOASCII {
}
}
} else if (CCTK_EQUALS (myoutcriterion, "divisor")) {
- int myoutevery = GetIntParameter("out%dD_every");
+ int myoutevery = GetParameter(every);
if (myoutevery == -2) {
myoutevery = out_every;
}
@@ -307,7 +311,7 @@ namespace CarpetIOASCII {
output_this_iteration = true;
}
} else if (CCTK_EQUALS (myoutcriterion, "time")) {
- CCTK_REAL myoutdt = GetRealParameter("out%dD_dt");
+ CCTK_REAL myoutdt = GetParameter(dt);
if (myoutdt == -2) {
myoutdt = out_dt;
}
@@ -536,33 +540,28 @@ namespace CarpetIOASCII {
file);
// Find the output offset
- ivect offset;
- if (groupdata.grouptype == CCTK_GF) {
- offset = GetOutputOffset (cctkGH, m, dirs);
- } else {
- offset = 0;
- }
+ const ivect offset =
+ groupdata.grouptype == CCTK_GF ? GetOutputOffset (cctkGH, m, dirs) : 0;
+
+ const gh* const hh = arrdata.at(group).at(m).hh;
+ const dh* const dd = arrdata.at(group).at(m).dd;
// Traverse all components on this multigrid level, refinement
// level, and map
const int c_min = 0;
const int c_max =
groupdata.grouptype == CCTK_GF ?
- vhh.at(m)->components(reflevel) :
+ hh->components(reflevel) :
groupdata.disttype != CCTK_DISTRIB_CONSTANT ?
CCTK_nProcs(cctkGH) :
1;
for (int c = c_min; c < c_max; ++ c) {
-
- const ggf* const ff = arrdata.at(group).at(m).data.at(var);
-
- const int tl_min = 0;
- const int tl_max = output_all_timelevels ? num_tl : 1;
- for (int tl = tl_min; tl < tl_max; ++tl) {
+ int const lc = hh->get_local_component(rl,c);
+ int const proc = hh->processor(rl,c);
+ if (dist::rank() == proc or dist::rank() == ioproc) {
- const gdata* const data = (*ff) (tl, rl, c, ml);
- const ibbox ext = GetOutputBBox (cctkGH, group, m, c,
- data->extent());
+ const ibbox& data_ext = dd->boxes.at(ml).at(rl).at(c).exterior;
+ const ibbox ext = GetOutputBBox (cctkGH, group, m, c, data_ext);
CCTK_REAL coord_time;
rvect coord_lower, coord_upper;
@@ -572,7 +571,7 @@ namespace CarpetIOASCII {
// Apply offset
ivect offset1;
if (groupdata.grouptype == CCTK_GF) {
- const ibbox& baseext = vhh.at(m)->baseextents.at(ml).at(rl);
+ const ibbox& baseext = hh->baseextents.at(ml).at(rl);
offset1 = baseext.lower() + offset * ext.stride();
} else {
offset1 = offset * ext.stride();
@@ -583,35 +582,80 @@ namespace CarpetIOASCII {
}
}
- vector<const gdata*> datas;
- if (one_file_per_group) {
- const int numvars = CCTK_NumVarsInGroupI(group);
- datas.resize (numvars);
- for (int n=0; n<numvars; ++n) {
- const ggf* const ff1 = arrdata.at(group).at(m).data.at(n);
- datas.at(n) = (*ff1) (tl, rl, c, ml);
+ const int tl_min = 0;
+ const int tl_max = output_all_timelevels ? num_tl : 1;
+ for (int tl = tl_min; tl < tl_max; ++tl) {
+
+ mempool pool;
+
+ const int n_min = one_file_per_group ? 0 : var;
+ const int n_max =
+ one_file_per_group ? CCTK_NumVarsInGroupI(group) : var+1;
+ vector<const gdata*> datas(n_max - n_min);
+ for (size_t n = 0; n < datas.size(); ++ n) {
+ if (dist::rank() == proc) {
+ const ggf* const ff =
+ arrdata.at(group).at(m).data.at(n + n_min);
+ datas.at(n) = (*ff) (tl, rl, lc, ml);
+ } else {
+ datas.at(n) = NULL;
+ }
}
- } else {
- datas.resize (1);
- datas.at(0) = data;
- }
-
- WriteASCII (file, datas, ext, vindex, cctkGH->cctk_iteration,
- offset1, dirs,
- rl, ml, m, c, tl,
- coord_time, coord_lower, coord_upper);
-
- // Append EOL after every component
- if (dist::rank()==ioproc) {
- if (separate_components) {
+
+ vector<gdata*> tmpdatas(datas.size());
+
+ if (proc != ioproc) {
+
+ for (size_t n = 0; n < datas.size(); ++ n) {
+ const ggf* const ff =
+ arrdata.at(group).at(m).data.at(n + n_min);
+ tmpdatas.at(n) = ff->typed_data (tl, rl, c, ml);
+ size_t const memsize =
+ tmpdatas.at(n)->allocsize (data_ext, ioproc);
+ void * const memptr = pool.alloc (memsize);
+ tmpdatas.at(n)->allocate(data_ext, ioproc, memptr, memsize);
+ } // for n
+
+ for (comm_state state; not state.done(); state.step()) {
+ for (size_t n=0; n<datas.size(); ++n) {
+ tmpdatas.at(n)->copy_from
+ (state, datas.at(n), data_ext, ioproc, proc);
+ }
+ }
+
+ } else {
+
+ for (size_t n=0; n<datas.size(); ++n) {
+ tmpdatas.at(n) = const_cast<gdata*> (datas.at(n));
+ }
+
+ }
+
+ if (dist::rank() == ioproc) {
+ WriteASCII (file, tmpdatas, ext, vindex, cctkGH->cctk_iteration,
+ offset1, dirs,
+ rl, ml, m, c, tl,
+ coord_time, coord_lower, coord_upper);
+ }
+
+ if (proc != ioproc) {
+ for (size_t n=0; n<tmpdatas.size(); ++n) {
+ delete tmpdatas.at(n);
+ }
+ }
+
+ // Append EOL after every component
+ if (dist::rank() == ioproc) {
+ if (separate_components) {
+ assert (file.good());
+ file << eol;
+ }
assert (file.good());
- file << eol;
}
- assert (file.good());
- }
+
+ } // for tl
- } // for tl
-
+ }
} // for c
// Append EOL after every complete set of components
@@ -916,16 +960,16 @@ namespace CarpetIOASCII {
case 0:
// 0D output
offset[0] = GetGridOffset (cctkGH, m, 1,
- "out%dD_point_xi", /*"out_point_xi"*/ NULL,
- "out%dD_point_x", /*"out_point_x"*/ NULL,
+ "out0D_point_xi", /*"out_point_xi"*/ NULL,
+ "out0D_point_x", /*"out_point_x"*/ NULL,
/*out_point_x*/ 0.0);
offset[1] = GetGridOffset (cctkGH, m, 2,
- "out%dD_point_yi", /*"out_point_yi"*/ NULL,
- "out%dD_point_y", /*"out_point_y"*/ NULL,
+ "out0D_point_yi", /*"out_point_yi"*/ NULL,
+ "out0D_point_y", /*"out_point_y"*/ NULL,
/*out_point_y*/ 0.0);
offset[2] = GetGridOffset (cctkGH, m, 3,
- "out%dD_point_zi", /*"out_point_zi"*/ NULL,
- "out%dD_point_z", /*"out_point_z"*/ NULL,
+ "out0D_point_zi", /*"out_point_zi"*/ NULL,
+ "out0D_point_z", /*"out_point_z"*/ NULL,
/*out_point_z*/ 0.0);
break;
@@ -934,32 +978,32 @@ namespace CarpetIOASCII {
switch (dirs[0]) {
case 0:
offset[1] = GetGridOffset (cctkGH, m, 2,
- "out%dD_xline_yi", "out_xline_yi",
- "out%dD_xline_y", "out_xline_y",
+ "out1D_xline_yi", "out_xline_yi",
+ "out1D_xline_y", "out_xline_y",
out_xline_y);
offset[2] = GetGridOffset (cctkGH, m, 3,
- "out%dD_xline_zi", "out_xline_zi",
- "out%dD_xline_z", "out_xline_z",
+ "out1D_xline_zi", "out_xline_zi",
+ "out1D_xline_z", "out_xline_z",
out_xline_z);
break;
case 1:
offset[0] = GetGridOffset (cctkGH, m, 1,
- "out%dD_yline_xi", "out_yline_xi",
- "out%dD_yline_x", "out_yline_x",
+ "out1D_yline_xi", "out_yline_xi",
+ "out1D_yline_x", "out_yline_x",
out_yline_x);
offset[2] = GetGridOffset (cctkGH, m, 3,
- "out%dD_yline_zi", "out_yline_zi",
- "out%dD_yline_z", "out_yline_z",
+ "out1D_yline_zi", "out_yline_zi",
+ "out1D_yline_z", "out_yline_z",
out_yline_z);
break;
case 2:
offset[0] = GetGridOffset (cctkGH, m, 1,
- "out%dD_zline_xi", "out_zline_xi",
- "out%dD_zline_x", "out_zline_x",
+ "out1D_zline_xi", "out_zline_xi",
+ "out1D_zline_x", "out_zline_x",
out_zline_x);
offset[1] = GetGridOffset (cctkGH, m, 2,
- "out%dD_zline_yi", "out_zline_yi",
- "out%dD_zline_y", "out_zline_y",
+ "out1D_zline_yi", "out_zline_yi",
+ "out1D_zline_y", "out_zline_y",
out_zline_y);
break;
case 3:
@@ -974,18 +1018,18 @@ namespace CarpetIOASCII {
// 2D output
if (dirs[0]==0 and dirs[1]==1) {
offset[2] = GetGridOffset (cctkGH, m, 3,
- "out%dD_xyplane_zi", "out_xyplane_zi",
- "out%dD_xyplane_z", "out_xyplane_z",
+ "out2D_xyplane_zi", "out_xyplane_zi",
+ "out2D_xyplane_z", "out_xyplane_z",
out_xyplane_z);
} else if (dirs[0]==0 and dirs[1]==2) {
offset[1] = GetGridOffset (cctkGH, m, 2,
- "out%dD_xzplane_yi", "out_xzplane_yi",
- "out%dD_xzplane_y", "out_xzplane_y",
+ "out2D_xzplane_yi", "out_xzplane_yi",
+ "out2D_xzplane_y", "out_xzplane_y",
out_xzplane_y);
} else if (dirs[0]==1 and dirs[1]==2) {
offset[0] = GetGridOffset (cctkGH, m, 1,
- "out%dD_yzplane_xi", "out_yzplane_xi",
- "out%dD_yzplane_x", "out_yzplane_x",
+ "out2D_yzplane_xi", "out_yzplane_xi",
+ "out2D_yzplane_x", "out_yzplane_x",
out_yzplane_x);
} else {
assert (0);
@@ -1006,11 +1050,10 @@ namespace CarpetIOASCII {
// Omit symmetry and ghost zones if requested
- template<int outdim>
- ibbox IOASCII<outdim>::GetOutputBBox (const cGH* const cctkGH,
- const int group,
- const int m, const int c,
- const ibbox& ext)
+ ibbox GetOutputBBox (const cGH* const cctkGH,
+ const int group,
+ const int m, const int c,
+ const ibbox& ext)
{
DECLARE_CCTK_PARAMETERS;
@@ -1074,12 +1117,11 @@ namespace CarpetIOASCII {
// Determine coordinates
- template<int outdim>
- void IOASCII<outdim>::GetCoordinates (const cGH* const cctkGH, const int m,
- const cGroup& groupdata,
- const ibbox& ext,
- CCTK_REAL& coord_time,
- rvect& coord_lower, rvect& coord_upper)
+ void GetCoordinates (const cGH* const cctkGH, const int m,
+ const cGroup& groupdata,
+ const ibbox& ext,
+ CCTK_REAL& coord_time,
+ rvect& coord_lower, rvect& coord_upper)
{
coord_time = cctkGH->cctk_time;
@@ -1108,16 +1150,12 @@ namespace CarpetIOASCII {
- template<int outdim>
- int IOASCII<outdim>
- ::GetGridOffset (const cGH* const cctkGH, const int m, const int dir,
- const char* const itempl, const char* const iglobal,
- const char* const ctempl, const char* const cglobal,
- const CCTK_REAL cfallback)
+ int GetGridOffset (const cGH* const cctkGH, const int m, const int dir,
+ const char* const iparam, const char* const iglobal,
+ const char* const cparam, const char* const cglobal,
+ const CCTK_REAL cfallback)
{
// First choice: explicit coordinate
- char cparam[1000];
- snprintf (cparam, sizeof cparam, ctempl, outdim);
const int ncparam = CCTK_ParameterQueryTimesSet (cparam, CCTK_THORNSTRING);
assert (ncparam >= 0);
if (ncparam > 0) {
@@ -1132,8 +1170,6 @@ namespace CarpetIOASCII {
}
// Second choice: explicit index
- char iparam[1000];
- snprintf (iparam, sizeof iparam, itempl, outdim);
const int niparam = CCTK_ParameterQueryTimesSet (iparam, CCTK_THORNSTRING);
assert (niparam >= 0);
if (niparam > 0) {
@@ -1184,10 +1220,8 @@ namespace CarpetIOASCII {
- template<int outdim>
- int IOASCII<outdim>
- ::CoordToOffset (const cGH* cctkGH, const int m, const int dir,
- const CCTK_REAL coord, const int ifallback)
+ int CoordToOffset (const cGH* cctkGH, const int m, const int dir,
+ const CCTK_REAL coord, const int ifallback)
{
assert (m>=0 and m<Carpet::maps and dir>=1 and dir<=dim);
@@ -1212,59 +1246,6 @@ namespace CarpetIOASCII {
- template<int outdim>
- const char* IOASCII<outdim>
- ::GetStringParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const char* const* const ppval = (const char* const*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- const char* const pval = *ppval;
- assert (ptype == PARAMETER_STRING or ptype == PARAMETER_KEYWORD);
- return pval;
- }
-
-
-
- template<int outdim>
- CCTK_INT IOASCII<outdim>
- ::GetIntParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const CCTK_INT* const ppval
- = (const CCTK_INT*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- assert (ptype == PARAMETER_INT or ptype == PARAMETER_BOOLEAN);
- const CCTK_INT pval = *ppval;
- return pval;
- }
-
-
-
- template<int outdim>
- CCTK_REAL IOASCII<outdim>
- ::GetRealParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const CCTK_REAL* const ppval
- = (const CCTK_REAL*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- assert (ptype == PARAMETER_REAL);
- const CCTK_REAL pval = *ppval;
- return pval;
- }
-
-
-
CCTK_REAL nicelooking (const CCTK_REAL val,
const CCTK_REAL base)
{
@@ -1276,7 +1257,7 @@ namespace CarpetIOASCII {
// Output
template<int outdim>
void WriteASCII (ostream& os,
- vector<const gdata*> const gfdatas,
+ vector<gdata*> const gfdatas,
const bbox<int,dim>& gfext,
const int vi,
const int time,
@@ -1292,228 +1273,196 @@ namespace CarpetIOASCII {
const vect<CCTK_REAL,dim>& coord_upper)
{
DECLARE_CCTK_PARAMETERS;
-
+
assert (outdim<=dim);
+
const int vartype = CCTK_VarTypeI(vi);
-
- bool all_on_root = true;
- for (size_t n=0; n<gfdatas.size(); ++n) {
- all_on_root &= gfdatas.at(n)->proc() == ioproc;
- }
- if (all_on_root) {
- // output on processor 0
-
- if (dist::rank() == ioproc) {
-
- if (CCTK_EQUALS (out_fileinfo, "axis labels") or
- CCTK_EQUALS (out_fileinfo, "all"))
- {
-
- assert (os.good());
-
- os << "# iteration " << time << eol
- << "# refinement level " << rl
- << " multigrid level " << ml
- << " map " << m
- << " component " << c
- << " time level " << tl
- << eol
- << "# column format: 1:it\t2:tl 3:rl 4:c 5:ml";
- int col=6;
- assert (dim>=1 and dim<=3);
- const char* const coords = "xyz";
- for (int d=0; d<dim; ++d) {
- os << (d==0 ? "\t" : " ") << col++ << ":i" << coords[d];
- }
- os << "\t" << col++ << ":time";
+
+ if (CCTK_EQUALS (out_fileinfo, "axis labels") or
+ CCTK_EQUALS (out_fileinfo, "all"))
+ {
+
+ assert (os.good());
+
+ os << "# iteration " << time << eol
+ << "# refinement level " << rl
+ << " multigrid level " << ml
+ << " map " << m
+ << " component " << c
+ << " time level " << tl
+ << eol
+ << "# column format: 1:it\t2:tl 3:rl 4:c 5:ml";
+ int col=6;
+ assert (dim>=1 and dim<=3);
+ const char* const coords = "xyz";
+ for (int d=0; d<dim; ++d) {
+ os << (d==0 ? "\t" : " ") << col++ << ":i" << coords[d];
+ }
+ os << "\t" << col++ << ":time";
+ for (int d=0; d<dim; ++d) {
+ os << (d==0 ? "\t" : " ") << col++ << ":" << coords[d];
+ }
+ os << "\t" << col << ":data" << eol;
+ if (one_file_per_group) {
+ os << "# data columns:";
+ int const gindex = CCTK_GroupIndexFromVarI(vi);
+ int const firstvar = CCTK_FirstVarIndexI(gindex);
+ int const numvars = CCTK_NumVarsInGroupI(gindex);
+ for (int n=firstvar; n<firstvar+numvars; ++n) {
+ os << " " << col << ":" << CCTK_VarName(n);
+ col += CarpetSimpleMPIDatatypeLength (vartype);
+ }
+ os << eol;
+ }
+
+ } // if out_fileinfo
+
+ // boolean that says if we are doing 1D-diagonal output
+ // This is not beautiful, but works for the moment
+ bool const diagonal_output = outdim == 1 and dirs[0] == 3;
+
+ if (not diagonal_output) { // not outputting the diagonal
+
+ const vect<int,outdim> lo = gfext.lower()[dirs];
+ const vect<int,outdim> up = gfext.upper()[dirs];
+ const vect<int,outdim> str = gfext.stride()[dirs];
+ const bbox<int,outdim> ext(lo,up,str);
+
+ // Check whether the output origin is contained in the extent of
+ // the data that should be output
+ ivect org1(org);
+ for (int d=0; d<outdim; ++d) org1[dirs[d]] = ext.lower()[d];
+ if (gfext.contains(org1)) {
+
+ typename bbox<int,outdim>::iterator it=ext.begin();
+ do {
+
+ ivect index(org);
+ for (int d=0; d<outdim; ++d) index[dirs[d]] = (*it)[d];
+ os << time << "\t" << tl << " " << rl << " " << c << " " << ml
+ << "\t";
+ for (int d=0; d<dim-1; ++d) os << index[d] << " ";
+ os << index[dim-1];
+ os << "\t" << coord_time << "\t";
for (int d=0; d<dim; ++d) {
- os << (d==0 ? "\t" : " ") << col++ << ":" << coords[d];
- }
- os << "\t" << col << ":data" << eol;
- if (one_file_per_group) {
- os << "# data columns:";
- int const gindex = CCTK_GroupIndexFromVarI(vi);
- int const firstvar = CCTK_FirstVarIndexI(gindex);
- int const numvars = CCTK_NumVarsInGroupI(gindex);
- for (int n=firstvar; n<firstvar+numvars; ++n) {
- os << " " << col << ":" << CCTK_VarName(n);
- col += CarpetSimpleMPIDatatypeLength (vartype);
+ if (d > 0) os << " ";
+ assert (gfext.upper()[d] - gfext.lower()[d] >= 0);
+ if (gfext.upper()[d] - gfext.lower()[d] == 0) {
+ os << coord_lower[d];
+ } else {
+ CCTK_REAL const dx
+ = ((coord_upper[d] - coord_lower[d])
+ / (gfext.upper()[d] - gfext.lower()[d]));
+ os << (nicelooking
+ (coord_lower[d] + (index[d] - gfext.lower()[d]) * dx,
+ dx * 1.0e-8));
}
- os << eol;
}
-
- } // if out_fileinfo
-
- // boolean that says if we are doing 1D-diagonal output
- // This is not beautiful, but works for the moment
- bool const diagonal_output = outdim == 1 and dirs[0] == 3;
-
- if (not diagonal_output) { // not outputting the diagonal
-
- const vect<int,outdim> lo = gfext.lower()[dirs];
- const vect<int,outdim> up = gfext.upper()[dirs];
- const vect<int,outdim> str = gfext.stride()[dirs];
- const bbox<int,outdim> ext(lo,up,str);
-
- // Check whether the output origin is contained in the extent
- // of the data that should be output
- ivect org1(org);
- for (int d=0; d<outdim; ++d) org1[dirs[d]] = ext.lower()[d];
- if (gfext.contains(org1)) {
-
- typename bbox<int,outdim>::iterator it=ext.begin();
- do {
-
- ivect index(org);
- for (int d=0; d<outdim; ++d) index[dirs[d]] = (*it)[d];
- os << time << "\t" << tl << " " << rl << " " << c << " " << ml
- << "\t";
- for (int d=0; d<dim-1; ++d) os << index[d] << " ";
- os << index[dim-1];
- os << "\t" << coord_time << "\t";
- for (int d=0; d<dim; ++d) {
- if (d > 0) os << " ";
- assert (gfext.upper()[d] - gfext.lower()[d] >= 0);
- if (gfext.upper()[d] - gfext.lower()[d] == 0) {
- os << coord_lower[d];
- } else {
- CCTK_REAL const dx
- = ((coord_upper[d] - coord_lower[d])
- / (gfext.upper()[d] - gfext.lower()[d]));
- os << (nicelooking
- (coord_lower[d] + (index[d] - gfext.lower()[d]) * dx,
- dx * 1.0e-8));
- }
- }
- os << "\t";
- for (size_t n=0; n<gfdatas.size(); ++n) {
- const gdata* gfdata = gfdatas.at(n);
- if (n > 0) os << " ";
- switch (vartype) {
+ os << "\t";
+ for (size_t n=0; n<gfdatas.size(); ++n) {
+ const gdata* gfdata = gfdatas.at(n);
+ if (n > 0) os << " ";
+ switch (vartype) {
#define TYPECASE(N,T) \
- case N: \
- os << (*(const data<T>*)gfdata)[index]; \
- break;
+ case N: \
+ os << (*(const data<T>*)gfdata)[index]; \
+ break;
#include "carpet_typecase.hh"
#undef TYPECASE
- default:
- UnsupportedVarType(vi);
- }
- } // for n
- os << eol;
-
- ++it;
-
- for (int d=0; d<outdim; ++d) {
- if ((*it)[d]!=(*ext.end())[d]) break;
- os << eol;
- }
-
- } while (it!=ext.end());
+ default:
+ UnsupportedVarType(vi);
+ }
+ } // for n
+ os << eol;
- } else {
-
- os << "#" << eol;
-
- } // if not ext contains org
-
- assert (os.good());
-
- } else { // taking care of the diagonal
-
- const vect<int,3> lo = gfext.lower();
- const vect<int,3> up = gfext.upper();
- const vect<int,3> str = gfext.stride();
- const bbox<int,3> ext(lo,up,str);
-
- gh const & hh = *vhh.at(m);
- ibbox const & base = hh.baseextents.at(mglevel).at(reflevel);
-
- assert (base.stride()[0] == base.stride()[1]
- and base.stride()[0] == base.stride()[2]);
+ ++it;
- // output the data on the diagonal
- for (int i=maxval(base.lower());
- i<=minval(base.upper()); i+=base.stride()[0])
- {
-
- ivect const pos = ivect(i,i,i);
-
- // check if the point in question is in our gf's extent
- if(gfext.contains(pos)) {
- os << time << "\t" << tl << " " << rl << " " << c << " " << ml
- << "\t";
- for (int d=0; d<dim-1; ++d) os << pos[d] << " "; os << pos[dim-1];
- os << "\t" << coord_time << "\t";
- for (int d=0; d<dim; ++d) {
- if (d > 0) os << " ";
- CCTK_REAL const dx = ((coord_upper[d] - coord_lower[d])
- / (gfext.upper()[d] - gfext.lower()[d]));
- os << (nicelooking
- (coord_lower[d] + (pos[d] - gfext.lower()[d]) * dx,
- dx * 1.0e-8));
- }
- os << "\t";
- for (size_t n=0; n<gfdatas.size(); ++n) {
- const gdata* gfdata = gfdatas.at(n);
- if (n > 0) os << " ";
- switch (vartype) {
+ for (int d=0; d<outdim; ++d) {
+ if ((*it)[d]!=(*ext.end())[d]) break;
+ os << eol;
+ }
+
+ } while (it!=ext.end());
+
+ } else {
+
+ os << "#" << eol;
+
+ } // if not ext contains org
+
+ assert (os.good());
+
+ } else { // taking care of the diagonal
+
+ const ivect lo = gfext.lower();
+ const ivect up = gfext.upper();
+ const ivect str = gfext.stride();
+ const ibbox ext(lo,up,str);
+
+ gh const & hh = *vhh.at(m);
+ ibbox const & base = hh.baseextents.at(mglevel).at(reflevel);
+
+ assert (base.stride()[0] == base.stride()[1] and
+ base.stride()[0] == base.stride()[2]);
+
+ // output the data on the diagonal
+ for (int i=maxval(base.lower());
+ i<=minval(base.upper()); i+=base.stride()[0])
+ {
+
+ ivect const pos = ivect(i,i,i);
+
+ // check if the point in question is in our gf's extent
+ if(gfext.contains(pos)) {
+ os << time << "\t" << tl << " " << rl << " " << c << " " << ml
+ << "\t";
+ for (int d=0; d<dim-1; ++d) os << pos[d] << " "; os << pos[dim-1];
+ os << "\t" << coord_time << "\t";
+ for (int d=0; d<dim; ++d) {
+ if (d > 0) os << " ";
+ assert (gfext.upper()[d] - gfext.lower()[d] >= 0);
+ if (gfext.upper()[d] - gfext.lower()[d] == 0) {
+ os << coord_lower[d];
+ } else {
+ CCTK_REAL const dx = ((coord_upper[d] - coord_lower[d])
+ / (gfext.upper()[d] - gfext.lower()[d]));
+ os << (nicelooking
+ (coord_lower[d] + (pos[d] - gfext.lower()[d]) * dx,
+ dx * 1.0e-8));
+ }
+ }
+ os << "\t";
+ for (size_t n=0; n<gfdatas.size(); ++n) {
+ const gdata* gfdata = gfdatas.at(n);
+ if (n > 0) os << " ";
+ switch (vartype) {
#define TYPECASE(N,T) \
- case N: \
- os << (*(const data<T>*)gfdata)[pos]; \
- break;
+ case N: \
+ os << (*(const data<T>*)gfdata)[pos]; \
+ break;
#include "carpet_typecase.hh"
#undef TYPECASE
- default:
- UnsupportedVarType(vi);
- }
- } // for n
-
- os << eol;
-
- } else {
-
- os << "#" << eol;
-
- } // if not ext contains org
-
- } // end for loop
+ default:
+ UnsupportedVarType(vi);
+ }
+ } // for n
- os << eol;
+ os << eol;
- assert (os.good());
+ } else {
- } // if(dirs[0]<3)
-
- } // if(dist::...)
- } else {
- // copy to processor 0 and output there
+ os << "#" << eol;
+
+ } // if not ext contains org
+
+ } // end for loop
- mempool pool;
- vector<gdata*> tmps (gfdatas.size());
- for (size_t n=0; n<gfdatas.size(); ++n) {
- tmps.at(n) = gfdatas.at(n)->make_typed (vi, error_centered, op_sync);
- size_t const memsize =
- tmps.at(n)->allocsize (gfdatas.at(n)->extent(), ioproc);
- void * const memptr = pool.alloc (memsize);
- tmps.at(n)->allocate(gfdatas.at(n)->extent(), ioproc, memptr, memsize);
- }
- for (comm_state state; not state.done(); state.step()) {
- for (size_t n=0; n<gfdatas.size(); ++n) {
- tmps.at(n)->copy_from (state, gfdatas.at(n), gfdatas.at(n)->extent());
- }
- }
- vector<const gdata*> ctmps (gfdatas.size());
- for (size_t n=0; n<gfdatas.size(); ++n) {
- ctmps.at(n) = tmps.at(n);
- }
- WriteASCII (os, ctmps, gfext, vi, time, org, dirs, rl, ml, m, c, tl,
- coord_time, coord_lower, coord_upper);
- for (size_t n=0; n<gfdatas.size(); ++n) {
- delete tmps.at(n);
- }
+ os << eol;
- }
+ assert (os.good());
+
+ } // if(dirs[0]<3)
+
}
@@ -1526,7 +1475,7 @@ namespace CarpetIOASCII {
template
void WriteASCII (ostream& os,
- vector<const gdata*> const gfdatas,
+ vector<gdata*> const gfdatas,
const bbox<int,dim>& gfext,
const int vi,
const int time,
@@ -1543,7 +1492,7 @@ namespace CarpetIOASCII {
template
void WriteASCII (ostream& os,
- vector<const gdata*> const gfdatas,
+ vector<gdata*> const gfdatas,
const bbox<int,dim>& gfext,
const int vi,
const int time,
@@ -1560,7 +1509,7 @@ namespace CarpetIOASCII {
template
void WriteASCII (ostream& os,
- vector<const gdata*> const gfdatas,
+ vector<gdata*> const gfdatas,
const bbox<int,dim>& gfext,
const int vi,
const int time,
@@ -1577,7 +1526,7 @@ namespace CarpetIOASCII {
template
void WriteASCII (ostream& os,
- vector<const gdata*> const gfdatas,
+ vector<gdata*> const gfdatas,
const bbox<int,dim>& gfext,
const int vi,
const int time,
diff --git a/Carpet/CarpetIOASCII/src/ioascii.hh b/Carpet/CarpetIOASCII/src/ioascii.hh
index 9713689b9..08b7789d6 100644
--- a/Carpet/CarpetIOASCII/src/ioascii.hh
+++ b/Carpet/CarpetIOASCII/src/ioascii.hh
@@ -9,58 +9,77 @@
namespace CarpetIOASCII {
-
+
using namespace std;
-
-
-
+
+
+
// Scheduled functions
extern "C" {
int CarpetIOASCIIStartup (void);
void CarpetIOASCIIInit (CCTK_ARGUMENTS);
}
-
-
-
+
+
+ // routines which are independent of the output dimension
+ static ibbox GetOutputBBox (const cGH* cctkGH,
+ int group,
+ int m, int c,
+ const ibbox& ext);
+
+ static void GetCoordinates (const cGH* cctkGH, int m,
+ const cGroup& groupdata,
+ const ibbox& ext,
+ CCTK_REAL& coord_time,
+ rvect& coord_lower, rvect& coord_upper);
+
+ static int GetGridOffset (const cGH* cctkGH, int m, int dir,
+ const char* iparam, const char* iglobal,
+ const char* cparam, const char* cglobal,
+ CCTK_REAL cfallback);
+ static int CoordToOffset (const cGH* cctkGH, int m, int dir,
+ CCTK_REAL coord, int ifallback);
+
+
// Everything is a class template, so that it can easily be
// instantiated for all output dimensions
-
+
template<int outdim>
struct IOASCII {
-
+
// name of the output directory
static char* my_out_dir;
-
+
// list of variables to output
static char* my_out_vars;
-
+
// I/O request description list (for all variables)
static vector<ioRequest*> requests;
-
-
-
+
+
+
// Scheduled functions
static int Startup();
-
+
// Registered functions
static void* SetupGH (tFleshConfig* fc, int convLevel, cGH* cctkGH);
-
+
static int OutputGH (const cGH* cctkGH);
static int OutputVarAs (const cGH* cctkGH,
const char* varname, const char* alias);
static int TimeToOutput (const cGH* cctkGH, int vindex);
static int TriggerOutput (const cGH* cctkGH, int vindex);
-
+
// Other functions
static void CheckSteerableParameters (const cGH* cctkGH);
-
+
static bool DidOutput (const cGH* cctkGH,
int vindex,
string basefilename,
bool& is_new_file, bool& truncate_file);
-
+
static bool DirectionIsRequested (const vect<int,outdim>& dirs);
-
+
static void OutputDirection (const cGH* cctkGH,
int vindex,
string alias,
@@ -78,37 +97,15 @@ namespace CarpetIOASCII {
bool is_new_file,
bool truncate_file,
fstream& file);
-
+
static void CloseFile (const cGH* cctkGH,
fstream& file);
-
+
static ivect GetOutputOffset (const cGH* cctkGH, int m,
const vect<int,outdim>& dirs);
-
- static ibbox GetOutputBBox (const cGH* cctkGH,
- int group,
- int m, int c,
- const ibbox& ext);
-
- static void GetCoordinates (const cGH* cctkGH, int m,
- const cGroup& groupdata,
- const ibbox& ext,
- CCTK_REAL& coord_time,
- rvect& coord_lower, rvect& coord_upper);
-
- static int GetGridOffset (const cGH* cctkGH, int m, int dir,
- const char* itempl, const char* iglobal,
- const char* ctempl, const char* cglobal,
- CCTK_REAL cfallback);
- static int CoordToOffset (const cGH* cctkGH, int m, int dir,
- CCTK_REAL coord, int ifallback);
-
- static const char* GetStringParameter (const char* parametertemplate);
- static CCTK_INT GetIntParameter (const char* parametertemplate);
- static CCTK_REAL GetRealParameter (const char* parametertemplate);
-
+
}; // struct IOASCII
-
+
} // namespace CarpetIOASCII
#endif // ! defined CARPETIOASCII_HH
diff --git a/Carpet/CarpetIOASCII/src/make.configuration.deps b/Carpet/CarpetIOASCII/src/make.configuration.deps
index 5bfdf71ba..e2cc0712b 100644
--- a/Carpet/CarpetIOASCII/src/make.configuration.deps
+++ b/Carpet/CarpetIOASCII/src/make.configuration.deps
@@ -4,7 +4,7 @@ CARPETIOASCII_BUILD_DIR = $(BUILD_DIR)/CarpetIOASCII
CARPETIOASCII_SRC_DIR = $(PACKAGE_DIR)/Carpet/CarpetIOASCII/src/util
CARPETIOASCII_CFLAGS = -DCCODE $(CFLAGS)
-CARPETIOASCII_LDFLAGS = $(DEBUG_LD) $(LDFLAGS) $(EXTRAFLAGS)
+CARPETIOASCII_LDFLAGS = $(DEBUG_LD) $(LDFLAGS) $(EXTRAFLAGS) $(GENERAL_LIBRARIES)
# add includes
CARPETIOASCII_CFLAGS += -I$(CONFIG) -I$(BINDINGS_DIR)/include -I$(FLESH_DIR)/include
diff --git a/Carpet/CarpetIOASCII/src/util/Carpet2ygraph.pl b/Carpet/CarpetIOASCII/src/util/Carpet2ygraph.pl
index 29a6a0483..29a6a0483 100755..100644
--- a/Carpet/CarpetIOASCII/src/util/Carpet2ygraph.pl
+++ b/Carpet/CarpetIOASCII/src/util/Carpet2ygraph.pl
diff --git a/Carpet/CarpetIOASCII/src/util/Carpet2ygraphCat.pl b/Carpet/CarpetIOASCII/src/util/Carpet2ygraphCat.pl
index de8ad2626..de8ad2626 100755..100644
--- a/Carpet/CarpetIOASCII/src/util/Carpet2ygraphCat.pl
+++ b/Carpet/CarpetIOASCII/src/util/Carpet2ygraphCat.pl
diff --git a/Carpet/CarpetIOASCII/src/util/mergeCarpetIOASCII.pl b/Carpet/CarpetIOASCII/src/util/mergeCarpetIOASCII.pl
index 6072832b2..6072832b2 100755..100644
--- a/Carpet/CarpetIOASCII/src/util/mergeCarpetIOASCII.pl
+++ b/Carpet/CarpetIOASCII/src/util/mergeCarpetIOASCII.pl
diff --git a/Carpet/CarpetIOBasic/README b/Carpet/CarpetIOBasic/README
index a0b0fa1f2..856666e42 100644
--- a/Carpet/CarpetIOBasic/README
+++ b/Carpet/CarpetIOBasic/README
@@ -1,8 +1,9 @@
Cactus Code Thorn CarpetIOBasic
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides info output for Carpet.
diff --git a/Carpet/CarpetIOHDF5/README b/Carpet/CarpetIOHDF5/README
index 93df6aa4e..21040ec18 100644
--- a/Carpet/CarpetIOHDF5/README
+++ b/Carpet/CarpetIOHDF5/README
@@ -1,8 +1,10 @@
Cactus Code Thorn CarpetIOHDF5
-Authors : Erik Schnetter <schnetter@aei.mpg.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides HDF5 based file I/O for Carpet. See
http://www.hdfgroup.org/HDF5/ for information about HDF5.
diff --git a/Carpet/CarpetIOHDF5/doc/documentation.tex b/Carpet/CarpetIOHDF5/doc/documentation.tex
index 4f449c2fd..dff8e30e2 100644
--- a/Carpet/CarpetIOHDF5/doc/documentation.tex
+++ b/Carpet/CarpetIOHDF5/doc/documentation.tex
@@ -25,7 +25,12 @@
% Do not delete next line
% START CACTUS THORNGUIDE
+\ifx\ThisThorn\undefined
\newcommand{\ThisThorn}{{\it CarpetIOHDF5}}
+\else
+\renewcommand{\ThisThorn}{{\it CarpetIOHDF5}}
+\fi
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{abstract}
diff --git a/Carpet/CarpetIOHDF5/interface.ccl b/Carpet/CarpetIOHDF5/interface.ccl
index a2ef8350e..521e023a9 100644
--- a/Carpet/CarpetIOHDF5/interface.ccl
+++ b/Carpet/CarpetIOHDF5/interface.ccl
@@ -24,6 +24,10 @@ CCTK_INT next_output_iteration TYPE=scalar
CCTK_REAL next_output_time TYPE=scalar
CCTK_INT this_iteration TYPE=scalar
+CCTK_INT last_output_iteration_slice[3] TYPE=scalar
+CCTK_REAL last_output_time_slice[3] TYPE=scalar
+CCTK_INT this_iteration_slice[3] TYPE=scalar
+
CCTK_INT FUNCTION Coord_GroupSystem \
(CCTK_POINTER_TO_CONST IN GH, \
@@ -37,6 +41,16 @@ CCTK_INT FUNCTION \
USES FUNCTION MultiPatch_MapIsCartesian
+# Determine which boundaries are symmetry boundaries
+CCTK_INT FUNCTION \
+ SymmetryTableHandleForGrid (CCTK_POINTER_TO_CONST IN cctkGH)
+REQUIRES FUNCTION SymmetryTableHandleForGrid
+
+CCTK_INT FUNCTION \
+ SymmetryTableHandleForGI (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_INT IN group_index)
+REQUIRES FUNCTION SymmetryTableHandleForGI
+
# Check whether existing output files should be truncated or not
CCTK_INT FUNCTION IO_TruncateOutputFiles \
@@ -53,12 +67,6 @@ FUNCTION UniqueConfigID (CCTK_POINTER_TO_CONST IN cctkGH)
USES FUNCTION UniqueConfigID
# Return a pointer to an unmodifiable C string
-# which contains a unique ID for this source tree
-CCTK_POINTER_TO_CONST \
-FUNCTION UniqueSourceID (CCTK_POINTER_TO_CONST IN cctkGH)
-USES FUNCTION UniqueSourceID
-
-# Return a pointer to an unmodifiable C string
# which contains a unique ID for this build
CCTK_POINTER_TO_CONST \
FUNCTION UniqueBuildID (CCTK_POINTER_TO_CONST IN cctkGH)
diff --git a/Carpet/CarpetIOHDF5/make.configuration.defn b/Carpet/CarpetIOHDF5/make.configuration.defn
new file mode 100644
index 000000000..b2c159945
--- /dev/null
+++ b/Carpet/CarpetIOHDF5/make.configuration.defn
@@ -0,0 +1,2 @@
+# add the Carpet HDF5-to-ASCII converter/slicer
+ALL_UTILS += hdf5toascii_slicer hdf5_slicer
diff --git a/Carpet/CarpetIOHDF5/param.ccl b/Carpet/CarpetIOHDF5/param.ccl
index bbaca928b..cc017adcb 100644
--- a/Carpet/CarpetIOHDF5/param.ccl
+++ b/Carpet/CarpetIOHDF5/param.ccl
@@ -31,6 +31,30 @@ USES STRING recover_dir
USES STRING recover_file
USES STRING filereader_ID_dir
+# 1D slice output
+USES CCTK_INT out_xline_yi
+USES CCTK_INT out_xline_zi
+USES CCTK_INT out_yline_xi
+USES CCTK_INT out_yline_zi
+USES CCTK_INT out_zline_xi
+USES CCTK_INT out_zline_yi
+
+USES CCTK_REAL out_xline_y
+USES CCTK_REAL out_xline_z
+USES CCTK_REAL out_yline_x
+USES CCTK_REAL out_yline_z
+USES CCTK_REAL out_zline_x
+USES CCTK_REAL out_zline_y
+
+# 2D slice output
+USES CCTK_INT out_xyplane_zi
+USES CCTK_INT out_xzplane_yi
+USES CCTK_INT out_yzplane_xi
+
+USES CCTK_REAL out_xyplane_z
+USES CCTK_REAL out_xzplane_y
+USES CCTK_REAL out_yzplane_x
+
shares: Cactus
@@ -46,11 +70,44 @@ STRING out_dir "Name of CarpetIOHDF5 output directory, overrides 'IO::out_dir'"
".+" :: "Not empty: directory name"
} ""
+CCTK_STRING out0D_dir "Name of 0D HDF5 slice output directory, overrides IO::out_dir" STEERABLE = ALWAYS
+{
+ "^$" :: "Empty: use IO::out_dir"
+ ".+" :: "Not empty: directory name"
+} ""
+
+CCTK_STRING out1D_dir "Name of 1D HDF5 slice output directory, overrides IO::out_dir" STEERABLE = ALWAYS
+{
+ "^$" :: "Empty: use IO::out_dir"
+ ".+" :: "Not empty: directory name"
+} ""
+
+CCTK_STRING out2D_dir "Name of 2D HDF5 slice output directory, overrides IO::out_dir" STEERABLE = ALWAYS
+{
+ "^$" :: "Empty: use IO::out_dir"
+ ".+" :: "Not empty: directory name"
+} ""
+
STRING out_vars "Variables to output in CarpetIOHDF5 file format" STEERABLE = ALWAYS
{
"" :: "List of group or variable names"
} ""
+CCTK_STRING out0D_vars "Variables to output in 0D HDF5 file format" STEERABLE = ALWAYS
+{
+ "" :: "List of group or variable names"
+} ""
+
+CCTK_STRING out1D_vars "Variables to output in 1D HDF5 file format" STEERABLE = ALWAYS
+{
+ "" :: "List of group or variable names"
+} ""
+
+CCTK_STRING out2D_vars "Variables to output in 2D HDF5 file format" STEERABLE = ALWAYS
+{
+ "" :: "List of group or variable names"
+} ""
+
STRING out_extension "File extension to use for CarpetIOHDF5 output" STEERABLE = ALWAYS
{
"" :: "File extension (including a leading dot, if desired)"
@@ -65,6 +122,33 @@ KEYWORD out_criterion "Criterion to select CarpetIOHDF5 output intervals, overri
"time" :: "Output every that much coordinate time"
} "default"
+KEYWORD out0D_criterion "Criterion to select 0D HDF5 slice output intervals, overrides out_every" STEERABLE = ALWAYS
+{
+ "default" :: "Use IO::out_criterion"
+ "never" :: "Never output"
+ "iteration" :: "Output every so many iterations"
+ "divisor" :: "Output if iteration mod divisor == 0."
+ "time" :: "Output every that much coordinate time"
+} "default"
+
+KEYWORD out1D_criterion "Criterion to select 1D HDF5 slice output intervals, overrides out_every" STEERABLE = ALWAYS
+{
+ "default" :: "Use IO::out_criterion"
+ "never" :: "Never output"
+ "iteration" :: "Output every so many iterations"
+ "divisor" :: "Output if (iteration % out_every) == 0."
+ "time" :: "Output every that much coordinate time"
+} "default"
+
+KEYWORD out2D_criterion "Criterion to select 2D HDF5 slice output intervals, overrides out_every" STEERABLE = ALWAYS
+{
+ "default" :: "Use IO::out_criterion"
+ "never" :: "Never output"
+ "iteration" :: "Output every so many iterations"
+ "divisor" :: "Output if (iteration % out_every) == 0."
+ "time" :: "Output every that much coordinate time"
+} "default"
+
INT out_every "How often to do CarpetIOHDF5 output, overrides out_every" STEERABLE = ALWAYS
{
1:* :: "Output every so many time steps"
@@ -72,6 +156,27 @@ INT out_every "How often to do CarpetIOHDF5 output, overrides out_every" STEERAB
-2 :: "Use 'IO::out_every'"
} -2
+CCTK_INT out0D_every "How often to do 0D HDF5 slice output, overrides out_every" STEERABLE = ALWAYS
+{
+ 1:* :: "Output every so many time steps"
+ -1:0 :: "No output"
+ -2 :: "Use IO::out_every"
+} -2
+
+CCTK_INT out1D_every "How often to do 1D HDF5 slice output, overrides out_every" STEERABLE = ALWAYS
+{
+ 1:* :: "Output every so many time steps"
+ -1:0 :: "No output"
+ -2 :: "Use IO::out_every"
+} -2
+
+CCTK_INT out2D_every "How often to do 2D HDF5 slice output, overrides out_every" STEERABLE = ALWAYS
+{
+ 1:* :: "Output every so many time steps"
+ -1:0 :: "No output"
+ -2 :: "Use IO::out_every"
+} -2
+
REAL out_dt "How often to do CarpetIOHDF5 output, overrides 'IO::out_dt'" STEERABLE = ALWAYS
{
(0:* :: "In intervals of that much coordinate time"
@@ -80,6 +185,202 @@ REAL out_dt "How often to do CarpetIOHDF5 output, overrides 'IO::out_dt'" STEERA
-2 :: "Default to 'IO::out_dt'"
} -2
+REAL out0D_dt "How often to do 0D HDF5 slice output, overrides IO::out_dt" STEERABLE = ALWAYS
+{
+ (0:* :: "In intervals of that much coordinate time"
+ 0 :: "As often as possible"
+ -1 :: "Disable output"
+ -2 :: "Default to IO::out_dt"
+} -2
+
+REAL out1D_dt "How often to do 1D HDF5 slice output, overrides IO::out_dt" STEERABLE = ALWAYS
+{
+ (0:* :: "In intervals of that much coordinate time"
+ 0 :: "As often as possible"
+ -1 :: "Disable output"
+ -2 :: "Default to IO::out_dt"
+} -2
+
+REAL out2D_dt "How often to do 2D HDF5 slice output, overrides IO::out_dt" STEERABLE = ALWAYS
+{
+ (0:* :: "In intervals of that much coordinate time"
+ 0 :: "As often as possible"
+ -1 :: "Disable output"
+ -2 :: "Default to IO::out_dt"
+} -2
+
+
+############################################################################
+# 0D slice output
+############################################################################
+CCTK_INT out0D_point_xi "x-index (counting from 0) for 0D points" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+CCTK_INT out0D_point_yi "y-index (counting from 0) for 0D points" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+CCTK_INT out0D_point_zi "z-index (counting from 0) for 0D points" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_REAL out0D_point_x "x coordinate for 0D points" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+CCTK_REAL out0D_point_y "y coordinate for 0D points" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+CCTK_REAL out0D_point_z "z coordinate for 0D points" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+
+
+############################################################################
+# 1D slice output
+############################################################################
+BOOLEAN out1D_x "Do 1D HDF5 slice output in the x-direction" STEERABLE = ALWAYS
+{
+} "yes"
+BOOLEAN out1D_y "Do 1D HDF5 slice output in the y-direction" STEERABLE = ALWAYS
+{
+} "yes"
+BOOLEAN out1D_z "Do 1D HDF5 slice output in the z-direction" STEERABLE = ALWAYS
+{
+} "yes"
+
+CCTK_INT out1D_xline_yi "y-index (counting from 0) for 1D lines in x-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+CCTK_INT out1D_xline_zi "z-index (counting from 0) for 1D lines in x-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_INT out1D_yline_xi "x-index (counting from 0) for 1D lines in y-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+CCTK_INT out1D_yline_zi "z-index (counting from 0) for 1D lines in y-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_INT out1D_zline_xi "x-index (counting from 0) for 1D lines in z-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+CCTK_INT out1D_zline_yi "y-index (counting from 0) for 1D lines in z-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_REAL out1D_xline_y "y coordinate for 1D lines in x-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+CCTK_REAL out1D_xline_z "z coordinate for 1D lines in x-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+CCTK_REAL out1D_yline_x "x coordinate for 1D lines in y-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+CCTK_REAL out1D_yline_z "z coordinate for 1D lines in y-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+CCTK_REAL out1D_zline_x "x coordinate for 1D lines in z-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+CCTK_REAL out1D_zline_y "y coordinate for 1D lines in z-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+
+############################################################################
+# 2D slice output
+############################################################################
+BOOLEAN out2D_xy "Do 2D HDF5 slice output in the xy-direction" STEERABLE = ALWAYS
+{
+} "yes"
+BOOLEAN out2D_xz "Do 2D HDF5 slice output in the xz-direction" STEERABLE = ALWAYS
+{
+} "yes"
+BOOLEAN out2D_yz "Do 2D HDF5 slice output in the yz-direction" STEERABLE = ALWAYS
+{
+} "yes"
+
+CCTK_INT out2D_xyplane_zi "z-index (counting from 0) for 2D planes in xy-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_INT out2D_xzplane_yi "y-index (counting from 0) for 2D planes in xz-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_INT out2D_yzplane_xi "x-index (counting from 0) for 2D planes in yz-direction" STEERABLE = ALWAYS
+{
+ 0:* :: ""
+} 0
+
+CCTK_REAL out2D_xyplane_z "z coordinate for 2D planes in xy-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+CCTK_REAL out2D_xzplane_y "y coordinate for 2D planes in xz-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+CCTK_REAL out2D_yzplane_x "x coordinate for 2D planes in yz-direction" STEERABLE = ALWAYS
+{
+ *:* :: ""
+} 0
+
+#######################################################################
+# general slice output parameters
+#######################################################################
+BOOLEAN output_all_timelevels "Output all timelevels instead of only the current" STEERABLE = ALWAYS
+{
+} "no"
+
+BOOLEAN output_symmetry_points "Output symmetry points (assuming that there are nghostzones symmetry points)"
+{
+} "yes"
+
+BOOLEAN out3D_ghosts "Output ghost zones"
+{
+} "yes"
+
+BOOLEAN out3D_outer_ghosts "Output outer boundary zones (assuming that there are nghostzones boundary points)"
+{
+} "yes"
+
+# These parameters are here for historic reasons only.
+# They might go away in the future. Do not use them.
+
+BOOLEAN out1D_d "Do output along the diagonal" STEERABLE = ALWAYS
+{
+} "yes"
+
+#######################################################################
+# checkpoint/recovery
+#######################################################################
BOOLEAN checkpoint "Do checkpointing with CarpetIOHDF5 ?" STEERABLE = ALWAYS
{
} "no"
@@ -110,3 +411,7 @@ INT compression_level "Compression level to use for writing HDF5 data" STEERABLE
{
0:9 :: "Higher numbers compress better, a value of zero disables compression"
} 0
+
+BOOLEAN use_checksums "Use checksums for the HDF5 data" STEERABLE = ALWAYS
+{
+} "no"
diff --git a/Carpet/CarpetIOHDF5/schedule.ccl b/Carpet/CarpetIOHDF5/schedule.ccl
index c08126887..0caa9f202 100644
--- a/Carpet/CarpetIOHDF5/schedule.ccl
+++ b/Carpet/CarpetIOHDF5/schedule.ccl
@@ -1,6 +1,7 @@
# Schedule definitions for thorn CarpetIOHDF5
storage: next_output_iteration next_output_time this_iteration
+storage: last_output_iteration_slice last_output_time_slice this_iteration_slice
schedule CarpetIOHDF5_Startup at STARTUP after IOUtil_Startup
{
diff --git a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.cc b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.cc
index b9bf36307..e34204c3c 100644
--- a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.cc
+++ b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.cc
@@ -57,9 +57,6 @@ static void GetVarIndex (int vindex, const char* optstring, void* arg);
static void CheckSteerableParameters (const cGH *const cctkGH,
CarpetIOHDF5GH *myGH);
-static int WriteMetadata (const cGH *cctkGH, int nioprocs,
- int firstvar, int numvars,
- bool called_from_checkpoint, hid_t file);
static int WriteAttribute (hid_t const group,
char const * const name,
@@ -98,6 +95,10 @@ int CarpetIOHDF5_Startup (void)
const int GHExtension = CCTK_RegisterGHExtension (CCTK_THORNSTRING);
CCTK_RegisterGHExtensionSetupGH (GHExtension, SetupGH);
+ IOHDF5<0>::Startup();
+ IOHDF5<1>::Startup();
+ IOHDF5<2>::Startup();
+
return (0);
}
@@ -110,6 +111,12 @@ void CarpetIOHDF5_Init (CCTK_ARGUMENTS)
*next_output_iteration = 0;
*next_output_time = cctk_time;
+ for (int d=0; d<3; ++d) {
+ this_iteration_slice[d] = 0;
+ last_output_iteration_slice[d] = 0;
+ last_output_time_slice[d] = cctk_time;
+ }
+
last_checkpoint_iteration = cctk_iteration;
last_checkpoint_walltime = CCTK_RunTime() / 3600.0;
}
@@ -271,6 +278,29 @@ hid_t CCTKtoHDF5_Datatype (const cGH* const cctkGH,
}
+// add attributes to an HDF5 slice dataset
+int AddSliceAttributes(const cGH* const cctkGH,
+ const char* const fullname,
+ const int refinementlevel,
+ const vector<double>& origin,
+ const vector<double>& delta,
+ const vector<int>& iorigin,
+ hid_t& dataset)
+{
+ int error_count = 0;
+
+ error_count += WriteAttribute(dataset, "time", cctkGH->cctk_time);
+ error_count += WriteAttribute(dataset, "timestep", cctkGH->cctk_iteration);
+ error_count += WriteAttribute(dataset, "name", fullname);
+ error_count += WriteAttribute(dataset, "level", refinementlevel);
+ error_count += WriteAttribute(dataset, "origin", &origin[0], origin.size());
+ error_count += WriteAttribute(dataset, "delta", &delta[0], delta.size());
+ error_count += WriteAttribute(dataset, "iorigin", &iorigin[0], iorigin.size());
+
+ return error_count;
+}
+
+
//////////////////////////////////////////////////////////////////////////////
// private routines
//////////////////////////////////////////////////////////////////////////////
@@ -422,20 +452,18 @@ static void CheckSteerableParameters (const cGH *const cctkGH,
// notify the user about the new setting
if (not CCTK_Equals (verbose, "none")) {
int count = 0;
- string msg ("Periodic HDF5 output requested for '");
- for (int i = CCTK_NumVars () - 1; i >= 0; i--) {
- if (myGH->requests[i]) {
- if (count++) {
- msg += "', '";
- }
- char *fullname = CCTK_FullName (i);
- msg += fullname;
+ ostringstream msg;
+ msg << "Periodic scalar output requested for:";
+ for (int vi=0; vi<CCTK_NumVars(); ++vi) {
+ if (myGH->requests[vi]) {
+ ++count;
+ char* const fullname = CCTK_FullName(vi);
+ msg << eol << " " << fullname;
free (fullname);
}
}
- if (count) {
- msg += "'";
- CCTK_INFO (msg.c_str());
+ if (count > 0) {
+ CCTK_INFO (msg.str().c_str());
}
}
@@ -756,7 +784,7 @@ static int OutputVarAs (const cGH* const cctkGH, const char* const fullname,
CCTK_REAL local[2], global[2];
local[0] = io_files;
local[1] = io_bytes;
- MPI_Allreduce (local, global, 2, dist::datatype (local[0]), MPI_SUM, dist::comm());
+ MPI_Allreduce (local, global, 2, dist::mpi_datatype (local[0]), MPI_SUM, dist::comm());
io_files = global[0];
io_bytes = global[1];
}
@@ -910,7 +938,7 @@ static void Checkpoint (const cGH* const cctkGH, int called_from)
CCTK_REAL local[2], global[2];
local[0] = io_files;
local[1] = io_bytes;
- MPI_Allreduce (local, global, 2, dist::datatype (local[0]), MPI_SUM, dist::comm());
+ MPI_Allreduce (local, global, 2, dist::mpi_datatype (local[0]), MPI_SUM, dist::comm());
io_files = global[0];
io_bytes = global[1];
}
@@ -1001,9 +1029,9 @@ static void Checkpoint (const cGH* const cctkGH, int called_from)
} // Checkpoint
-static int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
- int const firstvar, int const numvars,
- bool const called_from_checkpoint, hid_t const file)
+int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
+ int const firstvar, int const numvars,
+ bool const called_from_checkpoint, hid_t const file)
{
DECLARE_CCTK_PARAMETERS;
hid_t group;
@@ -1048,12 +1076,6 @@ static int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
(group, "config id", static_cast<char const *> (UniqueConfigID (cctkGH)));
}
- // Unique source tree identifier
- if (CCTK_IsFunctionAliased ("UniqueSourceID")) {
- error_count += WriteAttribute
- (group, "source id", static_cast<char const *> (UniqueSourceID (cctkGH)));
- }
-
// unique build identifier
if (CCTK_IsFunctionAliased ("UniqueBuildID")) {
error_count += WriteAttribute
@@ -1142,9 +1164,11 @@ static int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
// Save grid structure
if (called_from_checkpoint or not CCTK_Equals (out_save_parameters, "no")) {
+ vector <vector <vector <region_t> > > grid_superstructure (maps);
vector <vector <vector <region_t> > > grid_structure (maps);
vector <vector <vector <CCTK_REAL> > > grid_times (maps);
for (int m = 0; m < maps; ++ m) {
+ grid_superstructure.at(m) = vhh.at(m)->superregions;
grid_structure.at(m) = vhh.at(m)->regions.at(0);
grid_times.at(m).resize(mglevels);
for (int ml = 0; ml < mglevels; ++ ml) {
@@ -1155,6 +1179,12 @@ static int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
}
}
ostringstream gs_buf;
+ // We could write this information only into one of the checkpoint
+ // files (to save space), or write it into a separate metadata
+ // file
+ gs_buf << grid_superstructure;
+ // We could omit the grid structure (to save space), or write it
+ // only into one of the checkpoint files
gs_buf << grid_structure;
gs_buf << grid_times;
gs_buf << leveltimes;
diff --git a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
index 3d03939c0..f31be614c 100644
--- a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
+++ b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
@@ -4,6 +4,8 @@
#define H5_USE_16_API 1
#include <hdf5.h>
+#include <vector>
+
#include "cctk_Arguments.h"
#include "CactusBase/IOUtil/src/ioutil_Utils.h"
#include "carpet.hh"
@@ -15,7 +17,7 @@
// some macros for HDF5 group names
#define METADATA_GROUP "Parameters and Global Attributes"
#define ALL_PARAMETERS "All Parameters"
-#define GRID_STRUCTURE "Grid Structure"
+#define GRID_STRUCTURE "Grid Structure v2"
// atomic HDF5 datatypes for the generic CCTK datatypes
// (the one for CCTK_COMPLEX is created at startup as a compound HDF5 datatype)
@@ -56,6 +58,16 @@
} while (0)
+// datatype of the start[] parameter in a call to H5Sselect_hyperslab()
+// (the HDF5 API has changed in this respect after version 1.6.3)
+#if (H5_VERS_MAJOR == 1 && \
+ (H5_VERS_MINOR < 6 || (H5_VERS_MINOR == 6 && H5_VERS_RELEASE < 4)))
+#define slice_start_size_t hssize_t
+#else
+#define slice_start_size_t hsize_t
+#endif
+
+
// CarpetIOHDF5 GH extension structure
typedef struct
{
@@ -114,11 +126,106 @@ namespace CarpetIOHDF5
const ioRequest* const request,
bool called_from_checkpoint);
+ int WriteMetadata (const cGH * const cctkGH, int const nioprocs,
+ int const firstvar, int const numvars,
+ bool const called_from_checkpoint, hid_t const file);
+
+ int AddSliceAttributes(const cGH* const cctkGH,
+ const char* const fullname,
+ const int refinementlevel,
+ const vector<double>& origin,
+ const vector<double>& delta,
+ const vector<int>& iorigin,
+ hid_t& dataset);
+
// returns an HDF5 datatype corresponding to the given CCTK datatype
hid_t CCTKtoHDF5_Datatype (const cGH* const cctkGH,
int cctk_type,
bool single_precision);
+
+ // Everything is a class template, so that it can easily be
+ // instantiated for all output dimensions
+
+ template<int outdim>
+ struct IOHDF5 {
+
+ // name of the output directory
+ static char* my_out_slice_dir;
+
+ // list of variables to output
+ static char* my_out_slice_vars;
+
+ // I/O request description list (for all variables)
+ static vector<ioRequest*> slice_requests;
+
+
+
+ // Scheduled functions
+ static int Startup();
+
+ // Registered functions
+ static void* SetupGH (tFleshConfig* fc, int convLevel, cGH* cctkGH);
+
+ static int OutputGH (const cGH* cctkGH);
+ static int OutputVarAs (const cGH* cctkGH,
+ const char* varname, const char* alias);
+ static int TimeToOutput (const cGH* cctkGH, int vindex);
+ static int TriggerOutput (const cGH* cctkGH, int vindex);
+
+ // Other functions
+ static void CheckSteerableParameters (const cGH* cctkGH);
+
+ static bool DidOutput (const cGH* cctkGH,
+ int vindex,
+ string basefilename,
+ bool& is_new_file, bool& truncate_file);
+
+ static bool DirectionIsRequested (const vect<int,outdim>& dirs);
+
+ static void OutputDirection (const cGH* cctkGH,
+ int vindex,
+ string alias,
+ string basefilename,
+ const vect<int,outdim>& dirs,
+ bool is_new_file,
+ bool truncate_file);
+
+ static int OpenFile (const cGH* cctkGH,
+ int m,
+ int vindex,
+ int numvars,
+ string alias,
+ string basefilename,
+ const vect<int,outdim>& dirs,
+ bool is_new_file,
+ bool truncate_file,
+ hid_t& file);
+
+ static int WriteHDF5 (const cGH* cctkGH,
+ hid_t& file,
+ vector<gdata*> const gfdatas,
+ const bbox<int,dim>& gfext,
+ const int vi,
+ const vect<int,dim>& org,
+ const vect<int,outdim>& dirs,
+ const int rl,
+ const int ml,
+ const int m,
+ const int c,
+ const int tl,
+ const CCTK_REAL coord_time,
+ const vect<CCTK_REAL,dim>& coord_lower,
+ const vect<CCTK_REAL,dim>& coord_upper);
+
+ static int CloseFile (const cGH* cctkGH,
+ hid_t& file);
+
+ static ivect GetOutputOffset (const cGH* cctkGH, int m,
+ const vect<int,outdim>& dirs);
+
+ }; // struct IOHDF5
+
// scheduled routines (must be declared as C according to schedule.ccl)
extern "C" {
diff --git a/Carpet/CarpetIOHDF5/src/Input.cc b/Carpet/CarpetIOHDF5/src/Input.cc
index 738e78ad0..c89cb652e 100644
--- a/Carpet/CarpetIOHDF5/src/Input.cc
+++ b/Carpet/CarpetIOHDF5/src/Input.cc
@@ -60,6 +60,7 @@ typedef struct {
double delta_time;
vector<double> mgleveltimes; // [num_mglevels*num_reflevels]
+ vector<vector<vector<region_t> > > grid_superstructure; // [map][reflevel][component]
vector<vector<vector<region_t> > > grid_structure; // [map][reflevel][component]
vector<vector<vector<CCTK_REAL> > > grid_times; // [map][mglevel][reflevel]
vector<vector<CCTK_REAL> > leveltimes; // [mglevel][reflevel]
@@ -100,10 +101,15 @@ int CarpetIOHDF5_RecoverParameters ()
//////////////////////////////////////////////////////////////////////////////
void CarpetIOHDF5_RecoverGridStructure (CCTK_ARGUMENTS)
{
+ DECLARE_CCTK_PARAMETERS;
DECLARE_CCTK_ARGUMENTS;
fileset_t & fileset = * filesets.begin();
+ if (not CCTK_Equals (verbose, "none")) {
+ CCTK_INFO ("recovering grid structure");
+ }
+
// Abort with an error if there is no grid structure in the
// checkpoint file, or if the number of maps is wrong
if (fileset.grid_structure.empty()) {
@@ -115,7 +121,7 @@ void CarpetIOHDF5_RecoverGridStructure (CCTK_ARGUMENTS)
int(fileset.grid_structure.size()), maps);
}
- vector<vector<vector<region_t> > > superregsss = fileset.grid_structure;
+ vector<vector<vector<region_t> > > superregsss = fileset.grid_superstructure;
vector<vector<vector<vector<region_t> > > > regssss (maps);
int type;
@@ -184,7 +190,7 @@ void CarpetIOHDF5_RecoverGridStructure (CCTK_ARGUMENTS)
for (int m = 0; m < maps; ++ m) {
// Regrid
- RegridMap (cctkGH, m, superregsss.at(m), regssss.at(m));
+ RegridMap (cctkGH, m, superregsss.at(m), regssss.at(m), false);
// Set time hierarchy correctly after RegridMap created it
for (int ml = 0; ml < mglevels; ++ ml) {
@@ -199,10 +205,12 @@ void CarpetIOHDF5_RecoverGridStructure (CCTK_ARGUMENTS)
// Set level times correctly after PostRegrid created them
leveltimes = fileset.leveltimes;
-
+
for (int rl = 0; rl < reflevels; ++ rl) {
Recompose (cctkGH, rl, false);
}
+
+ RegridFree (cctkGH, false);
}
//////////////////////////////////////////////////////////////////////////////
@@ -384,16 +392,26 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
for (unsigned int gindex = 0; gindex < group_bboxes.size(); gindex++) {
group_bboxes[gindex].resize (maps);
const int grouptype = CCTK_GroupTypeI (gindex);
- BEGIN_MAP_LOOP (cctkGH, grouptype) {
- struct arrdesc& data = arrdata.at(gindex).at(Carpet::map);
-
- BEGIN_LOCAL_COMPONENT_LOOP (cctkGH, grouptype) {
- if (grouptype == CCTK_GF or (mglevel == 0 and reflevel == 0)) {
- group_bboxes[gindex][Carpet::map] |=
- data.dd->boxes.at(mglevel).at(reflevel).at(component).exterior;
+ if (grouptype == CCTK_GF) {
+ for (int m=0; m<maps; ++m) {
+ struct arrdesc& data = arrdata.at(gindex).at(m);
+ for (int lc=0; lc<data.hh->local_components(reflevel); ++lc) {
+ int const c = data.hh->get_component(reflevel,lc);
+ group_bboxes[gindex][m] |=
+ data.dd->boxes.at(mglevel).at(reflevel).at(c).exterior;
}
- } END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ group_bboxes[gindex][m].normalize();
+ }
+ } else {
+ if (mglevel==0 and reflevel==0) {
+ int const m=0;
+ struct arrdesc& data = arrdata.at(gindex).at(m);
+ int const c=dist::rank();
+ group_bboxes[gindex][m] |=
+ data.dd->boxes.at(mglevel).at(reflevel).at(c).exterior;
+ group_bboxes[gindex][m].normalize();
+ }
+ }
}
// mark variables in groups with no grid points (size 0) as already done
@@ -513,9 +531,10 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
// actually read the patch
if (not read_completely.at(patch->vindex).at(patch->timelevel)) {
- ReadVar (cctkGH, file.file, io_bytes, patch,
- bboxes_read.at(patch->vindex).at(patch->timelevel),
- in_recovery);
+ error_count +=
+ ReadVar (cctkGH, file.file, io_bytes, patch,
+ bboxes_read.at(patch->vindex).at(patch->timelevel),
+ in_recovery);
// update the read_completely entry
const int gindex = CCTK_GroupIndexFromVarI (patch->vindex);
@@ -563,6 +582,10 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
(ioUtilGH->do_inVars and ioUtilGH->do_inVars[vindex])) {
continue;
}
+ if (called_from == FILEREADER_DATA and tl > 0) {
+ // file reader reads only timelevel 0
+ continue;
+ }
if (not read_completely[vindex][tl]) {
// check if the variable has been read partially
@@ -578,14 +601,28 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
"(variable has option tag \"CHECKPOINT = 'no'\")",
fullname, tl);
} else {
- CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
- "variable '%s' timelevel %d has not been read",
- fullname, tl);
+ // TODO: With the file reader, the files are read
+ // sequentially, and each file contains only some of the
+ // variables. The warning below is emitted for all files,
+ // even those which don't contain the variable. This
+ // makes this warning useless, so we omit it when called
+ // for the file reader.
+ if (called_from != FILEREADER_DATA) {
+ CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "variable '%s' timelevel %d has not been read",
+ fullname, tl);
+ }
}
} else {
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"variable '%s' timelevel %d has been read only partially",
fullname, tl);
+ // for (int m = 0; m < maps; m++) {
+ // bboxes_read[vindex][tl][m].normalize();
+ // const int gindex = CCTK_GroupIndexFromVarI (vindex);
+ // cout << "Need: " << group_bboxes[gindex][m] << endl;
+ // cout << "Read: " << bboxes_read[vindex][tl][m] << endl;
+ // }
num_incomplete++;
}
free (fullname);
@@ -593,6 +630,8 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
}
}
if (num_incomplete) {
+ // cout.flush();
+ // cerr.flush();
CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
"%d variables on mglevel %d reflevel %d have been read "
"only partially", num_incomplete, mglevel, reflevel);
@@ -602,7 +641,7 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
CCTK_REAL local[2], global[2];
local[0] = io_files;
local[1] = io_bytes;
- MPI_Allreduce (local, global, 2, dist::datatype (local[0]), MPI_SUM, dist::comm());
+ MPI_Allreduce (local, global, 2, dist::mpi_datatype (local[0]), MPI_SUM, dist::comm());
io_files = global[0];
io_bytes = global[1];
}
@@ -645,6 +684,9 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
}
}
}
+ if (error_count and abort_on_io_errors) {
+ CCTK_WARN(0, "Found errors while trying to restart from checkpoint, aborting.");
+ }
if (in_recovery and not CCTK_Equals (verbose, "none")) {
CCTK_VInfo (CCTK_THORNSTRING,
@@ -831,6 +873,7 @@ static void ReadMetadata (fileset_t& fileset, hid_t file)
H5P_DEFAULT, &gs_cstr.front()));
HDF5_ERROR (H5Dclose (dataset));
istringstream gs_buf (&gs_cstr.front());
+ gs_buf >> fileset.grid_superstructure;
gs_buf >> fileset.grid_structure;
gs_buf >> fileset.grid_times;
gs_buf >> fileset.leveltimes;
@@ -975,7 +1018,7 @@ static int ReadVar (const cGH* const cctkGH,
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
"Cannot input variable '%s' (no storage)", fullname);
free (fullname);
- return 0;
+ return 1;
}
// filereader reads the current timelevel
@@ -999,7 +1042,10 @@ static int ReadVar (const cGH* const cctkGH,
// Traverse all local components on all maps
hid_t filespace = -1, dataset = -1;
- BEGIN_MAP_LOOP (cctkGH, group.grouptype) {
+ hid_t xfer = H5P_DEFAULT;
+ H5Z_EDC_t checksums = H5Z_NO_EDC;
+
+ BEGIN_LOCAL_MAP_LOOP (cctkGH, group.grouptype) {
// skip this dataset if it belongs to another map
if (group.grouptype == CCTK_GF and patch->map != Carpet::map) {
@@ -1023,8 +1069,10 @@ static int ReadVar (const cGH* const cctkGH,
upper[patch->rank-1] = newupper;
}
const ibbox filebox(lower, upper, stride);
+ // cout << "Found in file: " << filebox << endl;
- ibbox& interior_membox =
+#if 0
+ const ibbox& interior_membox =
data.dd->boxes.at(mglevel).at(reflevel).at(component).interior;
// skip this dataset if it doesn't overlap with this component's interior
@@ -1032,6 +1080,19 @@ static int ReadVar (const cGH* const cctkGH,
if (interior_overlap.empty()) {
continue;
}
+#endif
+ const ibbox& exterior_membox =
+ data.dd->boxes.at(mglevel).at(reflevel).at(component).exterior;
+
+ // skip this dataset if it doesn't overlap with this component's
+ // exterior, or if it only reads what has already been read
+ const ibbox exterior_overlap = exterior_membox & filebox;
+ const ibset exterior_overlaps =
+ exterior_overlap - bboxes_read.at(Carpet::map);
+ if (exterior_overlaps.empty()) {
+ // cout << "Skipping this bbox" << endl;
+ continue;
+ }
if (CCTK_Equals (verbose, "full")) {
char *fullname = CCTK_FullName (patch->vindex);
@@ -1041,21 +1102,19 @@ static int ReadVar (const cGH* const cctkGH,
}
// get the overlap with this component's exterior
- ibbox& membox =
+ const ibbox& membox =
data.dd->boxes.at(mglevel).at(reflevel).at(component).exterior;
const ibbox overlap = membox & filebox;
+ // cout << "Overlap: " << overlap << endl;
bboxes_read.at(Carpet::map) |= overlap;
+ bboxes_read.at(Carpet::map).normalize();
+ // cout << "New read: " << bboxes_read.at(Carpet::map) << endl;
// calculate hyperslab selection parameters
// before HDF5-1.6.4 the H5Sselect_hyperslab() function expected
// the 'start' argument to be of type 'hssize_t'
-#if (H5_VERS_MAJOR == 1 && \
- (H5_VERS_MINOR < 6 || (H5_VERS_MINOR == 6 && H5_VERS_RELEASE < 4)))
- hssize_t memorigin[dim], fileorigin[dim];
-#else
- hsize_t memorigin[dim], fileorigin[dim];
-#endif
+ slice_start_size_t memorigin[dim], fileorigin[dim];
hsize_t memdims[dim], count[dim];
for (int i = 0; i < patch->rank; i++) {
memdims[patch->rank-i-1] =
@@ -1073,6 +1132,14 @@ static int ReadVar (const cGH* const cctkGH,
if (dataset < 0) {
HDF5_ERROR (dataset = H5Dopen (file, patch->patchname.c_str()));
HDF5_ERROR (filespace = H5Dget_space (dataset));
+ xfer = H5Pcreate (H5P_DATASET_XFER);
+ checksums = H5Pget_edc_check (xfer);
+ if (use_checksums && (checksums == H5Z_DISABLE_EDC))
+ CCTK_WARN(1, "Checksums not enabled in HDF5 library, but "
+ "requested in parameter, reading data without "
+ "tests on checksums.");
+ if (!use_checksums && (checksums == H5Z_ENABLE_EDC))
+ H5Pset_edc_check(xfer, H5Z_DISABLE_EDC);
}
// read the hyperslab
@@ -1082,7 +1149,7 @@ static int ReadVar (const cGH* const cctkGH,
NULL, count, NULL));
HDF5_ERROR (H5Sselect_hyperslab (memspace, H5S_SELECT_SET, memorigin,
NULL, count, NULL));
- HDF5_ERROR (H5Dread (dataset, datatype, memspace, filespace, H5P_DEFAULT,
+ HDF5_ERROR (H5Dread (dataset, datatype, memspace, filespace, xfer,
cctkGH->data[patch->vindex][timelevel]));
hid_t datatype;
HDF5_ERROR (datatype = H5Dget_type (dataset));
@@ -1098,14 +1165,14 @@ static int ReadVar (const cGH* const cctkGH,
/ (delta_time * mglevelfact)) );
}
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
if (dataset >= 0) {
HDF5_ERROR (H5Dclose (dataset));
HDF5_ERROR (H5Sclose (filespace));
}
- return 1;
+ return error_count;
}
} // namespace CarpetIOHDF5
diff --git a/Carpet/CarpetIOHDF5/src/Output.cc b/Carpet/CarpetIOHDF5/src/Output.cc
index 675c51bc6..62f9d9778 100644
--- a/Carpet/CarpetIOHDF5/src/Output.cc
+++ b/Carpet/CarpetIOHDF5/src/Output.cc
@@ -72,18 +72,25 @@ int WriteVarUnchunked (const cGH* const cctkGH,
BEGIN_MAP_LOOP (cctkGH, group.grouptype) {
// Collect the set of all components' bboxes
ibset bboxes;
- BEGIN_COMPONENT_LOOP (cctkGH, group.grouptype) {
+ for (int c=0; c<arrdata.at(gindex).at(Carpet::map).hh->components(refinementlevel); ++c) {
// Using "interior" removes ghost zones and refinement boundaries.
+#if 0
bboxes += arrdata.at(gindex).at(Carpet::map).dd->
- boxes.at(mglevel).at(refinementlevel).at(component).interior;
- } END_COMPONENT_LOOP;
+ boxes.at(mglevel).at(refinementlevel).at(c).interior;
+#endif
+ bboxes += arrdata.at(gindex).at(Carpet::map).dd->
+ boxes.at(mglevel).at(refinementlevel).at(c).exterior;
+ }
// Normalise the set, i.e., try to represent the set with fewer bboxes.
- //
+ bboxes.normalize();
+
+#if 0
// According to Cactus conventions, DISTRIB=CONSTANT arrays
// (including grid scalars) are assumed to be the same on all
// processors and are therefore stored only by processor 0.
- if (group.disttype != CCTK_DISTRIB_CONSTANT) bboxes.normalize();
+ if (group.disttype != CCTK_DISTRIB_CONSTANT);
+#endif
// Loop over all components in the bbox set
int bbox_id = 0;
@@ -150,6 +157,11 @@ int WriteVarUnchunked (const cGH* const cctkGH,
HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
HDF5_ERROR (H5Pset_deflate (plist, compression_lvl));
}
+ // enable checksums if requested
+ if (use_checksums) {
+ HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
+ HDF5_ERROR (H5Pset_filter (plist, H5Z_FILTER_FLETCHER32, 0, 0, NULL));
+ }
HDF5_ERROR (dataset = H5Dcreate (outfile, datasetname.str().c_str(),
filedatatype, dataspace, plist));
HDF5_ERROR (H5Pclose (plist));
@@ -160,24 +172,33 @@ int WriteVarUnchunked (const cGH* const cctkGH,
BEGIN_COMPONENT_LOOP (cctkGH, group.grouptype) {
// Get the intersection of the current component with this combination
// (use either the interior or exterior here, as we did above)
+ gh const * const hh = arrdata.at(gindex).at(Carpet::map).hh;
+ dh const * const dd = arrdata.at(gindex).at(Carpet::map).dd;
+#if 0
ibbox const overlap = *bbox &
- arrdata.at(gindex).at(Carpet::map).dd->
- boxes.at(mglevel).at(refinementlevel).at(component).interior;
+ dd->boxes.at(mglevel).at(refinementlevel).at(component).interior;
+#endif
+ ibbox const overlap = *bbox &
+ dd->boxes.at(mglevel).at(refinementlevel).at(component).exterior;
// Continue if this component is not part of this combination
if (overlap.empty()) continue;
// Copy the overlap to the local processor
const ggf* ff = arrdata.at(gindex).at(Carpet::map).data.at(var);
- const gdata* const data = (*ff) (request->timelevel,
- refinementlevel,
- component, mglevel);
+ const gdata* const data =
+ local_component >= 0
+ ? (*ff) (request->timelevel, refinementlevel,
+ local_component, mglevel)
+ : NULL;
+ // TODO: This does not work; data may be NULL
gdata* const processor_component =
data->make_typed (request->vindex, error_centered, op_sync);
processor_component->allocate (overlap, 0);
for (comm_state state; not state.done(); state.step()) {
- processor_component->copy_from (state, data, overlap);
+ int const p = hh->processor(refinementlevel,component);
+ processor_component->copy_from (state, data, overlap, 0, p);
}
// Write data
@@ -207,12 +228,7 @@ int WriteVarUnchunked (const cGH* const cctkGH,
// before HDF5-1.6.4 the H5Sselect_hyperslab() function expected
// the 'start' argument to be of type 'hssize_t'
-#if (H5_VERS_MAJOR == 1 && \
- (H5_VERS_MINOR < 6 || (H5_VERS_MINOR == 6 && H5_VERS_RELEASE < 4)))
- hssize_t overlaporigin[dim];
-#else
- hsize_t overlaporigin[dim];
-#endif
+ slice_start_size_t overlaporigin[dim];
for (int d = 0; d < group.dim; ++d) {
assert (group.dim-1-d>=0 and group.dim-1-d<dim);
overlaporigin[group.dim-1-d] =
@@ -321,8 +337,10 @@ int WriteVarChunkedSequential (const cGH* const cctkGH,
BEGIN_MAP_LOOP (cctkGH, group.grouptype) {
BEGIN_COMPONENT_LOOP (cctkGH, group.grouptype) {
// Using "exterior" includes ghost zones and refinement boundaries.
- ibbox& bbox = arrdata.at(gindex).at(Carpet::map).dd->
- boxes.at(mglevel).at(refinementlevel).at(component).exterior;
+ gh const * const hh = arrdata.at(gindex).at(Carpet::map).hh;
+ dh const * const dd = arrdata.at(gindex).at(Carpet::map).dd;
+ ibbox const& bbox =
+ dd->boxes.at(mglevel).at(refinementlevel).at(component).exterior;
// Get the shape of the HDF5 dataset (in Fortran index order)
hsize_t shape[dim];
@@ -338,14 +356,19 @@ int WriteVarChunkedSequential (const cGH* const cctkGH,
// Copy the overlap to the local processor
const ggf* ff = arrdata.at(gindex).at(Carpet::map).data.at(var);
- const gdata* const data = (*ff) (request->timelevel, refinementlevel,
- component, mglevel);
+ const gdata* const data =
+ local_component >= 0
+ ? (*ff) (request->timelevel, refinementlevel,
+ local_component, mglevel)
+ : NULL;
+ // TODO: This does not work; data may be NULL
gdata* const processor_component =
- data->make_typed (request->vindex,error_centered, op_sync);
+ data->make_typed (request->vindex, error_centered, op_sync);
processor_component->allocate (bbox, 0);
for (comm_state state; not state.done(); state.step()) {
- processor_component->copy_from (state, data, bbox);
+ int const p = hh->processor(refinementlevel,component);
+ processor_component->copy_from (state, data, bbox, 0, p);
}
// Write data on I/O processor 0
@@ -412,6 +435,11 @@ int WriteVarChunkedSequential (const cGH* const cctkGH,
HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
HDF5_ERROR (H5Pset_deflate (plist, compression_lvl));
}
+ // enable checksums if requested
+ if (use_checksums) {
+ HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
+ HDF5_ERROR (H5Pset_filter (plist, H5Z_FILTER_FLETCHER32, 0, 0, NULL));
+ }
HDF5_ERROR (dataspace = H5Screate_simple (group.dim, shape, NULL));
HDF5_ERROR (dataset = H5Dcreate (outfile, datasetname.str().c_str(),
filedatatype, dataspace, plist));
@@ -479,13 +507,17 @@ int WriteVarChunkedParallel (const cGH* const cctkGH,
out_single_precision and not called_from_checkpoint));
// Traverse all maps
- BEGIN_MAP_LOOP (cctkGH, group.grouptype) {
+ BEGIN_LOCAL_MAP_LOOP (cctkGH, group.grouptype) {
BEGIN_LOCAL_COMPONENT_LOOP (cctkGH, group.grouptype) {
- const ggf* ff = arrdata.at(gindex).at(Carpet::map).data.at(var);
- const ibbox& bbox = (*ff) (request->timelevel, refinementlevel,
- group.disttype == CCTK_DISTRIB_CONSTANT ?
- 0 : component, mglevel)->extent();
+ // const ggf* ff = arrdata.at(gindex).at(Carpet::map).data.at(var);
+ // const ibbox& bbox = (*ff) (request->timelevel, refinementlevel,
+ // group.disttype == CCTK_DISTRIB_CONSTANT ?
+ // 0 : component, mglevel)->extent();
+ const dh* dd = arrdata.at(gindex).at(Carpet::map).dd;
+ const ibbox& bbox =
+ dd->boxes.AT(mglevel).AT(refinementlevel)
+ .AT(group.disttype == CCTK_DISTRIB_CONSTANT ? 0 : component).exterior;
// Don't create zero-sized components
if (bbox.empty()) continue;
@@ -499,8 +531,8 @@ int WriteVarChunkedParallel (const cGH* const cctkGH,
MPI_Datatype datatype;
switch (group.vartype) {
-#define TYPECASE(N,T) \
- case N: { T dummy; datatype = dist::datatype(dummy); } break;
+#define TYPECASE(N,T) \
+ case N: { T dummy; datatype = dist::mpi_datatype(dummy); } break;
#include "carpet_typecase.hh"
#undef TYPECASE
default: assert (0 and "invalid datatype");
@@ -565,6 +597,11 @@ int WriteVarChunkedParallel (const cGH* const cctkGH,
HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
HDF5_ERROR (H5Pset_deflate (plist, compression_lvl));
}
+ // enable checksums if requested
+ if (use_checksums) {
+ HDF5_ERROR (H5Pset_chunk (plist, group.dim, shape));
+ HDF5_ERROR (H5Pset_filter (plist, H5Z_FILTER_FLETCHER32, 0, 0, NULL));
+ }
HDF5_ERROR (dataspace = H5Screate_simple (group.dim, shape, NULL));
HDF5_ERROR (dataset = H5Dcreate (outfile, datasetname.str().c_str(),
filedatatype, dataspace, plist));
@@ -581,7 +618,7 @@ int WriteVarChunkedParallel (const cGH* const cctkGH,
if (data != mydata) free (data);
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
free (fullname);
diff --git a/Carpet/CarpetIOHDF5/src/OutputSlice.cc b/Carpet/CarpetIOHDF5/src/OutputSlice.cc
new file mode 100644
index 000000000..156332acb
--- /dev/null
+++ b/Carpet/CarpetIOHDF5/src/OutputSlice.cc
@@ -0,0 +1,1458 @@
+#include <cassert>
+#include <cctype>
+#include <climits>
+#include <cmath>
+#include <cstdlib>
+#include <cstring>
+
+#include <map>
+#include <string>
+
+#include "cctk.h"
+#include "util_Table.h"
+
+#include "CactusBase/IOUtil/src/ioGH.h"
+
+#include "CarpetTimers.hh"
+
+#include "CarpetIOHDF5.hh"
+
+
+
+// That's a hack
+namespace Carpet {
+ void UnsupportedVarType (const int vindex);
+}
+
+
+#define GetParameter(parameter) \
+ outdim == 0 ? out0D_##parameter : \
+ outdim == 1 ? out1D_##parameter : out2D_##parameter
+
+namespace CarpetIOHDF5 {
+
+ using namespace std;
+ using namespace Carpet;
+
+
+
+ // routines which are independent of the output dimension
+ static ibbox GetOutputBBox (const cGH* cctkGH,
+ int group,
+ int m, int c,
+ const ibbox& ext);
+
+ static void GetCoordinates (const cGH* cctkGH, int m,
+ const cGroup& groupdata,
+ const ibbox& ext,
+ CCTK_REAL& coord_time,
+ rvect& coord_lower, rvect& coord_upper);
+
+ static int GetGridOffset (const cGH* cctkGH, int m, int dir,
+ const char* itempl, const char* iglobal,
+ const char* ctempl, const char* cglobal,
+ CCTK_REAL cfallback);
+ static int CoordToOffset (const cGH* cctkGH, int m, int dir,
+ CCTK_REAL coord, int ifallback);
+
+
+
+ // IO processor
+ const int ioproc = 0;
+ const int nioprocs = 1;
+
+
+
+ // Global configuration parameters
+ bool stop_on_parse_errors = false;
+
+
+
+ // Definition of static members
+ template<int outdim> char* IOHDF5<outdim>::my_out_slice_dir;
+ template<int outdim> char* IOHDF5<outdim>::my_out_slice_vars;
+ template<int outdim> vector<ioRequest*> IOHDF5<outdim>::slice_requests;
+
+
+
+ template<int outdim>
+ int IOHDF5<outdim>::Startup()
+ {
+ ostringstream msg;
+ msg << "AMR " << outdim << "D HDF5 I/O provided by CarpetIOHDF5";
+ CCTK_RegisterBanner (msg.str().c_str());
+
+ ostringstream extension_name;
+ extension_name << "CarpetIOHDF5_" << outdim << "D";
+ const int GHExtension =
+ CCTK_RegisterGHExtension(extension_name.str().c_str());
+ CCTK_RegisterGHExtensionSetupGH (GHExtension, SetupGH);
+
+ ostringstream method_name;
+ method_name << "IOHDF5_" << outdim << "D";
+ const int IOMethod = CCTK_RegisterIOMethod (method_name.str().c_str());
+ CCTK_RegisterIOMethodOutputGH (IOMethod, OutputGH);
+ CCTK_RegisterIOMethodOutputVarAs (IOMethod, OutputVarAs);
+ CCTK_RegisterIOMethodTimeToOutput (IOMethod, TimeToOutput);
+ CCTK_RegisterIOMethodTriggerOutput (IOMethod, TriggerOutput);
+
+ return 0;
+ }
+
+
+
+ template<int outdim>
+ void* IOHDF5<outdim>::SetupGH (tFleshConfig* const fc,
+ const int convLevel, cGH* const cctkGH)
+ {
+ DECLARE_CCTK_PARAMETERS;
+ const void *dummy;
+
+ dummy = &fc;
+ dummy = &convLevel;
+ dummy = &cctkGH;
+ dummy = &dummy;
+
+ if (not CCTK_Equals (verbose, "none")) {
+ CCTK_VInfo (CCTK_THORNSTRING, "I/O Method 'IOHDF5_%dD' registered: "
+ "%dD AMR output of grid variables to HDF5 files",
+ outdim, outdim);
+ }
+
+ const int numvars = CCTK_NumVars();
+ slice_requests.resize (numvars);
+
+ // initial I/O parameter check
+ my_out_slice_dir = 0;
+ my_out_slice_vars = strdup ("");
+ stop_on_parse_errors = strict_io_parameter_check != 0;
+ CheckSteerableParameters (cctkGH);
+ stop_on_parse_errors = false;
+
+ // We register only once, ergo we get only one handle. We store
+ // that statically, so there is no need to pass anything to
+ // Cactus.
+ return NULL;
+ }
+
+
+
+ template<int outdim>
+ void IOHDF5<outdim>::CheckSteerableParameters (const cGH* const cctkGH)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ // re-parse the 'IOHDF5::out%dD_dir' parameter if it has changed
+ const char* the_out_dir = GetParameter(dir);
+ if (CCTK_EQUALS (the_out_dir, "")) {
+ the_out_dir = io_out_dir;
+ }
+
+ if (not my_out_slice_dir or strcmp (the_out_dir, my_out_slice_dir)) {
+ free (my_out_slice_dir);
+ my_out_slice_dir = strdup (the_out_dir);
+
+ // create the output directory
+ const int result = IOUtil_CreateDirectory (cctkGH, my_out_slice_dir, 0, 0);
+ if (result < 0) {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Problem creating %dD-output directory '%s'",
+ outdim, my_out_slice_dir);
+ } else if (result > 0 and CCTK_Equals (verbose, "full")) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "%dD-output directory '%s' already exists",
+ outdim, my_out_slice_dir);
+ }
+ }
+
+ // re-parse the 'IOHDF5::out%d_vars' parameter if it has changed
+ const char* const out_slice_vars = GetParameter(vars);
+ if (strcmp (out_slice_vars, my_out_slice_vars)) {
+ ostringstream parameter_name;
+ parameter_name << "IOHDF5::out" << outdim << "D_vars";
+ IOUtil_ParseVarsForOutput (cctkGH, CCTK_THORNSTRING,
+ parameter_name.str().c_str(),
+ stop_on_parse_errors, out_slice_vars,
+ -1, -1.0, &slice_requests[0]);
+
+ // notify the user about the new setting
+ if (not CCTK_Equals (verbose, "none")) {
+ int count = 0;
+ ostringstream msg;
+ msg << "Periodic " << outdim << "D AMR output requested for:";
+ for (int vi=0; vi< CCTK_NumVars(); ++vi) {
+ if (slice_requests.at(vi)) {
+ ++count;
+ char* const fullname = CCTK_FullName(vi);
+ msg << "\n" << " " << fullname;
+ free (fullname);
+ }
+ }
+ if (count > 0) {
+ CCTK_INFO (msg.str().c_str());
+ }
+ }
+
+ // save the last setting of 'IOHDF5::out%d_vars' parameter
+ free (my_out_slice_vars);
+ my_out_slice_vars = strdup (out_slice_vars);
+ }
+ }
+
+
+
+ template<int outdim>
+ int IOHDF5<outdim>::OutputGH (const cGH* const cctkGH)
+ {
+ static Carpet::Timer * timer = NULL;
+ if (not timer) {
+ ostringstream timer_name;
+ timer_name << "CarpetIOHDF5<" << outdim << ">::OutputGH";
+ timer = new Carpet::Timer (timer_name.str().c_str());
+ }
+
+ timer->start();
+ for (int vi=0; vi<CCTK_NumVars(); ++vi) {
+ if (TimeToOutput(cctkGH, vi)) {
+ TriggerOutput(cctkGH, vi);
+ }
+ }
+ timer->stop();
+
+ return 0;
+ }
+
+
+
+ template<int outdim>
+ int IOHDF5<outdim>::TimeToOutput (const cGH* const cctkGH, const int vindex)
+ {
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ assert (vindex >= 0 and vindex < CCTK_NumVars());
+
+ if (CCTK_GroupTypeFromVarI(vindex) != CCTK_GF and not do_global_mode) {
+ return 0;
+ }
+
+ CheckSteerableParameters (cctkGH);
+
+ // check if output for this variable was requested
+ if (not slice_requests.at(vindex)) {
+ return 0;
+ }
+
+ // check whether this refinement level should be output
+ if (not (slice_requests.at(vindex)->refinement_levels & (1 << reflevel))) {
+ return 0;
+ }
+
+ // check if output for this variable was requested individually by
+ // a "<varname>{ out_every = <number> }" option string
+ // this will overwrite the output criterion setting
+ const char* myoutcriterion = GetParameter(criterion);
+ if (CCTK_EQUALS(myoutcriterion, "default")) {
+ myoutcriterion = io_out_criterion;
+ }
+ if (slice_requests.at(vindex)->out_every >= 0) {
+ myoutcriterion = "divisor";
+ }
+
+ if (CCTK_EQUALS (myoutcriterion, "never")) {
+ return 0;
+ }
+
+ // check whether to output at this iteration
+ bool output_this_iteration = false;
+
+ if (CCTK_EQUALS (myoutcriterion, "iteration")) {
+ int myoutevery = GetParameter(every);
+ if (myoutevery == -2) {
+ myoutevery = io_out_every;
+ }
+ if (myoutevery > 0) {
+ if (cctk_iteration == this_iteration_slice[outdim]) {
+ // we already decided to output this iteration
+ output_this_iteration = true;
+ } else if (cctk_iteration >=
+ last_output_iteration_slice[outdim] + myoutevery) {
+ // it is time for the next output
+ output_this_iteration = true;
+ last_output_iteration_slice[outdim] = cctk_iteration;
+ this_iteration_slice[outdim] = cctk_iteration;
+ }
+ }
+ } else if (CCTK_EQUALS (myoutcriterion, "divisor")) {
+ int myoutevery = GetParameter(every);
+ if (myoutevery == -2) {
+ myoutevery = io_out_every;
+ }
+ if (slice_requests[vindex]->out_every >= 0) {
+ myoutevery = slice_requests[vindex]->out_every;
+ }
+ if (myoutevery > 0 and (cctk_iteration % myoutevery) == 0) {
+ // we already decided to output this iteration
+ output_this_iteration = true;
+ }
+ } else if (CCTK_EQUALS (myoutcriterion, "time")) {
+ CCTK_REAL myoutdt = GetParameter(dt);
+ if (myoutdt == -2) {
+ myoutdt = io_out_dt;
+ }
+ if (myoutdt == 0 or cctk_iteration == this_iteration_slice[outdim]) {
+ output_this_iteration = true;
+ } else if (myoutdt > 0) {
+ int do_output =
+ cctk_time / cctk_delta_time >=
+ (last_output_time_slice[outdim] + myoutdt) / cctk_delta_time - 1.0e-12;
+ MPI_Bcast (&do_output, 1, MPI_INT, 0, dist::comm());
+ if (do_output) {
+ // it is time for the next output
+ output_this_iteration = true;
+ last_output_time_slice[outdim] = cctk_time;
+ this_iteration_slice[outdim] = cctk_iteration;
+ }
+ }
+ } // select output criterion
+
+ return output_this_iteration ? 1 : 0;
+ }
+
+
+
+ template<int outdim>
+ int IOHDF5<outdim>::TriggerOutput (const cGH* const cctkGH, const int vindex)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ assert (vindex >= 0 and vindex < CCTK_NumVars());
+
+ char* const fullname = CCTK_FullName(vindex);
+
+ int retval;
+ if (one_file_per_group) {
+ char* const alias = CCTK_GroupNameFromVarI (vindex);
+ for (char* p = alias; *p; ++p) *p = (char) tolower (*p);
+ retval = OutputVarAs (cctkGH, fullname, alias);
+ free (alias);
+ } else {
+ const char* const alias = CCTK_VarName (vindex);
+ retval = OutputVarAs (cctkGH, fullname, alias);
+ }
+
+ free (fullname);
+
+ return retval;
+ }
+
+
+
+ static void GetVarIndex (const int vindex, const char* const optstring,
+ void* const arg)
+ {
+ if (optstring) {
+ char* const fullname = CCTK_FullName(vindex);
+ CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Option string '%s' will be ignored for HDF5 output of "
+ "variable '%s'", optstring, fullname);
+ free (fullname);
+ }
+
+ *static_cast<int*>(arg) = vindex;
+ }
+
+ template<int outdim>
+ int IOHDF5<outdim>::OutputVarAs (const cGH* const cctkGH,
+ const char* const varname,
+ const char* const alias)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ int vindex = -1;
+
+ if (CCTK_TraverseString (varname, GetVarIndex, &vindex, CCTK_VAR) < 0) {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "error while parsing variable name '%s' (alias name '%s')",
+ varname, alias);
+ return -1;
+ }
+
+ if (vindex < 0) {
+ return -1;
+ }
+
+ if (not (is_level_mode() or
+ (is_singlemap_mode() and maps == 1) or
+ (is_local_mode() and maps == 1 and
+ vhh.at(Carpet::map)->local_components(reflevel) == 1)))
+ {
+ CCTK_WARN (1, "OutputVarAs must be called in level mode");
+ return -1;
+ }
+
+ BEGIN_LEVEL_MODE (cctkGH) {
+
+ // Get information
+ const int group = CCTK_GroupIndexFromVarI (vindex);
+ assert (group >= 0);
+ cGroup groupdata;
+ {
+ int const ierr = CCTK_GroupData (group, & groupdata);
+ assert (not ierr);
+ }
+
+ // Check information
+ if (groupdata.grouptype != CCTK_GF) {
+ assert (do_global_mode);
+ }
+
+ if (outdim >= groupdata.dim) {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Cannot produce %dD slice HDF5 output file '%s' for variable '%s' "
+ "because it has only %d dimensions",
+ outdim, alias, varname, groupdata.dim);
+ return -1;
+ }
+
+ // Check for storage
+ if (not CCTK_QueryGroupStorageI (cctkGH, group)) {
+ // This may be okay if storage is e.g. scheduled only in the
+ // analysis bin
+ CCTK_VWarn (4, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Cannot output variable '%s' because it has no storage",
+ varname);
+ return 0;
+ }
+
+ ostringstream basefilenamebuf;
+ basefilenamebuf << my_out_slice_dir << "/" << alias;
+ const string basefilename = basefilenamebuf.str();
+
+ // Check if the file has been created already
+ bool is_new_file, truncate_file;
+ const bool did_output =
+ DidOutput (cctkGH, vindex, basefilename, is_new_file, truncate_file);
+ if (did_output) {
+ return 0;
+ }
+
+ // Loop over all direction combinations
+ vect<int,outdim> dirs (0);
+ bool done;
+ do {
+
+ // Output each combination only once
+ bool ascending = true;
+ for (int d1=0; d1<outdim; ++d1) {
+ for (int d2=d1+1; d2<outdim; ++d2) {
+ ascending = ascending and dirs[d1] < dirs[d2];
+ }
+ }
+
+ // Skip output if the dimensions are not ascending
+ if (ascending) {
+
+ // Skip output if not requested
+ if (DirectionIsRequested(dirs)) {
+ OutputDirection (cctkGH, vindex, alias, basefilename, dirs,
+ is_new_file, truncate_file);
+ }
+
+ } // if ascending
+
+ // Next direction combination
+ done = true;
+ for (int d=0; d<outdim; ++d) {
+ ++dirs[d];
+ if (dirs[d]<groupdata.dim + (outdim == 1 ? 1 : 0)) {
+ done = false;
+ break;
+ }
+ dirs[d] = 0;
+ }
+
+ } while (not done); // output all directions
+
+ } END_LEVEL_MODE;
+
+ return 0;
+ }
+
+
+
+ // Traverse all maps and components on this refinement and multigrid
+ // level
+ template<int outdim>
+ void IOHDF5<outdim>::OutputDirection (const cGH* const cctkGH,
+ const int vindex,
+ const string alias,
+ const string basefilename,
+ const vect<int,outdim>& dirs,
+ const bool is_new_file,
+ const bool truncate_file)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ // Get information
+ const int group = CCTK_GroupIndexFromVarI (vindex);
+ assert (group >= 0);
+ const int vindex0 = CCTK_FirstVarIndexI (group);
+ assert (vindex0 >= 0 and vindex >= vindex0);
+ const int var = vindex - vindex0;
+ cGroup groupdata;
+ {
+ int const ierr = CCTK_GroupData (group, & groupdata);
+ assert (not ierr);
+ }
+
+ const int ml = groupdata.grouptype == CCTK_GF ? mglevel : 0;
+ const int rl = groupdata.grouptype == CCTK_GF ? reflevel : 0;
+
+ const int num_tl = CCTK_NumTimeLevelsFromVarI (vindex);
+ assert (num_tl >= 1);
+
+ const int numvars = CCTK_NumVarsInGroupI(group);
+
+
+
+ // Loop over all maps
+ const int m_min = 0;
+ const int m_max = groupdata.grouptype == CCTK_GF ? Carpet::maps : 1;
+ for (int m = m_min; m < m_max; ++ m) {
+
+ hid_t file = -1;
+ int error_count = 0;
+ error_count += OpenFile (cctkGH, m, vindex, numvars, alias, basefilename,
+ dirs, is_new_file, truncate_file, file);
+
+ // Find the output offset
+ const ivect offset =
+ groupdata.grouptype == CCTK_GF ? GetOutputOffset (cctkGH, m, dirs) : 0;
+
+ const gh* const hh = arrdata.at(group).at(m).hh;
+ const dh* const dd = arrdata.at(group).at(m).dd;
+
+ // Traverse all components on this multigrid level, refinement
+ // level, and map
+ const int c_min = 0;
+ const int c_max =
+ groupdata.grouptype == CCTK_GF ?
+ vhh.at(m)->components(reflevel) :
+ groupdata.disttype != CCTK_DISTRIB_CONSTANT ?
+ CCTK_nProcs(cctkGH) :
+ 1;
+ for (int c = c_min; c < c_max; ++ c) {
+ int const lc = hh->get_local_component(rl,c);
+ int const proc = hh->processor(rl,c);
+ if (dist::rank() == proc or dist::rank() == ioproc) {
+
+ const ibbox& data_ext = dd->boxes.at(ml).at(rl).at(c).exterior;
+ const ibbox ext = GetOutputBBox (cctkGH, group, m, c, data_ext);
+
+ CCTK_REAL coord_time;
+ rvect coord_lower, coord_upper;
+ GetCoordinates (cctkGH, m, groupdata, ext,
+ coord_time, coord_lower, coord_upper);
+
+ // Apply offset
+ ivect offset1;
+ if (groupdata.grouptype == CCTK_GF) {
+ const ibbox& baseext = hh->baseextents.at(ml).at(rl);
+ offset1 = baseext.lower() + offset * ext.stride();
+ } else {
+ offset1 = offset * ext.stride();
+ }
+ for (int d=0; d<outdim; ++d) {
+ if (dirs[d] < 3) {
+ offset1[dirs[d]] = ext.lower()[dirs[d]];
+ }
+ }
+
+ const int tl_min = 0;
+ const int tl_max = output_all_timelevels ? num_tl : 1;
+ for (int tl = tl_min; tl < tl_max; ++tl) {
+
+ mempool pool;
+
+ const int n_min = one_file_per_group ? 0 : var;
+ const int n_max =
+ one_file_per_group ? CCTK_NumVarsInGroupI(group) : var+1;
+ vector<const gdata*> datas(n_max - n_min);
+ for (size_t n = 0; n < datas.size(); ++ n) {
+ if (dist::rank() == proc) {
+ const ggf* const ff =
+ arrdata.at(group).at(m).data.at(n + n_min);
+ datas.at(n) = (*ff) (tl, rl, lc, ml);
+ } else {
+ datas.at(n) = NULL;
+ }
+ }
+
+ vector<gdata*> tmpdatas(datas.size());
+
+ if (proc != ioproc) {
+
+ for (size_t n = 0; n < datas.size(); ++ n) {
+ const ggf* const ff =
+ arrdata.at(group).at(m).data.at(n + n_min);
+ tmpdatas.at(n) = ff->typed_data (tl, rl, c, ml);
+ size_t const memsize =
+ tmpdatas.at(n)->allocsize (data_ext, ioproc);
+ void * const memptr = pool.alloc (memsize);
+ tmpdatas.at(n)->allocate(data_ext, ioproc, memptr, memsize);
+ } // for n
+
+ for (comm_state state; not state.done(); state.step()) {
+ for (size_t n=0; n<datas.size(); ++n) {
+ tmpdatas.at(n)->copy_from
+ (state, datas.at(n), data_ext, ioproc, proc);
+ }
+ }
+
+ } else {
+
+ for (size_t n=0; n<datas.size(); ++n) {
+ tmpdatas.at(n) = const_cast<gdata*> (datas.at(n));
+ }
+
+ }
+
+ if (dist::rank() == ioproc) {
+ error_count +=
+ WriteHDF5 (cctkGH, file, tmpdatas, ext, vindex,
+ offset1, dirs,
+ rl, ml, m, c, tl,
+ coord_time, coord_lower, coord_upper);
+ }
+
+ if (proc != ioproc) {
+ for (size_t n=0; n<tmpdatas.size(); ++n) {
+ delete tmpdatas.at(n);
+ }
+ }
+
+ } // for tl
+
+ }
+ } // for c
+
+ error_count += CloseFile (cctkGH, file);
+ if (error_count > 0 and abort_on_io_errors) {
+ CCTK_WARN (0, "Aborting simulation due to previous I/O errors");
+ }
+
+ } // for m
+ }
+
+
+
+ template<int outdim>
+ bool IOHDF5<outdim>::DidOutput (const cGH* const cctkGH,
+ const int vindex,
+ const string basefilename,
+ bool& is_new_file, bool& truncate_file)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ typedef std::map<string, vector<vector<vector<int> > > > filelist;
+ static filelist created_files;
+
+ filelist::iterator thisfile = created_files.find (basefilename);
+ is_new_file = thisfile == created_files.end();
+ truncate_file = is_new_file and IO_TruncateOutputFiles (cctkGH);
+
+ if (is_new_file) {
+ const int numelems =
+ one_file_per_group ? CCTK_NumGroups() : CCTK_NumVars();
+ vector<vector<vector<int> > > last_outputs; // [ml][rl][var]
+ last_outputs.resize(mglevels);
+ for (int ml=0; ml<mglevels; ++ml) {
+ last_outputs.at(ml).resize (maxreflevels);
+ for (int rl=0; rl<maxreflevels; ++rl) {
+ last_outputs.at(ml).at(rl).resize
+ (numelems, cctkGH->cctk_iteration - 1);
+ }
+ }
+ // TODO: this makes a copy of last_outputs, which is expensive;
+ // change this to use a reference instead
+ thisfile = created_files.insert
+ (thisfile, filelist::value_type (basefilename, last_outputs));
+ assert (thisfile != created_files.end());
+ }
+
+ // Check if this variable has been output already during this
+ // iteration
+ const int elem =
+ one_file_per_group ? CCTK_GroupIndexFromVarI(vindex) : vindex;
+ int& last_output = thisfile->second.at(mglevel).at(reflevel).at(elem);
+ if (last_output == cctkGH->cctk_iteration) {
+ // has already been output during this iteration
+ char* const fullname = CCTK_FullName (vindex);
+ CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Skipping output for variable '%s', because this variable "
+ "has already been output during the current iteration -- "
+ "probably via a trigger during the analysis stage",
+ fullname);
+ free (fullname);
+ return true;
+ }
+ assert (last_output < cctkGH->cctk_iteration);
+ last_output = cctkGH->cctk_iteration;
+
+ return false;
+ }
+
+
+
+ CCTK_REAL io_files;
+ CCTK_REAL io_bytes;
+
+ template<int outdim>
+ int IOHDF5<outdim>::OpenFile (const cGH* const cctkGH,
+ const int m,
+ const int vindex,
+ const int numvars,
+ const string alias,
+ const string basefilename,
+ const vect<int,outdim>& dirs,
+ const bool is_new_file,
+ const bool truncate_file,
+ hid_t& file)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ int error_count = 0;
+
+ BeginTimingIO (cctkGH);
+ io_files = 0;
+ io_bytes = 0;
+
+ if (dist::rank() == ioproc) {
+
+ const int grouptype = CCTK_GroupTypeFromVarI(vindex);
+ assert (grouptype >= 0);
+
+ // Invent a file name
+ ostringstream filenamebuf;
+ filenamebuf << basefilename;
+ if (maps > 1 and grouptype == CCTK_GF) {
+ filenamebuf << "." << m;
+ }
+ filenamebuf << ".";
+ for (int d=0; d<outdim; ++d) {
+ const char* const coords = "xyzd";
+ filenamebuf << coords[dirs[d]];
+ }
+ filenamebuf << ".h5";
+ // we need a persistent temporary here
+ const string filenamestr = filenamebuf.str();
+ const char* const filename = filenamestr.c_str();
+
+ // Open the file
+ bool file_exists = false;
+ if (not truncate_file) {
+ H5E_BEGIN_TRY {
+ file_exists = H5Fis_hdf5(filename) > 0;
+ } H5E_END_TRY;
+ }
+
+ if (truncate_file or not file_exists) {
+ HDF5_ERROR(file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
+ H5P_DEFAULT));
+ // write metadata information
+ error_count +=
+ WriteMetadata(cctkGH, nioprocs, vindex, numvars, false, file);
+ } else {
+ HDF5_ERROR (file = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT));
+ }
+ io_files += 1;
+
+ } // if on the I/O processor
+
+ return error_count;
+ }
+
+ template<int outdim>
+ int IOHDF5<outdim>::CloseFile (const cGH* const cctkGH,
+ hid_t& file)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ int error_count = 0;
+
+ if (dist::rank() == ioproc) {
+ if (file >= 0) {
+ HDF5_ERROR(H5Fclose(file));
+ }
+ }
+ if (nioprocs > 1) {
+ CCTK_REAL local[2], global[2];
+ local[0] = io_files;
+ local[1] = io_bytes;
+ MPI_Allreduce (local, global, 2, dist::mpi_datatype (local[0]), MPI_SUM, dist::comm());
+ io_files = global[0];
+ io_bytes = global[1];
+ }
+
+ EndTimingIO (cctkGH, io_files, io_bytes, true);
+
+ return error_count;
+ }
+
+
+
+ // Check whether this output direction has been requested
+ template<int outdim>
+ bool IOHDF5<outdim>::DirectionIsRequested (const vect<int,outdim>& dirs)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ switch (outdim) {
+
+ case 0:
+ // Output is always requested (if switched on)
+ return true;
+
+ case 1:
+ switch (dirs[0]) {
+ case 0: return out1D_x;
+ case 1: return out1D_y;
+ case 2: return out1D_z;
+ case 3: return out1D_d;
+ default: assert (0);
+ }
+
+ case 2:
+ if (dirs[0]==0 and dirs[1]==1) return out2D_xy;
+ if (dirs[0]==0 and dirs[1]==2) return out2D_xz;
+ if (dirs[0]==1 and dirs[1]==2) return out2D_yz;
+ assert (0);
+
+// case 3:
+// // Output is always requested (if switched on)
+// return true;
+
+ default:
+ assert (0);
+ // Prevent compiler warning about missing return statement
+ return false;
+ }
+ }
+
+
+
+ // Get the region that should be output, in terms of grid points;
+ // this is the offset perpendicular to the output hyperslab
+ template<int outdim>
+ ivect IOHDF5<outdim>::GetOutputOffset (const cGH* const cctkGH, const int m,
+ const vect<int,outdim>& dirs)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ // Default is zero
+ ivect offset (0);
+
+ switch (outdim) {
+
+ case 0:
+ // 0D output
+ offset[0] = GetGridOffset (cctkGH, m, 1,
+ "out0D_point_xi", /*"out_point_xi"*/ NULL,
+ "out0D_point_x", /*"out_point_x"*/ NULL,
+ /*out_point_x*/ 0.0);
+ offset[1] = GetGridOffset (cctkGH, m, 2,
+ "out0D_point_yi", /*"out_point_yi"*/ NULL,
+ "out0D_point_y", /*"out_point_y"*/ NULL,
+ /*out_point_y*/ 0.0);
+ offset[2] = GetGridOffset (cctkGH, m, 3,
+ "out0D_point_zi", /*"out_point_zi"*/ NULL,
+ "out0D_point_z", /*"out_point_z"*/ NULL,
+ /*out_point_z*/ 0.0);
+ break;
+
+ case 1:
+ // 1D output
+ switch (dirs[0]) {
+ case 0:
+ offset[1] = GetGridOffset (cctkGH, m, 2,
+ "out1D_xline_yi", "out_xline_yi",
+ "out1D_xline_y", "out_xline_y",
+ out_xline_y);
+ offset[2] = GetGridOffset (cctkGH, m, 3,
+ "out1D_xline_zi", "out_xline_zi",
+ "out1D_xline_z", "out_xline_z",
+ out_xline_z);
+ break;
+ case 1:
+ offset[0] = GetGridOffset (cctkGH, m, 1,
+ "out1D_yline_xi", "out_yline_xi",
+ "out1D_yline_x", "out_yline_x",
+ out_yline_x);
+ offset[2] = GetGridOffset (cctkGH, m, 3,
+ "out1D_yline_zi", "out_yline_zi",
+ "out1D_yline_z", "out_yline_z",
+ out_yline_z);
+ break;
+ case 2:
+ offset[0] = GetGridOffset (cctkGH, m, 1,
+ "out1D_zline_xi", "out_zline_xi",
+ "out1D_zline_x", "out_zline_x",
+ out_zline_x);
+ offset[1] = GetGridOffset (cctkGH, m, 2,
+ "out1D_zline_yi", "out_zline_yi",
+ "out1D_zline_y", "out_zline_y",
+ out_zline_y);
+ break;
+ case 3:
+ // the diagonal: we don't care about the offset
+ break;
+ default:
+ assert (0);
+ }
+ break;
+
+ case 2:
+ // 2D output
+ if (dirs[0]==0 and dirs[1]==1) {
+ offset[2] = GetGridOffset (cctkGH, m, 3,
+ "out2D_xyplane_zi", "out_xyplane_zi",
+ "out2D_xyplane_z", "out_xyplane_z",
+ out_xyplane_z);
+ } else if (dirs[0]==0 and dirs[1]==2) {
+ offset[1] = GetGridOffset (cctkGH, m, 2,
+ "out2D_xzplane_yi", "out_xzplane_yi",
+ "out2D_xzplane_y", "out_xzplane_y",
+ out_xzplane_y);
+ } else if (dirs[0]==1 and dirs[1]==2) {
+ offset[0] = GetGridOffset (cctkGH, m, 1,
+ "out2D_yzplane_xi", "out_yzplane_xi",
+ "out2D_yzplane_x", "out_yzplane_x",
+ out_yzplane_x);
+ } else {
+ assert (0);
+ }
+ break;
+
+// case 3:
+// // 3D output: the offset does not matter
+// break;
+
+ default:
+ assert (0);
+ }
+
+ return offset;
+ }
+
+
+
+ // Omit symmetry and ghost zones if requested
+ ibbox GetOutputBBox (const cGH* const cctkGH,
+ const int group,
+ const int m, const int c,
+ const ibbox& ext)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ const int groupdim = CCTK_GroupDimI(group);
+ assert (groupdim >= 0);
+ const int grouptype = CCTK_GroupTypeI(group);
+ assert (grouptype >= 0);
+
+ // TODO: This is a bit ad hoc
+ CCTK_INT symtable;
+ if (grouptype == CCTK_GF and groupdim == cctkGH->cctk_dim) {
+ symtable = SymmetryTableHandleForGrid (cctkGH);
+ if (symtable < 0) CCTK_WARN (0, "internal error");
+ } else {
+ symtable = SymmetryTableHandleForGI (cctkGH, group);
+ if (symtable < 0) CCTK_WARN (0, "internal error");
+ }
+
+ CCTK_INT symbnd[2*dim];
+ int const ierr = Util_TableGetIntArray
+ (symtable, 2*groupdim, symbnd, "symmetry_handle");
+ if (ierr != 2*groupdim) CCTK_WARN (0, "internal error");
+
+ bool is_symbnd[2*dim];
+ for (int d=0; d<2*groupdim; ++d) {
+ is_symbnd[d] = symbnd[d] >= 0;
+ }
+
+ ivect lo = ext.lower();
+ ivect hi = ext.upper();
+ const ivect str = ext.stride();
+
+ const b2vect obnds = vhh.at(m)->outer_boundaries(reflevel,c);
+ const i2vect ghost_width = arrdata.at(group).at(m).dd->ghost_width;
+
+ for (int d=0; d<groupdim; ++d) {
+ bool const output_lower_ghosts =
+ obnds[0][d]
+ ? (is_symbnd[2*d]
+ ? output_symmetry_points
+ : out3D_outer_ghosts)
+ : out3D_ghosts;
+ bool const output_upper_ghosts =
+ obnds[1][d]
+ ? (is_symbnd[2*d+1]
+ ? output_symmetry_points
+ : out3D_outer_ghosts)
+ : out3D_ghosts;
+
+ if (not output_lower_ghosts) {
+ lo[d] += ghost_width[0][d] * str[d];
+ }
+ if (not output_upper_ghosts) {
+ hi[d] -= ghost_width[1][d] * str[d];
+ }
+ }
+
+ return ibbox(lo,hi,str);
+ }
+
+
+
+ // Determine coordinates
+ void GetCoordinates (const cGH* const cctkGH, const int m,
+ const cGroup& groupdata,
+ const ibbox& ext,
+ CCTK_REAL& coord_time,
+ rvect& coord_lower, rvect& coord_upper)
+ {
+ coord_time = cctkGH->cctk_time;
+
+ rvect global_lower;
+ rvect coord_delta;
+ if (groupdata.grouptype == CCTK_GF) {
+ rvect const cctk_origin_space = origin_space.at(m).at(mglevel);
+ rvect const cctk_delta_space = delta_space.at(m) * rvect(mglevelfact);
+ for (int d=0; d<dim; ++d) {
+ // lower boundary of Carpet's integer indexing
+ global_lower[d] = cctk_origin_space[d];
+ // grid spacing of Carpet's integer indexing
+ coord_delta[d] = (cctk_delta_space[d] /
+ vhh.at(m)->baseextents.at(0).at(0).stride()[d]);
+ }
+ } else {
+ for (int d=0; d<dim; ++d) {
+ global_lower[d] = 0.0;
+ coord_delta[d] = 1.0;
+ }
+ }
+
+ coord_lower = global_lower + coord_delta * rvect(ext.lower());
+ coord_upper = global_lower + coord_delta * rvect(ext.upper());
+ }
+
+
+
+ int GetGridOffset (const cGH* const cctkGH, const int m, const int dir,
+ const char* const iparam, const char* const iglobal,
+ const char* const cparam, const char* const cglobal,
+ const CCTK_REAL cfallback)
+ {
+ // First choice: explicit coordinate
+ const int ncparam = CCTK_ParameterQueryTimesSet (cparam, CCTK_THORNSTRING);
+ assert (ncparam >= 0);
+ if (ncparam > 0) {
+ int ptype;
+ const CCTK_REAL* const pcoord
+ = ((const CCTK_REAL*)CCTK_ParameterGet
+ (cparam, CCTK_THORNSTRING, &ptype));
+ assert (pcoord);
+ const CCTK_REAL coord = *pcoord;
+ assert (ptype == PARAMETER_REAL);
+ return CoordToOffset (cctkGH, m, dir, coord, 0);
+ }
+
+ // Second choice: explicit index
+ const int niparam = CCTK_ParameterQueryTimesSet (iparam, CCTK_THORNSTRING);
+ assert (niparam >= 0);
+ if (niparam > 0) {
+ int ptype;
+ const int* const pindex
+ = (const int*)CCTK_ParameterGet (iparam, CCTK_THORNSTRING, &ptype);
+ assert (pindex);
+ const int index = *pindex;
+ assert (ptype == PARAMETER_INT);
+ return index;
+ }
+
+ // Third choice: explicit global coordinate
+ const char* iothorn = CCTK_ImplementationThorn ("IO");
+ assert (iothorn);
+ if (cglobal) {
+ const int ncglobal = CCTK_ParameterQueryTimesSet (cglobal, iothorn);
+ assert (ncglobal >= 0);
+ if (ncglobal > 0) {
+ int ptype;
+ const CCTK_REAL* const pcoord
+ = (const CCTK_REAL*)CCTK_ParameterGet (cglobal, iothorn, &ptype);
+ assert (pcoord);
+ const CCTK_REAL coord = *pcoord;
+ assert (ptype == PARAMETER_REAL);
+ return CoordToOffset (cctkGH, m, dir, coord, 0);
+ }
+ }
+
+ // Fourth choice: explicit global index
+ if (iglobal) {
+ const int niglobal = CCTK_ParameterQueryTimesSet (iglobal, iothorn);
+ assert (niglobal >= 0);
+ if (niglobal > 0) {
+ int ptype;
+ const int* const pindex
+ = (const int*)CCTK_ParameterGet (iglobal, iothorn, &ptype);
+ assert (pindex);
+ const int index = *pindex;
+ assert (ptype == PARAMETER_INT);
+ return index;
+ }
+ }
+
+ // Fifth choice: default coordinate
+ return CoordToOffset (cctkGH, m, dir, cfallback, 0);
+ }
+
+
+
+ int CoordToOffset (const cGH* cctkGH, const int m, const int dir,
+ const CCTK_REAL coord, const int ifallback)
+ {
+ assert (m>=0 and m<Carpet::maps and dir>=1 and dir<=dim);
+
+ assert (mglevel!=-1 and reflevel!=-1 and Carpet::map==-1);
+
+ rvect const cctk_origin_space = origin_space.at(m).at(mglevel);
+ rvect const cctk_delta_space = delta_space.at(m) * rvect (mglevelfact);
+ ivect const cctk_levfac = spacereffacts.at (reflevel);
+ ibbox const & coarseext = vhh.at(m)->baseextents.at(mglevel).at(0 );
+ ibbox const & baseext = vhh.at(m)->baseextents.at(mglevel).at(reflevel);
+ ivect const cctk_levoff = baseext.lower() - coarseext.lower();
+ ivect const cctk_levoffdenom = baseext.stride();
+
+ const CCTK_REAL delta = cctk_delta_space[dir-1] / cctk_levfac[dir-1];
+ const CCTK_REAL lower = cctk_origin_space[dir-1] + cctk_delta_space[dir-1] / cctk_levfac[dir-1] * cctk_levoff[dir-1] / cctk_levoffdenom[dir-1];
+
+ const CCTK_REAL rindex = (coord - lower) / delta;
+ int cindex = (int)floor(rindex + 0.75);
+
+ return cindex;
+ }
+
+
+
+ // Output
+ template<int outdim>
+ int IOHDF5<outdim>::WriteHDF5 (const cGH* cctkGH,
+ hid_t& file,
+ vector<gdata*> const gfdatas,
+ const bbox<int,dim>& gfext,
+ const int vi,
+ const vect<int,dim>& org,
+ const vect<int,outdim>& dirs,
+ const int rl,
+ const int ml,
+ const int m,
+ const int c,
+ const int tl,
+ const CCTK_REAL coord_time,
+ const vect<CCTK_REAL,dim>& coord_lower,
+ const vect<CCTK_REAL,dim>& coord_upper)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ assert (outdim<=dim);
+
+ cGroup groupdata;
+ {
+ int const gi = CCTK_GroupIndexFromVarI (vi);
+ assert (gi >= 0);
+ int const ierr = CCTK_GroupData (gi, & groupdata);
+ assert (not ierr);
+ }
+
+ // boolean that says if we are doing 1D-diagonal output
+ // This is not beautiful, but works for the moment
+ bool const diagonal_output = outdim == 1 and dirs[0] == 3;
+
+ // Check whether the output bbox overlaps
+ // with the extent of the data to be output
+// FIXME: move this check up in the call stack
+ bool output_bbox_overlaps_data_extent;
+ if (not diagonal_output) {
+
+ const vect<int,outdim> lo = gfext.lower()[dirs];
+ const vect<int,outdim> up = gfext.upper()[dirs];
+ const vect<int,outdim> str = gfext.stride()[dirs];
+ const bbox<int,outdim> ext(lo,up,str);
+
+ // Check whether the output origin is contained in the extent
+ // of the data that should be output
+ ivect org1(org);
+ for (int d=0; d<outdim; ++d) org1[dirs[d]] = ext.lower()[d];
+ output_bbox_overlaps_data_extent = gfext.contains(org1);
+
+ } else {
+
+ gh const & hh = *vhh.at(m);
+ ibbox const & base = hh.baseextents.at(mglevel).at(reflevel);
+
+ assert (base.stride()[0] == base.stride()[1] and
+ base.stride()[0] == base.stride()[2]);
+
+ // Check if any point on the diagonal is in our gf's extent
+ output_bbox_overlaps_data_extent = false;
+ for (int i=maxval(base.lower());
+ i<=minval(base.upper()); i+=base.stride()[0]) {
+
+ ivect const pos = ivect(i,i,i);
+ output_bbox_overlaps_data_extent |= gfext.contains(pos);
+ }
+ }
+ // Shortcut if there is nothing to output
+ if (not output_bbox_overlaps_data_extent) {
+ return 0;
+ }
+
+ int error_count = 0;
+
+ ostringstream datasetname_suffix;
+ datasetname_suffix << " it=" << cctkGH->cctk_iteration << " tl=" << tl;
+ if (mglevels > 1) datasetname_suffix << " ml=" << ml;
+ if (groupdata.grouptype == CCTK_GF) {
+ if (maps > 1) datasetname_suffix << " m=" << m;
+ datasetname_suffix << " rl=" << rl;
+ }
+ if (groupdata.grouptype == CCTK_GF or
+ groupdata.disttype != CCTK_DISTRIB_CONSTANT) {
+ datasetname_suffix << " c=" << c;
+ }
+
+ // enable compression and checksums if requested
+ hid_t plist;
+ HDF5_ERROR(plist = H5Pcreate(H5P_DATASET_CREATE));
+ if (compression_level) {
+ HDF5_ERROR(H5Pset_deflate(plist, compression_level));
+ }
+ if (use_checksums) {
+ HDF5_ERROR(H5Pset_filter(plist, H5Z_FILTER_FLETCHER32, 0, 0, 0));
+ }
+
+ // enable datatype conversion if requested
+ const hid_t mem_type =
+ CCTKtoHDF5_Datatype(cctkGH, groupdata.vartype, false);
+ const hid_t slice_type =
+ CCTKtoHDF5_Datatype(cctkGH, groupdata.vartype, out_single_precision);
+
+ if (not diagonal_output) { // not outputting the diagonal
+
+ const vect<int,outdim> lo = gfext.lower()[dirs];
+ const vect<int,outdim> up = gfext.upper()[dirs];
+ const vect<int,outdim> str = gfext.stride()[dirs];
+ const bbox<int,outdim> ext(lo,up,str);
+
+ // Check whether the output origin is contained in the extent of
+ // the data that should be output
+ ivect org1(org);
+ for (int d=0; d<outdim; ++d) org1[dirs[d]] = ext.lower()[d];
+ assert (gfext.contains(org1));
+
+ // HDF5 wants ranks to be >= 1
+ const int rank = outdim > 0 ? outdim : 1;
+ vector<hsize_t> mem_shape(dim);
+ vector<hsize_t> slice_shape(rank, 1);
+ for (int d = 0; d < dim; d++) {
+ mem_shape[dim-1-d] = gfext.shape()[d] / gfext.stride()[d];
+ if (d < outdim) {
+ slice_shape[outdim-1-d] = ext.shape()[d] / ext.stride()[d];
+ }
+ }
+
+ ivect slice_lower(org - gfext.lower());
+ for (int d = 0; d < outdim; d++) {
+ slice_lower[dirs[d]] = 0;
+ }
+ ivect slice_upper(slice_lower);
+ for (int d = 0; d < outdim; d++) {
+ slice_upper[dirs[d]] = ext.upper()[d] - ext.lower()[d];
+ }
+ slice_lower /= gfext.stride();
+ slice_upper /= gfext.stride();
+
+ slice_start_size_t slice_start[dim];
+ hsize_t slice_count[dim];
+ for (int d = 0; d < dim; d++) {
+ slice_start[dim-1-d] = slice_lower[d];
+ slice_count[dim-1-d] = slice_upper[d] - slice_lower[d] + 1;
+ }
+ if (compression_level or use_checksums) {
+ HDF5_ERROR(H5Pset_chunk(plist, slice_shape.size(), &slice_shape[0]));
+ }
+ hid_t slice_space, mem_space;
+ HDF5_ERROR(slice_space =
+ H5Screate_simple (slice_shape.size(), &slice_shape[0], NULL));
+ HDF5_ERROR(mem_space =
+ H5Screate_simple (mem_shape.size(), &mem_shape[0], NULL));
+ HDF5_ERROR(H5Sselect_hyperslab (mem_space, H5S_SELECT_SET,
+ slice_start, NULL, slice_count, NULL));
+
+ vector<int> iorigin(rank, 0);
+ vector<double> delta(rank, 0), origin(rank, 0);
+ for (int d = 0; d < outdim; d++) {
+ assert(gfext.upper()[dirs[d]] - gfext.lower()[dirs[d]] >= 0);
+ iorigin[d] = ext.lower()[d];
+ delta[d] = 0;
+ origin[d] = coord_lower[dirs[d]];
+ if (gfext.upper()[dirs[d]] - gfext.lower()[dirs[d]] > 0) {
+ delta[d] = (coord_upper[dirs[d]] - coord_lower[dirs[d]]) /
+ (gfext.upper()[dirs[d]] - gfext.lower()[dirs[d]]) * gfext.stride()[dirs[d]];
+ origin[d] += (org1[dirs[d]] - gfext.lower()[dirs[d]]) * delta[d];
+ }
+ }
+
+ // now loop over all variables
+ for (size_t n = 0; n < gfdatas.size(); n++) {
+
+ // create a unique name for this variable's dataset
+ char *fullname = CCTK_FullName(vi + n);
+ string datasetname (fullname);
+ datasetname.append (datasetname_suffix.str());
+
+ // remove an already existing dataset of the same name
+ if (slice_requests.at(vi + n)->check_exist) {
+ H5E_BEGIN_TRY {
+ H5Gunlink(file, datasetname.c_str());
+ } H5E_END_TRY;
+ }
+
+ // write the dataset
+ hid_t dataset;
+ HDF5_ERROR(dataset =
+ H5Dcreate (file, datasetname.c_str(),
+ slice_type, slice_space, plist));
+ HDF5_ERROR(H5Dwrite (dataset, mem_type, mem_space, H5S_ALL,
+ H5P_DEFAULT, gfdatas[n]->storage()));
+ error_count +=
+ AddSliceAttributes (cctkGH, fullname, rl, origin, delta, iorigin,
+ dataset);
+ HDF5_ERROR(H5Dclose (dataset));
+ free (fullname);
+
+ io_bytes +=
+ H5Sget_simple_extent_npoints(slice_space) * H5Tget_size(slice_type);
+ } // for n
+
+ HDF5_ERROR(H5Sclose (mem_space));
+ HDF5_ERROR(H5Sclose (slice_space));
+
+ } else { // taking care of the diagonal
+
+ const ivect lo = gfext.lower();
+ const ivect up = gfext.upper();
+ const ivect str = gfext.stride();
+ const ibbox ext(lo,up,str);
+
+ gh const & hh = *vhh.at(m);
+ ibbox const & base = hh.baseextents.at(mglevel).at(reflevel);
+
+ assert (base.stride()[0] == base.stride()[1] and
+ base.stride()[0] == base.stride()[2]);
+
+ // count the number of points on the diagonal
+ hsize_t npoints = 0;
+ for (int i = maxval(base.lower());
+ i <= minval(base.upper());
+ i += base.stride()[0])
+ {
+ if (gfext.contains(i)) {
+ ++ npoints;
+ }
+ }
+ assert(npoints > 0);
+
+ // allocate a contiguous buffer for the diagonal points
+ vector<char> buffer (CCTK_VarTypeSize(groupdata.vartype) *
+ npoints * gfdatas.size());
+
+ // copy diagonal points into contiguous buffer
+ hsize_t offset = 0;
+ for (int i = maxval(base.lower());
+ i <= minval(base.upper());
+ i += base.stride()[0])
+ {
+ ivect const pos = ivect(i,i,i);
+ if(gfext.contains(pos)) {
+ for (size_t n = 0; n < gfdatas.size(); n++) {
+ switch (groupdata.vartype) {
+#define TYPECASE(N,T) \
+ case N: { T* typed_buffer = (T*) &buffer.front(); \
+ typed_buffer[offset + n*npoints] = \
+ (*(const data<T>*)gfdatas.at(n))[pos]; \
+ break; \
+ }
+#include "carpet_typecase.hh"
+#undef TYPECASE
+ }
+ }
+ ++ offset;
+ }
+ }
+ assert(offset == npoints);
+
+ if (compression_level or use_checksums) {
+ HDF5_ERROR(H5Pset_chunk(plist, 1, &npoints));
+ }
+ hid_t slice_space;
+ HDF5_ERROR(slice_space = H5Screate_simple(1, &npoints, NULL));
+
+ // loop over all variables and write out diagonals
+ for (size_t n = 0; n < gfdatas.size(); n++) {
+
+ // create a unique name for this variable's dataset
+ char *fullname = CCTK_FullName(vi + n);
+ string datasetname (fullname);
+ free (fullname);
+ datasetname.append (datasetname_suffix.str());
+
+ // remove an already existing dataset of the same name
+ if (slice_requests[vi + n]->check_exist) {
+ H5E_BEGIN_TRY {
+ H5Gunlink(file, datasetname.c_str());
+ } H5E_END_TRY;
+ }
+
+ // write the dataset
+ hid_t dataset;
+ HDF5_ERROR(dataset =
+ H5Dcreate(file, datasetname.c_str(),
+ slice_type, slice_space, plist));
+ HDF5_ERROR(H5Dwrite (dataset, mem_type,
+ H5S_ALL, H5S_ALL, H5P_DEFAULT,
+ &buffer.front() + n*npoints*gfdatas.size()));
+ HDF5_ERROR(H5Dclose (dataset));
+
+ io_bytes +=
+ H5Sget_simple_extent_npoints(slice_space) * H5Tget_size(slice_type);
+ }
+
+ HDF5_ERROR(H5Sclose(slice_space));
+
+ } // if(not diagonal_output)
+
+ HDF5_ERROR(H5Pclose(plist));
+
+ return error_count;
+ }
+
+
+
+ // Explicit instantiation for all slice output dimensions
+ template class IOHDF5<0>;
+ template class IOHDF5<1>;
+ template class IOHDF5<2>;
+// template class IOHDF5<3>;
+
+} // namespace CarpetIOHDF5
diff --git a/Carpet/CarpetIOHDF5/src/make.code.defn b/Carpet/CarpetIOHDF5/src/make.code.defn
index 930eab3af..223c95158 100644
--- a/Carpet/CarpetIOHDF5/src/make.code.defn
+++ b/Carpet/CarpetIOHDF5/src/make.code.defn
@@ -1,7 +1,7 @@
# Main make.code.defn file for thorn CarpetIOHDF5
# Source files in this directory
-SRCS = CarpetIOHDF5.cc Input.cc Output.cc
+SRCS = CarpetIOHDF5.cc Input.cc Output.cc OutputSlice.cc
# Extend CXXFLAGS if HDF5 library was built with LFS support
ifneq ($(strip $(HDF5_LFS_FLAGS)),)
diff --git a/Carpet/CarpetIOHDF5/src/make.configuration.defn b/Carpet/CarpetIOHDF5/src/make.configuration.defn
index b2c159945..ca3b64978 100644
--- a/Carpet/CarpetIOHDF5/src/make.configuration.defn
+++ b/Carpet/CarpetIOHDF5/src/make.configuration.defn
@@ -1,2 +1,2 @@
-# add the Carpet HDF5-to-ASCII converter/slicer
-ALL_UTILS += hdf5toascii_slicer hdf5_slicer
+# add the Carpet HDF5-to-ASCII converter/slicer/recombiner
+ALL_UTILS += hdf5toascii_slicer hdf5tobinary_slicer hdf5_slicer hdf5_recombiner
diff --git a/Carpet/CarpetIOHDF5/src/make.configuration.deps b/Carpet/CarpetIOHDF5/src/make.configuration.deps
index 61b8e22e0..475206db9 100644
--- a/Carpet/CarpetIOHDF5/src/make.configuration.deps
+++ b/Carpet/CarpetIOHDF5/src/make.configuration.deps
@@ -2,7 +2,7 @@ CARPETIOHDF5_BUILD_DIR = $(BUILD_DIR)/CarpetIOHDF5
CARPETIOHDF5_SRC_DIR = $(PACKAGE_DIR)/Carpet/CarpetIOHDF5/src/util
CARPETIOHDF5_CFLAGS = -DCCODE $(CFLAGS)
-CARPETIOHDF5_LDFLAGS = $(DEBUG_LD) $(LDFLAGS) $(EXTRAFLAGS) $(HDF5_LIB_DIRS:%=-L%) $(HDF5_LIBS:%=-l%)
+CARPETIOHDF5_LDFLAGS = $(DEBUG_LD) $(LDFLAGS) $(EXTRAFLAGS) $(GENERAL_LIBRARIES)
# Extend CFLAGS if HDF5 library was built with LFS support
ifneq ($(strip $(HDF5_LFS_FLAGS)),)
diff --git a/Carpet/CarpetIOHDF5/src/util/SubstituteDeprecatedParameters.pl b/Carpet/CarpetIOHDF5/src/util/SubstituteDeprecatedParameters.pl
index bfd1b17b0..bfd1b17b0 100755..100644
--- a/Carpet/CarpetIOHDF5/src/util/SubstituteDeprecatedParameters.pl
+++ b/Carpet/CarpetIOHDF5/src/util/SubstituteDeprecatedParameters.pl
diff --git a/Carpet/CarpetIOHDF5/src/util/hdf5_recombiner.cc b/Carpet/CarpetIOHDF5/src/util/hdf5_recombiner.cc
new file mode 100644
index 000000000..ecee483d3
--- /dev/null
+++ b/Carpet/CarpetIOHDF5/src/util/hdf5_recombiner.cc
@@ -0,0 +1,253 @@
+#include <cassert>
+#include <cstdio>
+#include <cstring>
+#include <iostream>
+#include <list>
+#include <string>
+#include <vector>
+
+#include <cctk_Config.h>
+
+#include <hdf5.h>
+
+using namespace std;
+
+
+
+// Global constants
+int const dim = 3;
+
+// Files and datasets
+int const num_input_files = 0;
+char const *const input_file_pattern = "interptoarray::parrays3d.file_%d.h5";
+int const iteration_divisor = 1024;
+char const *const output_file_name = "parrays3d-float.h5";
+char const *const output_dataset_name = "phi";
+hsize_t const output_dims[] = { 0, 1024, 1024, 1024 }; // [t,z,y,x]
+hsize_t const output_maxdims[] = { H5S_UNLIMITED, 1024, 1024, 1024 };
+typedef float output_t;
+hid_t const output_type = H5T_NATIVE_FLOAT;
+
+// Technical details
+hsize_t const chunk_size[] = { 1, 128, 128, 128 }; // 8 MB for float
+int const compression_level = 1;
+bool const write_checksum = true;
+
+
+
+// Check a return value
+#define check(_expr) do { bool const _val = (_expr); assert(_val); } while(0)
+
+
+
+static herr_t add_name (hid_t group, const char *name,
+ H5L_info_t const *info, void *op_data);
+
+
+
+int main (int argc, char **argv)
+{
+ cout << "hdf5_recombiner" << endl
+ << "Copyright 2009 Erik Schnetter <schnetter@cct.lsu.edu>" << endl
+ << endl;
+
+
+
+ cout << "Opening output file \"" << output_file_name << "\"" << endl;
+
+ htri_t is_hdf5;
+ H5E_BEGIN_TRY {
+ is_hdf5 = H5Fis_hdf5 (output_file_name);
+ } H5E_END_TRY;
+ bool const file_exists = is_hdf5 > 0;
+ hid_t const output_file =
+ file_exists ?
+ H5Fopen (output_file_name, H5F_ACC_RDWR, H5P_DEFAULT) :
+ H5Fcreate (output_file_name, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT);
+
+
+
+ cout << "Opening output dataset \"" << output_dataset_name << "\""<< endl;
+
+ hid_t const output_datatype = output_type;
+
+ hid_t const output_dataspace =
+ H5Screate_simple (dim+1, output_dims, output_maxdims);
+ assert (output_dataspace >= 0);
+
+ hid_t const output_properties = H5Pcreate (H5P_DATASET_CREATE);
+ assert (output_properties >= 0);
+ check (not H5Pset_chunk (output_properties, dim+1, chunk_size));
+ if (compression_level > 0) {
+ check (not H5Pset_deflate (output_properties, compression_level));
+ }
+ if (write_checksum) {
+ check (not H5Pset_fletcher32 (output_properties));
+ }
+
+ hid_t const output_dataset =
+ file_exists ?
+ H5Dopen (output_file, output_dataset_name, H5P_DEFAULT) :
+ H5Dcreate (output_file, output_dataset_name,
+ output_datatype, output_dataspace,
+ H5P_DEFAULT, output_properties, H5P_DEFAULT);
+ assert (output_dataset >= 0);
+
+
+
+ list<string> input_file_names;
+ for (int input_file_num=0; input_file_num<num_input_files; ++input_file_num) {
+ char input_file_name[10000];
+ snprintf (input_file_name, sizeof input_file_name,
+ input_file_pattern, input_file_num);
+ input_file_names.push_back (input_file_name);
+ }
+ for (int n=1; n<argc; ++n) {
+ input_file_names.push_back (argv[n]);
+ }
+
+ for (list<string>::const_iterator iinput_file_name = input_file_names.begin();
+ iinput_file_name != input_file_names.end();
+ ++ iinput_file_name)
+ {
+ string const& input_file_name = *iinput_file_name;
+ cout << "Opening input file \"" << input_file_name << "\"" << endl;
+ hid_t const input_file =
+ H5Fopen (input_file_name.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
+ assert (input_file >= 0);
+
+ typedef list<string> names_t;
+ names_t names;
+ hsize_t idx = 0;
+ check (not H5Literate (input_file,
+ H5_INDEX_NAME, H5_ITER_NATIVE,
+ &idx, add_name, &names));
+ for (names_t::const_iterator iname =
+ names.begin(); iname!=names.end(); ++iname)
+ {
+ char const *const input_dataset_name = iname->c_str();
+ cout << "Reading input dataset \"" << input_dataset_name << "\"" << endl;
+
+ char varname[10000];
+ int it, tl, c;
+ int const icnt = sscanf (input_dataset_name,
+ "%s it=%d tl=%d c=%d", varname, &it, &tl, &c);
+ assert (icnt == 4);
+ assert (it % iteration_divisor == 0);
+ int const iteration = it / iteration_divisor;
+
+ hid_t const input_dataset =
+ H5Dopen (input_file, input_dataset_name, H5P_DEFAULT);
+ assert (input_dataset >= 0);
+
+ int iorigin[dim];
+ hid_t const iorigin_attr =
+ H5Aopen (input_dataset, "iorigin", H5P_DEFAULT);
+ assert (iorigin_attr >= 0);
+ check (not H5Aread (iorigin_attr, H5T_NATIVE_INT, iorigin));
+ check (not H5Aclose (iorigin_attr));
+
+ hid_t const input_dataspace = H5Dget_space (input_dataset);
+ assert (input_dataspace >= 0);
+ assert (H5Sis_simple (input_dataspace) > 0);
+ assert (H5Sget_simple_extent_ndims (input_dataspace) == dim);
+ hsize_t input_dims[dim];
+ check (H5Sget_simple_extent_dims (input_dataspace, input_dims, NULL) ==
+ dim);
+
+ hid_t const input_memory_dataspace =
+ H5Screate_simple (dim, input_dims, NULL);
+ assert (input_memory_dataspace);
+ hssize_t const input_memory_npoints =
+ H5Sget_simple_extent_npoints (input_memory_dataspace);
+ vector<output_t> data (input_memory_npoints);
+
+ check (not H5Dread (input_dataset,
+ output_type, input_memory_dataspace,
+ input_dataspace,
+ H5P_DEFAULT, &data.front()));
+
+ check (not H5Sclose (input_memory_dataspace));
+ check (not H5Sclose (input_dataspace));
+ check (not H5Dclose (input_dataset));
+
+
+
+ cout << "Writing output dataset" << endl;
+
+ hsize_t output_extent[dim+1];
+ output_extent[0] = iteration + 1;
+ for (int d=0; d<dim; ++d) {
+ output_extent[d+1] = output_dims[d+1];
+ }
+ check (not H5Dextend (output_dataset, output_extent));
+
+ hid_t const output_dataspace =
+ H5Screate_simple (dim+1, output_extent, output_maxdims);
+ assert (output_dataspace >= 0);
+
+ hsize_t output_offset[dim+1];
+ hsize_t output_dims[dim+1];
+ output_offset[0] = iteration;
+ output_dims [0] = 1;
+ for (int d=0; d<dim; ++d) {
+ output_offset[d+1] = iorigin[dim-1-d];
+ output_dims [d+1] = input_dims[d];
+ }
+ check (not H5Sselect_hyperslab (output_dataspace, H5S_SELECT_SET,
+ output_offset, NULL, output_dims, NULL));
+ cout << " extent ["
+ << output_offset[3] << ","
+ << output_offset[2] << ","
+ << output_offset[1] << ","
+ << output_offset[0] << "] - ["
+ << output_offset[3] + output_dims[3] << ","
+ << output_offset[2] + output_dims[2] << ","
+ << output_offset[1] + output_dims[1] << ","
+ << output_offset[0] + output_dims[0] << "] "
+ << "(" << data.size() << " points)" << endl;
+
+ hid_t const output_memory_dataspace =
+ H5Screate_simple (dim+1, output_dims, NULL);
+ assert (output_memory_dataspace);
+ hssize_t const output_memory_npoints =
+ H5Sget_simple_extent_npoints (output_memory_dataspace);
+ assert (output_memory_npoints == input_memory_npoints);
+
+ check (not H5Dwrite (output_dataset,
+ output_type, output_memory_dataspace,
+ output_dataspace,
+ H5P_DEFAULT, &data.front()));
+
+ H5Sclose (output_memory_dataspace);
+ H5Sclose (output_dataspace);
+
+ } // for names
+
+ check (not H5Fclose (input_file));
+
+ } // for input_file_num
+
+
+
+ check (not H5Dclose (output_dataset));
+ check (not H5Pclose (output_properties));
+ check (not H5Sclose (output_dataspace));
+ check (not H5Fclose (output_file));
+
+ cout << "Done." << endl;
+ return 0;
+}
+
+
+
+static herr_t add_name (hid_t const group, const char *const name,
+ H5L_info_t const *const info, void *const op_data)
+{
+ typedef list<string> names_t;
+ names_t& names = * static_cast<names_t*> (op_data);
+ if (strcmp (name, "Parameters and Global Attributes") != 0) {
+ names.push_back (name);
+ }
+ return 0;
+}
diff --git a/Carpet/CarpetIOHDF5/src/util/hdf5toascii_slicer.cc b/Carpet/CarpetIOHDF5/src/util/hdf5toascii_slicer.cc
index 9472f41b0..0c9d32885 100644
--- a/Carpet/CarpetIOHDF5/src/util/hdf5toascii_slicer.cc
+++ b/Carpet/CarpetIOHDF5/src/util/hdf5toascii_slicer.cc
@@ -18,16 +18,9 @@
#include <cstring>
#include <regex.h>
-// some macros to fix compatibility issues as long
-// as 1.8.0 is in beta phase
#define H5_USE_16_API 1
-
#include <hdf5.h>
-#if (H5_VERS_MAJOR == 1 && (H5_VERS_MINOR == 8) && (H5_VERS_RELEASE == 0))
-#warning "Hacking HDF5 1.8.0 compatiblity with 1.6.x; fix once 1.8.0 stable"
-#endif
-
using namespace std;
/*****************************************************************************
diff --git a/Carpet/CarpetIOHDF5/src/util/hdf5tobinary_slicer.cc b/Carpet/CarpetIOHDF5/src/util/hdf5tobinary_slicer.cc
new file mode 100644
index 000000000..d1d75c169
--- /dev/null
+++ b/Carpet/CarpetIOHDF5/src/util/hdf5tobinary_slicer.cc
@@ -0,0 +1,814 @@
+ /*@@
+ @file hdf5tobinary_slicer.cc
+ @date April 23, 2009
+ @author Erik Schnetter, based on hdf5toascii_slicer.cc by Thomas Radke
+ @desc
+ Utility program to extract a 1D line or 2D slice from 3D datasets
+ in datafiles generated by CarpetIOHDF5.
+ The extracted slab is written to a binary file.
+ @enddesc
+ @@*/
+
+#include <algorithm>
+#include <iostream>
+#include <iomanip>
+#include <limits>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <cassert>
+#include <cmath>
+#include <cstdio>
+#include <cstring>
+#include <regex.h>
+
+#define H5_USE_16_API 1
+#include <hdf5.h>
+
+using namespace std;
+
+/*****************************************************************************
+ ************************* Macro Definitions ***************************
+ *****************************************************************************/
+
+// uncomment the following line to get some debug output
+// #define DEBUG 1
+
+// value for an unset parameter
+#define PARAMETER_UNSET -424242.0
+
+// fuzzy factor for comparing dataset timesteps with user-specified value
+#define FUZZY_FACTOR 1e-6
+
+// the datatype for the 'start' argument in H5Sselect_hyperslab()
+#if (H5_VERS_MAJOR == 1 && \
+ (H5_VERS_MINOR < 6 || (H5_VERS_MINOR == 6 && H5_VERS_RELEASE < 4)))
+#define h5size_t hssize_t
+#else
+#define h5size_t hsize_t
+#endif
+
+// macro to check the return code of calls to the HDF5 library
+#define CHECK_HDF5(fn_call) { \
+ const int _retval = fn_call; \
+ if (_retval < 0) { \
+ cerr << "HDF5 call " << #fn_call \
+ << " in file " << __FILE__ << " line " << __LINE__ \
+ << " returned error code " << _retval << endl; \
+ } \
+ }
+
+
+/*****************************************************************************
+ ************************** Type Definitions ***************************
+ *****************************************************************************/
+
+typedef struct {
+ hid_t file;
+ string name;
+ bool is_real;
+ hsize_t dims[3]; // C order
+
+ int map, mglevel, component, iteration, timelevel, rflevel;
+ double time;
+ int iorigin[3]; // Fortran order
+ double origin[3], delta[3]; // Fortran order
+} patch_t;
+
+
+/*****************************************************************************
+ ************************* Global Data *************************
+ *****************************************************************************/
+
+// the slab coordinate as selected by the user (Fortan order)
+static double slab_coord[3] = {PARAMETER_UNSET, PARAMETER_UNSET, PARAMETER_UNSET};
+
+// flag for outputting data in full 3D
+static bool out3D = false;
+
+// the specific timestep selected by the user
+static double timestep = PARAMETER_UNSET;
+
+// the regular expression to match against dataset names
+static const char* regex = NULL;
+static regex_t preg;
+
+// the dataset name, if given explicitly
+static const char* datasetname = NULL;
+
+// the list of all patches
+static vector<patch_t> patchlist;
+
+// maximum refinement level across all patches
+static int max_rflevel = -1;
+
+// whether to print omitted patches
+static bool verbose = false;
+
+// pointer to array that is filled with the data (Fortran order)
+static int datadims[3] = {-1,-1,-1};
+static float* dataptr = NULL;
+static unsigned char* bdataptr = NULL;
+
+// output file name
+static char* basename1 = NULL;
+
+// output format, either raw binary or HDF5
+static bool out_hdf5 = false;
+static int out_hdf5_4d_index = -1;
+
+// output type (float or byte)
+static bool out_float = false;
+static float data_min = -1.0;
+static float data_max = +1.0;
+
+/*****************************************************************************
+ ************************* Function Prototypes *************************
+ *****************************************************************************/
+static herr_t FindPatches (hid_t group, const char *name, void *_file);
+static void ReadPatch (const patch_t& patch, int last_iteration);
+static bool ComparePatches (const patch_t& a, const patch_t& b);
+
+
+ /*@@
+ @routine main
+ @date Sun 30 July 2006
+ @author Thomas Radke
+ @desc
+ Evaluates command line options and opens the input files.
+ @enddesc
+
+ @var argc
+ @vdesc number of command line parameters
+ @vtype int
+ @vio in
+ @endvar
+ @var argv
+ @vdesc array of command line parameters
+ @vtype char* const []
+ @vio in
+ @endvar
+ @@*/
+int main (int argc, char *const argv[])
+{
+ int i;
+ bool help = false;
+#if 0
+ int iorigin[3] = {-1, -1, -1};
+#endif
+ int num_slab_options = 0;
+
+
+ // evaluate command line parameters
+ for (i = 1; i < argc; i++) {
+ if (strcmp (argv[i], "--help") == 0) {
+ help = true; break;
+ } else if (strcmp (argv[i], "--verbose") == 0) {
+ verbose = true;
+ } else if (strcmp (argv[i], "--out3d-cube") == 0) {
+ out3D = true;
+ } else if (strcmp (argv[i], "--timestep") == 0 and i+1 < argc) {
+ timestep = atof (argv[++i]);
+ } else if (strcmp (argv[i], "--match") == 0 and i+1 < argc) {
+ regex = argv[++i];
+ if (regcomp (&preg, regex, REG_EXTENDED)) {
+ cerr << "Error: invalid regular expression '" << regex << "' given"
+ << endl << endl;
+ return (-1);
+ }
+ } else if (strcmp (argv[i], "--dataset") == 0 and i+1 < argc) {
+ datasetname = argv[++i];
+ } else if (strcmp (argv[i], "--out-precision") == 0 and i+1 < argc) {
+ cout << setprecision (atoi (argv[++i]));
+ } else if (strcmp (argv[i], "--out0d-point") == 0 and i+3 < argc) {
+ slab_coord[0] = atof (argv[++i]);
+ slab_coord[1] = atof (argv[++i]);
+ slab_coord[2] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out1d-xline-yz") == 0 and i+2 < argc) {
+ slab_coord[1] = atof (argv[++i]);
+ slab_coord[2] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out1d-yline-xz") == 0 and i+2 < argc) {
+ slab_coord[0] = atof (argv[++i]);
+ slab_coord[2] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out1d-zline-xy") == 0 and i+2 < argc) {
+ slab_coord[0] = atof (argv[++i]);
+ slab_coord[1] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out2d-yzplane-x") == 0 and i+1 < argc) {
+ slab_coord[0] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out2d-xzplane-y") == 0 and i+1 < argc) {
+ slab_coord[1] = atof (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out2d-xyplane-z") == 0 and i+1 < argc) {
+ slab_coord[2] = atof (argv[++i]); num_slab_options++;
+#if 0
+ } else if (strcmp (argv[i], "--out2d-yzplane-xi") == 0 and i+1 < argc) {
+ iorigin[0] = atoi (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out2d-xzplane-yi") == 0 and i+1 < argc) {
+ iorigin[1] = atoi (argv[++i]); num_slab_options++;
+ } else if (strcmp (argv[i], "--out2d-xyplane-zi") == 0 and i+1 < argc) {
+ iorigin[2] = atoi (argv[++i]); num_slab_options++;
+#endif
+ } else if (strcmp (argv[i], "--size") == 0 and i+3 < argc) {
+ datadims[0] = atof (argv[++i]);
+ datadims[1] = atof (argv[++i]);
+ datadims[2] = atof (argv[++i]);
+ } else if (strcmp (argv[i], "--basename") == 0 and i+1 < argc) {
+ basename1 = argv[++i];
+ } else if (strcmp (argv[i], "--out-hdf5") == 0) {
+ out_hdf5 = true;
+ } else if (strcmp (argv[i], "--out-float") == 0) {
+ out_float = true;
+ } else if (strcmp (argv[i], "--data-min") == 0 and i+1 < argc) {
+ data_min = atof (argv[++i]);
+ } else if (strcmp (argv[i], "--data-max") == 0 and i+1 < argc) {
+ data_max = atof (argv[++i]);
+ } else if (strcmp (argv[i], "--out-hdf5-4d-index") == 0 and i+1 < argc) {
+ out_hdf5_4d_index = atof (argv[++i]);
+ } else {
+ break;
+ }
+ }
+
+ /* give some help if called with incorrect number of parameters */
+ if (help or i >= argc or num_slab_options != (out3D ? 0 : 1)) {
+ const string indent (strlen (argv[0]) + 1, ' ');
+ cerr << endl << " ---------------------------"
+ << endl << " Carpet HDF5 to ASCII Slicer"
+ << endl << " ---------------------------" << endl
+ << endl
+ << "Usage: " << endl
+ << argv[0] << " [--help]" << endl
+ << indent << "[--match <regex string>]" << endl
+ << indent << "[--dataset <string (can contain %p)>]" << endl
+ << indent << "[--out-precision <digits>]" << endl
+ << indent << "[--timestep <cctk_time value>]" << endl
+ << indent << "[--verbose]" << endl
+ << indent << "<--out0d-point value value value> | <--out1d-line value value> | <--out2d-plane value> | <out3d-cube>" << endl
+ << indent << "--size <ni> <nj> <nk>" << endl
+ << indent << "--basename <filename>" << endl
+ << indent << "[--out-hdf5]" << endl
+ << indent << "[--out-float]" << endl
+ << indent << "[--out-hdf5-4d-index <t index>]" << endl
+ << indent << "<hdf5_infiles>" << endl << endl
+ << " where" << endl
+ << " [--help] prints this help" << endl
+ << " [--match <regex string>] selects HDF5 datasets by their names" << endl
+ << " matching a regex string using POSIX" << endl
+ << " Extended Regular Expression syntax" << endl
+ << " [--out-precision <digits>] sets the output precision" << endl
+ << " for floating-point numbers" << endl
+ << " [--timestep <cctk_time value>] selects all HDF5 datasets which" << endl
+ << " (fuzzily) match the specified time" << endl
+ << " [--verbose] lists skipped HDF5 datasets on stderr" << endl
+ << endl
+ << " and either --out0d-point value value value> or <--out1d-line value value> or <--out2d-plane value> or <--out3d-cube>" << endl
+ << " must be specified as in the following:" << endl
+ << " --out0d-point <origin_x> <origin_y> <origin_z>" << endl
+ << endl
+ << " --out1d-xline-yz <origin_y> <origin_z>" << endl
+ << " --out1d-yline-xz <origin_x> <origin_z>" << endl
+ << " --out1d-zline-xy <origin_x> <origin_y>" << endl
+ << endl
+ << " --out2d-yzplane-x <origin_x>" << endl
+ << " --out2d-xzplane-y <origin_y>" << endl
+ << " --out2d-xyplane-z <origin_z>" << endl
+ << endl
+ << " --out3d-cube" << endl
+#if 0
+ << " --out2d-yzplane-xi <origin_xi>" << endl
+ << " --out2d-xzplane-yi <origin_yi>" << endl
+ << " --out2d-xyplane-zi <origin_zi>" << endl
+#endif
+ << endl
+ << " eg, to extract a 2D xy-plane at z = 0:" << endl
+ << " " << argv[0] << " --out2d-xyplane-z 0 alp.file_*.h5" << endl
+ << endl
+ << " or the same plane but only for datasets of refinement level 0:" << endl
+ << " " << argv[0] << " --match 'ADMBASE::alp it=[0-9]+ tl=0 rl=0' --out2d-xyplane-z 0 alp.file_*.h5" << endl;
+ return (0);
+ }
+
+ if (not basename1) {
+ cerr << "Parameter --basename is not set" << endl;
+ return 1;
+ }
+
+ if (regex and datasetname) {
+ cerr << "Parameters --match and --dataset cannot be used together" << endl;
+ return 1;
+ }
+
+ {
+ if (datadims[0]<0 || datadims[1]<0 || datadims[2]<0) {
+ cerr << "Parameter --size is not set" << endl;
+ return 1;
+ }
+ size_t const npoints = (size_t)datadims[0]*datadims[1]*datadims[2];
+ dataptr = new float[npoints];
+ assert (dataptr);
+ bdataptr = new unsigned char[npoints];
+ assert (bdataptr);
+ }
+
+ vector<hid_t> filelist;
+ for (; i < argc; i++) {
+ hid_t file;
+
+ H5E_BEGIN_TRY {
+ file = H5Fopen (argv[i], H5F_ACC_RDONLY, H5P_DEFAULT);
+ } H5E_END_TRY;
+
+ if (file < 0) {
+ cerr << "Could not open Carpet HDF5 input file '" << argv[i] << "'"
+ << endl << endl;
+ continue;
+ }
+
+ if (not datasetname) {
+ cout << "File " << argv[i] << ":" << endl;
+ size_t const before = patchlist.size();
+ CHECK_HDF5 (H5Giterate (file, "/", NULL, FindPatches, &file));
+ size_t const after = patchlist.size();
+ size_t const count = after - before;
+ cout << " will read " << count << " "
+ << (count==1 ? "patch" : "patches") << endl;
+ } else {
+ const string ppmarker ("%p");
+ const string filemarker (".file_");
+ string name (datasetname);
+ const size_t pppos = name.find(ppmarker);
+ if (pppos != string::npos) {
+ const string filename (argv[i]);
+ const size_t procpos = filename.find(filemarker);
+ assert (procpos != string::npos);
+ const int proc = atoi(filename.c_str() + procpos + filemarker.length());
+ ostringstream namebuf;
+ namebuf << name.substr(0,pppos) << proc
+ << name.substr(pppos + ppmarker.length());
+ name = namebuf.str();
+ }
+ cout << " Examining dataset " << name << endl;
+ hid_t group;
+ CHECK_HDF5 (group = H5Dopen (file, name.c_str()));
+ FindPatches (group, name.c_str(), &file);
+ CHECK_HDF5 (H5Dclose (group));
+ }
+
+ filelist.push_back (file);
+ }
+
+ if (! patchlist.empty()) {
+ /* now sort the patches by their time attribute */
+ sort (patchlist.begin(), patchlist.end(), ComparePatches);
+
+ cout << "# 1D ASCII output created by";
+ for (int j = 0; j < argc; j++) cout << " " << argv[j];
+ cout << endl << "#" << endl;
+
+ int last_iteration = patchlist[0].iteration - 1;
+ for (size_t j = 0; j < patchlist.size(); j++) {
+ ReadPatch (patchlist[j], last_iteration);
+ last_iteration = patchlist[j].iteration;
+ }
+ } else {
+ cerr << "No valid datasets found" << endl << endl;
+ }
+
+ // find minimum and maximum
+ {
+ float const float_max = numeric_limits<float>::max();
+ float data_min1 = +float_max;
+ float data_max1 = -float_max;
+ double data_sum = 0.0;
+ double data_sum2 = 0.0;
+ double data_count = 0.0;
+ size_t const npoints = (size_t)datadims[0]*datadims[1]*datadims[2];
+ for (size_t n=0; n<npoints; ++n) {
+ float const data = dataptr[n];
+ if (data > -sqrt(float_max) and data < sqrt(float_max)) {
+ data_min1 = min(data_min1, data);
+ data_max1 = max(data_max1, data);
+ data_sum += (double)data;
+ data_sum2 += pow((double)data, 2.0);
+ ++ data_count;
+ }
+ }
+ double const data_avg = data_sum / data_count;
+ double const data_stddev =
+ sqrt(max(0.0, data_sum2/data_count - pow(data_avg, 2)));
+
+ cerr << "Minimum: " << data_min1 << endl
+ << "Maximum: " << data_max1 << endl
+ << "Average: " << data_avg << endl
+ << "Standard deviation: " << data_stddev << endl
+ << "Valid points: " << data_count << endl;
+ }
+
+ // convert from float to byte
+ if (not out_float) {
+ unsigned char const byte_min = 0;
+ unsigned char const byte_max = 255;
+ float const scale_factor =
+ ((float)byte_max - (float)byte_min + 1) / (data_max - data_min);
+ size_t const npoints = (size_t)datadims[0]*datadims[1]*datadims[2];
+ for (size_t n=0; n<npoints; ++n) {
+ float const data = dataptr[n];
+ float const data_scaled =
+ (float)byte_min + floor((data - data_min) * scale_factor);
+ float const data_clamped =
+ max((float)byte_min, min((float)byte_max, data_scaled));
+ unsigned char const bdata =
+ (unsigned char)data_clamped;
+ bdataptr[n] = bdata;
+ }
+ }
+
+ hid_t const out_type = out_float ? H5T_NATIVE_FLOAT : H5T_NATIVE_UCHAR;
+ size_t const out_size = out_float ? sizeof *dataptr : sizeof *bdataptr;
+ void const * const out_data =
+ out_float ?
+ static_cast<void const*>(dataptr) :
+ static_cast<void const*>(bdataptr);
+
+ // write output files
+ if (out_hdf5) {
+ // HDF5 output
+ if (out_hdf5_4d_index == -1) {
+ // 3D output
+ char filename[1000];
+ snprintf (filename, sizeof filename, "%s.h5", basename1);
+ hid_t const outfile = H5Fcreate (filename, H5F_ACC_TRUNC,
+ H5P_DEFAULT, H5P_DEFAULT);
+ assert (outfile >= 0);
+ hsize_t const dims[3] = { datadims[2], datadims[1], datadims[0] };
+ hid_t const dataspace = H5Screate_simple (3, dims, NULL);
+ assert (dataspace >= 0);
+ hid_t const dataset_properties = H5Pcreate (H5P_DATASET_CREATE);
+ assert (dataset_properties >= 0);
+ hid_t const dataset = H5Dcreate (outfile, "data",
+ out_type, dataspace,
+ dataset_properties);
+ assert (dataset >= 0);
+ hid_t const transfer_properties = H5Pcreate (H5P_DATASET_XFER);
+ assert (transfer_properties >= 0);
+ {
+ herr_t const herr = H5Dwrite (dataset, out_type,
+ H5S_ALL, H5S_ALL,
+ transfer_properties, out_data);
+ assert (herr >= 0);
+ }
+ CHECK_HDF5 (H5Dclose (dataset));
+ CHECK_HDF5 (H5Sclose (dataspace));
+ CHECK_HDF5 (H5Fclose (outfile));
+ } else {
+ // 4d output
+ char filename[1000];
+ snprintf (filename, sizeof filename, "%s.h5", basename1);
+ htri_t is_hdf5;
+ H5E_BEGIN_TRY {
+ is_hdf5 = H5Fis_hdf5 (filename);
+ } H5E_END_TRY;
+ bool const file_is_new = not (is_hdf5 > 0);
+ hid_t const outfile =
+ file_is_new ?
+ H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT) :
+ H5Fopen (filename, H5F_ACC_RDWR, H5P_DEFAULT);
+ assert (outfile >= 0);
+
+ hsize_t const dims[4] =
+ { 0, datadims[2], datadims[1], datadims[0] };
+ hsize_t const maxdims[4] =
+ { H5S_UNLIMITED, datadims[2], datadims[1], datadims[0] };
+ hid_t const dataspace = H5Screate_simple (4, dims, maxdims);
+ assert (dataspace >= 0);
+ hid_t const dataset_properties = H5Pcreate (H5P_DATASET_CREATE);
+ assert (dataset_properties >= 0);
+ // hsize_t const chunk_dims[4] = {1, 32, 32, 32 };
+ // Chunks must be < 4 GByte
+ // hsize_t const chunk_dims[4] =
+ // {1, datadims[2], datadims[1], datadims[0] };
+ hsize_t const chunk_dims[4] =
+ {1, min(128,datadims[2]), min(128,datadims[1]), min(128,datadims[0]) };
+ CHECK_HDF5 (H5Pset_chunk (dataset_properties, 4, chunk_dims));
+ int const compression_level = 1;
+ CHECK_HDF5 (H5Pset_deflate (dataset_properties, compression_level));
+ hid_t const dataset =
+ file_is_new ?
+ H5Dcreate (outfile, "data",
+ out_type, dataspace, dataset_properties) :
+ H5Dopen (outfile, "data");
+ assert (dataset >= 0);
+ // TODO: assert that the dataset's dataspace has the correct
+ // dimensions
+
+ hsize_t const extended_dims[4] =
+ { out_hdf5_4d_index+1, datadims[2], datadims[1], datadims[0] };
+ CHECK_HDF5 (H5Dextend (dataset, extended_dims));
+
+ // for debugging only
+ // CHECK_HDF5 (H5Fflush (outfile, H5F_SCOPE_GLOBAL));
+
+ hsize_t const memory_dims[4] =
+ { 1, datadims[2], datadims[1], datadims[0] };
+ hid_t const memory_dataspace = H5Screate_simple (4, memory_dims, NULL);
+ assert (memory_dataspace >= 0);
+
+ hid_t const file_dataspace = H5Screate_simple (4, extended_dims, NULL);
+ assert (file_dataspace >= 0);
+ // hssize_t const file_offset[4] =
+ // { out_hdf5_4d_index, 0, 0, 0 };
+ // CHECK_HDF5 (H5Soffset_simple (file_dataspace, file_offset));
+ hsize_t const file_offset[4] = { out_hdf5_4d_index, 0, 0, 0 };
+ CHECK_HDF5 (H5Sselect_hyperslab (file_dataspace, H5S_SELECT_SET,
+ file_offset, NULL, memory_dims, NULL));
+
+ hid_t const transfer_properties = H5Pcreate (H5P_DATASET_XFER);
+ assert (transfer_properties >= 0);
+ CHECK_HDF5 (H5Dwrite (dataset,
+ out_type, memory_dataspace, file_dataspace,
+ transfer_properties, out_data));
+
+ CHECK_HDF5 (H5Sclose (file_dataspace));
+ CHECK_HDF5 (H5Sclose (memory_dataspace));
+ CHECK_HDF5 (H5Dclose (dataset));
+ CHECK_HDF5 (H5Sclose (dataspace));
+ CHECK_HDF5 (H5Fclose (outfile));
+ }
+ } else {
+ // raw binary output
+ {
+ char filename[1000];
+ snprintf (filename, sizeof filename, "%s.bin", basename1);
+ FILE* const outfile = fopen(filename, "w");
+ assert (outfile);
+ size_t const npoints = (size_t)datadims[0]*datadims[1]*datadims[2];
+ size_t const icnt = fwrite (out_data, out_size, npoints, outfile);
+ assert (icnt == npoints);
+ int const ierr = fclose (outfile);
+ assert (not ierr);
+ }
+ }
+
+ {
+ delete[] dataptr;
+ dataptr = NULL;
+ delete[] bdataptr;
+ bdataptr = NULL;
+ }
+
+ // close all input files
+ for (size_t j = 0; j < filelist.size(); j++) {
+ if (filelist[j] >= 0) {
+ CHECK_HDF5 (H5Fclose (filelist[j]));
+ }
+ }
+
+ return (0);
+}
+
+
+ /*@@
+ @routine FindPatches
+ @date Tue 8 August 2006
+ @author Thomas Radke
+ @desc
+ The worker routine which is called by H5Giterate().
+ It checks whether the current HDF5 object is a patch matching
+ the user's slab criteria, and adds it to the patches list.
+ @enddesc
+
+ @var group
+ @vdesc HDF5 object to start the iteration
+ @vtype hid_t
+ @vio in
+ @endvar
+ @var name
+ @vdesc name of the object at the current iteration
+ @vtype const char *
+ @vio in
+ @endvar
+ @var _file
+ @vdesc pointer to the descriptor of the currently opened file
+ @vtype void *
+ @vio in
+ @endvar
+@@*/
+static herr_t FindPatches (hid_t group, const char *name, void *_file)
+{
+ int ndims;
+ hid_t dataset, datatype, attr;
+ H5G_stat_t object_info;
+ H5T_class_t typeclass;
+ patch_t patch;
+
+
+ /* we are interested in datasets only - skip anything else */
+ CHECK_HDF5 (H5Gget_objinfo (group, name, 0, &object_info));
+ if (object_info.type != H5G_DATASET) {
+ return (0);
+ }
+
+ /* check the dataset's datatype - make sure it is either integer or real */
+ CHECK_HDF5 (dataset = H5Dopen (group, name));
+ patch.name = name;
+
+ CHECK_HDF5 (datatype = H5Dget_type (dataset));
+ CHECK_HDF5 (typeclass = H5Tget_class (datatype));
+ CHECK_HDF5 (H5Tclose (datatype));
+
+ // read the timestep
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "time"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_DOUBLE, &patch.time));
+ CHECK_HDF5 (H5Aclose (attr));
+
+ // read the dimensions
+ hid_t dataspace = -1;
+ CHECK_HDF5 (dataspace = H5Dget_space (dataset));
+ ndims = H5Sget_simple_extent_ndims (dataspace);
+
+ bool is_okay = false;
+ if (typeclass != H5T_FLOAT and typeclass != H5T_INTEGER) {
+ if (verbose) {
+ cerr << "skipping dataset '" << name << "':" << endl
+ << " is not of integer or floating-point datatype" << endl;
+ }
+ } else if (ndims != 3) {
+ if (verbose) {
+ cerr << "skipping dataset '" << name << "':" << endl
+ << " dataset has " << ndims << " dimensions" << endl;
+ }
+ } else if (regex && regexec (&preg, name, 0, NULL, 0)) {
+ if (verbose) {
+ cerr << "skipping dataset '" << name << "':" << endl
+ << " name doesn't match regex" << endl;
+ }
+ } else if (timestep != PARAMETER_UNSET and
+ fabs (timestep - patch.time) > FUZZY_FACTOR) {
+ if (verbose) {
+ cerr << "skipping dataset '" << name << "':" << endl
+ << " timestep (" << patch.time << ") doesn't match" << endl;
+ }
+ } else {
+ if (not out3D) {
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "origin"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_DOUBLE, patch.origin));
+ CHECK_HDF5 (H5Aclose (attr));
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "delta"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_DOUBLE, patch.delta));
+ CHECK_HDF5 (H5Aclose (attr));
+ }
+ CHECK_HDF5 (H5Sget_simple_extent_dims (dataspace, patch.dims, NULL));
+
+ int i;
+ is_okay = out3D;
+ if (not out3D) {
+ for (i = 0; i < 3; i++) {
+ if (slab_coord[i] != PARAMETER_UNSET) {
+ is_okay = slab_coord[i] >= patch.origin[i] and
+ slab_coord[i] <= patch.origin[i] +
+ (patch.dims[2-i]-1)*patch.delta[i];
+ if (not is_okay) break;
+ }
+ }
+ }
+ if (not is_okay) {
+ if (verbose) {
+ cerr << "skipping dataset '" << name << "':" << endl
+ << " slab " << slab_coord[i] << " is out of dataset range ["
+ << patch.origin[i] << ", "
+ << patch.origin[i] + (patch.dims[2-i]-1)*patch.delta[i] << "]"
+ << endl;
+ }
+ }
+ }
+ CHECK_HDF5 (H5Sclose (dataspace));
+
+ if (not is_okay) {
+ CHECK_HDF5 (H5Dclose (dataset));
+ return (0);
+ }
+
+ patch.file = *(hid_t *) _file;
+ patch.is_real = typeclass == H5T_FLOAT;
+
+ /* read attributes */
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "timestep"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_INT, &patch.iteration));
+ CHECK_HDF5 (H5Aclose (attr));
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "level"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_INT, &patch.rflevel));
+ CHECK_HDF5 (H5Aclose (attr));
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "group_timelevel"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_INT, &patch.timelevel));
+ CHECK_HDF5 (H5Aclose (attr));
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "carpet_mglevel"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_INT, &patch.mglevel));
+ CHECK_HDF5 (H5Aclose (attr));
+ CHECK_HDF5 (attr = H5Aopen_name (dataset, "iorigin"));
+ CHECK_HDF5 (H5Aread (attr, H5T_NATIVE_INT, patch.iorigin));
+ CHECK_HDF5 (H5Aclose (attr));
+
+ CHECK_HDF5 (H5Dclose (dataset));
+
+ // the component and map info are not contained in the HDF5 dataset
+ // and thus have to be parsed from the dataset's name
+ patch.map = patch.component = 0;
+ string::size_type loc = patch.name.find (" m=", 0);
+ if (loc != string::npos) patch.map = atoi (patch.name.c_str() + loc + 3);
+ loc = patch.name.find (" c=", 0);
+ if (loc != string::npos) patch.component = atoi(patch.name.c_str() + loc + 3);
+
+ if (max_rflevel < patch.rflevel) max_rflevel = patch.rflevel;
+
+ patchlist.push_back (patch);
+
+ return (0);
+}
+
+
+ /*@@
+ @routine ReadPatch
+ @date Tue 8 August 2006
+ @author Thomas Radke
+ @desc
+ Reads a slab from the given patch
+ and outputs it in CarpetIOASCII format.
+ @enddesc
+
+ @var patch
+ @vdesc patch to output
+ @vtype const patch_t&
+ @vio in
+ @endvar
+ @var last_iteration
+ @vdesc iteration number of the last patch that was output
+ @vtype int
+ @vio in
+ @endvar
+@@*/
+static void ReadPatch (const patch_t& patch, int last_iteration)
+{
+ if (patch.iteration != last_iteration) cout << endl;
+
+ cout << "# iteration " << patch.iteration << endl
+ << "# refinement level " << patch.rflevel
+ << " multigrid level " << patch.mglevel
+ << " map " << patch.map
+ << " component " << patch.component
+ << " time level " << patch.timelevel
+ << endl;
+
+ // C order
+ h5size_t slabstart[3] =
+ {patch.iorigin[2], patch.iorigin[1], patch.iorigin[0]};
+ hsize_t slabcount[3] = {patch.dims[0], patch.dims[1], patch.dims[2]};
+ hsize_t slabsize[3] = {datadims[2], datadims[1], datadims[0]};
+ for (int d=0; d<3; ++d) {
+ if (slab_coord[d] != PARAMETER_UNSET) {
+ slabstart[2-d] = (h5size_t) ((slab_coord[d] - patch.origin[d]) /
+ patch.delta[d] + 0.5);
+ slabcount[2-d] = 1;
+ }
+ }
+ for (int d=0; d<3; ++d) {
+ cout << "slab[" << d << "]: lbnd=" << slabstart[2-d] << " lsh=" << slabcount[2-d] << " gsh=" << slabsize[2-d] << endl;
+ }
+ for (int d=0; d<3; ++d) {
+ assert (slabstart[2-d] >= 0);
+ assert (slabcount[2-d] >= 0);
+ assert (slabstart[2-d] + slabcount[2-d] <= slabsize[2-d]);
+ }
+
+ hid_t dataset, filespace, slabspace;
+ CHECK_HDF5 (dataset = H5Dopen (patch.file, patch.name.c_str()));
+ CHECK_HDF5 (filespace = H5Dget_space (dataset));
+#if 0
+ CHECK_HDF5 (slabspace = H5Screate_simple (3, slabcount, slabsize));
+ CHECK_HDF5 (H5Soffset_simple (slabspace, (hssize_t*)slabstart));
+// CHECK_HDF5 (H5Sselect_hyperslab (filespace, H5S_SELECT_SET,
+// slabstart, NULL, slabcount, NULL));
+#endif
+ CHECK_HDF5 (slabspace = H5Screate_simple (3, slabsize, NULL));
+ CHECK_HDF5 (H5Sselect_hyperslab (slabspace, H5S_SELECT_SET,
+ slabstart, NULL, slabcount, NULL));
+ assert (patch.is_real);
+ CHECK_HDF5 (H5Dread (dataset,
+ H5T_NATIVE_FLOAT,
+ slabspace, filespace, H5P_DEFAULT,
+ dataptr));
+ CHECK_HDF5 (H5Sclose (slabspace));
+ CHECK_HDF5 (H5Sclose (filespace));
+ CHECK_HDF5 (H5Dclose (dataset));
+}
+
+
+// comparison function to sort patches by iteration number, refinement level,
+// multigrid level, map, and component
+static bool ComparePatches (const patch_t& a, const patch_t& b)
+{
+ if (a.iteration != b.iteration) return (a.iteration < b.iteration);
+ if (a.rflevel != b.rflevel) return (a.rflevel < b.rflevel);
+ if (a.mglevel != b.mglevel) return (a.mglevel < b.mglevel);
+ if (a.map != b.map) return (a.map < b.map);
+ if (a.component != b.component) return (a.component < b.component);
+ return (a.timelevel < b.timelevel);
+}
diff --git a/Carpet/CarpetIOScalar/README b/Carpet/CarpetIOScalar/README
index cfce28fd4..a6cc34d50 100644
--- a/Carpet/CarpetIOScalar/README
+++ b/Carpet/CarpetIOScalar/README
@@ -1,8 +1,9 @@
Cactus Code Thorn CarpetIOScalar
-Thorn Author(s) : Erik Schnetter <schnetter@aei.mpg.de>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@aei.mpg.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides scalar output for Carpet.
diff --git a/Carpet/CarpetIOScalar/src/ioscalar.cc b/Carpet/CarpetIOScalar/src/ioscalar.cc
index b25241659..b96528698 100644
--- a/Carpet/CarpetIOScalar/src/ioscalar.cc
+++ b/Carpet/CarpetIOScalar/src/ioscalar.cc
@@ -54,6 +54,7 @@ namespace CarpetIOScalar {
static void* SetupGH (tFleshConfig* fc, int convLevel, cGH* cctkGH);
static int OutputGH (const cGH* cctkGH);
static int OutputVarAs (const cGH* cctkGH, const char* varname, const char* alias);
+ static int OutputVarAs (const cGH* cctkGH, const char* varname, const char* alias, const char* out_reductions);
static int TimeToOutput (const cGH* cctkGH, int vindex);
static int TriggerOutput (const cGH* cctkGH, int vindex);
@@ -169,6 +170,19 @@ namespace CarpetIOScalar {
OutputVarAs (const cGH * const cctkGH,
const char* const varname, const char* const alias)
{
+ DECLARE_CCTK_PARAMETERS;
+
+ int const retval = OutputVarAs (cctkGH, varname, alias,
+ outScalar_reductions);
+
+ return retval;
+ }
+
+ int
+ OutputVarAs (const cGH * const cctkGH,
+ const char* const varname, const char* const alias,
+ const char* out_reductions)
+ {
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
@@ -233,7 +247,7 @@ namespace CarpetIOScalar {
// Find the set of desired reductions
list<info> reductions;
- string const redlist (outScalar_reductions);
+ string const redlist (out_reductions);
string::const_iterator p = redlist.begin();
while (p!=redlist.end()) {
while (p!=redlist.end() and isspace(*p)) ++p;
@@ -613,6 +627,11 @@ namespace CarpetIOScalar {
assert (vindex>=0 and vindex<CCTK_NumVars());
+ // use individual reductions list for this variable when given
+ // otherwise IOScalar::outScalar_reductions
+ const char* out_reductions = IOparameters.requests[vindex]->reductions;
+ if (not out_reductions) out_reductions = outScalar_reductions;
+
int retval;
if (one_file_per_group) {
@@ -621,7 +640,7 @@ namespace CarpetIOScalar {
int const gindex = CCTK_GroupIndexFromVarI(vindex);
char* const groupname = CCTK_GroupName(gindex);
for (char* p=groupname; *p; ++p) *p=tolower(*p);
- retval = OutputVarAs (cctkGH, fullname, groupname);
+ retval = OutputVarAs (cctkGH, fullname, groupname, out_reductions);
free (fullname);
free (groupname);
@@ -635,7 +654,7 @@ namespace CarpetIOScalar {
char* const fullname = CCTK_FullName(vindex);
char const* const varname = CCTK_VarName(vindex);
- retval = OutputVarAs (cctkGH, fullname, varname);
+ retval = OutputVarAs (cctkGH, fullname, varname, out_reductions);
free (fullname);
last_output.at(vindex) = cctk_iteration;
@@ -661,20 +680,18 @@ namespace CarpetIOScalar {
// notify the user about the new setting
if (not CCTK_Equals (verbose, "none")) {
int count = 0;
- string msg ("Periodic scalar output requested for '");
- for (int i = CCTK_NumVars () - 1; i >= 0; i--) {
- if (IOparameters.requests[i]) {
- if (count++) {
- msg += "', '";
- }
- char *fullname = CCTK_FullName (i);
- msg += fullname;
+ ostringstream msg;
+ msg << "Periodic scalar output requested for:";
+ for (int vi=0; vi<CCTK_NumVars(); ++vi) {
+ if (IOparameters.requests[vi]) {
+ ++count;
+ char* const fullname = CCTK_FullName(vi);
+ msg << eol << " " << fullname;
free (fullname);
}
}
- if (count) {
- msg += "'";
- CCTK_INFO (msg.c_str());
+ if (count > 0) {
+ CCTK_INFO (msg.str().c_str());
}
}
diff --git a/Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl b/Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl
index 3aae60c3b..3aae60c3b 100755..100644
--- a/Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl
+++ b/Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl
diff --git a/Carpet/CarpetIOStreamedHDF5/README b/Carpet/CarpetIOStreamedHDF5/README
index 57009b177..0f5f11a91 100644
--- a/Carpet/CarpetIOStreamedHDF5/README
+++ b/Carpet/CarpetIOStreamedHDF5/README
@@ -1,9 +1,10 @@
Cactus Code Thorn CarpetIOStreamedHDF5
-Thorn Author(s) : Thomas Radke <tradke@aei.mpg.de>
-Thorn Maintainer(s) : Thomas Radke <tradke@aei.mpg.de>
+Author(s) : Thomas Radke <tradke@aei.mpg.de>
+Maintainer(s): Thomas Radke <tradke@aei.mpg.de>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn uses the HDF5 Stream Virtual File Driver to stream Carpet HDF5 data
files via a socket to any connected clients.
diff --git a/Carpet/CarpetInterp/README b/Carpet/CarpetInterp/README
index e7692e3ea..6e6aa5fa3 100644
--- a/Carpet/CarpetInterp/README
+++ b/Carpet/CarpetInterp/README
@@ -1,8 +1,9 @@
Cactus Code Thorn CarpetInterp
-Thorn Author(s) : Erik Schnetter <schnetter@uni-tuebingen.de>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides a parallel interpolator for Carpet.
diff --git a/Carpet/CarpetInterp/param.ccl b/Carpet/CarpetInterp/param.ccl
index d75bad138..090ef1bcb 100644
--- a/Carpet/CarpetInterp/param.ccl
+++ b/Carpet/CarpetInterp/param.ccl
@@ -16,11 +16,11 @@ CCTK_REAL ipoison "Integer poison value" STEERABLE=always
BOOLEAN tree_search "Use a tree search to find the source processor" STEERABLE=always
{
-} "no"
+} "yes"
BOOLEAN check_tree_search "Cross-check the result of the tree search" STEERABLE=always
{
-} "yes"
+} "no"
SHARES: Cactus
diff --git a/Carpet/CarpetInterp/src/interp.cc b/Carpet/CarpetInterp/src/interp.cc
index 4591fc04b..4707fd7cc 100644
--- a/Carpet/CarpetInterp/src/interp.cc
+++ b/Carpet/CarpetInterp/src/interp.cc
@@ -4,6 +4,7 @@
#include <cstdlib>
#include <cstring>
#include <iostream>
+#include <map>
#include <vector>
#include <mpi.h>
@@ -65,6 +66,7 @@ namespace CarpetInterp {
int const N_interp_points,
int const N_input_arrays,
int const N_output_arrays,
+ bool& want_global_mode,
bool& have_source_map,
vector<int> & num_time_derivs,
int & prolongation_order_time,
@@ -83,14 +85,16 @@ namespace CarpetInterp {
int const maxrl,
int const maxncomps,
int const N_dims,
+ int const ndims,
int const npoints,
vector<CCTK_INT> & source_map,
void const * const coords_list[],
- vector<CCTK_REAL> const& coords,
+ CCTK_REAL const * const coords,
vector<int>& procs,
- vector<int>& N_points_to,
+ vector<int>& sendcnt,
vector<int>& rlev,
vector<int>& home,
+ std::map<int, int>& homecntsmap,
vector<int>& homecnts);
static void
@@ -103,13 +107,15 @@ namespace CarpetInterp {
bool const want_global_mode,
int const prolongation_order_time,
int const N_dims,
- vector<int> & homecnts,
- vector<CCTK_REAL*> & coords,
- vector<char*> & outputs,
+ vector<int> const & homecnts,
+ std::map<int, int> const & homecntsmap,
+ vector<CCTK_INT> const & recvcnt,
+ vector<CCTK_REAL*> const & coords,
+ vector<char*> const & outputs,
CCTK_INT* const per_proc_statuses,
CCTK_INT* const per_proc_retvals,
- vector<CCTK_INT> & operand_indices,
- vector<CCTK_INT> & time_deriv_order,
+ vector<CCTK_INT> const & operand_indices,
+ vector<CCTK_INT> const & time_deriv_order,
vector<int> const & num_time_derivs,
CCTK_INT const local_interp_handle,
CCTK_INT const param_table_handle,
@@ -130,9 +136,9 @@ namespace CarpetInterp {
char* const outputs,
CCTK_INT& overall_status,
CCTK_INT& overall_retval,
- vector<CCTK_INT> & operand_indices,
- vector<CCTK_INT> & time_deriv_order,
- vector<CCTK_INT> & interp_num_time_levels,
+ vector<CCTK_INT> const & operand_indices,
+ vector<CCTK_INT> const & time_deriv_order,
+ vector<CCTK_INT> const & interp_num_time_levels,
CCTK_INT const local_interp_handle,
CCTK_INT const param_table_handle,
vector<int> const & num_tl,
@@ -289,8 +295,6 @@ namespace CarpetInterp {
"It is not possible to interpolate in meta mode");
}
- bool const want_global_mode = is_global_mode();
-
// Multiple convergence levels are not supported
assert (mglevels == 1);
@@ -331,31 +335,13 @@ namespace CarpetInterp {
MPI_Barrier (dist::comm());
}
-
- // Find range of refinement levels
- assert (maps > 0);
- for (int m=1; m<maps; ++m) {
- assert (arrdata.AT(coord_group).AT(0).hh->reflevels() ==
- arrdata.AT(coord_group).AT(m).hh->reflevels());
- }
- int const minrl = want_global_mode ? 0 : reflevel;
- int const maxrl = want_global_mode ?
- arrdata.AT(coord_group).AT(0).hh->reflevels() : reflevel+1;
-
- // Find maximum number of components over all levels and maps
- int maxncomps = 0;
- for (int rl=minrl; rl<maxrl; ++rl) {
- for (int m=0; m<maps; ++m) {
- maxncomps = max(maxncomps, arrdata.AT(coord_group).AT(m).hh->components(rl));
- }
- }
-
//////////////////////////////////////////////////////////////////////
// Extract parameter table options:
// - source map
// - output array operand indices
// - time interpolation order
//////////////////////////////////////////////////////////////////////
+ bool want_global_mode;
vector<CCTK_INT> source_map (N_interp_points);
vector<CCTK_INT> operand_indices (N_output_arrays);
vector<CCTK_INT> time_deriv_order (N_output_arrays);
@@ -369,7 +355,7 @@ namespace CarpetInterp {
(cctkGH,
param_table_handle,
N_interp_points, N_input_arrays, N_output_arrays,
- have_source_map, num_time_derivs,
+ want_global_mode, have_source_map, num_time_derivs,
prolongation_order_time, current_time, delta_time,
source_map, operand_indices, time_deriv_order);
if (iret < 0) {
@@ -378,121 +364,133 @@ namespace CarpetInterp {
}
}
+ // Find range of refinement levels
+ assert (maps > 0);
+ for (int m=1; m<maps; ++m) {
+ assert (arrdata.AT(coord_group).AT(0).hh->reflevels() ==
+ arrdata.AT(coord_group).AT(m).hh->reflevels());
+ }
+ int const minrl = want_global_mode ? 0 : reflevel;
+ int const maxrl = want_global_mode ?
+ arrdata.AT(coord_group).AT(0).hh->reflevels() : reflevel+1;
+
+ // Find maximum number of components over all levels and maps
+ int maxncomps = 0;
+ for (int rl=minrl; rl<maxrl; ++rl) {
+ for (int m=0; m<maps; ++m) {
+ maxncomps = max(maxncomps, arrdata.AT(coord_group).AT(m).hh->components(rl));
+ }
+ }
+
//////////////////////////////////////////////////////////////////////
// Map interpolation points to processors
//////////////////////////////////////////////////////////////////////
- vector<int> N_points_to (dist::size());
+ vector<int> sendcnt (dist::size());
+ vector<int> dstprocs (N_interp_points); // which processor owns point n
vector<int> rlev (N_interp_points); // refinement level of point n
vector<int> home (N_interp_points); // component of point n
- vector<int> dstprocs (N_interp_points); // which processor owns point n
- vector<int> allhomecnts ((maxrl-minrl) * maps * maxncomps * dist::size());
- // number of points in component c
- vector<CCTK_REAL> coords_buffer (N_dims * N_interp_points);
+ std::map<int, int> homecntsmap; // components hash map
+ vector<int> allhomecnts; // number of points in component
+ // homecntsmap.find(c)
+ int const ndims = have_source_map ? N_dims + 1 : N_dims;
// Each point from coord_list is mapped onto the processor
// that owns it (dstprocs)
- // Also accumulate the number of points per processor (N_points_to)
+ // Also accumulate the number of points per processor (sendcnt)
map_points (cctkGH, coord_system_handle, coord_group,
- ml, minrl, maxrl, maxncomps, N_dims, N_interp_points,
+ ml, minrl, maxrl, maxncomps, N_dims, ndims, N_interp_points,
source_map,
- coords_list, coords_buffer,
- dstprocs, N_points_to,
- rlev, home, allhomecnts);
- //cout << "CarpetInterp: N_points_to=" << N_points_to << endl;
+ coords_list, NULL,
+ dstprocs, sendcnt,
+ rlev, home, homecntsmap, allhomecnts);
+ //cout << "CarpetInterp: sendcnt=" << sendcnt << endl;
//////////////////////////////////////////////////////////////////////
// Communicate the number of points each processor is going to communicate
//////////////////////////////////////////////////////////////////////
- // N_points_from denotes the number of points
+ // recvcnt denotes the number of points
// that this processor is to receive from others
- vector<int> N_points_from (dist::size());
- {
- assert ((int)N_points_from.size() == dist::size());
- assert ((int)N_points_to.size() == dist::size());
- }
+ vector<int> recvcnt (dist::size());
{
- static Timer timer ("CarpetInterp::send_npoints");
- timer.start ();
- MPI_Alltoall (&N_points_to[0], 1, dist::datatype (N_points_to[0]),
- &N_points_from[0], 1, dist::datatype (N_points_from[0]),
+ static Timer * timer = NULL;
+ if (not timer) {
+ timer = new Timer ("CarpetInterp::send_npoints");
+ }
+ timer->start ();
+ MPI_Alltoall (&sendcnt[0], 1, dist::mpi_datatype (sendcnt[0]),
+ &recvcnt[0], 1, dist::mpi_datatype (recvcnt[0]),
dist::comm());
- timer.stop (dist::size() * sizeof(CCTK_INT));
+ timer->stop (dist::size() * sizeof(CCTK_INT));
}
- //cout << "CarpetInterp: N_points_from=" << N_points_from << endl;
+ //cout << "CarpetInterp: recvcnt=" << recvcnt << endl;
//////////////////////////////////////////////////////////////////////
// Communicate the interpolation coordinates
//////////////////////////////////////////////////////////////////////
- vector<int> sendcnt (dist::size());
- vector<int> recvcnt (dist::size());
- vector<int> senddispl (dist::size());
- vector<int> recvdispl (dist::size());
// Set up counts and displacements for MPI_Alltoallv()
- sendcnt.AT(0) = N_dims * N_points_to.AT(0);
- recvcnt.AT(0) = N_dims * N_points_from.AT(0);
- senddispl.AT(0) = recvdispl.AT(0) = 0;
+ // N_points_local is the total number of points to receive
+ // and thus the total number of points to interpolate on this processor
int N_points_local = recvcnt.AT(0);
+ vector<int> senddispl (dist::size());
+ vector<int> recvdispl (dist::size());
for (int p = 1; p < dist::size(); p++) {
- sendcnt.AT(p) = N_dims * N_points_to.AT(p);
- recvcnt.AT(p) = N_dims * N_points_from.AT(p);
N_points_local += recvcnt.AT(p);
senddispl.AT(p) = senddispl.AT(p-1) + sendcnt.AT(p-1);
recvdispl.AT(p) = recvdispl.AT(p-1) + recvcnt.AT(p-1);
}
- if (N_dims > 0) assert (N_points_local % N_dims == 0);
- // N_points_local is the total number of points to receive
- // and thus the total number of points to interpolate on this processor
- if (N_dims > 0) N_points_local /= N_dims;
- // Set up the per-component coordinates
- // as offset into the single communication send buffer
- vector<CCTK_REAL*> coords (allhomecnts.size());
- {
- int offset = 0;
- for (int c = 0; c < (int)allhomecnts.size(); c++) {
- coords.AT(c) = &coords_buffer.front() + N_dims*offset;
- offset += allhomecnts.AT(c);
- }
- assert (offset == N_interp_points);
- }
-
- // Copy the input coordinates into the communication send buffer
- // also remember the position of each point in the original input arrays
+ // remember the position of each point in the original input arrays
vector<int> indices (N_interp_points);
{
// totalhomecnts is the accumulated number of points over all components
vector<int> totalhomecnts (allhomecnts.size());
- for (int idx = 1; idx < (int)allhomecnts.size(); idx++) {
- totalhomecnts.AT(idx) = totalhomecnts.AT(idx-1) + allhomecnts.AT(idx-1);
+ if (totalhomecnts.size() > 0) {
+ totalhomecnts.AT(0) = 0;
+ for (size_t c = 1; c < totalhomecnts.size(); c++) {
+ totalhomecnts.AT(c) = totalhomecnts.AT(c-1) + allhomecnts.AT(c-1);
+ }
}
- vector<int> tmpcnts (allhomecnts.size(), 0);
+ vector<int> tmpcnts (allhomecnts.size());
+#pragma omp parallel for
for (int n = 0; n < N_interp_points; n++) {
- int const idx = component_idx
+ int const cidx = component_idx
(dstprocs.AT(n), source_map.AT(n), rlev.AT(n), home.AT(n));
- for (int d = 0; d < N_dims; d++) {
- assert (d + N_dims*tmpcnts.AT(idx) < N_dims*allhomecnts.AT(idx));
- coords.AT(idx)[d + N_dims*tmpcnts.AT(idx)] =
- static_cast<CCTK_REAL const *>(coords_list[d])[n];
+ std::map<int, int>::const_iterator it = homecntsmap.find(cidx);
+ assert (it != homecntsmap.end());
+ int const idx = it->second;
+ assert (idx < (int)totalhomecnts.size());
+#pragma omp critical
+ {
+ indices.AT(n) = totalhomecnts.AT(idx) + tmpcnts.AT(idx)++;
}
- indices.AT(n) = totalhomecnts.AT(idx) + tmpcnts.AT(idx);
- tmpcnts.AT(idx)++;
}
assert (tmpcnts == allhomecnts);
}
+ // Allocate the communication send buffer
+ // and copy the input coordinates and the source map (if necessary) into it
+ vector<CCTK_REAL> coords_buffer (ndims * N_interp_points);
+#pragma omp parallel for
+ for (int n = 0; n < N_interp_points; n++) {
+ int const idx = indices.AT(n);
+ assert ((idx+1) * ndims <= (int)coords_buffer.size());
+ for (int d = 0; d < N_dims; d++) {
+ coords_buffer[d + ndims*idx] =
+ static_cast<CCTK_REAL const *>(coords_list[d])[n];
+ }
+ if (have_source_map) {
+ coords_buffer[N_dims + ndims*idx] = source_map.AT(n);
+ }
+ }
+
// Send this processor's points to owning processors,
// receive other processors' points for interpolation on this processor
{
- vector<CCTK_REAL> tmp (N_dims * N_points_local);
- MPI_Datatype const datatype = dist::datatype (tmp[0]);
+ vector<CCTK_REAL> tmp (ndims * N_points_local);
{
- assert ((int)sendcnt.size() == dist::size());
- assert ((int)recvcnt.size() == dist::size());
- assert ((int)senddispl.size() == dist::size());
- assert ((int)recvdispl.size() == dist::size());
int const sendbufsize = (int)coords_buffer.size();
int const recvbufsize = (int)tmp.size();
for (int n=0; n<dist::size(); ++n) {
@@ -511,16 +509,26 @@ namespace CarpetInterp {
}
#endif
{
- static Timer timer ("CarpetInterp::send_coordinates");
- timer.start ();
- MPI_Alltoallv (&coords_buffer[0], &sendcnt[0], &senddispl[0], datatype,
- &tmp[0], &recvcnt[0], &recvdispl[0], datatype,
+ MPI_Datatype datatype = dist::mpi_datatype (tmp[0]);
+ MPI_Datatype vdatatype;
+ MPI_Type_vector(1, ndims, 0, datatype, &vdatatype);
+ MPI_Type_commit(&vdatatype);
+
+ static Timer * timer = NULL;
+ if (not timer) {
+ timer = new Timer ("CarpetInterp::send_coordinates");
+ }
+ timer->start ();
+ MPI_Alltoallv (&coords_buffer[0], &sendcnt[0], &senddispl[0], vdatatype,
+ &tmp[0], &recvcnt[0], &recvdispl[0], vdatatype,
dist::comm());
- timer.stop (coords_buffer.size() * sizeof(CCTK_REAL));
+ timer->stop (coords_buffer.size() * sizeof(CCTK_REAL));
+
+ MPI_Type_free(&vdatatype);
}
#ifndef _NDEBUG
{
- vector<bool> filled(tmp.size(), false);
+ vector<bool> filled(N_points_local, false);
for (int n=0; n<(int)dist::size(); ++n) {
//#pragma omp parallel for
for (int i=0; i<recvcnt.AT(n); ++i) {
@@ -530,7 +538,7 @@ namespace CarpetInterp {
}
bool error = false;
for (int i=0; i<(int)filled.size(); ++i) {
- error = error or not (filled.AT(i));
+ error = error or not filled.AT(i);
}
if (error) {
cout << "error" << endl;
@@ -543,8 +551,6 @@ namespace CarpetInterp {
assert (filled.AT(i));
}
}
-#endif
-#ifndef _NDEBUG
#pragma omp parallel for
for (int i=0; i<(int)tmp.size(); ++i) {
assert (tmp.AT(i) != poison);
@@ -554,108 +560,14 @@ namespace CarpetInterp {
}
//////////////////////////////////////////////////////////////////////
- // Communicate the source map (if neccessary)
+ // Set up (local) source map
//////////////////////////////////////////////////////////////////////
if (have_source_map) {
- // Calculate displacements and lengths
- sendcnt.AT(0) = N_points_to.AT(0);
- recvcnt.AT(0) = N_points_from.AT(0);
- senddispl.AT(0) = recvdispl.AT(0) = 0;
- for (int p = 1; p < dist::size(); p++) {
- sendcnt.AT(p) = N_points_to.AT(p);
- recvcnt.AT(p) = N_points_from.AT(p);
- senddispl.AT(p) = senddispl.AT(p-1) + sendcnt.AT(p-1);
- recvdispl.AT(p) = recvdispl.AT(p-1) + recvcnt.AT(p-1);
- }
-
- // Set up the per-component maps
- // as offset into the single communication send buffer
- vector<CCTK_INT> tmp (source_map.size());
- vector<CCTK_INT*> maps (allhomecnts.size());
- {
- int offset = 0;
- for (int c = 0; c < (int)allhomecnts.size(); c++) {
- maps.AT(c) = &tmp.front() + offset;
- offset += allhomecnts.AT(c);
- }
- assert (offset == N_interp_points);
- }
-
- // Copy the input maps into the communication send buffer
- {
- // totalhomecnts is the accumulated number of points over all components
- vector<int> totalhomecnts (allhomecnts.size());
- for (int idx = 1; idx < (int)allhomecnts.size(); idx++) {
- totalhomecnts.AT(idx) =
- totalhomecnts.AT(idx-1) + allhomecnts.AT(idx-1);
- }
-
- vector<int> tmpcnts (allhomecnts.size(), 0);
- for (int n = 0; n < N_interp_points; n++) {
- int const idx = component_idx
- (dstprocs.AT(n), source_map.AT(n), rlev.AT(n), home.AT(n));
- assert (tmpcnts.AT(idx) < allhomecnts.AT(idx));
- maps.AT(idx)[tmpcnts.AT(idx)] = source_map.AT(n);
- tmpcnts.AT(idx)++;
- }
- assert (tmpcnts == allhomecnts);
- }
-
- // Transmit the source maps
source_map.resize (N_points_local);
- MPI_Datatype const datatype = dist::datatype (tmp[0]);
- {
- assert ((int)sendcnt.size() == dist::size());
- assert ((int)recvcnt.size() == dist::size());
- assert ((int)senddispl.size() == dist::size());
- assert ((int)recvdispl.size() == dist::size());
- int const sendbufsize = (int)tmp.size();
- int const recvbufsize = (int)source_map.size();
- for (int n=0; n<dist::size(); ++n) {
- assert (sendcnt.AT(n) >= 0);
- assert (senddispl.AT(n) >= 0);
- assert (senddispl.AT(n) + sendcnt.AT(n) <= sendbufsize);
- assert (recvcnt.AT(n) >= 0);
- assert (recvdispl.AT(n) >= 0);
- assert (recvdispl.AT(n) + recvcnt.AT(n) <= recvbufsize);
- }
- }
-#ifndef _NDEBUG
-#pragma omp parallel for
- for (int i=0; i<(int)source_map.size(); ++i) {
- source_map[i] = ipoison;
- }
-#endif
- {
- static Timer timer ("CarpetInterp::send_maps");
- timer.start ();
- MPI_Alltoallv (&tmp[0], &sendcnt[0], &senddispl[0], datatype,
- &source_map[0], &recvcnt[0], &recvdispl[0], datatype,
- dist::comm());
- timer.stop (tmp.size() * sizeof(CCTK_INT));
- }
-#ifndef _NDEBUG
- {
- vector<bool> filled(source_map.size(), false);
- for (int n=0; n<(int)dist::size(); ++n) {
- //#pragma omp parallel for
- for (int i=0; i<recvcnt.AT(n); ++i) {
- assert (not filled.AT(recvdispl.AT(n)+i));
- filled.AT(recvdispl.AT(n)+i) = true;
- }
- }
-#pragma omp parallel for
- for (int i=0; i<(int)filled.size(); ++i) {
- assert (filled.AT(i));
- }
- }
-#endif
-#ifndef _NDEBUG
#pragma omp parallel for
- for (int i=0; i<(int)source_map.size(); ++i) {
- assert (source_map[i] != poison);
+ for (int n = 0; n < N_points_local; n++) {
+ source_map.AT(n) = static_cast<int>(coords_buffer[ndims*n + N_dims]);
}
-#endif
} else {
// No explicit source map specified
if (Carpet::map != -1) {
@@ -672,13 +584,12 @@ namespace CarpetInterp {
//////////////////////////////////////////////////////////////////////
// Map (local) interpolation points to components
//////////////////////////////////////////////////////////////////////
- vector<int> srcprocs (N_points_local); // which processor requested point n
-
// Remember from where point n came
+ vector<int> srcprocs (N_points_local); // which processor requested point n
{
int offset = 0;
- for (int p = 0; p < (int)N_points_from.size(); p++) {
- for (int n = 0; n < N_points_from.AT(p); n++) {
+ for (int p = 0; p < (int)recvcnt.size(); p++) {
+ for (int n = 0; n < recvcnt.AT(p); n++) {
srcprocs.AT(offset++) = p;
}
}
@@ -701,15 +612,16 @@ namespace CarpetInterp {
// (One could argue though that the per-point status codes as returned
// by the local interpolator could be used to determine the global
// interpolator return value instead.)
- rlev.resize (N_points_local); // reflevel of (local) point n
- home.resize (N_points_local); // component of (local) point n
- vector<int> homecnts (allhomecnts.size(), 0); // points per components
+ rlev.resize (N_points_local); // reflevel of (local) point n
+ home.resize (N_points_local); // component of (local) point n
+ vector<int> homecnts; // number of points in component
+ // homecntsmap.find(c)
map_points (cctkGH, coord_system_handle, coord_group,
- ml, minrl, maxrl, maxncomps, N_dims, N_points_local,
+ ml, minrl, maxrl, maxncomps, N_dims, ndims, N_points_local,
source_map,
- NULL, coords_buffer,
- srcprocs, N_points_to,
- rlev, home, homecnts);
+ NULL, &coords_buffer.front(),
+ srcprocs, sendcnt,
+ rlev, home, homecntsmap, homecnts);
// Free some memory
source_map.clear();
@@ -720,17 +632,17 @@ namespace CarpetInterp {
{
int offset = 0;
vector<CCTK_REAL> tmp (coords_buffer.size());
- for (int c = 0; c < (int)homecnts.size(); c++) {
+ for (size_t c = 0; c < homecnts.size(); c++) {
#pragma omp parallel for
for (int n = 0; n < homecnts.AT(c); n++) {
for (int d = 0; d < N_dims; d++) {
- tmp.AT(d*homecnts.AT(c) + n + offset) =
- coords_buffer.AT(n*N_dims + d + offset);
+ tmp.AT(d*homecnts.AT(c) + n + N_dims*offset) =
+ coords_buffer.AT((n + offset)*ndims + d);
}
}
- offset += N_dims * homecnts[c];
+ offset += homecnts.AT(c);
}
- assert (offset == N_dims * N_points_local);
+ assert (offset == N_points_local);
coords_buffer.swap (tmp);
}
@@ -741,7 +653,8 @@ namespace CarpetInterp {
const int vtypesize = CCTK_VarTypeSize (vtype);
assert (vtypesize > 0);
vector<char> outputs_buffer (N_points_local * N_output_arrays * vtypesize);
- vector<char*> outputs (homecnts.size());
+ vector<char*> outputs (homecnts.size(), &outputs_buffer.front());
+ vector<CCTK_REAL*> coords(homecnts.size(), &coords_buffer.front());
vector<CCTK_INT> status_and_retval_buffer (2 * dist::size(), 0);
CCTK_INT* per_proc_statuses = &status_and_retval_buffer.front();
CCTK_INT* per_proc_retvals = per_proc_statuses + dist::size();
@@ -750,10 +663,10 @@ namespace CarpetInterp {
// into the single communication buffers
{
int offset = 0;
- for (int c = 0; c < (int)homecnts.size(); c++) {
- coords.AT(c) = &coords_buffer.front() + N_dims*offset;
- outputs.AT(c) = &outputs_buffer.front() + N_output_arrays*offset*vtypesize;
- offset += homecnts.AT(c);
+ for (size_t c = 0; c < homecnts.size(); c++) {
+ coords[c] += N_dims*offset;
+ outputs[c] += N_output_arrays*offset*vtypesize;
+ offset += homecnts[c];
}
assert (offset == N_points_local);
}
@@ -765,7 +678,7 @@ namespace CarpetInterp {
want_global_mode,
prolongation_order_time,
N_dims,
- homecnts,
+ homecnts, homecntsmap, recvcnt,
coords, outputs, per_proc_statuses, per_proc_retvals,
operand_indices, time_deriv_order, num_time_derivs,
local_interp_handle, param_table_handle,
@@ -783,51 +696,35 @@ namespace CarpetInterp {
//////////////////////////////////////////////////////////////////////
// Communicate interpolation results
//////////////////////////////////////////////////////////////////////
- sendcnt.AT(0) = N_output_arrays * N_points_from.AT(0);
- recvcnt.AT(0) = N_output_arrays * N_points_to.AT(0);
- senddispl.AT(0) = recvdispl.AT(0) = 0;
- for (int p = 1; p < dist::size(); p++) {
- sendcnt.AT(p) = N_output_arrays * N_points_from.AT(p);
- recvcnt.AT(p) = N_output_arrays * N_points_to.AT(p);
- senddispl.AT(p) = senddispl.AT(p-1) + sendcnt.AT(p-1);
- recvdispl.AT(p) = recvdispl.AT(p-1) + recvcnt.AT(p-1);
- }
{
+ vector<char> tmp (N_interp_points * N_output_arrays * vtypesize);
+
MPI_Datatype datatype;
switch (vtype) {
-#define TYPECASE(N,T) \
- case N: { T dummy; datatype = dist::datatype(dummy); } break;
+#define TYPECASE(N,T) \
+ case N: { T dummy; datatype = dist::mpi_datatype(dummy); break; }
#include "carpet_typecase.hh"
#undef TYPECASE
- default: CCTK_WARN (0, "invalid datatype"); abort();
+ default: { CCTK_WARN (0, "invalid datatype"); abort(); }
}
+ MPI_Type_vector(1, N_output_arrays, 0, datatype, &datatype);
+ MPI_Type_commit(&datatype);
- vector<char> tmp (N_interp_points * N_output_arrays * vtypesize);
- {
- assert ((int)sendcnt.size() == dist::size());
- assert ((int)recvcnt.size() == dist::size());
- assert ((int)senddispl.size() == dist::size());
- assert ((int)recvdispl.size() == dist::size());
- int const sendbufsize = (int)outputs_buffer.size();
- int const recvbufsize = (int)tmp.size() / vtypesize;
- for (int n=0; n<dist::size(); ++n) {
- assert (sendcnt.AT(n) >= 0);
- assert (senddispl.AT(n) >= 0);
- assert (senddispl.AT(n) + sendcnt.AT(n) <= sendbufsize);
- assert (recvcnt.AT(n) >= 0);
- assert (recvdispl.AT(n) >= 0);
- assert (recvdispl.AT(n) + recvcnt.AT(n) <= recvbufsize);
- }
- }
- {
- static Timer timer ("CarpetInterp::recv_points");
- timer.start ();
- MPI_Alltoallv (&outputs_buffer[0], &sendcnt[0], &senddispl[0], datatype,
- &tmp[0], &recvcnt[0], &recvdispl[0], datatype,
- dist::comm());
- timer.stop (N_interp_points * N_output_arrays * vtypesize);
+ static Timer * timer = NULL;
+ if (not timer) {
+ timer = new Timer ("CarpetInterp::recv_points");
}
+ timer->start ();
+ // distribute the results the same way as the coordinates were gathered
+ // simply by interchanging the send/recv counts/displacements
+ MPI_Alltoallv (&outputs_buffer[0], &recvcnt[0], &recvdispl[0], datatype,
+ &tmp[0], &sendcnt[0], &senddispl[0], datatype,
+ dist::comm());
+ timer->stop (N_interp_points * N_output_arrays * vtypesize);
+
+ MPI_Type_free(&datatype);
+
outputs_buffer.swap (tmp);
}
@@ -843,7 +740,7 @@ namespace CarpetInterp {
assert (status_and_retval_buffer.size() == tmp.size());
}
MPI_Allreduce (&status_and_retval_buffer[0], &tmp[0], tmp.size(),
- dist::datatype (tmp[0]), MPI_MIN, dist::comm());
+ dist::mpi_datatype (tmp[0]), MPI_MIN, dist::comm());
status_and_retval_buffer.swap (tmp);
per_proc_statuses = &status_and_retval_buffer.front();
per_proc_retvals = per_proc_statuses + dist::size();
@@ -857,7 +754,7 @@ namespace CarpetInterp {
vector<int> reverse_indices(indices.size());
#pragma omp parallel for
for (int i = 0; i < (int)indices.size(); i++) {
- reverse_indices.AT(indices[i]) = i;
+ reverse_indices[indices[i]] = i;
}
for (int d = 0; d < N_output_arrays; d++) {
@@ -909,6 +806,7 @@ namespace CarpetInterp {
int const N_interp_points,
int const N_input_arrays,
int const N_output_arrays,
+ bool& want_global_mode,
bool& have_source_map,
vector<int>& num_time_derivs,
int& prolongation_order_time,
@@ -920,10 +818,29 @@ namespace CarpetInterp {
{
DECLARE_CCTK_PARAMETERS;
+ int iret;
+
+ // Do we want to interpolate in global mode, i.e., from all
+ // refinement levels?
+ CCTK_INT want_global_mode1;
+ iret = Util_TableGetInt (param_table_handle,
+ &want_global_mode1, "want_global_mode");
+ if (iret == UTIL_ERROR_TABLE_NO_SUCH_KEY) {
+ want_global_mode = is_global_mode();
+ } else if (iret < 0) {
+ CCTK_WARN (CCTK_WARN_ALERT, "internal error");
+ return -1;
+ } else if (iret != 1) {
+ CCTK_WARN (CCTK_WARN_ALERT, "internal error");
+ return -1;
+ } else {
+ want_global_mode = want_global_mode1;
+ }
+
// Find source map
assert ((int)source_map.size() == N_interp_points);
- int iret = Util_TableGetIntArray (param_table_handle, N_interp_points,
- &source_map.front(), "source_map");
+ iret = Util_TableGetIntArray (param_table_handle, N_interp_points,
+ &source_map.front(), "source_map");
have_source_map = not (iret == UTIL_ERROR_TABLE_NO_SUCH_KEY);
if (not have_source_map) {
// No explicit source map specified
@@ -948,14 +865,17 @@ namespace CarpetInterp {
iret = Util_TableGetIntArray (param_table_handle, source_map.size(),
&source_map.front(), "source_map");
assert (iret == (int)source_map.size());
+
+#ifndef _NDEBUG
// Check source map
#pragma omp parallel for
for (int n = 0; n < (int)source_map.size(); ++n) {
- if (not (source_map.AT(n) >= 0 and source_map.AT(n) < maps)) {
- cout << "CI: n=" << n << " map=" << source_map.AT(n) << endl;
+ if (not (source_map[n] >= 0 and source_map[n] < maps)) {
+ cout << "CI: n=" << n << " map=" << source_map[n] << endl;
}
- assert (source_map.AT(n) >= 0 and source_map.AT(n) < maps);
+ assert (source_map[n] >= 0 and source_map[n] < maps);
}
+#endif
}
// Find the time interpolation order
@@ -997,8 +917,8 @@ namespace CarpetInterp {
return 0;
}
-
-
+
+
// Find the component and integer index to which a grid point
// belongs. This uses a linear search over all components, which
@@ -1016,29 +936,29 @@ namespace CarpetInterp {
int & restrict c)
{
// cout << "CarpetInterp: assign: m=" << m << " pos=" << pos << endl;
-
+
assert (ml>=0 and ml<mglevels);
assert (minrl>=0 and minrl<maxrl and maxrl<=reflevels);
-
+
CCTK_REAL const rone = 1.0;
CCTK_REAL const rhalf = rone / 2;
-
+
if (all (pos >= lower and pos <= upper)) {
// The point is within the domain
-
+
// Try finer levels first
for (rl = maxrl-1; rl >= minrl; --rl) {
-
+
ivect const fact =
maxspacereflevelfact / spacereffacts.AT(rl) * ipow(mgfact, ml);
ivect const ipos =
ivect(floor((pos - lower) / (delta * rvect(fact)) + rhalf)) * fact;
-
+
ivect const & stride = hh->baseextent(ml,rl).stride();
assert (all (ipos % stride == 0));
-
+
gh::cregs const & regs = hh->regions.AT(ml).AT(rl);
-
+
// Search all components linearly
for (c = 0; c < int(regs.size()); ++c) {
region_t const & reg = regs.AT(c);
@@ -1050,14 +970,14 @@ namespace CarpetInterp {
}
}
}
-
+
// The point does not belong to any component. This should happen
// only rarely.
rl = -1;
c = -1;
}
-
-
+
+
// Find the component and integer index to which a grid point
// belongs. This uses a tree search over the superregions in the
@@ -1076,29 +996,29 @@ namespace CarpetInterp {
int & restrict c)
{
// cout << "CarpetInterp: assign: m=" << m << " pos=" << pos << endl;
-
+
assert (ml>=0 and ml<mglevels);
assert (minrl>=0 and minrl<maxrl and maxrl<=reflevels);
-
+
CCTK_REAL const rone = 1.0;
CCTK_REAL const rhalf = rone / 2;
-
+
if (all (pos >= lower and pos <= upper)) {
// The point is within the domain
-
+
// Try finer levels first
for (rl = maxrl-1; rl >= minrl; --rl) {
-
+
ivect const fact =
maxspacereflevelfact / spacereffacts.AT(rl) * ipow(mgfact, ml);
ivect const ipos =
ivect(floor((pos - lower) / (delta * rvect(fact)) + rhalf)) * fact;
-
+
ivect const & stride = hh->baseextent(ml,rl).stride();
assert (all (ipos % stride == 0));
-
+
gh::cregs const & regs = hh->superregions.AT(rl);
-
+
// Search all superregions linearly. Each superregion
// corresponds to a "refined region", and the number of
// superregions is thus presumably independent of the number
@@ -1108,11 +1028,11 @@ namespace CarpetInterp {
if (reg.extent.contains(ipos)) {
// We found the superregion to which this grid point
// belongs
-
+
// Search the superregion hierarchically
pseudoregion_t const * const preg = reg.processors->search(ipos);
assert (preg);
-
+
// We now know the refinement level, component, and index
// to which this grid point belongs
c = preg->component;
@@ -1121,15 +1041,15 @@ namespace CarpetInterp {
}
}
}
-
+
// The point does not belong to any component. This should happen
// only rarely.
rl = -1;
c = -1;
}
-
-
-
+
+
+
static void
map_points (cGH const* const cctkGH,
int const coord_system_handle,
@@ -1139,14 +1059,16 @@ namespace CarpetInterp {
int const maxrl,
int const maxncomps,
int const N_dims,
+ int const ndims,
int const npoints,
vector<CCTK_INT> & source_map,
void const* const coords_list[],
- vector<CCTK_REAL> const& coords,
+ CCTK_REAL const * const coords,
vector<int>& procs,
- vector<int>& N_points_to,
+ vector<int>& sendcnt,
vector<int>& rlev,
vector<int>& home,
+ std::map<int, int>& homecntsmap,
vector<int>& homecnts)
{
DECLARE_CCTK_PARAMETERS;
@@ -1155,13 +1077,11 @@ namespace CarpetInterp {
if (not timer) timer = new Timer ("CarpetInterp::map_points");
timer->start ();
+ assert (npoints == 0 or coords or coords_list);
bool const map_onto_processors = coords_list != NULL;
- if (not map_onto_processors) {
- assert ((int)coords.size() == N_dims * npoints);
- }
assert ((int)procs.size() == npoints);
- assert ((int)N_points_to.size() == dist::size());
+ assert ((int)sendcnt.size() == dist::size());
assert ((int)rlev.size() == npoints);
assert ((int)home.size() == npoints);
assert ((int)source_map.size() == npoints);
@@ -1172,10 +1092,10 @@ namespace CarpetInterp {
vector<rvect> lower (maps);
vector<rvect> upper (maps);
vector<rvect> delta (maps); // spacing on finest possible grid
-
+
int const grouptype = CCTK_GroupTypeI (coord_group);
switch (grouptype) {
-
+
case CCTK_GF: {
for (int m = 0; m < Carpet::maps; ++ m) {
jvect gsh;
@@ -1186,21 +1106,21 @@ namespace CarpetInterp {
}
break;
}
-
+
case CCTK_SCALAR:
case CCTK_ARRAY: {
-
+
rvect coord_lower, coord_upper;
char const * const coord_system_name =
CCTK_CoordSystemName (coord_system_handle);
-
+
for (int d = 0; d < N_dims; ++ d) {
int const iret = CCTK_CoordRange (cctkGH, &coord_lower[d],
&coord_upper[d], d+1,
NULL, coord_system_name);
assert (iret == 0);
}
-
+
assert (arrdata.AT(coord_group).size() == 1);
int const m = 0;
ibbox const & baseextent =
@@ -1211,11 +1131,14 @@ namespace CarpetInterp {
rvect (baseextent.upper() - baseextent.lower()));
break;
}
-
+
default:
assert (0);
}
+ // Clear the components hash map
+ homecntsmap.clear();
+
// Assign interpolation points to processors/components
#pragma omp parallel for
for (int n = 0; n < npoints; ++n) {
@@ -1226,20 +1149,20 @@ namespace CarpetInterp {
gh const * hh = NULL;
if (m >= 0) {
-
+
hh = arrdata.AT(coord_group).AT(m).hh;
-
+
// Find the grid point closest to the interpolation point
for (int d = 0; d < N_dims; ++d) {
if (map_onto_processors) {
pos[d] = static_cast<CCTK_REAL const *>(coords_list[d])[n];
} else {
- pos[d] = coords[N_dims*n + d];
+ pos[d] = coords[ndims*n + d];
}
}
-
+
// Find the component that this grid point belongs to
-
+
// Calculate rl, c, and proc
if (not tree_search) {
find_location_linear
@@ -1262,12 +1185,12 @@ namespace CarpetInterp {
}
}
}
-
+
} // if m >= 0
-
+
if (c == -1) {
// The point could not be mapped onto any component
-
+
// Warn only once, namely when mapping points onto processors.
// (This routine is called twice; first to map points onto
// processors, then to map points onto components.)
@@ -1277,13 +1200,13 @@ namespace CarpetInterp {
"Interpolation point #%d at [%g,%g,%g] of patch #%d is not on any component",
n, (double)pos[0], (double)pos[1], (double)pos[2], (int)m);
}
-
+
// Map the point (arbitrarily) to the first component of the
// coarsest grid
// TODO: Handle these points explicitly later on
rl = minrl;
c = 0;
-
+
// Find a patch which exists on this processor
for (m=0; m<maps; ++m) {
hh = arrdata.AT(coord_group).AT(m).hh;
@@ -1291,7 +1214,8 @@ namespace CarpetInterp {
}
assert (m < maps);
}
-
+
+#ifndef _NDEBUG
if (not (rl >= minrl and rl < maxrl) or
not (c >= 0 and c < hh->components(rl)))
{
@@ -1299,21 +1223,42 @@ namespace CarpetInterp {
}
assert (rl >= minrl and rl < maxrl);
assert (c >= 0 and c < hh->components(rl));
-
+#endif
+
if (map_onto_processors) {
int const proc = hh->processor(rl,c);
procs.AT(n) = proc;
- int & this_N_points_to = N_points_to.AT(proc);
+ int & this_sendcnt = sendcnt.AT(proc);
#pragma omp atomic
- ++ this_N_points_to;
+ ++ this_sendcnt;
}
rlev.AT(n) = rl;
home.AT(n) = c;
- int & this_homecnts = homecnts.AT(component_idx (procs.AT(n), m, rl, c));
-#pragma omp atomic
- ++ this_homecnts;
-
+ int const cidx = component_idx (procs.AT(n), m, rl, c);
+// only scalars of intrinsic type can be atomically updated
+//#pragma omp atomic
+#pragma omp critical
+ {
+ homecntsmap[cidx]++;
+ }
+
} // for n
+
+ // allocate and fill the (dense) homecnts vector from the hash map
+ homecnts.resize (homecntsmap.size());
+ {
+ int c = 0;
+ for (std::map<int, int>::iterator it = homecntsmap.begin();
+ it != homecntsmap.end(); it++) {
+ // store the number of points of this component in homecnts
+ assert (it->second > 0);
+ homecnts.AT(c) = it->second;
+ // save the homecnts index in the hash map
+ it->second = c++;
+ }
+ assert (c == (int)homecnts.size());
+ }
+
timer->stop (npoints);
}
@@ -1328,13 +1273,15 @@ namespace CarpetInterp {
bool const want_global_mode,
int const prolongation_order_time,
int const N_dims,
- vector<int> & homecnts,
- vector<CCTK_REAL*>& coords,
- vector<char*>& outputs,
+ vector<int> const & homecnts,
+ std::map<int, int> const & homecntsmap,
+ vector<CCTK_INT> const & recvcnt,
+ vector<CCTK_REAL*> const & coords,
+ vector<char*> const & outputs,
CCTK_INT* const per_proc_statuses,
CCTK_INT* const per_proc_retvals,
- vector<CCTK_INT>& operand_indices,
- vector<CCTK_INT>& time_deriv_order,
+ vector<CCTK_INT> const & operand_indices,
+ vector<CCTK_INT> const & time_deriv_order,
vector<int> const & num_time_derivs,
CCTK_INT const local_interp_handle,
CCTK_INT const param_table_handle,
@@ -1364,22 +1311,24 @@ namespace CarpetInterp {
}
}
- {
- // Ensure that this processor is only supposed to interpolate
- // points from maps and components that are actually located on
- // this processor
- for (int rl=minrl; rl<maxrl; ++rl) {
- for (int m=0; m<maps; ++m) {
- gh const * const hh = arrdata.AT(coord_group).AT(m).hh;
- for (int c=0; c<hh->components(rl); ++c) {
- for (int p=0; p<dist::size(); ++p) {
- int const idx = component_idx (p, m, rl, c);
- assert (hh->is_local(rl, c) or homecnts.AT(idx) == 0);
+#ifndef _NDEBUG
+ // Ensure that this processor is only supposed to interpolate
+ // points from maps and components that are actually located on
+ // this processor
+ for (int rl=minrl; rl<maxrl; ++rl) {
+ for (int m=0; m<maps; ++m) {
+ gh const * const hh = arrdata.AT(coord_group).AT(m).hh;
+ for (int c=0; c<hh->components(rl); ++c) {
+ for (int p=0; p<dist::size(); ++p) {
+ int const cidx = component_idx (p, m, rl, c);
+ if (homecntsmap.find(cidx) != homecntsmap.end()) {
+ assert (hh->is_local(rl, c));
}
}
}
}
}
+#endif
// TODO: Don't use explicit mode switching; code the loops
// manually
@@ -1410,14 +1359,20 @@ namespace CarpetInterp {
: 1));
}
- BEGIN_MAP_LOOP(cctkGH, CCTK_GF) {
+ BEGIN_LOCAL_MAP_LOOP(cctkGH, CCTK_GF) {
BEGIN_LOCAL_COMPONENT_LOOP(cctkGH, CCTK_GF) {
for (int p = 0; p < dist::size(); p++) {
- int const idx =
- component_idx (p, Carpet::map,reflevel,component);
- //cout << "CarpetInterp: interpolate_single_component: rl=" << reflevel << " map=" << (Carpet::map) << " component=" << component << " p=" << p << endl;
- if (homecnts.AT(idx) > 0) {
+ // short cut if there's nothing to interpolate for processor p
+ if (recvcnt[p] <= 0) continue;
+
+ int const cidx =
+ component_idx (p, Carpet::map, reflevel, component);
+ std::map<int,int>::const_iterator it = homecntsmap.find(cidx);
+ if (it != homecntsmap.end()) {
+ //cout << "CarpetInterp: interpolate_single_component: rl=" << reflevel << " map=" << (Carpet::map) << " component=" << component << " p=" << p << endl;
+ int const idx = it->second;
+ assert (idx < (int)homecnts.size());
interpolate_single_component
(cctkGH, coord_system_handle, coord_group,
N_dims,
@@ -1433,7 +1388,7 @@ namespace CarpetInterp {
} // for p
} END_LOCAL_COMPONENT_LOOP;
- } END_MAP_LOOP;
+ } END_LOCAL_MAP_LOOP;
} LEAVE_LEVEL_MODE;
} // for rl
@@ -1599,9 +1554,9 @@ namespace CarpetInterp {
char* const outputs,
CCTK_INT& overall_status,
CCTK_INT& overall_retval,
- vector<CCTK_INT>& operand_indices,
- vector<CCTK_INT>& time_deriv_order,
- vector<CCTK_INT>& interp_num_time_levels,
+ vector<CCTK_INT> const & operand_indices,
+ vector<CCTK_INT> const & time_deriv_order,
+ vector<CCTK_INT> const & interp_num_time_levels,
CCTK_INT const local_interp_handle,
CCTK_INT const param_table_handle,
vector<int> const & num_tl,
@@ -1633,7 +1588,7 @@ namespace CarpetInterp {
// Get global origin and spacing of the underlying coordinate system
int const grouptype = CCTK_GroupTypeI (coord_group);
switch (grouptype) {
-
+
case CCTK_GF: {
jvect gsh;
GetCoordRange (cctkGH, Carpet::map, mglevel, dim,
@@ -1642,7 +1597,7 @@ namespace CarpetInterp {
delta /= maxspacereflevelfact;
break;
}
-
+
case CCTK_SCALAR:
case CCTK_ARRAY: {
#ifdef NEW_COORD_API
@@ -1655,13 +1610,13 @@ namespace CarpetInterp {
char const * const coord_system_name =
CCTK_CoordSystemName (coord_system_handle);
assert (CCTK_CoordSystemDim (coord_system_name) >= N_dims);
-
+
for (int d = 0; d < N_dims; ++ d) {
int const iret = CCTK_CoordRange (cctkGH, &lower[d], &upper[d], d+1,
NULL, coord_system_name);
assert (iret == 0);
}
-
+
int const m = 0;
// delta for the Carpet grid indices
ibbox const & baseextent =
@@ -1670,7 +1625,7 @@ namespace CarpetInterp {
#endif
break;
}
-
+
default:
assert (0);
}
@@ -1721,7 +1676,7 @@ namespace CarpetInterp {
// if the desired timelevel does not exist
int const my_tl = tl >= interp_num_tl ? 0 : tl;
assert (my_tl < num_tl.AT(n));
-
+
// Are there enough time levels?
int const active_tl = CCTK_ActiveTimeLevelsVI (cctkGH, vi);
if (active_tl <= my_tl) {
@@ -1731,7 +1686,7 @@ namespace CarpetInterp {
fullname, active_tl, reflevel);
free (fullname);
}
-
+
#if 0
input_arrays[n] = CCTK_VarDataPtrI (cctkGH, my_tl, vi);
#else
@@ -1739,7 +1694,7 @@ namespace CarpetInterp {
int const vi0 = CCTK_FirstVarIndexI (gi);
input_arrays[n]
= ((*arrdata.AT(gi).AT(Carpet::map).data.AT(vi-vi0))
- (my_tl, reflevel, component, mglevel)->storage());
+ (my_tl, reflevel, local_component, mglevel)->storage());
#endif
}
} // for input arrays
@@ -1818,7 +1773,7 @@ namespace CarpetInterp {
dest += tfacs[tl] * src;
}
}
-
+
for (int tl=0; tl<max_num_tl; ++tl) {
delete [] (CCTK_REAL *)tmp_output_arrays[tl][j];
}
diff --git a/Carpet/CarpetInterp/test/waveinterp-1p.par b/Carpet/CarpetInterp/test/waveinterp-1p.par
index c854dfb35..8a07bf51d 100644
--- a/Carpet/CarpetInterp/test/waveinterp-1p.par
+++ b/Carpet/CarpetInterp/test/waveinterp-1p.par
@@ -24,7 +24,6 @@ Carpet::domain_from_coordbase = yes
Carpet::max_refinement_levels = 20
driver::ghost_size = 2
-Carpet::buffer_width = 4
Carpet::prolongation_order_space = 3
Carpet::prolongation_order_time = 2
@@ -33,8 +32,6 @@ Carpet::convergence_level = 0
Carpet::init_3_timelevels = yes
-CarpetLib::save_memory_during_regridding = yes
-
ActiveThorns = "NaNChecker"
diff --git a/Carpet/CarpetInterp/test/waveinterp-2p.par b/Carpet/CarpetInterp/test/waveinterp-2p.par
index c854dfb35..8a07bf51d 100644
--- a/Carpet/CarpetInterp/test/waveinterp-2p.par
+++ b/Carpet/CarpetInterp/test/waveinterp-2p.par
@@ -24,7 +24,6 @@ Carpet::domain_from_coordbase = yes
Carpet::max_refinement_levels = 20
driver::ghost_size = 2
-Carpet::buffer_width = 4
Carpet::prolongation_order_space = 3
Carpet::prolongation_order_time = 2
@@ -33,8 +32,6 @@ Carpet::convergence_level = 0
Carpet::init_3_timelevels = yes
-CarpetLib::save_memory_during_regridding = yes
-
ActiveThorns = "NaNChecker"
diff --git a/Carpet/CarpetInterp2/README b/Carpet/CarpetInterp2/README
index 6480393c9..de19cb6e4 100644
--- a/Carpet/CarpetInterp2/README
+++ b/Carpet/CarpetInterp2/README
@@ -1,8 +1,9 @@
Cactus Code Thorn CarpetInterp2
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides a parallel interpolator for Carpet.
diff --git a/Carpet/CarpetInterp2/interface.ccl b/Carpet/CarpetInterp2/interface.ccl
index 1a8e1c177..15b3919c7 100644
--- a/Carpet/CarpetInterp2/interface.ccl
+++ b/Carpet/CarpetInterp2/interface.ccl
@@ -46,8 +46,6 @@ CCTK_INT FUNCTION \
CCTK_POINTER IN ddadxdx)
USES FUNCTION MultiPatch_GlobalToLocal
-
-
CCTK_INT FUNCTION \
InterpGridArrays \
(CCTK_POINTER_TO_CONST IN cctkGH, \
@@ -62,3 +60,52 @@ CCTK_INT FUNCTION \
PROVIDES FUNCTION InterpGridArrays \
WITH CarpetInterp2_InterpGridArrays \
LANGUAGE C
+
+CCTK_INT FUNCTION \
+ MultiPatchInterpGridArrays \
+ (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_INT IN N_dims, \
+ CCTK_INT IN order, \
+ CCTK_INT IN N_interp_points, \
+ CCTK_INT ARRAY IN interp_maps, \
+ CCTK_POINTER_TO_CONST IN interp_coords, \
+ CCTK_INT IN N_input_arrays, \
+ CCTK_INT ARRAY IN input_array_indices, \
+ CCTK_INT IN N_output_arrays, \
+ CCTK_POINTER IN output_arrays)
+PROVIDES FUNCTION MultiPatchInterpGridArrays \
+ WITH CarpetInterp2_MultiPatchInterpGridArrays \
+ LANGUAGE C
+
+
+
+CCTK_POINTER FUNCTION \
+ Interp2GridArraysSetup \
+ (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_INT IN N_dims, \
+ CCTK_INT IN order, \
+ CCTK_INT IN N_interp_points, \
+ CCTK_POINTER_TO_CONST IN interp_coords)
+PROVIDES FUNCTION Interp2GridArraysSetup \
+ WITH CarpetInterp2_Interp2GridArraysSetup \
+ LANGUAGE C
+
+CCTK_INT FUNCTION \
+ Interp2GridArrays \
+ (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_POINTER_TO_CONST IN interp_handle, \
+ CCTK_INT IN N_input_arrays, \
+ CCTK_INT ARRAY IN input_array_indices, \
+ CCTK_INT IN N_output_arrays, \
+ CCTK_POINTER IN output_arrays)
+PROVIDES FUNCTION Interp2GridArrays \
+ WITH CarpetInterp2_Interp2GridArrays \
+ LANGUAGE C
+
+CCTK_INT FUNCTION \
+ Interp2GridArraysFree \
+ (CCTK_POINTER_TO_CONST IN cctkGH, \
+ CCTK_POINTER IN interp_handle)
+PROVIDES FUNCTION Interp2GridArraysFree \
+ WITH CarpetInterp2_Interp2GridArraysFree \
+ LANGUAGE C
diff --git a/Carpet/CarpetInterp2/src/fasterp.cc b/Carpet/CarpetInterp2/src/fasterp.cc
index 039c01a15..4b5126b78 100644
--- a/Carpet/CarpetInterp2/src/fasterp.cc
+++ b/Carpet/CarpetInterp2/src/fasterp.cc
@@ -25,7 +25,9 @@ namespace CarpetInterp2 {
int const ipoison = -1234567890;
CCTK_REAL const poison = -1.0e+12;
+ int get_poison (int const &) CCTK_ATTRIBUTE_CONST;
int get_poison (int const &) { return ipoison; }
+ CCTK_REAL get_poison (CCTK_REAL const &) CCTK_ATTRIBUTE_CONST;
CCTK_REAL get_poison (CCTK_REAL const &) { return poison; }
template <typename T>
@@ -72,7 +74,9 @@ namespace CarpetInterp2 {
{ \
sizeof s.name / sizeof(type), /* count elements */ \
(char*)&s.name - (char*)&s, /* offsetof doesn't work (why?) */ \
- dist::datatype<type>() /* find MPI datatype */ \
+ dist::mpi_datatype<type>(), /* find MPI datatype */ \
+ STRINGIFY(name), /* field name */ \
+ STRINGIFY(type), /* type name */ \
}
dist::mpi_struct_descr_t const descr[] = {
ENTRY(int, mrc),
@@ -83,11 +87,12 @@ namespace CarpetInterp2 {
#endif
ENTRY(int, ind3d),
ENTRY(CCTK_REAL, offset),
- {1, sizeof(s), MPI_UB}
+ {1, sizeof(s), MPI_UB, "MPI_UB", "MPI_UB"}
};
#undef ENTRY
- dist::create_mpi_datatype
- (sizeof(descr) / sizeof(descr[0]), descr, newtype);
+ newtype =
+ dist::create_mpi_datatype (sizeof descr / sizeof descr[0], descr,
+ "fasterp_iloc_t::mpi_datatype", sizeof s);
initialised = true;
}
return newtype;
@@ -240,6 +245,7 @@ namespace CarpetInterp2 {
// round is not available with PGI compilers
// CCTK_REAL const rx = round(x);
CCTK_REAL const rx = floor(x+0.5);
+#warning "TODO: make eps a relative error my taking max(abs(xmin),abs(xmax)) into account"
if (abs(x - rx) < eps) {
// The interpolation point coincides with a grid point; no
// interpolation is necessary (this is a special case)
@@ -478,7 +484,8 @@ namespace CarpetInterp2 {
fasterp_setup_t (cGH const * restrict const cctkGH,
fasterp_glocs_t const & locations,
int const order_)
- : order (order_)
+ : order (order_),
+ regridding_epoch (Carpet::regridding_epoch)
{
// Some global properties
int const npoints = locations.size();
@@ -1026,6 +1033,12 @@ namespace CarpetInterp2 {
{
DECLARE_CCTK_PARAMETERS;
+ // Check regridding epoch
+ if (regridding_epoch != Carpet::regridding_epoch) {
+ CCTK_WARN (CCTK_WARN_ALERT,
+ "The Carpet grid structure was changed since this fasterp_setup was created");
+ }
+
// Desired time level
int const tl = 0; // current time
@@ -1072,19 +1085,19 @@ namespace CarpetInterp2 {
MPI_Irecv (& recv_points.AT(recv_proc.offset * nvars),
recv_proc.npoints * nvars,
- dist::datatype<CCTK_REAL>(), recv_proc.p, mpi_tag,
+ dist::mpi_datatype<CCTK_REAL>(), recv_proc.p, mpi_tag,
comm_world, & recv_reqs.AT(pp));
#ifdef CARPET_DEBUG
MPI_Irecv (& recv_pn.AT(recv_proc.offset),
recv_proc.npoints * 2,
- dist::datatype<int>(), recv_proc.p, mpi_tag,
+ dist::mpi_datatype<int>(), recv_proc.p, mpi_tag,
comm_world, & recv_reqs_pn.AT(pp));
#endif
}
// Interpolate data and post Isends
if (verbose) CCTK_INFO ("Interpolating and posting MPI_Isends");
- // TODO: Use one arrays per processor?
+ // TODO: Use one array per processor?
vector<CCTK_REAL> send_points (send_descr.npoints * nvars);
fill_with_poison (send_points);
vector<MPI_Request> send_reqs (send_descr.procs.size());
@@ -1107,6 +1120,8 @@ namespace CarpetInterp2 {
int const rl = send_comp.mrc.rl;
int const c = send_comp.mrc.c;
+ int const lc = Carpet::vhh.AT(m)->get_local_component(rl,c);
+
// Get pointers to 3D data
vector<CCTK_REAL const *> varptrs (nvars);
for (size_t v=0; v<nvars; ++v) {
@@ -1117,11 +1132,13 @@ namespace CarpetInterp2 {
varptrs.AT(v) =
(CCTK_REAL const *)
(* Carpet::arrdata.AT(gi).AT(m).data.AT(vi))
- (tl, rl, c, Carpet::mglevel)->storage();
+ (tl, rl, lc, Carpet::mglevel)->storage();
assert (varptrs.AT(v));
}
-#pragma omp parallel for
+ // TODO: This loops seems unbalanced. Maybe the different
+ // interpolations have different costs.
+#pragma omp parallel for schedule (dynamic, 1000)
for (int n=0; n<int(send_comp.locs.size()); ++n) {
size_t const ind = (send_comp.offset + n) * nvars;
send_comp.locs.AT(n).interpolate
@@ -1161,12 +1178,12 @@ namespace CarpetInterp2 {
MPI_Isend (& send_points.AT(send_proc.offset * nvars),
send_proc.npoints * nvars,
- dist::datatype<CCTK_REAL>(), send_proc.p, mpi_tag,
+ dist::mpi_datatype<CCTK_REAL>(), send_proc.p, mpi_tag,
comm_world, & send_reqs.AT(pp));
#ifdef CARPET_DEBUG
MPI_Isend (& send_pn.AT(send_proc.offset),
send_proc.npoints * 2,
- dist::datatype<int>(), send_proc.p, mpi_tag,
+ dist::mpi_datatype<int>(), send_proc.p, mpi_tag,
comm_world, & send_reqs_pn.AT(pp));
#endif
} // for pp
diff --git a/Carpet/CarpetInterp2/src/fasterp.hh b/Carpet/CarpetInterp2/src/fasterp.hh
index 393fd5144..1a58e8222 100644
--- a/Carpet/CarpetInterp2/src/fasterp.hh
+++ b/Carpet/CarpetInterp2/src/fasterp.hh
@@ -38,7 +38,7 @@ namespace CarpetInterp2 {
static int components;
static void determine_mrc_info ();
- static int get_max_ind ()
+ static int get_max_ind () CCTK_ATTRIBUTE_PURE
{
return maps * reflevels * components;
}
@@ -63,12 +63,12 @@ namespace CarpetInterp2 {
mrc_t (int ind);
// Convert a mrc into an integer index
- int get_ind () const
+ int get_ind () const CCTK_ATTRIBUTE_PURE
{
return c + components * (rl + reflevels * m);
}
- bool operator== (mrc_t const & a) const
+ bool operator== (mrc_t const & a) const CCTK_ATTRIBUTE_PURE
{
return m == a.m and rl == a.rl and c == a.c;
}
@@ -116,7 +116,7 @@ namespace CarpetInterp2 {
coords[d].resize(n);
}
}
- size_t size () const { return coords[0].size(); }
+ size_t size () const CCTK_ATTRIBUTE_PURE { return coords[0].size(); }
};
// A local location, given by map and local coordinates
@@ -130,7 +130,7 @@ namespace CarpetInterp2 {
coords[d].resize(n);
}
}
- size_t size () const { return maps.size(); }
+ size_t size () const CCTK_ATTRIBUTE_PURE { return maps.size(); }
};
// An integer location, given by map, refinement level, and
@@ -146,7 +146,7 @@ namespace CarpetInterp2 {
int ind3d; // closest grid point
rvect offset; // in terms of grid points
- static MPI_Datatype mpi_datatype ();
+ static MPI_Datatype mpi_datatype () CCTK_ATTRIBUTE_CONST;
void output (ostream& os) const;
};
@@ -277,6 +277,8 @@ namespace CarpetInterp2 {
send_descr_t send_descr;
int order;
+ int regridding_epoch;
+
void
setup (cGH const * restrict cctkGH,
fasterp_llocs_t const & locations);
@@ -300,7 +302,7 @@ namespace CarpetInterp2 {
size_t
get_npoints ()
- const
+ const CCTK_ATTRIBUTE_PURE
{
return recv_descr.npoints;
}
diff --git a/Carpet/CarpetInterp2/src/interp2.cc b/Carpet/CarpetInterp2/src/interp2.cc
index f8a17df99..ee026744d 100644
--- a/Carpet/CarpetInterp2/src/interp2.cc
+++ b/Carpet/CarpetInterp2/src/interp2.cc
@@ -75,4 +75,189 @@ namespace CarpetInterp2 {
return 0;
}
+ extern "C"
+ CCTK_INT
+ CarpetInterp2_MultiPatchInterpGridArrays (CCTK_POINTER_TO_CONST const cctkGH_,
+ CCTK_INT const N_dims,
+ CCTK_INT const order,
+ CCTK_INT const N_interp_points,
+ CCTK_INT const * const interp_maps,
+ CCTK_POINTER_TO_CONST const interp_coords_,
+ CCTK_INT const N_input_arrays,
+ CCTK_INT const * const input_array_indices,
+ CCTK_INT const N_output_arrays,
+ CCTK_POINTER const output_arrays_)
+ {
+ // Check input values and convert types
+ cGH const * const cctkGH = static_cast<cGH const *> (cctkGH_);
+ assert (cctkGH);
+
+ assert (N_dims == dim);
+
+ assert (N_interp_points >= 0);
+
+ assert (interp_maps);
+ CCTK_REAL const * const * const interp_coords =
+ static_cast<CCTK_REAL const * const *> (interp_coords_);
+ assert (interp_coords);
+ for (int d=0; d<dim; ++d) {
+ assert (N_interp_points==0 or interp_coords[d]);
+ }
+
+ assert (N_input_arrays >= 0);
+
+ assert (input_array_indices);
+ for (int n=0; n<N_input_arrays; ++n) {
+ assert (input_array_indices[n]>=0 and
+ input_array_indices[n]<CCTK_NumVars());
+ }
+
+ assert (N_output_arrays >= 0);
+ assert (N_output_arrays == N_input_arrays);
+
+ CCTK_REAL * const * const output_arrays =
+ static_cast<CCTK_REAL * const *> (output_arrays_);
+ assert (output_arrays);
+ for (int n=0; n<N_output_arrays; ++n) {
+ assert (N_output_arrays==0 or output_arrays[n]);
+ }
+
+ // Set up interpolation
+ fasterp_llocs_t locations (N_interp_points);
+ for (int i=0; i<N_interp_points; ++i) {
+ locations.maps.AT(i) = interp_maps[i];
+ }
+ for (int d=0; d<dim; ++d) {
+ for (int i=0; i<N_interp_points; ++i) {
+ locations.coords[d].AT(i) = interp_coords[d][i];
+ }
+ }
+ fasterp_setup_t const setup (cctkGH, locations, order);
+
+ // Interpolate
+ vector<int> varinds (N_input_arrays);
+ for (int n=0; n<N_input_arrays; ++n) {
+ varinds.AT(n) = input_array_indices[n];
+ }
+ vector<CCTK_REAL *> values (N_input_arrays);
+ for (int n=0; n<N_input_arrays; ++n) {
+ values.AT(n) = output_arrays[n];
+ }
+ setup.interpolate (cctkGH, varinds, values);
+
+ // Done
+ return 0;
+ }
+
+
+
+ extern "C"
+ CCTK_POINTER
+ CarpetInterp2_Interp2GridArraysSetup
+ (CCTK_POINTER_TO_CONST const cctkGH_,
+ CCTK_INT const N_dims,
+ CCTK_INT const order,
+ CCTK_INT const N_interp_points,
+ CCTK_POINTER_TO_CONST const interp_coords_)
+ {
+ // Check input values and convert types
+ cGH const * const cctkGH = static_cast<cGH const *> (cctkGH_);
+ assert (cctkGH);
+
+ assert (N_dims == dim);
+
+ assert (N_interp_points >= 0);
+
+ CCTK_REAL const * const * const interp_coords =
+ static_cast<CCTK_REAL const * const *> (interp_coords_);
+ assert (interp_coords);
+ for (int d=0; d<dim; ++d) {
+ assert (N_interp_points==0 or interp_coords[d]);
+ }
+
+ // Set up interpolation
+ fasterp_glocs_t locations (N_interp_points);
+ for (int d=0; d<dim; ++d) {
+ for (int i=0; i<N_interp_points; ++i) {
+ locations.coords[d].AT(i) = interp_coords[d][i];
+ }
+ }
+ fasterp_setup_t * const setup =
+ new fasterp_setup_t (cctkGH, locations, order);
+
+ // Done
+ return setup;
+ }
+
+ extern "C"
+ CCTK_INT
+ CarpetInterp2_Interp2GridArrays
+ (CCTK_POINTER_TO_CONST const cctkGH_,
+ CCTK_POINTER_TO_CONST const setup_,
+ CCTK_INT const N_input_arrays,
+ CCTK_INT const * const input_array_indices,
+ CCTK_INT const N_output_arrays,
+ CCTK_POINTER const output_arrays_)
+ {
+ // Check input values and convert types
+ cGH const * const cctkGH = static_cast<cGH const *> (cctkGH_);
+ assert (cctkGH);
+
+ fasterp_setup_t const * const setup =
+ static_cast<fasterp_setup_t const *> (setup_);
+ assert (setup);
+
+ assert (N_input_arrays >= 0);
+
+ assert (input_array_indices);
+ for (int n=0; n<N_input_arrays; ++n) {
+ assert (input_array_indices[n]>=0 and
+ input_array_indices[n]<CCTK_NumVars());
+ }
+
+ assert (N_output_arrays >= 0);
+ assert (N_output_arrays == N_input_arrays);
+
+ CCTK_REAL * const * const output_arrays =
+ static_cast<CCTK_REAL * const *> (output_arrays_);
+ assert (output_arrays);
+ for (int n=0; n<N_output_arrays; ++n) {
+ assert (N_output_arrays==0 or output_arrays[n]);
+ }
+
+ // Interpolate
+ vector<int> varinds (N_input_arrays);
+ for (int n=0; n<N_input_arrays; ++n) {
+ varinds.AT(n) = input_array_indices[n];
+ }
+ vector<CCTK_REAL *> values (N_input_arrays);
+ for (int n=0; n<N_input_arrays; ++n) {
+ values.AT(n) = output_arrays[n];
+ }
+ setup->interpolate (cctkGH, varinds, values);
+
+ // Done
+ return 0;
+ }
+
+ extern "C"
+ CCTK_INT
+ CarpetInterp2_Interp2GridArraysFree
+ (CCTK_POINTER_TO_CONST const cctkGH_,
+ CCTK_POINTER const setup_)
+ {
+ // Check input values and convert types
+ cGH const * const cctkGH = static_cast<cGH const *> (cctkGH_);
+ assert (cctkGH);
+
+ fasterp_setup_t const * const setup =
+ static_cast<fasterp_setup_t const *> (setup_);
+ assert (setup);
+
+ delete setup;
+
+ // Done
+ return 0;
+ }
+
} // namespace CarpetInterp2
diff --git a/Carpet/CarpetLib/README b/Carpet/CarpetLib/README
index 82e529534..6e2e17abc 100644
--- a/Carpet/CarpetLib/README
+++ b/Carpet/CarpetLib/README
@@ -1,7 +1,9 @@
Cactus Code Thorn CarpetLib
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn contains the backend library that provides mesh refinement.
diff --git a/Carpet/CarpetLib/interface.ccl b/Carpet/CarpetLib/interface.ccl
index 6e7462678..c88cf032d 100644
--- a/Carpet/CarpetLib/interface.ccl
+++ b/Carpet/CarpetLib/interface.ccl
@@ -2,6 +2,8 @@
IMPLEMENTS: CarpetLib
+includes header: mpi_string.hh in mpi_string.hh
+
includes header: defs.hh in defs.hh
includes header: dist.hh in dist.hh
includes header: typeprops.hh in typeprops.hh
@@ -28,6 +30,7 @@ includes header: th.hh in th.hh
includes header: operators.hh in operators.hh
uses include header: carpet_typecase.hh
+uses include header: CarpetTimers.hh
diff --git a/Carpet/CarpetLib/param.ccl b/Carpet/CarpetLib/param.ccl
index 45724f25d..31a43a135 100644
--- a/Carpet/CarpetLib/param.ccl
+++ b/Carpet/CarpetLib/param.ccl
@@ -41,19 +41,48 @@ BOOLEAN poison_new_memory "Try to catch uninitialised data by setting newly allo
{
} "no"
+RESTRICTED:
+
CCTK_INT poison_value "Integer value (0..255) used to poison new timelevels (with memset)" STEERABLE=always
{
0:255 :: "Must fit into a byte. Use 0 for zero, 255 for nan, and e.g. 113 for a large value."
} 255
+CCTK_INT deadbeef "A strange integer value that indicates that something has gone wrong; the integer equivalent of a nan" STEERABLE=always
+{
+ *:* :: "should be large and positive"
+} 666 # 7353315
+
+PRIVATE:
+
+# System limits
+
+INT max_core_size_MB "Maximum size of a core file, set via setrlimit" STEERABLE=recover
+{
+ -2 :: "unchanged"
+ -1 :: "unlimited"
+ 0:* :: "limited"
+} -2
+
+INT max_memory_size_MB "Maximum amount of memory per MPI process, set via setrlimit" STEERABLE=recover
+{
+ -2 :: "unchanged"
+ -1 :: "unlimited"
+ 0:* :: "limited"
+} -2
+
+
+
+# Statistics
+
INT print_timestats_every "Print timing statistics periodically" STEERABLE=always
{
-1 :: "don't report"
- 0 :: "don't report"
+ 0 :: "report after initialisation"
1:* :: "report every so many iterations"
-} 0
+} -1
STRING timestat_file "File name in which timestat output is collected (because stdout from the root node may not be enough)" STEERABLE=always
{
@@ -70,7 +99,7 @@ INT print_memstats_every "Report periodically how much memory is used per proces
1:* :: "report every so many iterations"
} 0
-INT max_allowed_memory_MB "Maximum allowed amount of memory per process (in Megabytes)" STEERABLE=always
+INT max_allowed_memory_MB "Maximum allowed amount of memory per process that can be allocated for grid variables (in Megabytes)" STEERABLE=always
{
-1 :: "no maximum"
0 :: "no maximum"
@@ -85,21 +114,29 @@ STRING memstat_file "File name in which memstat output is collected (because std
-# Experimental recomposing parameters
-
BOOLEAN combine_recompose "Recompose all grid functions of one refinement levels at once" STEERABLE=always
{
-} "no"
+} "yes"
-# Experimental communication parameters
+# Communication experiment parameters
-BOOLEAN interleave_communications "Try to interleave communications with each other; each processor begins to communicate with its 'right neighbour' in rank, instead of with the root processor" STEERABLE=always
+INT message_size_multiplier "Enlarge size of transmitted messages by this factor" STEERABLE=always
{
-} "no"
+ 1:* :: ""
+} 1
+
+INT message_count_multiplier "Transmit messages this many times" STEERABLE=always
+{
+ 1:* :: ""
+} 1
-BOOLEAN vary_tags "Use different tags for each communication" STEERABLE=always
+
+
+# Experimental communication parameters
+
+BOOLEAN interleave_communications "Try to interleave communications with each other; each processor begins to communicate with its 'right neighbour' in rank, instead of with the root processor" STEERABLE=always
{
} "no"
@@ -107,11 +144,11 @@ BOOLEAN barrier_between_stages "Add a barrier between the communication stages (
{
} "no"
-BOOLEAN combine_sends "Send data together and in order of processor ranks" STEERABLE=always
+BOOLEAN check_communication_schedule "Check the communication schedule at run time (expensive)" STEERABLE=always
{
} "no"
-BOOLEAN reduce_mpi_waitall "Call MPI_Waitall only for requests that are not null" STEERABLE=always
+BOOLEAN combine_sends "Send data together and in order of processor ranks" STEERABLE=always
{
} "no"
diff --git a/Carpet/CarpetLib/schedule.ccl b/Carpet/CarpetLib/schedule.ccl
index d371bc7a5..a208c97ca 100644
--- a/Carpet/CarpetLib/schedule.ccl
+++ b/Carpet/CarpetLib/schedule.ccl
@@ -1,10 +1,10 @@
# Schedule definitions for thorn CarpetLib
-SCHEDULE CarpetLib_setmemlimit AT WRAGH
+SCHEDULE CarpetLib_registercycleclock AT startup BEFORE Driver_Startup
{
LANG: C
OPTIONS: global
-} "Set operating system memory limit"
+} "Register cycle based timer"
SCHEDULE CarpetLib_printtimestats AT analysis
{
diff --git a/Carpet/CarpetLib/src/bbox.cc b/Carpet/CarpetLib/src/bbox.cc
index a14e1e9a3..164d63884 100644
--- a/Carpet/CarpetLib/src/bbox.cc
+++ b/Carpet/CarpetLib/src/bbox.cc
@@ -1,4 +1,4 @@
-
+#include <algorithm>
#include <cassert>
#include <iostream>
#include <limits>
@@ -6,7 +6,8 @@
#include <string>
#include <typeinfo>
-#include "cctk.h"
+#include <cctk.h>
+#include <cctk_Parameters.h>
#include "defs.hh"
#include "vect.hh"
@@ -21,8 +22,8 @@ using namespace std;
template<class T, int D>
void bbox<T,D>::assert_bbox_limits () const
{
- assert (all(_stride>T(0)));
- assert (all((_upper-_lower)%_stride == T(0)));
+ ASSERT_BBOX (all(_stride>T(0)));
+ ASSERT_BBOX (all((_upper-_lower)%_stride == T(0)));
if (numeric_limits<T>::is_integer) {
// prevent accidental wrap-around
if (any (_lower >= numeric_limits<T>::max() / 2) or
@@ -30,29 +31,34 @@ void bbox<T,D>::assert_bbox_limits () const
any (_upper >= numeric_limits<T>::max() / 2) or
any (_upper <= numeric_limits<T>::min() / 2))
{
- ostringstream lbuf, ubuf, sbuf;
- lbuf << _lower;
- ubuf << _upper;
- sbuf << _stride;
- string const lstr = lbuf.str();
- string const ustr = ubuf.str();
- string const sstr = sbuf.str();
- CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Tried to create a very large bbox [%s,%s,%s] of type %s -- it is likely that this would lead to an integer overflow",
- lstr.c_str(), ustr.c_str(), sstr.c_str(),
- typeid(*this).name());
+ ostringstream buf;
+ T dummy;
+ buf << "Tried to create a very large bbox [" << _lower << "," << _upper << "," << _stride << "] for the type " << typeid(dummy).name() << " -- it is likely that this would lead to an integer overflow";
+ CCTK_WARN (CCTK_WARN_ABORT, buf.str().c_str());
}
}
}
+// Poison
+template<class T, int D>
+bbox<T,D> bbox<T,D>::poison ()
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ vect<T,D> const v (deadbeef);
+ return bbox (v, v, v);
+}
+
+
+
// Accessors
template<class T, int D>
typename bbox<T,D>::size_type bbox<T,D>::size () const {
if (empty()) return 0;
const vect<T,D> sh(shape()/stride());
-#ifdef NDEBUG
+#ifndef CARPET_DEBUG
return prod(vect<size_type,D>(sh));
#else
size_type sz = 1, max = numeric_limits<size_type>::max();
@@ -103,7 +109,7 @@ bool bbox<T,D>::is_aligned_with (const bbox& b) const {
template<class T, int D>
bool bbox<T,D>::operator== (const bbox& b) const {
if (empty() and b.empty()) return true;
- assert (all(stride()==b.stride()));
+ ASSERT_BBOX (all(stride()==b.stride()));
return all(lower()==b.lower() and upper()==b.upper());
}
@@ -160,8 +166,8 @@ bool bbox<T,D>::operator> (const bbox& b) const {
template<class T, int D>
bbox<T,D> bbox<T,D>::expand (const vect<T,D>& lo, const vect<T,D>& hi) const {
// Allow expansion only into directions where the extent is not negative
- // assert (all(lower()<=upper() or (lo==T(0) and hi==T(0))));
- assert (all(shape()>=vect<T,D>(0) or (lo==T(0) and hi==T(0))));
+ // ASSERT_BBOX (all(lower()<=upper() or (lo==T(0) and hi==T(0))));
+ ASSERT_BBOX (all(shape()>=vect<T,D>(0) or (lo==T(0) and hi==T(0))));
const vect<T,D> str = stride();
const vect<T,D> lb = lower() - lo * str;
const vect<T,D> ub = upper() + hi * str;
@@ -197,7 +203,7 @@ template<class T, int D>
bbox<T,D> bbox<T,D>::expanded_containing (const bbox& b) const {
if (empty()) return b;
if (b.empty()) return *this;
- assert (is_aligned_with(b));
+ ASSERT_BBOX (is_aligned_with(b));
const vect<T,D> lo = min(lower(), b.lower());
const vect<T,D> up = max(upper(), b.upper());
const vect<T,D> str = min(stride(), b.stride());
@@ -268,12 +274,13 @@ void bbox<T,D>::input (istream& is) {
consume (is, '/');
size_type size_dummy;
is >> size_dummy;
- assert (is.good());
+ ASSERT_BBOX (is.good());
skipws (is);
}
consume (is, ')');
} catch (input_error &err) {
- cout << "Input error while reading a bbox" << endl;
+ T Tdummy;
+ cout << "Input error while reading a bbox<" << typestring(Tdummy) << "," << D << ">" << endl;
throw err;
}
if (any(_stride<=T(0))) {
@@ -286,8 +293,8 @@ void bbox<T,D>::input (istream& is) {
<< " The stride does not evenly divide the extent." << endl;
throw input_error();
}
- assert (all(_stride>T(0)));
- assert (all((_upper-_lower)%_stride == T(0)));
+ ASSERT_BBOX (all(_stride>T(0)));
+ ASSERT_BBOX (all((_upper-_lower)%_stride == T(0)));
}
@@ -308,4 +315,5 @@ template class bbox<int,0>;
template class bbox<int,1>;
template class bbox<int,2>;
template class bbox<int,3>;
-template class bbox<CCTK_REAL,3>;
+template class bbox<int,4>;
+template class bbox<CCTK_REAL,dim>;
diff --git a/Carpet/CarpetLib/src/bbox.hh b/Carpet/CarpetLib/src/bbox.hh
index a79fbe87b..8386f58a2 100644
--- a/Carpet/CarpetLib/src/bbox.hh
+++ b/Carpet/CarpetLib/src/bbox.hh
@@ -13,6 +13,14 @@ using namespace std;
+#ifdef CARPET_DEBUG
+# define ASSERT_BBOX(x) assert(x)
+#else
+# define ASSERT_BBOX(x)
+#endif
+
+
+
// Forward declaration
template<class T, int D> class bbox;
@@ -69,11 +77,14 @@ public:
const vect<T,D>& stride_)
: _lower(lower_), _upper(upper_), _stride(stride_)
{
-#ifndef NDEBUG
+#ifndef CARPET_DEBUG
assert_bbox_limits();
#endif
}
+ // Poison
+ static bbox poison ();
+
// Accessors
// (Don't return references; *this might be a temporary)
@@ -131,7 +142,7 @@ public:
bbox b. */
bbox operator& (const bbox& b) const
{
- assert (all(stride()==b.stride()));
+ ASSERT_BBOX (all(stride()==b.stride()));
vect<T,D> lo = max(lower(),b.lower());
vect<T,D> up = min(upper(),b.upper());
return bbox(lo,up,stride());
@@ -179,7 +190,7 @@ public:
iterator end () const;
// Memory usage
- size_t memory () const
+ size_t memory () const CCTK_ATTRIBUTE_CONST
{
return memoryof (_lower) + memoryof (_upper) + memoryof (_stride);
}
@@ -194,6 +205,8 @@ public:
// Memory usage
template<class T, int D>
+inline size_t memoryof (bbox<T,D> const & b) CCTK_ATTRIBUTE_CONST;
+template<class T, int D>
inline size_t memoryof (bbox<T,D> const & b) { return b.memory(); }
diff --git a/Carpet/CarpetLib/src/bboxset.cc b/Carpet/CarpetLib/src/bboxset.cc
index eceb264d8..a5748a7c6 100644
--- a/Carpet/CarpetLib/src/bboxset.cc
+++ b/Carpet/CarpetLib/src/bboxset.cc
@@ -51,6 +51,11 @@ bboxset<T,D>::bboxset (const vector<list<box> >& vlb) {
normalize();
}
+template<class T, int D>
+bboxset<T,D> bboxset<T,D>::poison () {
+ return bboxset (bbox<T,D>::poison());
+}
+
// Invariant
@@ -455,16 +460,54 @@ bool bboxset<T,D>::operator!= (const bboxset<T,D>& s) const {
+// Input
+template<class T,int D>
+istream& bboxset<T,D>::input (istream& is) {
+ T Tdummy;
+ try {
+ skipws (is);
+ consume (is, "bboxset<");
+ consume (is, typestring(Tdummy));
+ consume (is, ",");
+ int D_;
+ is >> D_;
+ if (D_ != D) {
+ cout << "Input error: Wrong bboxset dimension " << D_ << ", expected " << D << endl;
+ throw input_error();
+ }
+ consume (is, ">:{");
+ consume (is, "size=");
+ size_type size_;
+ is >> size_;
+ consume (is, ",");
+ consume (is, "setsize=");
+ int setsize_;
+ is >> setsize_;
+ consume (is, ",");
+ consume (is, "set=");
+ is >> bs;
+ consume (is, "}");
+ } catch (input_error & err) {
+ cout << "Input error while reading a bboxset<" << typestring(Tdummy) << "," << D << ">" << endl;
+ throw err;
+ }
+ return is;
+}
+
+
+
// Output
template<class T,int D>
-void bboxset<T,D>::output (ostream& os) const {
+ostream& bboxset<T,D>::output (ostream& os) const {
T Tdummy;
- os << "bboxset<" << typestring(Tdummy) << "," << D << ">:"
+ os << "bboxset<" << typestring(Tdummy) << "," << D << ">:{"
<< "size=" << size() << ","
<< "setsize=" << setsize() << ","
- << "set=" << bs;
+ << "set=" << bs
+ << "}";
+ return os;
}
-template class bboxset<int,3>;
+template class bboxset<int,dim>;
diff --git a/Carpet/CarpetLib/src/bboxset.hh b/Carpet/CarpetLib/src/bboxset.hh
index 45e0dc0f2..5d206da33 100644
--- a/Carpet/CarpetLib/src/bboxset.hh
+++ b/Carpet/CarpetLib/src/bboxset.hh
@@ -28,6 +28,10 @@ template<class T, int D> class bboxset;
// template<class T,int D>
// bboxset<T,D> operator- (const bbox<T,D>& b, const bboxset<T,D>& s);
+// Input
+template<class T,int D>
+istream& operator>> (istream& is, bboxset<T,D>& s);
+
// Output
template<class T,int D>
ostream& operator<< (ostream& os, const bboxset<T,D>& s);
@@ -60,6 +64,8 @@ public:
bboxset (const list<box>& lb);
bboxset (const vector<list<box> >& vlb);
+ static bboxset poison ();
+
// Invariant
bool invariant () const;
@@ -143,10 +149,13 @@ public:
// iterator end () const { return bs.end(); }
// Memory usage
- size_t memory () const { return memoryof (bs); }
+ size_t memory () const CCTK_ATTRIBUTE_PURE { return memoryof (bs); }
+
+ // Input
+ istream& input (istream& is);
// Output
- void output (ostream& os) const;
+ ostream& output (ostream& os) const;
};
@@ -186,64 +195,112 @@ inline bboxset<T,D> operator& (const bbox<T,D>& b, const bboxset<T,D>& s) {
template<class T,int D>
-inline bool operator== (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator== (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator== (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) == s;
}
template<class T,int D>
-inline bool operator!= (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator!= (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator!= (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) != s;
}
template<class T,int D>
-inline bool operator< (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator< (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator< (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) < s;
}
template<class T,int D>
-inline bool operator<= (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator<= (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator<= (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) <= s;
}
template<class T,int D>
-inline bool operator> (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator> (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator> (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) > s;
}
template<class T,int D>
-inline bool operator>= (const bbox<T,D>& b, const bboxset<T,D>& s) {
+inline bool operator>= (const bbox<T,D>& b, const bboxset<T,D>& s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator>= (const bbox<T,D>& b, const bboxset<T,D>& s)
+{
return bboxset<T,D>(b) >= s;
}
template<class T,int D>
-inline bool operator== (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator== (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator== (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s == bboxset<T,D>(b);
}
template<class T,int D>
-inline bool operator!= (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator!= (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator!= (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s != bboxset<T,D>(b);
}
template<class T,int D>
-inline bool operator< (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator< (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator< (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s < bboxset<T,D>(b);
}
template<class T,int D>
-inline bool operator<= (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator<= (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator<= (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s <= bboxset<T,D>(b);
}
template<class T,int D>
-inline bool operator> (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator> (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator> (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s > bboxset<T,D>(b);
}
template<class T,int D>
-inline bool operator>= (const bboxset<T,D>& s, const bbox<T,D>& b) {
+inline bool operator>= (const bboxset<T,D>& s, const bbox<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<class T,int D>
+inline bool operator>= (const bboxset<T,D>& s, const bbox<T,D>& b)
+{
return s >= bboxset<T,D>(b);
}
@@ -251,15 +308,26 @@ inline bool operator>= (const bboxset<T,D>& s, const bbox<T,D>& b) {
// Memory usage
template<class T, int D>
-inline size_t memoryof (bboxset<T,D> const & s) { return s.memory(); }
+inline size_t memoryof (bboxset<T,D> const & s)
+ CCTK_ATTRIBUTE_PURE;
+template<class T, int D>
+inline size_t memoryof (bboxset<T,D> const & s)
+{ return s.memory(); }
+
+
+
+// Input
+template<class T,int D>
+inline istream& operator>> (istream& is, bboxset<T,D>& s) {
+ return s.input(is);
+}
// Output
template<class T,int D>
inline ostream& operator<< (ostream& os, const bboxset<T,D>& s) {
- s.output(os);
- return os;
+ return s.output(os);
}
diff --git a/Carpet/CarpetLib/src/commstate.cc b/Carpet/CarpetLib/src/commstate.cc
index 7a00157c2..ef1b64cdb 100644
--- a/Carpet/CarpetLib/src/commstate.cc
+++ b/Carpet/CarpetLib/src/commstate.cc
@@ -21,241 +21,463 @@ using namespace CarpetLib;
+char const * tostring (astate const & thestate)
+{
+ switch (thestate) {
+ case state_get_buffer_sizes: return "state_get_buffer_sizes";
+ case state_fill_send_buffers: return "state_fill_send_buffers";
+ case state_do_some_work: return "state_do_some_work";
+ case state_empty_recv_buffers: return "state_empty_recv_buffers";
+ case state_done: return "state_done";
+ default: assert(0); abort();
+ }
+ return NULL;
+}
+
+
+
// Communication state control
comm_state::comm_state ()
{
- // A comm_state object will step through
- // state_get_buffer_sizes
- // state_fill_send_buffers
- // state_empty_recv_buffers
-
DECLARE_CCTK_PARAMETERS;
-
+
static Timer timer ("commstate::create");
timer.start ();
thestate = state_get_buffer_sizes;
-
+
typebufs.resize (dist::c_ndatatypes());
-#define INSTANTIATE(T) \
- { \
- T dummy; \
- int const type = dist::c_datatype (dummy); \
- assert (typebufs.AT(type).datatypesize == 0); \
- typebufs.AT(type).datatypesize = sizeof dummy; \
- typebufs.AT(type).mpi_datatype = dist::datatype (dummy); \
- typebufs.AT(type).procbufs.resize (dist::size()); \
+#define INSTANTIATE(T) \
+ { \
+ T dummy; \
+ unsigned const type = dist::c_datatype (dummy); \
+ typebufs.AT(type).mpi_datatype = dist::mpi_datatype (dummy); \
+ typebufs.AT(type).datatypesize = sizeof dummy; \
}
#include "instantiate"
#undef INSTANTIATE
-
- srequests.resize (dist::c_ndatatypes() * dist::size(), MPI_REQUEST_NULL);
- rrequests.resize (dist::c_ndatatypes() * dist::size(), MPI_REQUEST_NULL);
+
+ srequests.reserve (dist::c_ndatatypes() * dist::size());
+ rrequests.reserve (dist::c_ndatatypes() * dist::size());
timer.stop (0);
}
+
void comm_state::step ()
{
DECLARE_CCTK_PARAMETERS;
static Timer total ("commstate::step");
total.start ();
- assert (thestate != state_done);
+
+ if (barrier_between_stages) {
+ // Add a barrier, ensuring e.g. that all Irecvs are posted before
+ // the first Isends are made
+ if (commstate_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "before MPI_Barrier; state=%s", tostring(thestate));
+ }
+ MPI_Barrier (dist::comm());
+ if (commstate_verbose) {
+ CCTK_INFO ("after MPI_Barrier");
+ }
+ }
+
switch (thestate) {
- case state_get_buffer_sizes:
+
+
+ case state_get_buffer_sizes: {
+
+ if (check_communication_schedule) {
+ vector<int> sendcount(dist::size() * dist::c_ndatatypes());
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ for (int proc = 0; proc < dist::size(); ++ proc) {
+ sendcount.AT(proc * dist::c_ndatatypes() + type) =
+ typebufs.AT(type).in_use ?
+ typebufs.AT(type).procbufs.AT(proc).sendbufsize :
+ 0;
+ }
+ assert (sendcount.AT(dist::rank() * dist::c_ndatatypes() + type) == 0);
+ }
+ vector<int> recvcount(dist::size() * dist::c_ndatatypes());
+ if (commstate_verbose) {
+ CCTK_INFO ("before MPI_Alltoall");
+ }
+ MPI_Alltoall (&sendcount.front(), dist::c_ndatatypes(), MPI_INT,
+ &recvcount.front(), dist::c_ndatatypes(), MPI_INT,
+ dist::comm());
+ if (commstate_verbose) {
+ CCTK_INFO ("after MPI_Alltoall");
+ }
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ for (int proc = 0; proc < dist::size(); ++ proc) {
+ assert (recvcount.AT(proc * dist::c_ndatatypes() + type) ==
+ (typebufs.AT(type).in_use ?
+ int (typebufs.AT(type).procbufs.AT(proc).recvbufsize) :
+ 0));
+ }
+ assert (recvcount.AT(dist::rank() * dist::c_ndatatypes() + type) == 0);
+ }
+ }
+
// The sizes of the collective communication buffers are known so
// now allocate them.
// The receive operations are also posted here already (a clever
// MPI layer may take advantage of such early posting).
- num_posted_recvs = num_completed_recvs = 0;
- for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
- size_t const proc =
- interleave_communications
- ? (proc1 + dist::rank()) % dist::size()
- : proc1;
-
- for (size_t type = 0; type < typebufs.size(); type++) {
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
- // skip unused datatype buffers
- if (not typebufs.AT(type).in_use) continue;
-
- int datatypesize = typebufs.AT(type).datatypesize;
- procbufdesc& procbuf = typebufs.AT(type).procbufs.AT(proc);
-
- assert (procbuf.sendbufbase.empty());
- assert (procbuf.recvbufbase.empty());
- procbuf.sendbufbase.resize (procbuf.sendbufsize*datatypesize);
- procbuf.recvbufbase.resize (procbuf.recvbufsize*datatypesize);
- // TODO: this may be a bit extreme, and it is only for
- // internal consistency checking
- if (poison_new_memory) {
- memset (&procbuf.sendbufbase.front(), poison_value,
- procbuf.sendbufsize*datatypesize);
- memset (&procbuf.recvbufbase.front(), poison_value,
- procbuf.recvbufsize*datatypesize);
- }
- procbuf.sendbuf = &procbuf.sendbufbase.front();
- procbuf.recvbuf = &procbuf.recvbufbase.front();
-
- if (procbuf.recvbufsize > 0) {
- static Timer timer ("commstate_sizes_irecv");
- timer.start ();
- int const tag =
- vary_tags
- ? (dist::rank() + dist::size() * (proc + dist::size() * type)) % 32768
- : type;
- if (commstate_verbose) {
- CCTK_VInfo (CCTK_THORNSTRING,
- "About to MPI_Irecv from %d", (int)proc);
+ for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
+ int const proc =
+ interleave_communications ?
+ (proc1 + dist::rank()) % dist::size() :
+ proc1;
+
+ int const datatypesize = typebufs.AT(type).datatypesize;
+ procbufdesc & procbuf = typebufs.AT(type).procbufs.AT(proc);
+
+ assert (procbuf.sendbufbase.empty());
+ assert (procbuf.recvbufbase.empty());
+ procbuf.sendbufbase.resize
+ (procbuf.sendbufsize * datatypesize * message_size_multiplier);
+ procbuf.recvbufbase.resize
+ (procbuf.recvbufsize * datatypesize * message_size_multiplier);
+ // TODO: this may be a bit extreme, and it is only for
+ // internal consistency checking
+ if (poison_new_memory) {
+ memset (&procbuf.sendbufbase.front(), poison_value,
+ procbuf.sendbufsize * datatypesize * message_size_multiplier);
+ memset (&procbuf.recvbufbase.front(), poison_value,
+ procbuf.recvbufsize * datatypesize * message_size_multiplier);
}
- MPI_Irecv (&procbuf.recvbufbase.front(), procbuf.recvbufsize,
- typebufs.AT(type).mpi_datatype, proc, tag,
- dist::comm(), &rrequests.AT(dist::size()*type + proc));
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Irecv");
+ procbuf.sendbuf = &procbuf.sendbufbase.front();
+ procbuf.recvbuf = &procbuf.recvbufbase.front();
+
+ if (procbuf.recvbufsize > 0) {
+ static Timer timer ("commstate::sizes_irecv");
+ timer.start ();
+ int const tag = type;
+ if (commstate_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "About to MPI_Irecv from processor %d for type %s",
+ proc, dist::c_datatype_name(type));
+ }
+ MPI_Irecv (&procbuf.recvbufbase.front(),
+ procbuf.recvbufsize * message_size_multiplier,
+ typebufs.AT(type).mpi_datatype, proc, tag,
+ dist::comm(), &push_back(rrequests));
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Irecv");
+ }
+ assert (not procbuf.did_post_recv);
+ procbuf.did_post_recv = true;
+ timer.stop (procbuf.recvbufsize * datatypesize);
}
- timer.stop (procbuf.recvbufsize * datatypesize);
- num_posted_recvs++;
- }
+
+ } // for proc
+
}
- }
+ } // for type
- if (barrier_between_stages) {
- // Add a barrier, to try to ensure that all Irecvs are posted
- // before the first Isends are made
- // (Alternative: Use MPI_Alltoallv instead)
- MPI_Barrier (dist::comm());
+ if (check_communication_schedule) {
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
+ for (int proc = 0; proc < dist::size(); ++ proc) {
+ procbufdesc const & procbuf = typebufs.AT(type).procbufs.AT(proc);
+ assert (procbuf.did_post_recv == (procbuf.recvbufsize > 0));
+ }
+ }
+ }
}
- // Now go and get the send buffers filled with data.
- // Once a buffer is full it will be posted right away
- // (see gdata::copy_into_sendbuffer() and
- // gdata::interpolate_into_sendbuffer()).
thestate = state_fill_send_buffers;
break;
+ }
+
- case state_fill_send_buffers:
+
+ case state_fill_send_buffers: {
if (combine_sends) {
- // Send the data. Do not send them sequentially, but try to
- // intersperse the communications
- for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
- int const proc =
- interleave_communications
- ? (proc1 + dist::size() - dist::rank()) % dist::size()
- : proc1;
-
- for (size_t type = 0; type < typebufs.size(); type++) {
- // skip unused datatype buffers
- if (not typebufs.AT(type).in_use) continue;
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
- int const datatypesize = typebufs.AT(type).datatypesize;
- procbufdesc const & procbuf = typebufs.AT(type).procbufs.AT(proc);
-
- size_t const fillstate =
- procbuf.sendbuf - &procbuf.sendbufbase.front();
- assert (fillstate == procbuf.sendbufsize * datatypesize);
-
- if (procbuf.sendbufsize > 0) {
- int const tag =
- vary_tags
- ? (proc + dist::size() * (dist::rank() + dist::size() * type)) % 32768
- : type;
- if (use_mpi_send) {
- // use MPI_Send
- static Timer timer ("commstate_send");
- timer.start ();
- if (commstate_verbose) {
- CCTK_VInfo (CCTK_THORNSTRING,
- "About to MPI_Send to %d", (int)proc);
+ for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
+ int const proc =
+ interleave_communications
+ ? (proc1 + dist::size() - dist::rank()) % dist::size()
+ : proc1;
+
+ procbufdesc & procbuf = typebufs.AT(type).procbufs.AT(proc);
+ if (procbuf.sendbufsize > 0) {
+
+ int const datatypesize = typebufs.AT(type).datatypesize;
+
+ size_t const fillstate =
+ procbuf.sendbuf - &procbuf.sendbufbase.front();
+ assert (fillstate == procbuf.sendbufsize * datatypesize);
+
+ // Enlarge messages for performance testing
+ if (message_size_multiplier > 1) {
+ size_t const nbytes =
+ procbuf.sendbufsize * datatypesize *
+ (message_size_multiplier - 1);
+#warning "TODO"
+ // memset (procbuf.sendbuf, poison_value, nbytes);
+ memset (procbuf.sendbuf, 0, nbytes);
}
- MPI_Send (const_cast<char*>(&procbuf.sendbufbase.front()),
- procbuf.sendbufsize,
- typebufs.AT(type).mpi_datatype, proc, tag,
- dist::comm());
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Send");
+
+ int const tag = type;
+ if (use_mpi_send) {
+ // use MPI_Send
+ static Timer timer ("commstate::send");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "About to MPI_Send to processor %d for type %s",
+ proc, dist::c_datatype_name(type));
+ }
+ MPI_Send (const_cast<char*>(&procbuf.sendbufbase.front()),
+ procbuf.sendbufsize * message_size_multiplier,
+ typebufs.AT(type).mpi_datatype, proc, tag,
+ dist::comm());
+ assert (not procbuf.did_post_send);
+ procbuf.did_post_send = true;
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Send");
+ }
+ timer.stop (procbuf.sendbufsize * datatypesize);
+ } else if (use_mpi_ssend) {
+ // use MPI_Ssend
+ static Timer timer ("commstate::ssend");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "About to MPI_Ssend to processor %d for type %s",
+ proc, dist::c_datatype_name(type));
+ }
+ MPI_Ssend (const_cast<char*>(&procbuf.sendbufbase.front()),
+ procbuf.sendbufsize * message_size_multiplier,
+ typebufs.AT(type).mpi_datatype, proc, tag,
+ dist::comm());
+ assert (not procbuf.did_post_send);
+ procbuf.did_post_send = true;
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Ssend");
+ }
+ timer.stop (procbuf.sendbufsize * datatypesize);
+ } else {
+ // use MPI_Isend
+ static Timer timer ("commstate::isend");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "About to MPI_Isend to processor %d for type %s",
+ proc, dist::c_datatype_name(type));
+ }
+ MPI_Isend (const_cast<char*>(&procbuf.sendbufbase.front()),
+ procbuf.sendbufsize * message_size_multiplier,
+ typebufs.AT(type).mpi_datatype, proc, tag,
+ dist::comm(), &push_back(srequests));
+ assert (not procbuf.did_post_send);
+ procbuf.did_post_send = true;
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Isend");
+ }
+ timer.stop (procbuf.sendbufsize * datatypesize);
}
- srequests.AT(dist::size()*type + proc) = MPI_REQUEST_NULL;
- timer.stop (procbuf.sendbufsize * datatypesize);
- } else if (use_mpi_ssend) {
- // use MPI_Ssend
- static Timer timer ("commstate_ssend");
+
+ }
+ } // for proc
+
+ }
+ } // for type
+ } // if combine_sends
+
+ if (check_communication_schedule) {
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
+ for (int proc = 0; proc < dist::size(); ++ proc) {
+ procbufdesc const & procbuf = typebufs.AT(type).procbufs.AT(proc);
+ assert (procbuf.did_post_send == (procbuf.sendbufsize > 0));
+ }
+ }
+ }
+ }
+
+ thestate = state_do_some_work;
+ break;
+ }
+
+
+
+ case state_do_some_work: {
+ static Timer timer ("commstate::do_some_work::waitall");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_INFO ("About to MPI_Waitall");
+ }
+ MPI_Waitall (rrequests.size(), &rrequests.front(), MPI_STATUSES_IGNORE);
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Waitall");
+ }
+ timer.stop (0);
+
+ thestate = state_empty_recv_buffers;
+ break;
+ }
+
+
+
+ case state_empty_recv_buffers: {
+ static Timer timer ("commstate::empty_recv_buffers::waitall");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_INFO ("About to MPI_Waitall");
+ }
+ MPI_Waitall (srequests.size(), &srequests.front(), MPI_STATUSES_IGNORE);
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Waitall");
+ }
+ timer.stop (0);
+
+ // Transfer messages again for performance testing
+ for (int n = 1; n < message_count_multiplier; ++ n) {
+
+ srequests.clear();
+ srequests.reserve (dist::c_ndatatypes() * dist::size());
+ rrequests.clear();
+ rrequests.reserve (dist::c_ndatatypes() * dist::size());
+
+ // Irecv
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
+
+ for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
+ int const proc =
+ interleave_communications ?
+ (proc1 + dist::rank()) % dist::size() :
+ proc1;
+
+ procbufdesc & procbuf = typebufs.AT(type).procbufs.AT(proc);
+
+ if (procbuf.recvbufsize > 0) {
+ static Timer timer ("commstate::message_count_multiplier::irecv");
timer.start ();
+ int const tag = type;
if (commstate_verbose) {
CCTK_VInfo (CCTK_THORNSTRING,
- "About to MPI_Ssend to %d", (int)proc);
+ "About to MPI_Irecv from processor %d for type %s",
+ proc, dist::c_datatype_name(type));
}
- MPI_Ssend (const_cast<char*>(&procbuf.sendbufbase.front()),
- procbuf.sendbufsize,
+ MPI_Irecv (&procbuf.recvbufbase.front(),
+ procbuf.recvbufsize * message_size_multiplier,
typebufs.AT(type).mpi_datatype, proc, tag,
- dist::comm());
+ dist::comm(), &push_back(rrequests));
if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Ssend");
+ CCTK_INFO ("Finished MPI_Irecv");
}
- srequests.AT(dist::size()*type + proc) = MPI_REQUEST_NULL;
- timer.stop (procbuf.sendbufsize * datatypesize);
- } else {
- // use MPI_Isend
- static Timer timer ("commstate_isend");
+ timer.stop (procbuf.recvbufsize * typebufs.AT(type).datatypesize);
+ }
+
+ } // for proc
+
+ }
+ } // for type
+
+ // Isend
+ for (unsigned type = 0; type < dist::c_ndatatypes(); ++ type) {
+ if (typebufs.AT(type).in_use) {
+
+ for (int proc1 = 0; proc1 < dist::size(); ++ proc1) {
+ int const proc =
+ interleave_communications
+ ? (proc1 + dist::size() - dist::rank()) % dist::size()
+ : proc1;
+
+ procbufdesc & procbuf = typebufs.AT(type).procbufs.AT(proc);
+
+ if (procbuf.sendbufsize > 0) {
+ int const tag = type;
+ assert (not use_mpi_send);
+ assert (not use_mpi_ssend);
+ static Timer timer ("commstate::message_count_multiplier::isend");
timer.start ();
if (commstate_verbose) {
- CCTK_VWarn (3, __LINE__, __FILE__, CCTK_THORNSTRING,
- "About to MPI_Isend to %d", (int)proc);
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "About to MPI_Isend to processor %d for type %s",
+ proc, dist::c_datatype_name(type));
}
MPI_Isend (const_cast<char*>(&procbuf.sendbufbase.front()),
- procbuf.sendbufsize,
+ procbuf.sendbufsize * message_size_multiplier,
typebufs.AT(type).mpi_datatype, proc, tag,
- dist::comm(), &srequests.AT(dist::size()*type + proc));
+ dist::comm(), &push_back(srequests));
if (commstate_verbose) {
CCTK_INFO ("Finished MPI_Isend");
}
- timer.stop (procbuf.sendbufsize * datatypesize);
+ timer.stop (procbuf.sendbufsize * typebufs.AT(type).datatypesize);
}
- }
+
+ } // for proc
- } // for type
-
- } // for proc
- }
+ }
+ } // for type
+
+ // Waitall
+ {
+ static Timer timer ("commstate::message_count_multiplier::waitall(irecv)");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_INFO ("About to MPI_Waitall");
+ }
+ MPI_Waitall (rrequests.size(), &rrequests.front(), MPI_STATUSES_IGNORE);
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Waitall");
+ }
+ timer.stop (0);
+ }
+
+ // Waitall
+ {
+ static Timer timer ("commstate::message_count_multiplier::waitall(isend)");
+ timer.start ();
+ if (commstate_verbose) {
+ CCTK_INFO ("About to MPI_Waitall");
+ }
+ MPI_Waitall (srequests.size(), &srequests.front(), MPI_STATUSES_IGNORE);
+ if (commstate_verbose) {
+ CCTK_INFO ("Finished MPI_Waitall");
+ }
+ timer.stop (0);
+ }
+
+ } // for n
- // Now fall through to the next state in which the recv buffers
- // are emptied as soon as data has arrived.
- thestate = state_do_some_work;
+ thestate = state_done;
break;
+ }
+
+
+
+ case state_done: {
+ assert (0); abort();
+ }
- case state_do_some_work:
- // Now fall through to the next state in which the recv buffers
- // are emptied as soon as data has arrived.
- thestate = state_empty_recv_buffers;
- case state_empty_recv_buffers:
- // Finish (at least one of) the posted communications
- if (not AllPostedCommunicationsFinished ()) {
- // No state change if there are still outstanding
- // communications; do another comm_state loop iteration.
- } else {
- // Everything is done so release the collective communication buffers.
- for (size_t type = 0; type < typebufs.size(); type++) {
- for (size_t proc = 0; proc < typebufs.AT(type).procbufs.size(); proc++) {
- typebufs.AT(type).procbufs.AT(proc).sendbufbase.clear();
- typebufs.AT(type).procbufs.AT(proc).recvbufbase.clear();
- }
- }
- thestate = state_done;
- }
- break;
default:
- assert (0 && "invalid state");
+ assert (0); abort();
}
+
+
+
total.stop (0);
}
-bool comm_state::done ()
+bool comm_state::done () const
{
return thestate == state_done;
}
@@ -264,116 +486,16 @@ bool comm_state::done ()
comm_state::~comm_state ()
{
DECLARE_CCTK_PARAMETERS;
-
+
assert (thestate == state_done or
thestate == state_get_buffer_sizes);
}
-// wait for completion of posted collective buffer sends/receives
-//
-// This function will wait for all of the posted receive operations to
-// finish.
-//
-// It returns true if all posted communications have been completed.
-bool comm_state::AllPostedCommunicationsFinished ()
-{
- DECLARE_CCTK_PARAMETERS;
-
- // check if all outstanding receives have been completed already
- if (num_posted_recvs == num_completed_recvs) {
- // finalize the outstanding sends in one go
- if (reduce_mpi_waitall) {
- size_t nreqs = 0;
- for (size_t i=0; i<srequests.size(); ++i) {
- if (srequests.AT(i) != MPI_REQUEST_NULL) {
- ++nreqs;
- }
- }
- vector<MPI_Request> reqs(nreqs);
- nreqs = 0;
- for (size_t i=0; i<srequests.size(); ++i) {
- if (srequests.AT(i) != MPI_REQUEST_NULL) {
- reqs.AT(nreqs) = srequests.AT(i);
- ++nreqs;
- }
- }
- assert (nreqs == reqs.size());
- static Timer timer ("commstate_waitall_final");
- timer.start ();
- if (commstate_verbose) {
- CCTK_INFO ("About to MPI_Waitall");
- }
- MPI_Waitall (reqs.size(), &reqs.front(), MPI_STATUSES_IGNORE);
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Waitall");
- }
- timer.stop (0);
- } else {
- static Timer timer ("commstate_waitall_final");
- timer.start ();
- if (commstate_verbose) {
- CCTK_INFO ("About to MPI_Waitall");
- }
- MPI_Waitall (srequests.size(), &srequests.front(), MPI_STATUSES_IGNORE);
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Waitall");
- }
- timer.stop (0);
- }
-
- return true;
- }
-
- // wait for completion of all posted receive operations
- if (reduce_mpi_waitall) {
- size_t nreqs = 0;
- for (size_t i=0; i<rrequests.size(); ++i) {
- if (rrequests.AT(i) != MPI_REQUEST_NULL) {
- ++nreqs;
- }
- }
- vector<MPI_Request> reqs(nreqs);
- nreqs = 0;
- for (size_t i=0; i<rrequests.size(); ++i) {
- if (rrequests.AT(i) != MPI_REQUEST_NULL) {
- reqs.AT(nreqs) = rrequests.AT(i);
- ++nreqs;
- }
- }
- assert (nreqs == reqs.size());
- static Timer timer ("commstate_waitall");
- timer.start ();
- if (commstate_verbose) {
- CCTK_INFO ("About to MPI_Waitall");
- }
- MPI_Waitall (reqs.size(), &reqs.front(), MPI_STATUSES_IGNORE);
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Waitall");
- }
- timer.stop (0);
- } else {
- static Timer timer ("commstate_waitall");
- timer.start ();
- if (commstate_verbose) {
- CCTK_INFO ("About to MPI_Waitall");
- }
- MPI_Waitall (rrequests.size(), &rrequests.front(), MPI_STATUSES_IGNORE);
- if (commstate_verbose) {
- CCTK_INFO ("Finished MPI_Waitall");
- }
- timer.stop (0);
- }
- num_completed_recvs = num_posted_recvs;
-
- return false;
-}
-
-
void
comm_state::
-reserve_send_space (unsigned int const type,
+reserve_send_space (unsigned const type,
int const proc,
int const npoints)
{
@@ -381,14 +503,19 @@ reserve_send_space (unsigned int const type,
assert (proc >= 0 and proc < dist::size());
assert (npoints >= 0);
typebufdesc & typebuf = typebufs.AT(type);
+ if (not typebuf.in_use) {
+ typebuf.procbufs.resize (dist::size());
+ typebuf.in_use = true;
+ }
procbufdesc & procbuf = typebuf.procbufs.AT(proc);
procbuf.sendbufsize += npoints;
- typebuf.in_use = true;
}
+
+
void
comm_state::
-reserve_recv_space (unsigned int const type,
+reserve_recv_space (unsigned const type,
int const proc,
int const npoints)
{
@@ -396,19 +523,25 @@ reserve_recv_space (unsigned int const type,
assert (proc >= 0 and proc < dist::size());
assert (npoints >= 0);
typebufdesc & typebuf = typebufs.AT(type);
+ if (not typebuf.in_use) {
+ typebuf.procbufs.resize (dist::size());
+ typebuf.in_use = true;
+ }
procbufdesc & procbuf = typebuf.procbufs.AT(proc);
procbuf.recvbufsize += npoints;
- typebuf.in_use = true;
}
+
+
void *
comm_state::
-send_buffer (unsigned int const type,
+send_buffer (unsigned const type,
int const proc,
int const npoints)
{
assert (type < dist::c_ndatatypes());
assert (proc >= 0 and proc < dist::size());
+ assert (npoints > 0);
typebufdesc const & typebuf = typebufs.AT(type);
procbufdesc const & procbuf = typebuf.procbufs.AT(proc);
@@ -419,14 +552,17 @@ send_buffer (unsigned int const type,
return procbuf.sendbuf;
}
+
+
void *
comm_state::
-recv_buffer (unsigned int const type,
+recv_buffer (unsigned const type,
int const proc,
int const npoints)
{
assert (type < dist::c_ndatatypes());
assert (proc >= 0 and proc < dist::size());
+ assert (npoints > 0);
typebufdesc const & typebuf = typebufs.AT(type);
procbufdesc const & procbuf = typebuf.procbufs.AT(proc);
@@ -437,9 +573,11 @@ recv_buffer (unsigned int const type,
return procbuf.recvbuf;
}
+
+
void
comm_state::
-commit_send_space (unsigned int const type,
+commit_send_space (unsigned const type,
int const proc,
int const npoints)
{
@@ -448,6 +586,7 @@ commit_send_space (unsigned int const type,
assert (type < dist::c_ndatatypes());
assert (proc >= 0 and proc < dist::size());
assert (npoints >= 0);
+ assert (npoints > 0);
typebufdesc & typebuf = typebufs.AT(type);
procbufdesc & procbuf = typebuf.procbufs.AT(proc);
procbuf.sendbuf += npoints * typebuf.datatypesize;
@@ -461,16 +600,30 @@ commit_send_space (unsigned int const type,
&procbuf.sendbufbase.front() +
procbuf.sendbufsize * typebuf.datatypesize)
{
+ if (message_size_multiplier > 1) {
+ size_t const nbytes =
+ procbuf.sendbufsize * typebuf.datatypesize *
+ (message_size_multiplier - 1);
+ memset (procbuf.sendbuf, poison_value, nbytes);
+ }
+
static Timer timer ("commit_send_space::isend");
timer.start ();
if (commstate_verbose) {
CCTK_VInfo (CCTK_THORNSTRING,
- "About to MPI_Isend to %d", (int)proc);
+ "About to MPI_Isend to processor %d for type %s",
+ proc, dist::c_datatype_name(type));
}
+ int const tag = type;
+ assert (procbuf.sendbufsize > 0);
+ assert (not use_mpi_send);
+ assert (not use_mpi_ssend);
MPI_Isend (&procbuf.sendbufbase.front(),
- procbuf.sendbufsize, typebuf.mpi_datatype,
- proc, type, dist::comm(),
- & srequests.AT(type * dist::size() + proc));
+ procbuf.sendbufsize * message_size_multiplier,
+ typebuf.mpi_datatype, proc, tag,
+ dist::comm(), &push_back(srequests));
+ assert (not procbuf.did_post_send);
+ procbuf.did_post_send = true;
if (commstate_verbose) {
CCTK_INFO ("Finished MPI_Isend");
}
@@ -479,15 +632,18 @@ commit_send_space (unsigned int const type,
}
}
+
+
void
comm_state::
-commit_recv_space (unsigned int const type,
+commit_recv_space (unsigned const type,
int const proc,
int const npoints)
{
assert (type < dist::c_ndatatypes());
assert (proc >= 0 and proc < dist::size());
assert (npoints >= 0);
+ assert (npoints > 0);
typebufdesc & typebuf = typebufs.AT(type);
procbufdesc & procbuf = typebuf.procbufs.AT(proc);
procbuf.recvbuf += npoints * typebuf.datatypesize;
diff --git a/Carpet/CarpetLib/src/commstate.hh b/Carpet/CarpetLib/src/commstate.hh
index c01f732da..e59ce7cb4 100644
--- a/Carpet/CarpetLib/src/commstate.hh
+++ b/Carpet/CarpetLib/src/commstate.hh
@@ -2,7 +2,7 @@
#define COMMSTATE_HH
#include <cstdlib>
-#include <queue>
+#include <iostream>
#include <vector>
#include <mpi.h>
@@ -29,115 +29,132 @@ enum astate {
state_done
};
+char const * tostring (astate const & thestate);
+
+inline ostream& operator<< (ostream& os, astate const & thestate)
+{
+ return os << tostring(thestate);
+}
+
+
+
struct comm_state {
astate thestate;
-
+
comm_state ();
void step ();
- bool done ();
+ bool done () const;
~comm_state ();
-
+
private:
// Forbid copying and passing by value
comm_state (comm_state const &);
comm_state& operator= (comm_state const &);
-
-public:
-
- //////////////////////////////////////////////////////////////////////////
- // the following members are used for collective communications
- //////////////////////////////////////////////////////////////////////////
-
-public:
- // structure describing a per-processor buffer for collective communications
+
+
+
+ // structure describing a per-processor buffer
struct procbufdesc {
- // the allocated communication buffers
+ // allocated communication buffers
vector<char> sendbufbase;
vector<char> recvbufbase;
-
- // the sizes of communication buffers (in elements of type <datatype>)
+
+ // sizes of the communication buffers (in elements of type <datatype>)
size_t sendbufsize;
size_t recvbufsize;
-
+
// pointers to step through the communication buffers
// (these get advanced by the routines which fill/empty the buffers)
char* sendbuf;
char* recvbuf;
-
+
+ bool did_post_send;
+ bool did_post_recv;
+
// constructor for an instance of this structure
- procbufdesc() : sendbufsize(0), recvbufsize(0),
- sendbuf(NULL), recvbuf(NULL)
+ procbufdesc() :
+ sendbufsize(0), recvbufsize(0),
+ sendbuf(NULL), recvbuf(NULL),
+ did_post_send(false), did_post_recv(false)
{
}
};
-
+
+
+
// structure describing a collective communications buffer for a C datatype
struct typebufdesc {
// flag indicating whether this buffer is in use
bool in_use;
-
+
+ // the MPI datatype
+ MPI_Datatype mpi_datatype;
+
// the size of this datatype (in bytes)
int datatypesize;
-
- // the corresponding MPI datatype
- MPI_Datatype mpi_datatype;
-
+
// per-processor buffers
- vector<procbufdesc> procbufs; // [dist::size()]
-
+ vector<procbufdesc> procbufs; // [dist::size()]
+
// constructor for an instance of this structure
- typebufdesc() : in_use(false), datatypesize(0),
- mpi_datatype(MPI_DATATYPE_NULL)
+ typebufdesc() :
+ in_use(false),
+ mpi_datatype(MPI_DATATYPE_NULL), datatypesize(0)
{
}
};
-
- // list of datatype buffers
- vector<typebufdesc> typebufs; // [dist::c_ndatatypes()]
-
+
+
+
+ // datatype buffers
+ vector<typebufdesc> typebufs; // [type]
+
+
+
+ // outstanding requests for posted send/recv communications
+ vector<MPI_Request> srequests;
+ vector<MPI_Request> rrequests;
+
+ static inline
+ MPI_Request & push_back (vector<MPI_Request> & reqs)
+ {
+ reqs.push_back (MPI_REQUEST_NULL);
+ return reqs.back();
+ }
+
+
+
+public:
+
void
- reserve_send_space (unsigned int type,
+ reserve_send_space (unsigned type,
int proc,
int npoints);
-
+
void
- reserve_recv_space (unsigned int type,
+ reserve_recv_space (unsigned type,
int proc,
int npoints);
-
+
void *
- send_buffer (unsigned int type,
+ send_buffer (unsigned type,
int proc,
int npoints);
-
+
void *
- recv_buffer (unsigned int type,
+ recv_buffer (unsigned type,
int proc,
int npoints);
-
+
void
- commit_send_space (unsigned int type,
+ commit_send_space (unsigned type,
int proc,
int npoints);
-
+
void
- commit_recv_space (unsigned int type,
+ commit_recv_space (unsigned type,
int proc,
int npoints);
-
-private:
- // lists of outstanding requests for posted send/recv communications
- vector<MPI_Request> srequests; // [dist::size() * dist::c_ndatatypes()]
- vector<MPI_Request> rrequests; // [dist::size() * dist::c_ndatatypes()]
-
- // number of posted and already completed receive communications
- int num_posted_recvs;
- int num_completed_recvs;
-
- // wait for completion of posted collective buffer sends/receives
- bool AllPostedCommunicationsFinished();
};
-
-
#endif // COMMSTATE_HH
diff --git a/Carpet/CarpetLib/src/copy_3d.cc b/Carpet/CarpetLib/src/copy_3d.cc
index 36a48df40..06adb0276 100644
--- a/Carpet/CarpetLib/src/copy_3d.cc
+++ b/Carpet/CarpetLib/src/copy_3d.cc
@@ -7,7 +7,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/copy_4d.cc b/Carpet/CarpetLib/src/copy_4d.cc
new file mode 100644
index 000000000..c5ba95371
--- /dev/null
+++ b/Carpet/CarpetLib/src/copy_4d.cc
@@ -0,0 +1,142 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+#include <iostream>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_4d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND4(i,j,k,l) \
+ index4 (srcioff + (i), srcjoff + (j), srckoff + (k), srcloff + (l), \
+ srciext, srcjext, srckext, srclext)
+#define DSTIND4(i,j,k,l) \
+ index4 (dstioff + (i), dstjoff + (j), dstkoff + (k), dstloff + (l), \
+ dstiext, dstjext, dstkext, dstlext)
+
+
+
+ template <typename T>
+ void
+ copy_4d (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox)
+ {
+ if (any (srcbbox.stride() != regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ cout << "copy_4d.cc:" << endl
+ << "srcbbox=" << srcbbox << endl
+ << "dstbbox=" << dstbbox << endl
+ << "regbbox=" << regbbox << endl;
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+ if (not regbbox.is_contained_in(srcbbox) or
+ not regbbox.is_contained_in(dstbbox))
+ {
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ ivect4 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower()) % srcbbox.stride() == 0));
+ ivect4 const srcoff = (regbbox.lower() - srcbbox.lower()) / srcbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % dstbbox.stride() == 0));
+ ivect4 const dstoff = (regbbox.lower() - dstbbox.lower()) / dstbbox.stride();
+
+
+
+ ptrdiff_t const srciext = srcext[0];
+ ptrdiff_t const srcjext = srcext[1];
+ ptrdiff_t const srckext = srcext[2];
+ ptrdiff_t const srclext = srcext[3];
+
+ ptrdiff_t const dstiext = dstext[0];
+ ptrdiff_t const dstjext = dstext[1];
+ ptrdiff_t const dstkext = dstext[2];
+ ptrdiff_t const dstlext = dstext[3];
+
+ ptrdiff_t const regiext = regext[0];
+ ptrdiff_t const regjext = regext[1];
+ ptrdiff_t const regkext = regext[2];
+ ptrdiff_t const reglext = regext[3];
+
+ ptrdiff_t const srcioff = srcoff[0];
+ ptrdiff_t const srcjoff = srcoff[1];
+ ptrdiff_t const srckoff = srcoff[2];
+ ptrdiff_t const srcloff = srcoff[3];
+
+ ptrdiff_t const dstioff = dstoff[0];
+ ptrdiff_t const dstjoff = dstoff[1];
+ ptrdiff_t const dstkoff = dstoff[2];
+ ptrdiff_t const dstloff = dstoff[3];
+
+
+
+ // Loop over region
+#pragma omp parallel for
+ for (int l=0; l<reglext; ++l) {
+ for (int k=0; k<regkext; ++k) {
+ for (int j=0; j<regjext; ++j) {
+ for (int i=0; i<regiext; ++i) {
+
+ dst [DSTIND4(i, j, k, l)] = src [SRCIND4(i, j, k, l)];
+
+ }
+ }
+ }
+ }
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ copy_4d (T const * restrict const src, \
+ ivect4 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect4 const & restrict dstext, \
+ ibbox4 const & restrict srcbbox, \
+ ibbox4 const & restrict dstbbox, \
+ ibbox4 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/data.cc b/Carpet/CarpetLib/src/data.cc
index d19df3788..da32ee4ea 100644
--- a/Carpet/CarpetLib/src/data.cc
+++ b/Carpet/CarpetLib/src/data.cc
@@ -25,7 +25,8 @@
#include "vect.hh"
#include "data.hh"
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
+#include "operator_prototypes_4d.hh"
using namespace std;
@@ -100,6 +101,73 @@ call_operator (void
#endif
}
+template <typename T>
+static
+void
+call_operator (void
+ (* the_operator) (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox),
+ T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox)
+{
+#ifndef _OPENMP
+ (* the_operator) (src, srcext, dst, dstext, srcbbox, dstbbox, regbbox);
+#else
+# if ! defined (NDEBUG) && ! defined (CARPET_OPTIMISE)
+ ibset allregbboxes;
+# endif
+#pragma omp parallel
+ {
+ int const num_threads = omp_get_num_threads();
+ int const thread_num = omp_get_thread_num();
+ // Parallelise in z direction
+ // TODO: parallelise along longest extent
+ int const dir = 2;
+ int const stride = regbbox.stride()[dir];
+ int const first_point = regbbox.lower()[dir];
+ int const last_point = regbbox.upper()[dir] + stride;
+ int const num_points = last_point - first_point;
+ assert (num_points >= 0);
+ assert (num_points % stride == 0);
+ int const my_num_points =
+ (num_points / stride + num_threads - 1) / num_threads * stride;
+ int const my_first_point =
+ min (last_point, first_point + thread_num * my_num_points);
+ int const my_last_point =
+ max (my_first_point, min (last_point, my_first_point + my_num_points));
+ ibbox4 const myregbbox
+ (regbbox.lower().replace (dir, my_first_point),
+ regbbox.upper().replace (dir, my_last_point - stride),
+ regbbox.stride());
+ if (not myregbbox.empty()) {
+ (* the_operator) (src, srcext, dst, dstext, srcbbox, dstbbox, myregbbox);
+# if ! defined (NDEBUG) && ! defined (CARPET_OPTIMISE)
+#pragma omp critical
+ allregbboxes += myregbbox;
+# endif
+ }
+ }
+# if ! defined (NDEBUG) && ! defined (CARPET_OPTIMISE)
+ if (not (allregbboxes == ibset (regbbox))) {
+ allregbboxes.normalize();
+ cout << "allregbboxes=" << allregbboxes << endl
+ << "regbbox=" << regbbox << endl;
+ }
+ assert (allregbboxes == ibset (regbbox));
+# endif
+#endif
+}
+
// Fortran wrappers
@@ -200,16 +268,13 @@ prolongate_3d_weno (CCTK_REAL8 const * restrict const src,
-static const CCTK_REAL eps = 1.0e-10;
-
// Constructors
template<typename T>
data<T>::data (const int varindex_,
const centering cent_, const operator_type transport_operator_,
const int vectorlength_, const int vectorindex_,
- data* const vectorleader_,
- const int tag_)
- : gdata(varindex_, cent_, transport_operator_, tag_),
+ data* const vectorleader_)
+ : gdata(varindex_, cent_, transport_operator_),
_memory(NULL),
vectorlength(vectorlength_), vectorindex(vectorindex_),
vectorleader(vectorleader_)
@@ -249,11 +314,10 @@ data<T>::~data ()
template<typename T>
data<T>* data<T>::make_typed (const int varindex_,
const centering cent_,
- const operator_type transport_operator_,
- const int tag_)
+ const operator_type transport_operator_)
const
{
- return new data(varindex_, cent_, transport_operator_, 1, 0, NULL, tag_);
+ return new data(varindex_, cent_, transport_operator_, 1, 0, NULL);
}
@@ -335,6 +399,7 @@ copy_from_innerloop (gdata const * const gsrc,
assert (proc() == src->proc());
assert (dist::rank() == proc());
+#if CARPET_DIM == 3
copy_3d (static_cast <T const *> (src->storage()),
src->shape(),
static_cast <T *> (this->storage()),
@@ -342,6 +407,17 @@ copy_from_innerloop (gdata const * const gsrc,
src->extent(),
this->extent(),
box);
+#elif CARPET_DIM == 4
+ copy_4d (static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+#else
+# error "Value for CARPET_DIM not supported"
+#endif
}
@@ -382,7 +458,8 @@ transfer_time (vector <gdata const *> const & gsrcs,
{
// Use this timelevel, or interpolate in time if set to -1
int timelevel0, ntimelevels;
- find_source_timelevel (times, time, order_time, timelevel0, ntimelevels);
+ find_source_timelevel
+ (times, time, order_time, transport_operator, timelevel0, ntimelevels);
if (ntimelevels > 1) {
// Time interpolation is necessary
@@ -437,7 +514,8 @@ transfer_p_r (data const * const src,
copy_from_innerloop (src, box);
} else if (all (src->extent().stride() > this->extent().stride())) {
// Prolongate
- assert (transport_operator != op_sync);
+ assert (transport_operator != op_sync and
+ transport_operator != op_restrict);
transfer_p_vc_cc (src, box, order_space);
} else if (all (src->extent().stride() < this->extent().stride())) {
// Restrict
@@ -457,6 +535,9 @@ transfer_p_vc_cc (data const * const src,
ibbox const & box,
int const order_space)
{
+ transfer_prolongate (src, box, order_space);
+
+#if 0
if (cent == vertex_centered) {
// Vertex centred
@@ -501,6 +582,8 @@ transfer_p_vc_cc (data const * const src,
newdstbox .contracted_for (tmpsrcbox) .expand (offsetlo, offsethi);
// Allocate temporary storage
+ // TODO: This may not be necessary if the source is already a
+ // temporary
data * const newsrc =
new data (src->varindex, vertex_centered, src->transport_operator);
newsrc->allocate (newsrcbox, src->proc());
@@ -538,6 +621,7 @@ transfer_p_vc_cc (data const * const src,
} else {
assert (0);
}
+#endif
}
template <>
@@ -562,25 +646,139 @@ transfer_prolongate (data const * const src,
static Timer total ("prolongate");
total.start ();
+#if CARPET_DIM == 3
+
switch (transport_operator) {
case op_copy:
case op_Lagrange: {
static Timer timer ("prolongate_Lagrange");
timer.start ();
+ // enum centering { vertex_centered, cell_centered };
+ switch (cent) {
+ case vertex_centered:
+ switch (order_space) {
+ case 1:
+ call_operator<T> (& prolongate_3d_o1_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 3:
+ call_operator<T> (& prolongate_3d_o3_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 5:
+ call_operator<T> (& prolongate_3d_o5_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 7:
+ call_operator<T> (& prolongate_3d_o7_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 9:
+ call_operator<T> (& prolongate_3d_o9_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 11:
+ call_operator<T> (& prolongate_3d_o11_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ default:
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "There is no vertex-centred stencil for op=\"LAGRANGE\" with order_space not in {1, 3, 5, 7, 9, 11}");
+ break;
+ }
+ break;
+ case cell_centered:
+ switch (order_space) {
+ case 0:
+ call_operator<T> (& prolongate_3d_cc_o0_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 1:
+ call_operator<T> (& prolongate_3d_cc_o1_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ case 2:
+ call_operator<T> (& prolongate_3d_cc_o2_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ default:
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "There is no cell-centred stencil for op=\"LAGRANGE\" with order_space not in {0, 1, 2}");
+ break;
+ }
+ break;
+ default:
+ assert (0);
+ }
+ timer.stop (0);
+ break;
+ }
+
+ case op_ENO: {
+ static Timer timer ("prolongate_ENO");
+ timer.start ();
switch (order_space) {
case 1:
- call_operator<T> (& prolongate_3d_o1_rf2,
- static_cast <T const *> (src->storage()),
- src->shape(),
- static_cast <T *> (this->storage()),
- this->shape(),
- src->extent(),
- this->extent(),
- box);
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "There is no stencil for op=\"ENO\" with order_space=1");
break;
case 3:
- call_operator<T> (& prolongate_3d_o3_rf2,
+ call_operator<T> (& prolongate_3d_eno,
static_cast <T const *> (src->storage()),
src->shape(),
static_cast <T *> (this->storage()),
@@ -590,37 +788,10 @@ transfer_prolongate (data const * const src,
box);
break;
case 5:
- call_operator<T> (& prolongate_3d_o5_rf2,
- static_cast <T const *> (src->storage()),
- src->shape(),
- static_cast <T *> (this->storage()),
- this->shape(),
- src->extent(),
- this->extent(),
- box);
- break;
- case 7:
- call_operator<T> (& prolongate_3d_o7_rf2,
- static_cast <T const *> (src->storage()),
- src->shape(),
- static_cast <T *> (this->storage()),
- this->shape(),
- src->extent(),
- this->extent(),
- box);
- break;
- case 9:
- call_operator<T> (& prolongate_3d_o9_rf2,
- static_cast <T const *> (src->storage()),
- src->shape(),
- static_cast <T *> (this->storage()),
- this->shape(),
- src->extent(),
- this->extent(),
- box);
- break;
- case 11:
- call_operator<T> (& prolongate_3d_o11_rf2,
+ // There is only one parameter for the prolongation order, but
+ // Whisky may want 5th order for spacetime and 3rd order for
+ // hydro, so we cheat here.
+ call_operator<T> (& prolongate_3d_eno,
static_cast <T const *> (src->storage()),
src->shape(),
static_cast <T *> (this->storage()),
@@ -631,22 +802,26 @@ transfer_prolongate (data const * const src,
break;
default:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"LAGRANGE\" with order_space not in {1, 3, 5, 7, 9, 11}");
+ "There is no stencil for op=\"ENO\" with order_space!=3");
break;
}
timer.stop (0);
break;
}
- case op_ENO: {
- static Timer timer ("prolongate_ENO");
+ case op_WENO: {
+ static Timer timer ("prolongate_WENO");
timer.start ();
switch (order_space) {
case 1:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"ENO\" with order_space=1");
+ "There is no stencil for op=\"WENO\" with order_space=1");
break;
case 3:
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "There is no stencil for op=\"WENO\" with order_space=3");
+ break;
+ case 5:
call_operator<T> (& prolongate_3d_eno,
static_cast <T const *> (src->storage()),
src->shape(),
@@ -656,40 +831,29 @@ transfer_prolongate (data const * const src,
this->extent(),
box);
break;
- case 5:
- // there is only a parameter for the prolongation order, but Whisky may want 5th order for spacetime and 3rd order for hydro; so this is a trick.
- call_operator<T> (& prolongate_3d_eno,
- static_cast <T const *> (src->storage()),
- src->shape(),
- static_cast <T *> (this->storage()),
- this->shape(),
- src->extent(),
- this->extent(),
- box);
- break;
default:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"ENO\" with order_space!=3");
+ "There is no stencil for op=\"WENO\" with order_space!=5");
break;
}
timer.stop (0);
break;
}
- case op_WENO: {
- static Timer timer ("prolongate_WENO");
+ case op_Lagrange_monotone: {
+ static Timer timer ("prolongate_Lagrange_monotone");
timer.start ();
switch (order_space) {
case 1:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"WENO\" with order_space=1");
+ "There is no stencil for op=\"Lagrange_monotone\" with order_space=1");
break;
case 3:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"WENO\" with order_space=3");
+ "There is no stencil for op=\"Lagrange_monotone\" with order_space=3");
break;
case 5:
- call_operator<T> (& prolongate_3d_eno,
+ call_operator<T> (& prolongate_3d_o5_monotone_rf2,
static_cast <T const *> (src->storage()),
src->shape(),
static_cast <T *> (this->storage()),
@@ -700,7 +864,7 @@ transfer_prolongate (data const * const src,
break;
default:
CCTK_WARN (CCTK_WARN_ABORT,
- "There is no stencil for op=\"WENO\" with order_space!=5");
+ "There is no stencil for op=\"Lagrange_monotone\" with order_space!=5");
break;
}
timer.stop (0);
@@ -711,6 +875,48 @@ transfer_prolongate (data const * const src,
assert (0);
} // switch (transport_operator)
+#elif CARPET_DIM == 4
+
+ switch (transport_operator) {
+
+ case op_copy:
+ case op_Lagrange: {
+ static Timer timer ("prolongate_Lagrange");
+ timer.start ();
+ // enum centering { vertex_centered, cell_centered };
+ switch (cent) {
+ case vertex_centered:
+ switch (order_space) {
+ case 1:
+ call_operator<T> (& prolongate_4d_o1_rf2,
+ static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ default:
+ CCTK_WARN (CCTK_WARN_ABORT,
+ "There is no vertex-centred stencil for op=\"LAGRANGE\" with order_space not in {1}");
+ break;
+ }
+ break;
+ default:
+ assert (0);
+ }
+ timer.stop (0);
+ break;
+ }
+ default:
+ assert (0);
+ } // switch (transport_operator)
+
+#else
+# error "Value for CARPET_DIM not supported"
+#endif
+
total.stop (0);
}
@@ -736,12 +942,15 @@ transfer_restrict (data const * const src,
static Timer total ("restrict");
total.start ();
+#if CARPET_DIM == 3
+
switch (transport_operator) {
case op_copy:
case op_Lagrange:
case op_ENO:
case op_WENO:
+ case op_Lagrange_monotone:
// enum centering { vertex_centered, cell_centered };
switch (cent) {
case vertex_centered:
@@ -771,6 +980,36 @@ transfer_restrict (data const * const src,
assert (0);
}
+#elif CARPET_DIM == 4
+
+ switch (transport_operator) {
+
+ case op_copy:
+ case op_Lagrange:
+ // enum centering { vertex_centered, cell_centered };
+ switch (cent) {
+ case vertex_centered:
+ restrict_4d_rf2 (static_cast <T const *> (src->storage()),
+ src->shape(),
+ static_cast <T *> (this->storage()),
+ this->shape(),
+ src->extent(),
+ this->extent(),
+ box);
+ break;
+ default:
+ assert (0);
+ }
+ break;
+
+ default:
+ assert (0);
+ }
+
+#else
+# error "Value for CARPET_DIM not supported"
+#endif
+
total.stop (0);
}
@@ -797,7 +1036,9 @@ time_interpolate (vector <data *> const & srcs,
{
static Timer total ("time_interpolate");
total.start ();
-
+
+#if CARPET_DIM == 3
+
switch (transport_operator) {
case op_copy:
@@ -886,8 +1127,10 @@ time_interpolate (vector <data *> const & srcs,
}
case op_ENO:
- case op_WENO: {
- // ENO and WENO timer interpolation is the same for order_time <= 2
+ case op_WENO:
+ case op_Lagrange_monotone: {
+ // ENO, WENO, and Lagrange_monotone time interpolation is the same
+ // for order_time <= 2
static Timer timer ("time_interpolate_ENO");
timer.start ();
switch (order_time) {
@@ -935,6 +1178,14 @@ time_interpolate (vector <data *> const & srcs,
assert (0);
} // switch (transport_operator)
+#elif CARPET_DIM == 4
+
+ assert (0);
+
+#else
+# error "Value for CARPET_DIM not supported"
+#endif
+
total.stop (0);
}
@@ -982,22 +1233,9 @@ output (ostream & os)
return os;
}
-template<typename T>
-ostream &
-operator << (ostream & os, data<T> const & d)
-{
- char const * space = "";
- for (int i = 0; i < d.vectorlength; i++) {
- os << space << d[i];
- space = " ";
- }
- return os;
-}
-
#define INSTANTIATE(T) \
-template class data<T>; \
-template ostream & operator << <T> (ostream & os, data<T> const & d);
+template class data<T>;
#include "instantiate"
#undef INSTANTIATE
diff --git a/Carpet/CarpetLib/src/data.hh b/Carpet/CarpetLib/src/data.hh
index 6b7a774e1..d321e46c1 100644
--- a/Carpet/CarpetLib/src/data.hh
+++ b/Carpet/CarpetLib/src/data.hh
@@ -20,9 +20,6 @@ using namespace std;
template<typename T>
class data;
-template<typename T>
-ostream & operator << ( ostream & os, const data<T> & d );
-
// A distributed multi-dimensional array
template<typename T>
class data: public gdata
@@ -35,7 +32,7 @@ class data: public gdata
int vectorlength; // number of vector elements
int vectorindex; // index of this vector element
data* vectorleader; // if index!=0: first vector element
-
+
private:
// Forbid copying and passing by value
data (data const &);
@@ -48,23 +45,21 @@ public:
const centering cent = error_centered,
const operator_type transport_operator = op_error,
const int vectorlength = 1, const int vectorindex = 0,
- data* const vectorleader = NULL,
- const int tag = -1);
+ data* const vectorleader = NULL);
data (const int varindex,
const centering cent, const operator_type transport_operator,
const int vectorlength, const int vectorindex,
data* const vectorleader,
const ibbox& extent, const int proc);
-
+
// Destructors
virtual ~data ();
-
+
// Pseudo constructors
virtual data* make_typed (const int varindex,
const centering cent,
- const operator_type transport_operator,
- const int tag) const;
-
+ const operator_type transport_operator) const;
+
// Storage management
virtual void allocate (const ibbox& extent, const int proc,
void* const memptr = NULL, size_t const memsize = 0);
@@ -156,19 +151,10 @@ private:
public:
// Memory usage
- size_t memory () const;
+ virtual size_t memory () const CCTK_ATTRIBUTE_PURE;
// Output
- ostream & output (ostream& os) const;
-
- friend ostream & operator<< <T> (ostream & os, data<T> const & d);
+ virtual ostream & output (ostream& os) const;
};
-
-// Memory usage
-template<typename T>
-inline size_t memoryof (data<T> const & d)
-{
- return d.memory();
-}
#endif // DATA_HH
diff --git a/Carpet/CarpetLib/src/defs.cc b/Carpet/CarpetLib/src/defs.cc
index 357061ee2..ab3b021d8 100644
--- a/Carpet/CarpetLib/src/defs.cc
+++ b/Carpet/CarpetLib/src/defs.cc
@@ -2,11 +2,13 @@
#include <cctype>
#include <iostream>
#include <list>
+#include <map>
#include <set>
#include <stack>
#include <vector>
#include "cctk.h"
+#include "cctk_Parameters.h"
#include "bbox.hh"
#include "defs.hh"
@@ -19,6 +21,8 @@ using namespace std;
template <typename T>
+inline T ipow_helper (T x, unsigned int y) CCTK_ATTRIBUTE_CONST;
+template <typename T>
inline T ipow_helper (T x, unsigned int y)
{
T z = y&1 ? x : 1;
@@ -31,7 +35,7 @@ inline T ipow_helper (T x, unsigned int y)
}
template<class T>
-T ipow (T x, int y)
+T ipow (T const x, int const y)
{
if (y < 0)
return T(1) / ipow_helper(x, -y);
@@ -41,8 +45,23 @@ T ipow (T x, int y)
+// Access to CarpetLib parameters
+CCTK_INT get_poison_value()
+{
+ DECLARE_CCTK_PARAMETERS;
+ return poison_value;
+}
+
+CCTK_INT get_deadbeef()
+{
+ DECLARE_CCTK_PARAMETERS;
+ return deadbeef;
+}
+
+
+
void skipws (istream& is) {
- while (is.good() && isspace(is.peek())) {
+ while (is.good() and isspace(is.peek())) {
is.get();
}
}
@@ -138,6 +157,60 @@ memoryof (vector<T> const & c)
+// List input
+template<class T>
+istream& input (istream& is, list<T>& l) {
+ l.clear();
+ try {
+ skipws (is);
+ consume (is, '[');
+ skipws (is);
+ while (is.good() and is.peek() != ']') {
+ T elem;
+ is >> elem;
+ l.push_back (elem);
+ skipws (is);
+ if (is.peek() != ',') break;
+ is.get();
+ skipws (is);
+ }
+ skipws (is);
+ consume (is, ']');
+ } catch (input_error &err) {
+ cout << "Input error while reading a list<>" << endl
+ << " The following elements have been read so far: " << l << endl;
+ throw err;
+ }
+ return is;
+}
+
+// Set input
+template<class T>
+istream& input (istream& is, set<T>& s) {
+ s.clear();
+ try {
+ skipws (is);
+ consume (is, '{');
+ skipws (is);
+ while (is.good() and is.peek() != '}') {
+ T elem;
+ is >> elem;
+ s.insert (elem);
+ skipws (is);
+ if (is.peek() != ',') break;
+ is.get();
+ skipws (is);
+ }
+ skipws (is);
+ consume (is, ']');
+ } catch (input_error &err) {
+ cout << "Input error while reading a set<>" << endl
+ << " The following elements have been read so far: " << s << endl;
+ throw err;
+ }
+ return is;
+}
+
// Vector input
template<class T>
istream& input (istream& is, vector<T>& v) {
@@ -146,7 +219,7 @@ istream& input (istream& is, vector<T>& v) {
skipws (is);
consume (is, '[');
skipws (is);
- while (is.good() && is.peek() != ']') {
+ while (is.good() and is.peek() != ']') {
T elem;
is >> elem;
v.push_back (elem);
@@ -179,6 +252,25 @@ ostream& output (ostream& os, const list<T>& l) {
return os;
}
+// Map output
+template<class S, class T>
+ostream& output (ostream& os, const map<S,T>& m) {
+ os << "{";
+ for (typename map<S,T>::const_iterator ti=m.begin(); ti!=m.end(); ++ti) {
+ if (ti!=m.begin()) os << ",";
+ os << ti->first << ":" << ti->second;
+ }
+ os << "}";
+ return os;
+}
+
+// Pair output
+template<class S, class T>
+ostream& output (ostream& os, const pair<S,T>& p) {
+ os << "(" << p.first << "," << p.second << ")";
+ return os;
+}
+
// Set output
template<class T>
ostream& output (ostream& os, const set<T>& s) {
@@ -196,7 +288,7 @@ template<class T>
ostream& output (ostream& os, const stack<T>& s) {
stack<T> s2 (s);
list<T> l;
- while (! s2.empty()) {
+ while (not s2.empty()) {
l.insert (l.begin(), s2.top());
s2.pop();
}
@@ -231,28 +323,32 @@ ostream& output (ostream& os, const vector<T>& v) {
#include "th.hh"
#include "vect.hh"
+#include "CarpetTimers.hh"
+
template int ipow (int x, int y);
template CCTK_REAL ipow (CCTK_REAL x, int y);
-template vect<int,3> ipow (vect<int,3> x, int y);
+template vect<int,dim> ipow (vect<int,dim> x, int y);
-template size_t memoryof (list<bbox<int,3> > const & l);
-template size_t memoryof (list<vect<int,3> > const & l);
+template size_t memoryof (list<bbox<int,dim> > const & l);
+template size_t memoryof (list<vect<int,dim> > const & l);
template size_t memoryof (list<dh*> const & l);
+template size_t memoryof (list<gh*> const & l);
+template size_t memoryof (list<gdata*> const & l);
template size_t memoryof (list<ggf*> const & l);
template size_t memoryof (list<th*> const & l);
template size_t memoryof (stack<void*> const & s);
template size_t memoryof (vector<bool> const & v);
template size_t memoryof (vector<int> const & v);
template size_t memoryof (vector<CCTK_REAL> const & v);
-template size_t memoryof (vector<bbox<int,3> > const & v);
-template size_t memoryof (vector<vect<int,3> > const & v);
-template size_t memoryof (vector<fulltree <int,3,pseudoregion_t> *> const & f);
+template size_t memoryof (vector<bbox<int,dim> > const & v);
+template size_t memoryof (vector<vect<int,dim> > const & v);
+template size_t memoryof (vector<fulltree <int,dim,pseudoregion_t> *> const & f);
template size_t memoryof (vector<pseudoregion_t> const & v);
template size_t memoryof (vector<region_t> const & v);
template size_t memoryof (vector<sendrecv_pseudoregion_t> const & v);
template size_t memoryof (vector<vector<int> > const & v);
template size_t memoryof (vector<vector<CCTK_REAL> > const & v);
-template size_t memoryof (vector<vector<bbox<int,3> > > const & v);
+template size_t memoryof (vector<vector<bbox<int,dim> > > const & v);
template size_t memoryof (vector<vector<dh::dboxes> > const & v);
template size_t memoryof (vector<vector<dh::fast_dboxes> > const & v);
template size_t memoryof (vector<vector<region_t> > const & v);
@@ -262,49 +358,54 @@ template size_t memoryof (vector<vector<vector<region_t> > > const & v);
template size_t memoryof (vector<vector<vector<gdata*> > > const & v);
template size_t memoryof (vector<vector<vector<vector<gdata*> > > > const & v);
+template istream& input (istream& os, list<bbox<int,dim> >& l);
+template istream& input (istream& os, set<bbox<int,dim> >& s);
template istream& input (istream& os, vector<int>& v);
template istream& input (istream& os, vector<CCTK_REAL>& v);
-template istream& input (istream& os, vector<bbox<int,3> >& v);
-template istream& input (istream& os, vector<bbox<CCTK_REAL,3> >& v);
-template istream& input (istream& os, vector<vect<int,3> >& v);
-template istream& input (istream& os, vector<vect<vect<bool,2>,3> >& v);
+template istream& input (istream& os, vector<bbox<int,dim> >& v);
+template istream& input (istream& os, vector<bbox<CCTK_REAL,dim> >& v);
+template istream& input (istream& os, vector<vect<int,dim> >& v);
+template istream& input (istream& os, vector<vect<vect<bool,2>,dim> >& v);
template istream& input (istream& os, vector<region_t>& v);
+template istream& input (istream& os, vector<pseudoregion_t>& v);
+template istream& input (istream& os, vector<sendrecv_pseudoregion_t>& v);
template istream& input (istream& os, vector<vector<CCTK_REAL> >& v);
-template istream& input (istream& os, vector<vector<bbox<int,3> > >& v);
-template istream& input (istream& os, vector<vector<bbox<CCTK_REAL,3> > >& v);
-template istream& input (istream& os, vector<vector<vect<vect<bool,2>,3> > >& v);
+template istream& input (istream& os, vector<vector<bbox<int,dim> > >& v);
+template istream& input (istream& os, vector<vector<bbox<CCTK_REAL,dim> > >& v);
+template istream& input (istream& os, vector<vector<vect<vect<bool,2>,dim> > >& v);
template istream& input (istream& os, vector<vector<region_t> >& v);
template istream& input (istream& os, vector<vector<vector<CCTK_REAL> > >& v);
template istream& input (istream& os, vector<vector<vector<region_t> > >& v);
-template ostream& output (ostream& os, const list<bbox<int,3> >& l);
+template ostream& output (ostream& os, const list<bbox<int,dim> >& l);
template ostream& output (ostream& os, const list<region_t>& l);
-template ostream& output (ostream& os, const set<bbox<int,3> >& s);
-template ostream& output (ostream& os, const set<bboxset<int,3> >& s);
-template ostream& output (ostream& os, const stack<bbox<int,3> >& s);
+template ostream& output (ostream& os, const map<string,Carpet::Timer*>& m);
+template ostream& output (ostream& os, const set<bbox<int,dim> >& s);
+template ostream& output (ostream& os, const set<bboxset<int,dim> >& s);
+template ostream& output (ostream& os, const stack<bbox<int,dim> >& s);
template ostream& output (ostream& os, const vector<bool>& v);
template ostream& output (ostream& os, const vector<int>& v);
template ostream& output (ostream& os, const vector<CCTK_REAL>& v);
-template ostream& output (ostream& os, const vector<bbox<int,3> >& v);
-template ostream& output (ostream& os, const vector<bbox<CCTK_REAL,3> >& v);
-template ostream& output (ostream& os, const vector<vect<int,3> >& v);
-template ostream& output (ostream& os, const vector<vect<vect<bool,2>,3> >& v);
+template ostream& output (ostream& os, const vector<bbox<int,dim> >& v);
+template ostream& output (ostream& os, const vector<bbox<CCTK_REAL,dim> >& v);
+template ostream& output (ostream& os, const vector<vect<int,dim> >& v);
+template ostream& output (ostream& os, const vector<vect<vect<bool,2>,dim> >& v);
template ostream& output (ostream& os, const vector<dh::dboxes> & v);
template ostream& output (ostream& os, const vector<dh::fast_dboxes> & v);
template ostream& output (ostream& os, const vector<region_t>& v);
template ostream& output (ostream& os, const vector<pseudoregion_t>& v);
template ostream& output (ostream& os, const vector<sendrecv_pseudoregion_t>& v);
-template ostream& output (ostream& os, const vector<list<bbox<int,3> > >& v);
+template ostream& output (ostream& os, const vector<list<bbox<int,dim> > >& v);
template ostream& output (ostream& os, const vector<vector<int> >& v);
template ostream& output (ostream& os, const vector<vector<CCTK_REAL> >& v);
-template ostream& output (ostream& os, const vector<vector<bbox<int,3> > >& v);
-template ostream& output (ostream& os, const vector<vector<bbox<CCTK_REAL,3> > >& v);
-template ostream& output (ostream& os, const vector<vector<vect<vect<bool,2>,3> > >& v);
+template ostream& output (ostream& os, const vector<vector<bbox<int,dim> > >& v);
+template ostream& output (ostream& os, const vector<vector<bbox<CCTK_REAL,dim> > >& v);
+template ostream& output (ostream& os, const vector<vector<vect<vect<bool,2>,dim> > >& v);
template ostream& output (ostream& os, const vector<vector<dh::dboxes> > & b);
template ostream& output (ostream& os, const vector<vector<dh::fast_dboxes> > & b);
template ostream& output (ostream& os, const vector<vector<region_t> >& v);
template ostream& output (ostream& os, const vector<vector<vector<CCTK_REAL> > >& v);
-template ostream& output (ostream& os, const vector<vector<vector<bbox<int,3> > > >& v);
+template ostream& output (ostream& os, const vector<vector<vector<bbox<int,dim> > > >& v);
template ostream& output (ostream& os, const vector<vector<vector<dh::dboxes> > > & b);
template ostream& output (ostream& os, const vector<vector<vector<dh::fast_dboxes> > > & b);
template ostream& output (ostream& os, const vector<vector<vector<region_t> > >& v);
diff --git a/Carpet/CarpetLib/src/defs.hh b/Carpet/CarpetLib/src/defs.hh
index a44d20ef0..3a1188d21 100644
--- a/Carpet/CarpetLib/src/defs.hh
+++ b/Carpet/CarpetLib/src/defs.hh
@@ -11,25 +11,24 @@
#include <cstdlib>
#include <iostream>
#include <list>
+#include <map>
#include <set>
#include <stack>
#include <vector>
#include "cctk.h"
+#include "typeprops.hh"
-using namespace std;
-
-
-// A compile time pseudo assert statement
-#define static_assert(_x, _msg) do { typedef int ai[(_x) ? 1 : -1]; } while(0)
+using namespace std;
-// Check a return value
-#define check(_expr) do { bool const _val = (_expr); assert(_val); } while(0)
+// Stringify
+#define STRINGIFY1(x) #x
+#define STRINGIFY(x) STRINGIFY1(x)
@@ -40,14 +39,11 @@ using namespace std;
-// Use this macro AT instead of vector's operator[] or at().
-// Depending on the macro NDEBUG, this macro AT either checks for
-// valid indices or not.
-#ifndef CARPET_OPTIMISE
-# define AT(index) at(index)
-#else
-# define AT(index) operator[](index)
+// Number of dimensions
+#ifndef CARPET_DIM
+# define CARPET_DIM 3
#endif
+const int dim = CARPET_DIM;
@@ -55,9 +51,25 @@ using namespace std;
char const * const eol = "\n";
+
+// A compile time pseudo assert statement
+#define static_assert(_x, _msg) do { typedef int ai[(_x) ? 1 : -1]; } while(0)
-// Number of dimensions
-const int dim = 3;
+
+
+// Check a return value
+#define check(_expr) do { bool const _val = (_expr); assert(_val); } while(0)
+
+
+
+// Use this macro AT instead of vector's operator[] or at().
+// Depending on the macro CARPET_OPTIMISE, this macro AT either checks
+// for valid indices or not.
+#if ! defined(CARPET_OPTIMISE)
+# define AT(index) at(index)
+#else
+# define AT(index) operator[](index)
+#endif
@@ -100,11 +112,19 @@ enum centering { error_centered, vertex_centered, cell_centered };
// Useful helper
template<class T>
+inline T square (const T& x) CCTK_ATTRIBUTE_CONST;
+template<class T>
inline T square (const T& x) { return x*x; }
// Another useful helper
template<class T>
-T ipow (T x, int y);
+T ipow (T x, int y) CCTK_ATTRIBUTE_CONST;
+
+
+
+// Access to CarpetLib parameters
+CCTK_INT get_poison_value() CCTK_ATTRIBUTE_CONST;
+CCTK_INT get_deadbeef() CCTK_ATTRIBUTE_CONST;
@@ -120,52 +140,62 @@ void consume (istream& is, char const * c);
// Names for types
#ifdef HAVE_CCTK_INT1
-inline const char * typestring (const CCTK_INT1& dummy)
+inline const char * typestring (const CCTK_INT1&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_INT1&)
{ return "CCTK_INT1"; }
#endif
#ifdef HAVE_CCTK_INT2
-inline const char * typestring (const CCTK_INT2& dummy)
+inline const char * typestring (const CCTK_INT2&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_INT2&)
{ return "CCTK_INT2"; }
#endif
#ifdef HAVE_CCTK_INT4
-inline const char * typestring (const CCTK_INT4& dummy)
+inline const char * typestring (const CCTK_INT4&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_INT4&)
{ return "CCTK_INT4"; }
#endif
#ifdef HAVE_CCTK_INT8
-inline const char * typestring (const CCTK_INT8& dummy)
+inline const char * typestring (const CCTK_INT8&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_INT8&)
{ return "CCTK_INT8"; }
#endif
#ifdef HAVE_CCTK_REAL4
-inline const char * typestring (const CCTK_REAL4& dummy)
+inline const char * typestring (const CCTK_REAL4&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_REAL4&)
{ return "CCTK_REAL4"; }
#endif
#ifdef HAVE_CCTK_REAL8
-inline const char * typestring (const CCTK_REAL8& dummy)
+inline const char * typestring (const CCTK_REAL8&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_REAL8&)
{ return "CCTK_REAL8"; }
#endif
#ifdef HAVE_CCTK_REAL16
-inline const char * typestring (const CCTK_REAL16& dummy)
+inline const char * typestring (const CCTK_REAL16&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_REAL16&)
{ return "CCTK_REAL16"; }
#endif
#ifdef HAVE_CCTK_REAL4
-inline const char * typestring (const CCTK_COMPLEX8& dummy)
+inline const char * typestring (const CCTK_COMPLEX8&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_COMPLEX8&)
{ return "CCTK_COMPLEX8"; }
#endif
#ifdef HAVE_CCTK_REAL8
-inline const char * typestring (const CCTK_COMPLEX16& dummy)
+inline const char * typestring (const CCTK_COMPLEX16&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_COMPLEX16&)
{ return "CCTK_COMPLEX16"; }
#endif
#ifdef HAVE_CCTK_REAL16
-inline const char * typestring (const CCTK_COMPLEX32& dummy)
+inline const char * typestring (const CCTK_COMPLEX32&) CCTK_ATTRIBUTE_CONST;
+inline const char * typestring (const CCTK_COMPLEX32&)
{ return "CCTK_COMPLEX32"; }
#endif
@@ -174,78 +204,105 @@ inline const char * typestring (const CCTK_COMPLEX32& dummy)
namespace CarpetLib {
namespace good {
- // Explicitly overload abs for all types in the same namespace, to
- // circumvent confusion among some compilers
+ // Explicitly overload some functions for all types in the same
+ // namespace CarpetLib::good, to circumvent confusion among some
+ // compilers
- // CCTK_BYTE is unsigned
- inline CCTK_BYTE abs (CCTK_BYTE const & x) { return x; }
+ //
+ // abs
+ //
-#if 0
- // This does not work on AIX, which does not have long long abs
- // (long long)
-# ifdef HAVE_CCTK_INT1
- inline CCTK_INT1 abs (CCTK_INT1 const & x) { return std::abs (x); }
-# endif
-# ifdef HAVE_CCTK_INT2
- inline CCTK_INT2 abs (CCTK_INT2 const & x) { return std::abs (x); }
-# endif
-# ifdef HAVE_CCTK_INT4
- inline CCTK_INT4 abs (CCTK_INT4 const & x) { return std::abs (x); }
-# endif
-# ifdef HAVE_CCTK_INT8
- inline CCTK_INT8 abs (CCTK_INT8 const & x) { return std::abs (x); }
-# endif
-#endif
+ template <typename T>
+ inline typename typeprops<T>::real abs (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline typename typeprops<T>::real abs (T const & x)
+ { return std::abs (x); }
-#if 0
- // This does not work on Linux with Intel compilers, which do not
- // always have long long llabs (long long)
- inline signed char abs (signed char const & x) { return ::abs (x); }
- inline unsigned char abs (unsigned char const & x) { return ::abs (x); }
- inline short abs (short const & x) { return ::abs (x); }
- inline int abs (int const & x) { return ::abs (x); }
- inline long abs (long const & x) { return ::labs (x); }
-# ifdef SIZEOF_LONG_LONG
- inline long long abs (long long const & x) { return ::llabs (x); }
-# endif
-#endif
+// // This does not work on Linux with Intel compilers, which do not
+// // always have long long llabs (long long)
+// template<> inline signed char abs<signed char> (signed char const & x) CCTK_ATTRIBUTE_CONST { return ::abs (x); }
+// template<> inline unsigned char abs<unsigned char> (unsigned char const & x) CCTK_ATTRIBUTE_CONST { return ::abs (x); }
+// template<> inline short abs<short> (short const & x) { return ::abs (x); }
+// template<> inline int abs<int> (int const & x) CCTK_ATTRIBUTE_CONST { return ::abs (x); }
+// template<> inline long abs<long> (long const & x) CCTK_ATTRIBUTE_CONST { return ::labs (x); }
+// #ifdef SIZEOF_LONG_LONG
+// inline long long abs<long long> (long long const & x) CCTK_ATTRIBUTE_CONST { return ::llabs (x); }
+// #endif
-#if 1
-# ifdef HAVE_CCTK_INT1
- inline CCTK_INT1 abs (CCTK_INT1 const & x) { return x < 0 ? - x : x; }
-# endif
-# ifdef HAVE_CCTK_INT2
- inline CCTK_INT2 abs (CCTK_INT2 const & x) { return x < 0 ? - x : x; }
-# endif
-# ifdef HAVE_CCTK_INT4
- inline CCTK_INT4 abs (CCTK_INT4 const & x) { return x < 0 ? - x : x; }
-# endif
-# ifdef HAVE_CCTK_INT8
- inline CCTK_INT8 abs (CCTK_INT8 const & x) { return x < 0 ? - x : x; }
-# endif
+// // This template does not work on AIX, which does not have long
+// // long abs (long long)
+// #ifdef HAVE_CCTK_INT1
+// template<> inline CCTK_INT1 abs<CCTK_INT1> (CCTK_INT1 const & x) CCTK_ATTRIBUTE_CONST { return x < 0 ? - x : x; }
+// #endif
+// #ifdef HAVE_CCTK_INT2
+// template<> inline CCTK_INT2 abs<CCTK_INT2> (CCTK_INT2 const & x) CCTK_ATTRIBUTE_CONST { return x < 0 ? - x : x; }
+// #endif
+// #ifdef HAVE_CCTK_INT4
+// template<> inline CCTK_INT4 abs<CCTK_INT4> (CCTK_INT4 const & x) CCTK_ATTRIBUTE_CONST { return x < 0 ? - x : x; }
+// #endif
+// #ifdef HAVE_CCTK_INT8
+// template<> inline CCTK_INT8 abs<CCTK_INT8> (CCTK_INT8 const & x) CCTK_ATTRIBUTE_CONST { return x < 0 ? - x : x; }
+// #endif
+
+#ifdef HAVE_CCTK_COMPLEX8
+ template<> inline CCTK_REAL4 abs<CCTK_COMPLEX8> (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline CCTK_REAL4 abs<CCTK_COMPLEX8> (CCTK_COMPLEX8 const & x)
+ { return CCTK_Cmplx8Abs (x); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ template<> inline CCTK_REAL8 abs<CCTK_COMPLEX16> (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline CCTK_REAL8 abs<CCTK_COMPLEX16> (CCTK_COMPLEX16 const & x)
+ { return CCTK_Cmplx16Abs (x); }
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ template<> inline CCTK_REAL16 abs<CCTK_COMPLEX32> (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline CCTK_REAL16 abs<CCTK_COMPLEX32> (CCTK_COMPLEX32 const & x)
+ { return CCTK_Cmplx32Abs (x); }
#endif
+ //
+ // isnan
+ //
+
+#undef isnan
+
+ // Default implementation, only good for integers
+ template <typename T>
+ inline int isnan (T const & x) CCTK_ATTRIBUTE_CONST;
+ template <typename T>
+ inline int isnan (T const & x)
+ { return 0; }
+
#ifdef HAVE_CCTK_REAL4
- inline CCTK_REAL4 abs (CCTK_REAL4 const & x) { return std::abs (x); }
+ template<> inline int isnan (CCTK_REAL4 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_REAL4 const & x)
+ { return ::isnan (x); }
#endif
#ifdef HAVE_CCTK_REAL8
- inline CCTK_REAL8 abs (CCTK_REAL8 const & x) { return std::abs (x); }
+ template<> inline int isnan (CCTK_REAL8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_REAL8 const & x)
+ { return ::isnan (x); }
#endif
#ifdef HAVE_CCTK_REAL16
- inline CCTK_REAL16 abs (CCTK_REAL16 const & x) { return std::abs (x); }
+ template<> inline int isnan (CCTK_REAL16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_REAL16 const & x)
+ { return ::isnan (x); }
#endif
#ifdef HAVE_CCTK_COMPLEX8
- inline CCTK_REAL4 abs (CCTK_COMPLEX8 const & x)
- { return CCTK_Cmplx8Abs (x); }
+ template<> inline int isnan (CCTK_COMPLEX8 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_COMPLEX8 const & x)
+ { return ::isnan (CCTK_Cmplx8Real (x)) or ::isnan (CCTK_Cmplx8Imag (x)); }
#endif
#ifdef HAVE_CCTK_COMPLEX16
- inline CCTK_REAL8 abs (CCTK_COMPLEX16 const & x)
- { return CCTK_Cmplx16Abs (x); }
+ template<> inline int isnan (CCTK_COMPLEX16 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_COMPLEX16 const & x)
+ { return ::isnan (CCTK_Cmplx16Real (x)) or ::isnan (CCTK_Cmplx16Imag (x)); }
#endif
#ifdef HAVE_CCTK_COMPLEX32
- inline CCTK_REAL16 abs (CCTK_COMPLEX32 const & x)
- { return CCTK_Cmplx32Abs (x); }
+ template<> inline int isnan (CCTK_COMPLEX32 const & x) CCTK_ATTRIBUTE_CONST;
+ template<> inline int isnan (CCTK_COMPLEX32 const & x)
+ { return ::isnan (CCTK_Cmplx32Real (x)) or std::isnan (CCTK_Cmplx32Imag (x)); }
#endif
} // namespace good
@@ -254,33 +311,69 @@ namespace CarpetLib {
// Container memory usage
-inline size_t memoryof (char e) { return sizeof e; }
-inline size_t memoryof (short e) { return sizeof e; }
-inline size_t memoryof (int e) { return sizeof e; }
-inline size_t memoryof (long e) { return sizeof e; }
-inline size_t memoryof (long long e) { return sizeof e; }
-inline size_t memoryof (unsigned char e) { return sizeof e; }
-inline size_t memoryof (unsigned short e) { return sizeof e; }
-inline size_t memoryof (unsigned int e) { return sizeof e; }
-inline size_t memoryof (unsigned long e) { return sizeof e; }
-inline size_t memoryof (unsigned long long e) { return sizeof e; }
-inline size_t memoryof (float e) { return sizeof e; }
-inline size_t memoryof (double e) { return sizeof e; }
-inline size_t memoryof (long double e) { return sizeof e; }
-inline size_t memoryof (void * e) { return sizeof e; }
-template<class T> inline size_t memoryof (T * e) { return sizeof e; }
-template<class T> inline size_t memoryof (T const * e) { return sizeof e; }
-template<class T> size_t memoryof (list<T> const & c);
-template<class T> size_t memoryof (set<T> const & c);
-template<class T> size_t memoryof (stack<T> const & c);
-template<class T> size_t memoryof (vector<T> const & c);
+inline size_t memoryof (char const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (short const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (int const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (long const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (long long const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (unsigned char const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (unsigned short const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (unsigned int const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (unsigned long const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (unsigned long long const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (float const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (double const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (long double const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (void * const e) CCTK_ATTRIBUTE_CONST;
+inline size_t memoryof (void const * const e) CCTK_ATTRIBUTE_CONST;
+template<class T> inline size_t memoryof (T * const e) CCTK_ATTRIBUTE_CONST;
+template<class T> inline size_t memoryof (T const * const e) CCTK_ATTRIBUTE_CONST;
+template<class T> inline size_t memoryof (typename list<T>::iterator const & i) CCTK_ATTRIBUTE_CONST;
+template<class T> inline size_t memoryof (typename list<T>::const_iterator const & i) CCTK_ATTRIBUTE_CONST;
+
+inline size_t memoryof (char const e) { return sizeof e; }
+inline size_t memoryof (short const e) { return sizeof e; }
+inline size_t memoryof (int const e) { return sizeof e; }
+inline size_t memoryof (long const e) { return sizeof e; }
+inline size_t memoryof (long long const e) { return sizeof e; }
+inline size_t memoryof (unsigned char const e) { return sizeof e; }
+inline size_t memoryof (unsigned short const e) { return sizeof e; }
+inline size_t memoryof (unsigned int const e) { return sizeof e; }
+inline size_t memoryof (unsigned long const e) { return sizeof e; }
+inline size_t memoryof (unsigned long long const e) { return sizeof e; }
+inline size_t memoryof (float const e) { return sizeof e; }
+inline size_t memoryof (double const e) { return sizeof e; }
+inline size_t memoryof (long double const e) { return sizeof e; }
+inline size_t memoryof (void * const e) { return sizeof e; }
+inline size_t memoryof (void const * const e) { return sizeof e; }
+template<class T> inline size_t memoryof (T * const e) { return sizeof e; }
+template<class T> inline size_t memoryof (T const * const e) { return sizeof e; }
+template<class T> inline size_t memoryof (typename list<T>::iterator const & i) { return sizeof i; }
+template<class T> inline size_t memoryof (typename list<T>::const_iterator const & i) { return sizeof i; }
+
+template<class T> size_t memoryof (list<T> const & c) CCTK_ATTRIBUTE_PURE;
+template<class T> size_t memoryof (set<T> const & c) CCTK_ATTRIBUTE_PURE;
+template<class T> size_t memoryof (stack<T> const & c) CCTK_ATTRIBUTE_PURE;
+template<class T> size_t memoryof (vector<T> const & c) CCTK_ATTRIBUTE_PURE;
// Container input
+template<class T> istream& input (istream& is, list<T>& l);
+template<class T> istream& input (istream& is, set<T>& s);
template<class T> istream& input (istream& is, vector<T>& v);
template<class T>
+inline istream& operator>> (istream& is, list<T>& l) {
+ return input(is,l);
+}
+
+template<class T>
+inline istream& operator>> (istream& is, set<T>& s) {
+ return input(is,s);
+}
+
+template<class T>
inline istream& operator>> (istream& is, vector<T>& v) {
return input(is,v);
}
@@ -289,6 +382,8 @@ inline istream& operator>> (istream& is, vector<T>& v) {
// Container output
template<class T> ostream& output (ostream& os, const list<T>& l);
+template<class S, class T> ostream& output (ostream& os, const map<S,T>& m);
+template<class S, class T> ostream& output (ostream& os, const pair<S,T>& p);
template<class T> ostream& output (ostream& os, const set<T>& s);
template<class T> ostream& output (ostream& os, const stack<T>& s);
template<class T> ostream& output (ostream& os, const vector<T>& v);
@@ -298,6 +393,11 @@ inline ostream& operator<< (ostream& os, const list<T>& l) {
return output(os,l);
}
+template<class S, class T>
+inline ostream& operator<< (ostream& os, const map<S,T>& m) {
+ return output(os,m);
+}
+
template<class T>
inline ostream& operator<< (ostream& os, const set<T>& s) {
return output(os,s);
diff --git a/Carpet/CarpetLib/src/dh.cc b/Carpet/CarpetLib/src/dh.cc
index 046600c6b..36b3c310f 100644
--- a/Carpet/CarpetLib/src/dh.cc
+++ b/Carpet/CarpetLib/src/dh.cc
@@ -3,6 +3,9 @@
#include "cctk.h"
#include "cctk_Parameters.h"
+#include "CarpetTimers.hh"
+
+#include "mpi_string.hh"
#include "bbox.hh"
#include "bboxset.hh"
#include "defs.hh"
@@ -19,6 +22,10 @@ using namespace CarpetLib;
+list<dh*> dh::alldh;
+
+
+
// Constructors
dh::
dh (gh & h_,
@@ -31,12 +38,14 @@ dh (gh & h_,
assert (all (all (ghost_width >= 0)));
assert (all (all (buffer_width >= 0)));
assert (prolongation_order_space >= 0);
- h.add (this);
+ alldhi = alldh.insert(alldh.end(), this);
+ gh_handle = h.add (this);
CHECKPOINT;
- regrid ();
+ regrid (false);
for (int rl = 0; rl < h.reflevels(); ++ rl) {
recompose (rl, false);
}
+ regrid_free (false);
}
@@ -46,7 +55,8 @@ dh::
~dh ()
{
CHECKPOINT;
- h.remove (this);
+ h.erase (gh_handle);
+ alldh.erase(alldhi);
}
@@ -135,6 +145,15 @@ assert_error (char const * restrict const checkstring,
there_was_an_error = true;
}
+#ifdef CARPET_OPTIMISE
+
+// For highest efficiency, omit all self-checks
+#define ASSERT_rl(check, message)
+#define ASSERT_c(check, message)
+#define ASSERT_cc(check, message)
+
+#else
+
#define ASSERT_rl(check, message) \
do { \
if (not (check)) { \
@@ -156,41 +175,60 @@ assert_error (char const * restrict const checkstring,
} \
} while (false)
+#endif
+
void
dh::
-regrid ()
+regrid (bool const do_init)
{
DECLARE_CCTK_PARAMETERS;
+
+ static Carpet::Timer timer ("CarpetLib::dh::regrid");
+ timer.start();
CHECKPOINT;
- static Timer total ("dh::regrid");
+ static Timer total ("CarpetLib::dh::regrid");
total.start ();
- oldboxes.clear();
+ mboxes oldboxes;
swap (boxes, oldboxes);
- fast_oldboxes.clear();
- swap (fast_boxes, fast_oldboxes);
+
+ full_mboxes full_boxes;
+
+ fast_boxes.clear();
+ // cerr << "QQQ: regrid[1]" << endl;
boxes.resize (h.mglevels());
+ full_boxes.resize (h.mglevels());
fast_boxes.resize (h.mglevels());
for (int ml = 0; ml < h.mglevels(); ++ ml) {
+ // cerr << "QQQ: regrid[2] ml=" << ml << endl;
boxes.AT(ml).resize (h.reflevels());
+ full_boxes.AT(ml).resize (h.reflevels());
fast_boxes.AT(ml).resize (h.reflevels());
for (int rl = 0; rl < h.reflevels(); ++ rl) {
+ // cerr << "QQQ: regrid[3] rl=" << rl << endl;
boxes.AT(ml).AT(rl).resize (h.components(rl));
- fast_boxes.AT(ml).AT(rl).resize (dist::size());
+ full_boxes.AT(ml).AT(rl).resize (h.components(rl));
cboxes & level = boxes.AT(ml).AT(rl);
- fast_cboxes & fast_level = fast_boxes.AT(ml).AT(rl);
+ full_cboxes & full_level = full_boxes.AT(ml).AT(rl);
+ fast_dboxes & fast_level = fast_boxes.AT(ml).AT(rl);
+
+ vector<fast_dboxes> fast_level_otherprocs (dist::size());
// Domain:
+ // cerr << "QQQ: regrid[a]" << endl;
+
+ static Carpet::Timer timer_domain ("CarpetLib::dh::regrid::domain");
+ timer_domain.start();
ibbox const & domain_exterior = h.baseextent(ml,rl);
// Variables may have size zero
@@ -211,17 +249,24 @@ regrid ()
ibset domain_boundary = domain_exterior - domain_active;
domain_boundary.normalize();
+ timer_domain.stop();
+
+ static Carpet::Timer timer_region ("CarpetLib::dh::regrid::region");
+ timer_region.start();
+
+ // cerr << "QQQ: regrid[b]" << endl;
for (int c = 0; c < h.components(rl); ++ c) {
- dboxes & box = boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes & box = full_level.AT(c);
// Interior:
ibbox & intr = box.interior;
+ intr = ibbox::poison();
// The interior of the grid has the extent as specified by the
// regridding thorn
@@ -237,10 +282,12 @@ regrid ()
"The interior must be contained in the domain");
// All interiors must be disjunct
+#ifdef CARPET_DEBUG
for (int cc = 0; cc < c; ++ cc) {
- ASSERT_cc (not intr.intersects (level.AT(cc).interior),
+ ASSERT_cc (not intr.intersects (full_level.AT(cc).interior),
"All interiors must be disjunct");
}
+#endif
@@ -261,6 +308,7 @@ regrid ()
// Exterior:
ibbox & extr = box.exterior;
+ extr = ibbox::poison();
ASSERT_c (all (all (ghost_width >= 0)),
"The gh ghost widths must not be negative");
@@ -280,6 +328,7 @@ regrid ()
// Cactus ghost zones (which include outer boundaries):
ibset & ghosts = box.ghosts;
+ ghosts = ibset::poison();
ghosts = extr - intr;
ghosts.normalize();
@@ -295,6 +344,7 @@ regrid ()
// Communicated region:
ibbox & comm = box.communicated;
+ comm = ibbox::poison();
comm = extr.expand (i2vect (is_outer_boundary) * (- boundary_width));
@@ -313,6 +363,7 @@ regrid ()
// Outer boundary:
ibset & outer_boundaries = box.outer_boundaries;
+ outer_boundaries = ibset::poison();
outer_boundaries = extr - comm;
outer_boundaries.normalize();
@@ -327,6 +378,7 @@ regrid ()
// Owned region:
ibbox & owned = box.owned;
+ owned = ibbox::poison();
owned = intr.expand (i2vect (is_outer_boundary) * (- boundary_width));
@@ -341,10 +393,12 @@ regrid ()
"The owned region must be contained in the active part of the domain");
// All owned regions must be disjunct
+#ifdef CARPET_DEBUG
for (int cc = 0; cc < c; ++ cc) {
- ASSERT_cc (not owned.intersects (level.AT(cc).owned),
+ ASSERT_cc (not owned.intersects (full_level.AT(cc).owned),
"All owned regions must be disjunct");
}
+#endif
@@ -352,6 +406,7 @@ regrid ()
// boundaries):
ibset & boundaries = box.boundaries;
+ boundaries = ibset::poison();
boundaries = comm - owned;
boundaries.normalize();
@@ -365,9 +420,15 @@ regrid ()
} // for c
+ timer_region.stop();
+
// Conjunction of all buffer zones:
+ // cerr << "QQQ: regrid[c]" << endl;
+
+ static Carpet::Timer timer_buffers ("CarpetLib::dh::regrid::buffers");
+ timer_buffers.start();
// Enlarge active part of domain
i2vect const safedist = i2vect (0);
@@ -376,7 +437,7 @@ regrid ()
// All owned regions
ibset allowned;
for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes const & box = full_level.AT(c);
allowned += box.owned;
}
allowned.normalize();
@@ -409,20 +470,13 @@ regrid ()
for (int c = 0; c < h.components(rl); ++ c) {
-
- dboxes & box = boxes.AT(ml).AT(rl).AT(c);
-
-
+ full_dboxes & box = full_level.AT(c);
// Buffer zones:
-
box.buffers = box.owned & allbuffers;
box.buffers.normalize();
-
-
// Active region:
-
box.active = box.owned - box.buffers;
box.active.normalize();
@@ -431,22 +485,29 @@ regrid ()
// The conjunction of all buffer zones must equal allbuffers
+ // cerr << "QQQ: regrid[d]" << endl;
ibset allbuffers1;
for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes const & box = full_level.AT(c);
allbuffers1 += box.buffers;
}
allbuffers1.normalize();
ASSERT_rl (allbuffers1 == allbuffers,
"Buffer zone consistency check");
+ timer_buffers.stop();
+
// Test constituency relations:
+ // cerr << "QQQ: regrid[e]" << endl;
+
+ static Carpet::Timer timer_test ("CarpetLib::dh::regrid::test");
+ timer_test.start();
for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes const & box = full_level.AT(c);
ASSERT_c ((box.active & box.buffers).empty(),
"Consistency check");
@@ -473,24 +534,36 @@ regrid ()
} // for c
+ timer_test.stop();
+
// Communication schedule:
+ // cerr << "QQQ: regrid[4]" << endl;
- for (int c = 0; c < h.components(rl); ++ c) {
+ static Carpet::Timer timer_comm ("CarpetLib::dh::regrid::comm");
+ timer_comm.start();
+
+ for (int lc = 0; lc < h.local_components(rl); ++ lc) {
+ int const c = h.get_component (rl, lc);
+ // cerr << "QQQ: regrid[4a] lc=" << lc << " c=" << c << endl;
- dboxes & box = boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes & box = full_level.AT(c);
// Multigrid restriction:
+ static Carpet::Timer timer_comm_mgrest
+ ("CarpetLib::dh::regrid::comm::mgrest");
+ timer_comm_mgrest.start();
+
if (ml > 0) {
int const oml = ml - 1;
// Multigrid restriction must fill all active points
- dboxes const & obox = boxes.AT(oml).AT(rl).AT(c);
+ full_dboxes const & obox = full_boxes.AT(oml).AT(rl).AT(c);
ibset needrecv = box.active;
@@ -513,11 +586,8 @@ regrid ()
ibbox const send = recv.expanded_for (obox.interior);
ASSERT_c (send <= obox.exterior,
"Multigrid restriction: Send region must be contained in exterior");
- if (on_this_proc (rl, c)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_mg_rest_sendrecv.push_back
- (sendrecv_pseudoregion_t (send, c, recv, c));
- }
+ fast_level.fast_mg_rest_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, c, recv, c));
}
needrecv -= ovlp;
@@ -529,9 +599,16 @@ regrid ()
} // if ml > 0
+ timer_comm_mgrest.stop();
+
// Multigrid prolongation:
+ // cerr << "QQQ: regrid[f]" << endl;
+
+ static Carpet::Timer timer_comm_mgprol
+ ("CarpetLib::dh::regrid::comm::mprol");
+ timer_comm_mgprol.start();
if (ml > 0) {
int const oml = ml - 1;
@@ -539,7 +616,7 @@ regrid ()
// Multigrid prolongation must fill all active points
// (this could probably be relaxed)
- dboxes const & obox = boxes.AT(oml).AT(rl).AT(c);
+ full_dboxes const & obox = full_boxes.AT(oml).AT(rl).AT(c);
ibset oneedrecv = obox.active;
@@ -565,11 +642,8 @@ regrid ()
recv.expanded_for (box.interior).expand (stencil_size);
ASSERT_c (send <= box.exterior,
"Multigrid prolongation: Send region must be contained in exterior");
- if (on_this_proc (rl, c)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_mg_prol_sendrecv.push_back
- (sendrecv_pseudoregion_t (send, c, recv, c));
- }
+ fast_level.fast_mg_prol_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, c, recv, c));
}
oneedrecv -= ovlp;
@@ -581,9 +655,16 @@ regrid ()
} // if ml > 0
+ timer_comm_mgprol.stop();
+
// Refinement prolongation:
+ // cerr << "QQQ: regrid[g]" << endl;
+
+ static Carpet::Timer timer_comm_refprol
+ ("CarpetLib::dh::regrid::comm::refprol");
+ timer_comm_refprol.start();
if (rl > 0) {
int const orl = rl - 1;
@@ -600,7 +681,7 @@ regrid ()
i2vect (h.reffacts.at(rl) / h.reffacts.at(orl));
for (int cc = 0; cc < h.components(orl); ++ cc) {
- dboxes const & obox = boxes.AT(ml).AT(orl).AT(cc);
+ full_dboxes const & obox = full_boxes.AT(ml).AT(orl).AT(cc);
ibset contracted_oactive;
for (ibset::const_iterator
@@ -617,16 +698,19 @@ regrid ()
ovlp.normalize();
for (ibset::const_iterator
- ri =ovlp.begin(); ri != ovlp.end(); ++ ri)
+ ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
{
ibbox const & recv = * ri;
ibbox const send =
recv.expanded_for (obox.interior).expand (stencil_size);
ASSERT_c (send <= obox.exterior,
"Refinement prolongation: Send region must be contained in exterior");
- if (on_this_proc (rl, c) or on_this_proc (orl, cc)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_ref_prol_sendrecv.push_back
+ fast_level.fast_ref_prol_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, cc, recv, c));
+ if (not on_this_proc (orl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(orl, cc));
+ fast_level_otherproc.fast_ref_prol_sendrecv.push_back
(sendrecv_pseudoregion_t (send, cc, recv, c));
}
}
@@ -635,83 +719,120 @@ regrid ()
} // for cc
- needrecv.normalize();
-
// All points must have been received
+ needrecv.normalize();
ASSERT_c (needrecv.empty(),
"Refinement prolongation: All points must have been received");
} // if rl > 0
+ timer_comm_refprol.stop();
+
// Synchronisation:
+ // cerr << "QQQ: regrid[h]" << endl;
- // Synchronisation should fill as many boundary points as
- // possible
+ static Carpet::Timer timer_comm_sync
+ ("CarpetLib::dh::regrid::comm::sync");
+ timer_comm_sync.start();
+ {
+
+ // Synchronisation should fill as many boundary points as
+ // possible
+
#if 0
- // Outer boundaries are not synchronised, since they cannot be
- // filled by boundary prolongation either, and therefore the
- // user code must set them anyway.
- ibset needrecv = box.boundaries;
+ // Outer boundaries are not synchronised, since they cannot
+ // be filled by boundary prolongation either, and therefore
+ // the user code must set them anyway.
+ ibset needrecv = box.boundaries;
#else
- // Outer boundaries are synchronised for backward
- // compatibility.
- ibset needrecv = box.ghosts;
+ // Outer boundaries are synchronised for backward
+ // compatibility.
+ ibset needrecv = box.ghosts;
#endif
-
- ibset & sync = box.sync;
-
- for (int cc = 0; cc < h.components(rl); ++ cc) {
- dboxes const & obox = boxes.AT(ml).AT(rl).AT(cc);
+ ibset const needrecv_orig = needrecv;
+ ibset & sync = box.sync;
+
+ for (int cc = 0; cc < h.components(rl); ++ cc) {
+ full_dboxes const & obox = full_level.AT(cc);
+
#if 0
- ibset ovlp = needrecv & obox.owned;
+ ibset ovlp = needrecv & obox.owned;
#else
- ibset ovlp = needrecv & obox.interior;
+ ibset ovlp = needrecv & obox.interior;
#endif
- ovlp.normalize();
-
- if (cc == c) {
- ASSERT_cc (ovlp.empty(),
- "A region may not synchronise from itself");
- }
-
- for (ibset::const_iterator
- ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
- {
- ibbox const & recv = * ri;
- ibbox const & send = recv;
- if (on_this_proc (rl, c) or on_this_proc (rl, cc)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_sync_sendrecv.push_back
+ ovlp.normalize();
+
+ if (cc == c) {
+ ASSERT_cc (ovlp.empty(),
+ "A region may not synchronise from itself");
+ }
+
+ for (ibset::const_iterator
+ ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
+ {
+ ibbox const & recv = * ri;
+ ibbox const & send = recv;
+ fast_level.fast_sync_sendrecv.push_back
(sendrecv_pseudoregion_t (send, cc, recv, c));
+ if (not on_this_proc (rl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(rl, cc));
+ fast_level_otherproc.fast_sync_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, cc, recv, c));
+ }
}
- }
+
+ needrecv -= ovlp;
+ sync += ovlp;
+
+ } // for cc
- needrecv -= ovlp;
- sync += ovlp;
+ sync.normalize();
- } // for cc
+ }
- needrecv.normalize();
- sync.normalize();
+ timer_comm_sync.stop();
// Boundary prolongation:
+ // cerr << "QQQ: regrid[i]" << endl;
+
+ static Carpet::Timer timer_comm_refbndprol
+ ("CarpetLib::dh::regrid::comm::refbndprol");
+ timer_comm_refbndprol.start();
if (rl > 0) {
int const orl = rl - 1;
+#if 0
+ // Outer boundaries are not synchronised, since they cannot
+ // be filled by boundary prolongation either, and therefore
+ // the user code must set them anyway.
+ ibset needrecv = box.boundaries;
+#else
+ // Outer boundaries are synchronised for backward
+ // compatibility.
+ ibset needrecv = box.ghosts;
+#endif
+
+ // Points which are synchronised need not be boundary
+ // prolongated
+ needrecv -= box.sync;
+
// Outer boundary points cannot be boundary prolongated
needrecv &= box.communicated;
// Prolongation must fill what cannot be synchronised, and
// also all buffer zones
needrecv += box.buffers;
+
needrecv.normalize();
+ ibset const needrecv_orig = needrecv;
ibset & bndref = box.bndref;
@@ -721,9 +842,10 @@ regrid ()
"Refinement factors must be integer multiples of each other");
i2vect const reffact =
i2vect (h.reffacts.at(rl) / h.reffacts.at(orl));
+ ivect const reffact1 = h.reffacts.at(rl) / h.reffacts.at(orl);
for (int cc = 0; cc < h.components(orl); ++ cc) {
- dboxes const & obox = boxes.AT(ml).AT(orl).AT(cc);
+ full_dboxes const & obox = full_boxes.AT(ml).AT(orl).AT(cc);
ibset contracted_oactive;
for (ibset::const_iterator
@@ -747,251 +869,522 @@ regrid ()
recv.expanded_for (obox.interior).expand (stencil_size);
ASSERT_c (send <= obox.exterior,
"Boundary prolongation: Send region must be contained in exterior");
- if (on_this_proc (rl, c) or on_this_proc (orl, cc)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_ref_bnd_prol_sendrecv.push_back
+ fast_level.fast_ref_bnd_prol_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, cc, recv, c));
+ if (not on_this_proc (orl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(orl, cc));
+ fast_level_otherproc.fast_ref_bnd_prol_sendrecv.push_back
(sendrecv_pseudoregion_t (send, cc, recv, c));
}
}
needrecv -= ovlp;
bndref += ovlp;
-
+
} // for cc
- needrecv.normalize();
bndref.normalize();
+ // All points must now have been received, either through
+ // synchronisation or through boundary prolongation
+ needrecv.normalize();
+ ASSERT_c (needrecv.empty(),
+ "Synchronisation and boundary prolongation: All points must have been received");
+
} // if rl > 0
- // All points must now have been received, either through
- // synchronisation or through boundary prolongation
- ASSERT_c (needrecv.empty(),
- "Synchronisation and boundary prolongation: All points must have been received");
+ timer_comm_refbndprol.stop();
- } // for c
+ } // for lc
// Refinement restriction:
+ // cerr << "QQQ: regrid[j]" << endl;
+
+ static Carpet::Timer timer_comm_refrest
+ ("CarpetLib::dh::regrid::comm::refrest");
+ timer_comm_refrest.start();
if (rl > 0) {
int const orl = rl - 1;
- fast_cboxes & fast_olevel = fast_boxes.AT(ml).AT(orl);
-
- ibset needrecv;
- for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
- dboxes const & obox0 = boxes.AT(ml).AT(orl).AT(0);
-
- // Refinement restriction may fill all active points, and
- // must use all active points
-
- for (ibset::const_iterator
- ai = box.active.begin(); ai != box.active.end(); ++ ai)
- {
- ibbox const & active = * ai;
- needrecv += active.contracted_for (obox0.interior);
- }
- needrecv.normalize();
- } // for c
+ fast_dboxes & fast_olevel = fast_boxes.AT(ml).AT(orl);
- for (int cc = 0; cc < h.components(orl); ++ cc) {
- dboxes & obox = boxes.AT(ml).AT(orl).AT(cc);
-
- for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
+ if (h.components(orl) > 0) {
+ for (int lc = 0; lc < h.local_components(rl); ++ lc) {
+ int const c = h.get_component (rl, lc);
+
+ full_dboxes const & box = full_level.AT(c);
+ full_dboxes const & obox0 = full_boxes.AT(ml).AT(orl).AT(0);
+
+ // Refinement restriction may fill all active points, and
+ // must use all active points
- ibset contracted_active;
+ ibset needrecv;
for (ibset::const_iterator
ai = box.active.begin(); ai != box.active.end(); ++ ai)
{
ibbox const & active = * ai;
- contracted_active += active.contracted_for (obox.interior);
+ needrecv += active.contracted_for (obox0.interior);
}
- contracted_active.normalize();
+ needrecv.normalize();
- ibset ovlp = obox.active & contracted_active;
- ovlp.normalize();
-
- for (ibset::const_iterator
- ri =ovlp.begin(); ri != ovlp.end(); ++ ri)
- {
- ibbox const & recv = * ri;
- ibbox const send = recv.expanded_for (box.interior);
- ASSERT_c (send <= box.active,
- "Refinement restriction: Send region must be contained in active part");
- if (on_this_proc (rl, c) or on_this_proc (orl, cc)) {
- int const p = dist::rank();
- fast_olevel.AT(p).fast_ref_rest_sendrecv.push_back
+ for (int cc = 0; cc < h.components(orl); ++ cc) {
+ full_dboxes & obox = full_boxes.AT(ml).AT(orl).AT(cc);
+
+ ibset contracted_active;
+ for (ibset::const_iterator
+ ai = box.active.begin(); ai != box.active.end(); ++ ai)
+ {
+ ibbox const & active = * ai;
+ contracted_active += active.contracted_for (obox0.interior);
+ }
+ contracted_active.normalize();
+
+ ibset ovlp = obox.active & contracted_active;
+ ovlp.normalize();
+
+ for (ibset::const_iterator
+ ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
+ {
+ ibbox const & recv = * ri;
+ ibbox const send = recv.expanded_for (box.interior);
+ ASSERT_c (send <= box.active,
+ "Refinement restriction: Send region must be contained in active part");
+ fast_olevel.fast_ref_rest_sendrecv.push_back
(sendrecv_pseudoregion_t (send, c, recv, cc));
+ if (not on_this_proc (orl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(orl, cc));
+ fast_level_otherproc.fast_ref_rest_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, c, recv, cc));
+ }
}
- }
-
- needrecv -= ovlp;
- } // for c
-
- } // for cc
-
- needrecv.normalize();
-
- // All points must have been received
- ASSERT_rl (needrecv.empty(),
- "Refinement restriction: All points must have been received");
+ needrecv -= ovlp;
+
+ } // for cc
+
+ // All points must have been received
+ needrecv.normalize();
+ ASSERT_rl (needrecv.empty(),
+ "Refinement restriction: All points must have been received");
+
+ } // for lc
+ } // if orl not empty
} // if rl > 0
+ timer_comm_refrest.stop();
+
+ timer_comm.stop();
+
// Regridding schedule:
+ // cerr << "QQQ: regrid[5]" << endl;
- for (int c = 0; c < h.components(rl); ++ c) {
-
- dboxes & box = boxes.AT(ml).AT(rl).AT(c);
-
- ibset needrecv = box.active;
+ fast_level.do_init = do_init;
+ if (do_init) {
+ static Carpet::Timer timer_regrid ("CarpetLib::dh::regrid::regrid");
+ timer_regrid.start();
+ for (int lc = 0; lc < h.local_components(rl); ++ lc) {
+ int const c = h.get_component (rl, lc);
+ // cerr << "QQQ: regrid[5a] lc=" << lc << " c=" << c << endl;
- // Synchronisation:
-
- if (int (oldboxes.size()) > ml and int (oldboxes.AT(ml).size()) > rl) {
+ full_dboxes & box = full_level.AT(c);
- int const oldcomponents = oldboxes.AT(ml).AT(rl).size();
+ ibset needrecv = box.active;
- // Synchronisation copies from the same level of the old
- // grid structure. It should fill as many active points as
- // possible
- for (int cc = 0; cc < oldcomponents; ++ cc) {
- dboxes const & obox = oldboxes.AT(ml).AT(rl).AT(cc);
+
+ // Synchronisation:
+ // cerr << "QQQ: regrid[k]" << endl;
+
+ static Carpet::Timer timer_regrid_sync
+ ("CarpetLib::dh::regrid::regrid::sync");
+ timer_regrid_sync.start();
+
+ if (int (oldboxes.size()) > ml and int (oldboxes.AT(ml).size()) > rl)
+ {
- ibset ovlp = needrecv & obox.owned;
- ovlp.normalize();
+ int const oldcomponents = oldboxes.AT(ml).AT(rl).size();
- for (ibset::const_iterator
- ri =ovlp.begin(); ri != ovlp.end(); ++ ri)
- {
- ibbox const & recv = * ri;
- ibbox const & send = recv;
- if (on_this_proc (rl, c) or on_this_oldproc (rl, cc)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_old2new_sync_sendrecv.push_back
+ // Synchronisation copies from the same level of the old
+ // grid structure. It should fill as many active points
+ // as possible.
+
+ for (int cc = 0; cc < oldcomponents; ++ cc) {
+ dboxes const & obox = oldboxes.AT(ml).AT(rl).AT(cc);
+
+ ibset ovlp = needrecv & obox.owned;
+ ovlp.normalize();
+
+ for (ibset::const_iterator
+ ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
+ {
+ ibbox const & recv = * ri;
+ ibbox const & send = recv;
+ fast_level.fast_old2new_sync_sendrecv.push_back
(sendrecv_pseudoregion_t (send, cc, recv, c));
+ if (not on_this_oldproc (rl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(rl, cc));
+ fast_level_otherproc.fast_old2new_sync_sendrecv.push_back
+ (sendrecv_pseudoregion_t (send, cc, recv, c));
+ }
}
- }
+
+ needrecv -= ovlp;
+
+ } // for cc
- needrecv -= ovlp;
+ needrecv.normalize();
- } // for cc
+ } // if not oldboxes.empty
- needrecv.normalize();
-
- } // if not oldboxes.empty
-
-
-
- // Prolongation:
-
- if (rl > 0) {
- int const orl = rl - 1;
+ timer_regrid_sync.stop();
- // Prolongation interpolates from the next coarser level of
- // the new grid structure. It must fill what cannot be
- // synchronised
-
- i2vect const stencil_size = i2vect (prolongation_stencil_size());
- ASSERT_c (all (h.reffacts.at(rl) % h.reffacts.at(orl) == 0),
- "Refinement factors must be integer multiples of each other");
- i2vect const reffact =
- i2vect (h.reffacts.at(rl) / h.reffacts.at(orl));
- for (int cc = 0; cc < h.components(orl); ++ cc) {
- dboxes const & obox = boxes.AT(ml).AT(orl).AT(cc);
+ // Prolongation:
+ // cerr << "QQQ: regrid[l]" << endl;
+
+ static Carpet::Timer timer_regrid_prolongate
+ ("CarpetLib::dh::regrid::regrid::prolongate");
+ timer_regrid_prolongate.start();
+
+ if (rl > 0) {
+ int const orl = rl - 1;
- ibset contracted_oactive;
- for (ibset::const_iterator
- ai = obox.active.begin(); ai != obox.active.end(); ++ ai)
- {
- ibbox const & oactive = * ai;
- // untested for cell centering
- contracted_oactive +=
- oactive.contracted_for (box.interior).expand (reffact);
- }
- contracted_oactive.normalize();
+ // Prolongation interpolates from the next coarser level
+ // of the new grid structure. It must fill what cannot be
+ // synchronised.
- ibset ovlp = needrecv & contracted_oactive;
- ovlp.normalize();
+ i2vect const stencil_size = i2vect (prolongation_stencil_size());
- for (ibset::const_iterator
- ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
- {
- ibbox const & recv = * ri;
- ibbox const send =
- recv.expanded_for (obox.interior).expand (stencil_size);
- ASSERT_c (send <= obox.exterior,
- "Regridding prolongation: Send region must be contained in exterior");
- if (on_this_proc (rl, c) or on_this_proc (orl, cc)) {
- int const p = dist::rank();
- fast_level.AT(p).fast_old2new_ref_prol_sendrecv.push_back
+ ASSERT_c (all (h.reffacts.at(rl) % h.reffacts.at(orl) == 0),
+ "Refinement factors must be integer multiples of each other");
+ i2vect const reffact =
+ i2vect (h.reffacts.at(rl) / h.reffacts.at(orl));
+
+ for (int cc = 0; cc < h.components(orl); ++ cc) {
+ full_dboxes const & obox = full_boxes.AT(ml).AT(orl).AT(cc);
+
+ ibset contracted_oactive;
+ for (ibset::const_iterator
+ ai = obox.active.begin(); ai != obox.active.end(); ++ ai)
+ {
+ ibbox const & oactive = * ai;
+ // untested for cell centering
+ contracted_oactive +=
+ oactive.contracted_for (box.interior).expand (reffact);
+ }
+ contracted_oactive.normalize();
+
+ ibset ovlp = needrecv & contracted_oactive;
+ ovlp.normalize();
+
+ for (ibset::const_iterator
+ ri = ovlp.begin(); ri != ovlp.end(); ++ ri)
+ {
+ ibbox const & recv = * ri;
+ ibbox const send =
+ recv.expanded_for (obox.interior).expand (stencil_size);
+ ASSERT_c (send <= obox.exterior,
+ "Regridding prolongation: Send region must be contained in exterior");
+ fast_level.fast_old2new_ref_prol_sendrecv.push_back
(sendrecv_pseudoregion_t (send, cc, recv, c));
+ if (not on_this_proc (orl, cc)) {
+ fast_dboxes & fast_level_otherproc =
+ fast_level_otherprocs.AT(this_proc(orl, cc));
+ fast_level_otherproc.fast_old2new_ref_prol_sendrecv.
+ push_back (sendrecv_pseudoregion_t (send, cc, recv, c));
+ }
}
- }
+
+ needrecv -= ovlp;
+
+ } // for cc
- needrecv -= ovlp;
+ needrecv.normalize();
- } // for cc
+ } // if rl > 0
- needrecv.normalize();
+ if (int (oldboxes.size()) > ml and int (oldboxes.AT(ml).size()) > 0) {
+ // All points must now have been received, either through
+ // synchronisation or through prolongation
+ ASSERT_c (needrecv.empty(),
+ "Regridding prolongation: All points must have been received");
+ }
- } // if rl > 0
+ timer_regrid_prolongate.stop();
+
+ } // for lc
- if (int (oldboxes.size()) > ml and int (oldboxes.AT(ml).size()) > 0) {
- // All points must now have been received, either through
- // synchronisation or through prolongation
- ASSERT_c (needrecv.empty(),
- "Regridding prolongation: All points must have been received");
+ timer_regrid.stop();
+
+ } // if do_init
+
+
+
+ // cerr << "QQQ: regrid[6]" << endl;
+ for (int lc = 0; lc < h.local_components(rl); ++ lc) {
+ int const c = h.get_component (rl, lc);
+
+ level.AT(c).exterior = full_level.AT(c).exterior;
+ level.AT(c).owned = full_level.AT(c).owned;
+ level.AT(c).interior = full_level.AT(c).interior;
+
+ level.AT(c).exterior_size = full_level.AT(c).exterior.size();
+ level.AT(c).owned_size = full_level.AT(c).owned.size();
+ level.AT(c).active_size = full_level.AT(c).active.size();
+
+ } // for lc
+
+
+
+ // Broadcast grid structure and communication schedule
+ // cerr << "QQQ: regrid[7]" << endl;
+
+ {
+
+ static Carpet::Timer timer_bcast_boxes
+ ("CarpetLib::dh::regrid::bcast_boxes");
+ timer_bcast_boxes.start();
+
+ int const count_send = h.local_components(rl);
+ vector<dboxes> level_send (count_send);
+ for (int lc = 0; lc < h.local_components(rl); ++ lc) {
+ int const c = h.get_component (rl, lc);
+ level_send.AT(lc) = level.AT(c);
+ }
+ // cerr << "QQQ: regrid[7a]" << endl;
+ vector<vector<dboxes> > const level_recv =
+ allgatherv (dist::comm(), level_send);
+ // cerr << "QQQ: regrid[7b]" << endl;
+ vector<int> count_recv (dist::size(), 0);
+ for (int c = 0; c < h.components(rl); ++ c) {
+ int const p = this_proc (rl, c);
+ if (p != dist::rank()) {
+ level.AT(c) = level_recv.AT(p).AT(count_recv.AT(p));
+ ++ count_recv.AT(p);
+ }
+ }
+ for (int p = 0; p < dist::size(); ++ p) {
+ if (p != dist::rank()) {
+ assert (count_recv.AT(p) == int(level_recv.AT(p).size()));
+ }
}
+ // cerr << "QQQ: regrid[7c]" << endl;
- } // for c
+ timer_bcast_boxes.stop();
+
+ }
- } // for rl
- } // for m
-
-
-
- // Output:
- if (output_bboxes or there_was_an_error) {
-
- for (int ml = 0; ml < h.mglevels(); ++ ml) {
- for (int rl = 0; rl < h.reflevels(); ++ rl) {
+ {
+
+ static Carpet::Timer timer_bcast_comm
+ ("CarpetLib::dh::regrid::bcast_comm");
+ timer_bcast_comm.start();
+
+ static Carpet::Timer timer_bcast_comm_ref_prol
+ ("CarpetLib::dh::regrid::bcast_comm::ref_prol");
+ timer_bcast_comm_ref_prol.start();
+ broadcast_schedule (fast_level_otherprocs, fast_level,
+ & fast_dboxes::fast_ref_prol_sendrecv);
+ timer_bcast_comm_ref_prol.stop();
+
+ static Carpet::Timer timer_bcast_comm_sync
+ ("CarpetLib::dh::regrid::bcast_comm::sync");
+ timer_bcast_comm_sync.start();
+ broadcast_schedule (fast_level_otherprocs, fast_level,
+ & fast_dboxes::fast_sync_sendrecv);
+ timer_bcast_comm_sync.stop();
+
+ static Carpet::Timer timer_bcast_comm_ref_bnd_prol
+ ("CarpetLib::dh::regrid::bcast_comm::ref_bnd_prol");
+ timer_bcast_comm_ref_bnd_prol.start();
+ broadcast_schedule (fast_level_otherprocs, fast_level,
+ & fast_dboxes::fast_ref_bnd_prol_sendrecv);
+ timer_bcast_comm_ref_bnd_prol.stop();
+
+ if (rl > 0) {
+ int const orl = rl - 1;
+ fast_dboxes & fast_olevel = fast_boxes.AT(ml).AT(orl);
+ static Carpet::Timer timer_bcast_comm_ref_rest
+ ("CarpetLib::dh::regrid::bcast_comm::ref_rest");
+ timer_bcast_comm_ref_rest.start();
+ broadcast_schedule (fast_level_otherprocs, fast_olevel,
+ & fast_dboxes::fast_ref_rest_sendrecv);
+ timer_bcast_comm_ref_rest.stop();
+ }
+
+ // TODO: Maybe broadcast old2new schedule only if do_init is
+ // set
+ static Carpet::Timer timer_bcast_comm_old2new_sync
+ ("CarpetLib::dh::regrid::bcast_comm::old2new_sync");
+ timer_bcast_comm_old2new_sync.start();
+ broadcast_schedule (fast_level_otherprocs, fast_level,
+ & fast_dboxes::fast_old2new_sync_sendrecv);
+ timer_bcast_comm_old2new_sync.stop();
+
+ static Carpet::Timer timer_bcast_comm_old2new_ref_prol
+ ("CarpetLib::dh::regrid::bcast_comm::old2new_ref_prol");
+ timer_bcast_comm_old2new_ref_prol.start();
+ broadcast_schedule (fast_level_otherprocs, fast_level,
+ & fast_dboxes::fast_old2new_ref_prol_sendrecv);
+ timer_bcast_comm_old2new_ref_prol.stop();
+
+ timer_bcast_comm.stop();
+
+ }
+
+
+
+ // Output:
+ if (output_bboxes or there_was_an_error) {
+
for (int c = 0; c < h.components(rl); ++ c) {
- dboxes const & box = boxes.AT(ml).AT(rl).AT(c);
- fast_dboxes const & fast_box = fast_boxes.AT(ml).AT(rl).AT(c);
+ full_dboxes const & box = full_boxes.AT(ml).AT(rl).AT(c);
cout << eol;
cout << "ml=" << ml << " rl=" << rl << " c=" << c << eol;
cout << box;
- cout << fast_box;
- cout << endl;
} // for c
- } // for rl
- } // for m
+
+ fast_dboxes const & fast_box = fast_boxes.AT(ml).AT(rl);
+
+ cout << eol;
+ cout << "ml=" << ml << " rl=" << rl << eol;
+ cout << fast_box;
+
+ } // if output_bboxes
+
+
+
+ // Free memory early to save space
+ if (int (oldboxes.size()) > ml and int (oldboxes.AT(ml).size()) > rl) {
+ oldboxes.AT(ml).AT(rl).clear();
+ }
+
+ if (ml > 0) {
+ if (rl > 0) {
+ full_boxes.AT(ml-1).AT(rl-1).clear();
+ }
+ if (rl == h.reflevels()-1) {
+ full_boxes.AT(ml-1).AT(rl).clear();
+ }
+ }
+ if (ml == h.mglevels()-1) {
+ if (rl > 0) {
+ full_boxes.AT(ml).AT(rl-1).clear();
+ }
+ if (rl == h.reflevels()-1) {
+ full_boxes.AT(ml).AT(rl).clear();
+ }
+ }
+
+ } // for rl
+
+ if (ml > 0) {
+ full_boxes.AT(ml-1).clear();
+ }
+ if (ml == h.mglevels()-1) {
+ full_boxes.AT(ml).clear();
+ }
+
+ } // for ml
+
+
+
+ // Output:
+ if (output_bboxes or there_was_an_error) {
+
+ cout << eol;
+ cout << "memoryof(gh)=" << memoryof(h) << eol;
+ cout << "memoryof(dh)=" << memoryof(*this) << eol;
+ cout << "memoryof(dh.boxes)=" << memoryof(boxes) << eol;
+ cout << "memoryof(dh.fast_boxes)=" << memoryof(fast_boxes) << eol;
+ int gfcount = 0;
+ size_t gfmemory = 0;
+ for (list<ggf*>::const_iterator
+ gfi = gfs.begin(); gfi != gfs.end(); ++ gfi)
+ {
+ ++ gfcount;
+ gfmemory += memoryof(**gfi);
+ }
+ cout << "#gfs=" << gfcount << eol;
+ cout << "memoryof(gfs)=" << gfmemory << eol;
} // if output_bboxes
if (there_was_an_error) {
CCTK_WARN (CCTK_WARN_ABORT,
- "The grid structure is inconsistent. "
- "It is impossible to continue.");
+ "The grid structure is inconsistent. It is impossible to continue.");
}
total.stop (0);
+ timer.stop();
+}
+
+
+
+void
+dh::
+broadcast_schedule (vector<fast_dboxes> & fast_level_otherprocs,
+ fast_dboxes & fast_level,
+ srpvect fast_dboxes::* const schedule_item)
+{
+ // cerr << "QQQ: broadcast_schedule[1]" << endl;
+ static Carpet::Timer timer_bs1 ("CarpetLib::dh::bs1");
+ timer_bs1.start();
+ vector <srpvect> send (dist::size());
+ for (int p=0; p<dist::size(); ++p) {
+ swap (send.AT(p), fast_level_otherprocs.AT(p).*schedule_item);
+ }
+ timer_bs1.stop();
+
+ static Carpet::Timer timer_bs2 ("CarpetLib::dh::bs2");
+ timer_bs2.start();
+ srpvect const recv = alltoallv1 (dist::comm(), send);
+ timer_bs2.stop();
+
+ static Carpet::Timer timer_bs3 ("CarpetLib::dh::bs3");
+ timer_bs3.start();
+ (fast_level.*schedule_item).insert
+ ((fast_level.*schedule_item).end(), recv.begin(), recv.end());
+ timer_bs3.stop();
+ // cerr << "QQQ: broadcast_schedule[2]" << endl;
+}
+
+
+
+void
+dh::
+regrid_free (bool const do_init)
+{
+ if (do_init) {
+ for (int ml = 0; ml < h.mglevels(); ++ ml) {
+ for (int rl = 0; rl < h.reflevels(); ++ rl) {
+ fast_boxes.AT(ml).AT(rl).fast_old2new_sync_sendrecv.clear();
+ fast_boxes.AT(ml).AT(rl).fast_old2new_ref_prol_sendrecv.clear();
+ }
+ }
+ } else {
+ for (int ml = 0; ml < h.mglevels(); ++ ml) {
+ for (int rl = 0; rl < h.reflevels(); ++ rl) {
+ assert (fast_boxes.AT(ml).AT(rl).fast_old2new_sync_sendrecv.empty());
+ assert (fast_boxes.AT(ml).AT(rl).fast_old2new_ref_prol_sendrecv.empty());
+ }
+ }
+ }
}
@@ -1004,7 +1397,7 @@ recompose (int const rl, bool const do_prolongate)
assert (rl>=0 and rl<h.reflevels());
- static Timer timer ("dh::recompose");
+ static Carpet::Timer timer ("CarpetLib::dh::recompose");
timer.start ();
for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
@@ -1017,11 +1410,21 @@ recompose (int const rl, bool const do_prolongate)
for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
(*f)->recompose_allocate (rl);
}
+#warning "TODO: If this works, rename do_prolongate to do_init here, and remove the do_prolongate parameter from ggf::recompose_fill"
+#if 0
for (comm_state state; not state.done(); state.step()) {
for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
(*f)->recompose_fill (state, rl, do_prolongate);
}
}
+#endif
+ if (do_prolongate) {
+ for (comm_state state; not state.done(); state.step()) {
+ for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
+ (*f)->recompose_fill (state, rl, true);
+ }
+ }
+ }
for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
(*f)->recompose_free_old (rl);
}
@@ -1030,33 +1433,144 @@ recompose (int const rl, bool const do_prolongate)
// but requires less memory. This is the default.
for (list<ggf*>::iterator f=gfs.begin(); f!=gfs.end(); ++f) {
(*f)->recompose_allocate (rl);
+#if 0
for (comm_state state; not state.done(); state.step()) {
(*f)->recompose_fill (state, rl, do_prolongate);
}
+#endif
+ if (do_prolongate) {
+ for (comm_state state; not state.done(); state.step()) {
+ (*f)->recompose_fill (state, rl, true);
+ }
+ }
(*f)->recompose_free_old (rl);
}
}
- timer.stop (0);
+ timer.stop ();
}
// Grid function management
-void
+dh::ggf_handle
dh::
add (ggf * const f)
{
CHECKPOINT;
- gfs.push_back (f);
+ return gfs.insert (gfs.end(), f);
}
void
dh::
-remove (ggf * const f)
+erase (ggf_handle const fi)
{
CHECKPOINT;
- gfs.remove (f);
+ gfs.erase (fi);
+}
+
+
+
+// Equality
+
+bool
+dh::full_dboxes::
+operator== (full_dboxes const & b) const
+{
+ return
+ exterior == b.exterior and
+ all(all(is_outer_boundary == b.is_outer_boundary)) and
+ outer_boundaries == b.outer_boundaries and
+ communicated == b.communicated and
+ boundaries == b.boundaries and
+ owned == b.owned and
+ buffers == b.buffers and
+ active == b.active and
+ sync == b.sync and
+ bndref == b.bndref and
+ ghosts == b.ghosts and
+ interior == b.interior;
+}
+
+
+
+// MPI datatypes
+
+MPI_Datatype
+mpi_datatype (dh::dboxes const &)
+{
+ static bool initialised = false;
+ static MPI_Datatype newtype;
+ if (not initialised) {
+ static dh::dboxes s;
+#define ENTRY(type, name) \
+ { \
+ sizeof s.name / sizeof(type), /* count elements */ \
+ (char*)&s.name - (char*)&s, /* offsetof doesn't work (why?) */ \
+ dist::mpi_datatype<type>(), /* find MPI datatype */ \
+ STRINGIFY(name), /* field name */ \
+ STRINGIFY(type), /* type name */ \
+ }
+ dist::mpi_struct_descr_t const descr[] = {
+ ENTRY(int, exterior),
+ ENTRY(int, owned),
+ ENTRY(int, interior),
+ ENTRY(dh::dboxes::size_type, exterior_size),
+ ENTRY(dh::dboxes::size_type, owned_size),
+ ENTRY(dh::dboxes::size_type, active_size),
+ {1, sizeof s, MPI_UB, "MPI_UB", "MPI_UB"}
+ };
+#undef ENTRY
+ newtype =
+ dist::create_mpi_datatype (sizeof descr / sizeof descr[0], descr,
+ "dh::dboxes", sizeof s);
+#if 0
+ int type_size;
+ MPI_Type_size (newtype, & type_size);
+ assert (type_size <= sizeof s);
+ MPI_Aint type_lb, type_ub;
+ MPI_Type_lb (newtype, & type_lb);
+ MPI_Type_ub (newtype, & type_ub);
+ assert (type_ub - type_lb == sizeof s);
+#endif
+ initialised = true;
+ }
+ return newtype;
+}
+
+MPI_Datatype
+mpi_datatype (dh::fast_dboxes const &)
+{
+ static bool initialised = false;
+ static MPI_Datatype newtype;
+ if (not initialised) {
+ static dh::fast_dboxes s;
+#define ENTRY(type, name) \
+ { \
+ sizeof s.name / sizeof(type), /* count elements */ \
+ (char*)&s.name - (char*)&s, /* offsetof doesn't work (why?) */ \
+ dist::mpi_datatype<type>(), /* find MPI datatype */ \
+ STRINGIFY(name), /* field name */ \
+ STRINGIFY(type), /* type name */ \
+ }
+ dist::mpi_struct_descr_t const descr[] = {
+ ENTRY (dh::srpvect, fast_mg_rest_sendrecv),
+ ENTRY (dh::srpvect, fast_mg_prol_sendrecv),
+ ENTRY (dh::srpvect, fast_ref_prol_sendrecv),
+ ENTRY (dh::srpvect, fast_ref_rest_sendrecv),
+ ENTRY (dh::srpvect, fast_sync_sendrecv),
+ ENTRY (dh::srpvect, fast_ref_bnd_prol_sendrecv),
+ ENTRY (dh::srpvect, fast_old2new_sync_sendrecv),
+ ENTRY (dh::srpvect, fast_old2new_ref_prol_sendrecv),
+ {1, sizeof s, MPI_UB, "MPI_UB", "MPI_UB"}
+ };
+#undef ENTRY
+ newtype =
+ dist::create_mpi_datatype (sizeof descr / sizeof descr[0], descr,
+ "dh::fast_dboxes", sizeof s);
+ initialised = true;
+ }
+ return newtype;
}
@@ -1069,22 +1583,48 @@ memory ()
const
{
return
+ sizeof alldhi + // memoryof (alldhi) +
+ sizeof & h + // memoryof (& h) +
+ sizeof gh_handle + // memoryof (gh_handle) +
memoryof (ghost_width) +
memoryof (buffer_width) +
memoryof (prolongation_order_space) +
memoryof (boxes) +
memoryof (fast_boxes) +
- memoryof (fast_oldboxes) +
memoryof (gfs);
}
size_t
+dh::
+allmemory ()
+{
+ size_t mem = memoryof(alldh);
+ for (list<dh*>::const_iterator
+ dhi = alldh.begin(); dhi != alldh.end(); ++ dhi)
+ {
+ mem += memoryof(**dhi);
+ }
+ return mem;
+}
+
+size_t
dh::dboxes::
memory ()
const
{
return
memoryof (exterior) +
+ memoryof (owned) +
+ memoryof (interior);
+}
+
+size_t
+dh::full_dboxes::
+memory ()
+ const
+{
+ return
+ memoryof (exterior) +
memoryof (is_outer_boundary) +
memoryof (outer_boundaries) +
memoryof (communicated) +
@@ -1116,6 +1656,135 @@ memory ()
+// Input
+
+istream &
+dh::dboxes::
+input (istream & is)
+{
+ // Regions:
+ try {
+ skipws (is);
+ consume (is, "dh::dboxes:{");
+ skipws (is);
+ consume (is, "exterior:");
+ is >> exterior;
+ exterior_size = exterior.size();
+ skipws (is);
+ consume (is, "owned:");
+ is >> owned;
+ owned_size = owned.size();
+ skipws (is);
+ consume (is, "interior:");
+ is >> interior;
+ skipws (is);
+ consume (is, "active_size:");
+ is >> active_size;
+ skipws (is);
+ consume (is, "}");
+ } catch (input_error & err) {
+ cout << "Input error while reading a dh::full_dboxes" << endl;
+ throw err;
+ }
+ return is;
+}
+
+istream &
+dh::full_dboxes::
+input (istream & is)
+{
+ // Regions:
+ try {
+ skipws (is);
+ consume (is, "dh::full_dboxes:{");
+ skipws (is);
+ consume (is, "exterior:");
+ is >> exterior;
+ skipws (is);
+ consume (is, "is_outer_boundary:");
+ is >> is_outer_boundary;
+ skipws (is);
+ consume (is, "outer_boundaries:");
+ is >> outer_boundaries;
+ skipws (is);
+ consume (is, "communicated:");
+ is >> communicated;
+ skipws (is);
+ consume (is, "boundaries:");
+ is >> boundaries;
+ skipws (is);
+ consume (is, "owned:");
+ is >> owned;
+ skipws (is);
+ consume (is, "buffers:");
+ is >> buffers;
+ skipws (is);
+ consume (is, "active:");
+ is >> active;
+ skipws (is);
+ consume (is, "sync:");
+ is >> sync;
+ skipws (is);
+ consume (is, "bndref:");
+ is >> bndref;
+ skipws (is);
+ consume (is, "ghosts:");
+ is >> ghosts;
+ skipws (is);
+ consume (is, "interior:");
+ is >> interior;
+ skipws (is);
+ consume (is, "}");
+ } catch (input_error & err) {
+ cout << "Input error while reading a dh::full_dboxes" << endl;
+ throw err;
+ }
+ return is;
+}
+
+istream &
+dh::fast_dboxes::
+input (istream & is)
+{
+ // Communication schedule:
+ try {
+ skipws (is);
+ consume (is, "dh::fast_dboxes:{");
+ skipws (is);
+ consume (is, "fast_mg_rest_sendrecv:");
+ is >> fast_mg_rest_sendrecv;
+ skipws (is);
+ consume (is, "fast_mg_prol_sendrecv:");
+ is >> fast_mg_prol_sendrecv;
+ skipws (is);
+ consume (is, "fast_ref_prol_sendrecv:");
+ is >> fast_ref_prol_sendrecv;
+ skipws (is);
+ consume (is, "fast_ref_rest_sendrecv:");
+ is >> fast_ref_rest_sendrecv;
+ skipws (is);
+ consume (is, "fast_sync_sendrecv:");
+ is >> fast_sync_sendrecv;
+ skipws (is);
+ consume (is, "fast_ref_bnd_prol_sendrecv:");
+ is >> fast_ref_bnd_prol_sendrecv;
+ skipws (is);
+ consume (is, "fast_old2new_sync_sendrecv:");
+ is >> fast_old2new_sync_sendrecv;
+ skipws (is);
+ consume (is, "fast_old2new_ref_prol_sendrecv:");
+ is >> fast_old2new_ref_prol_sendrecv;
+ skipws (is);
+ consume (is, "}");
+ } catch (input_error & err) {
+ cout << "Input error while reading a dh::fast_dboxes" << endl;
+ throw err;
+ }
+ return is;
+}
+
+
+
// Output
ostream &
@@ -1149,19 +1818,35 @@ output (ostream & os)
const
{
// Regions:
- os << "dh::dboxes:" << eol;
- os << "exterior:" << exterior << eol;
- os << "is_outer_boundary:" << is_outer_boundary << eol;
- os << "outer_boundaries:" << outer_boundaries << eol;
- os << "communicated:" << communicated << eol;
- os << "boundaries:" << boundaries << eol;
- os << "owned:" << owned << eol;
- os << "buffers:" << buffers << eol;
- os << "active:" << active << eol;
- os << "sync:" << sync << eol;
- os << "bndref:" << bndref << eol;
- os << "ghosts:" << ghosts << eol;
- os << "interior:" << interior << eol;
+ os << "dh::dboxes:{" << eol
+ << " exterior: " << exterior << eol
+ << " owned: " << owned << eol
+ << " interior: " << interior << eol
+ << " active_size: " << active_size << eol
+ << "}" << eol;
+ return os;
+}
+
+ostream &
+dh::full_dboxes::
+output (ostream & os)
+ const
+{
+ // Regions:
+ os << "dh::full_dboxes:{" << eol
+ << " exterior: " << exterior << eol
+ << " is_outer_boundary: " << is_outer_boundary << eol
+ << " outer_boundaries: " << outer_boundaries << eol
+ << " communicated: " << communicated << eol
+ << " boundaries: " << boundaries << eol
+ << " owned: " << owned << eol
+ << " buffers: " << buffers << eol
+ << " active: " << active << eol
+ << " sync: " << sync << eol
+ << " bndref: " << bndref << eol
+ << " ghosts: " << ghosts << eol
+ << " interior: " << interior << eol
+ << "}" << eol;
return os;
}
@@ -1171,14 +1856,15 @@ output (ostream & os)
const
{
// Communication schedule:
- os << "dh::fast_dboxes:" << eol;
- os << "fast_mg_rest_sendrecv: " << fast_mg_rest_sendrecv << eol;
- os << "fast_mg_prol_sendrecv: " << fast_mg_prol_sendrecv << eol;
- os << "fast_ref_prol_sendrecv: " << fast_ref_prol_sendrecv << eol;
- os << "fast_ref_rest_sendrecv: " << fast_ref_rest_sendrecv << eol;
- os << "fast_sync_sendrecv: " << fast_sync_sendrecv << eol;
- os << "fast_ref_bnd_prol_sendrecv: " << fast_ref_bnd_prol_sendrecv << eol;
- os << "fast_old2new_sync_sendrecv:" << fast_old2new_sync_sendrecv << eol;
- os << "fast_old2new_ref_prol_sendrecv:" << fast_old2new_ref_prol_sendrecv << eol;
+ os << "dh::fast_dboxes:{" << eol
+ << " fast_mg_rest_sendrecv: " << fast_mg_rest_sendrecv << eol
+ << " fast_mg_prol_sendrecv: " << fast_mg_prol_sendrecv << eol
+ << " fast_ref_prol_sendrecv: " << fast_ref_prol_sendrecv << eol
+ << " fast_ref_rest_sendrecv: " << fast_ref_rest_sendrecv << eol
+ << " fast_sync_sendrecv: " << fast_sync_sendrecv << eol
+ << " fast_ref_bnd_prol_sendrecv: " << fast_ref_bnd_prol_sendrecv << eol
+ << " fast_old2new_sync_sendrecv: " << fast_old2new_sync_sendrecv << eol
+ << " fast_old2new_ref_prol_sendrecv: " << fast_old2new_ref_prol_sendrecv << eol
+ << "}" << eol;
return os;
}
diff --git a/Carpet/CarpetLib/src/dh.hh b/Carpet/CarpetLib/src/dh.hh
index 078e0b725..93a29f83b 100644
--- a/Carpet/CarpetLib/src/dh.hh
+++ b/Carpet/CarpetLib/src/dh.hh
@@ -24,9 +24,13 @@ class ggf;
class dh;
+
// A data hierarchy (grid hierarchy plus ghost zones)
class dh {
+ static list<dh*> alldh;
+ list<dh*>::iterator alldhi;
+
// Types
public:
typedef list<ibbox> iblist;
@@ -42,6 +46,23 @@ public:
// Region description:
ibbox exterior; // whole region (including boundaries)
+ ibbox owned; // evolved in time
+ ibbox interior; // interior (without ghost zones)
+
+ // Region statistics:
+ typedef ibbox::size_type size_type;
+ size_type exterior_size, owned_size, active_size;
+
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ istream & input (istream & is);
+ ostream & output (ostream & os) const;
+ };
+
+ struct full_dboxes {
+
+ // Complete region description:
+
+ ibbox exterior; // whole region (including boundaries)
b2vect is_outer_boundary;
ibset outer_boundaries; // outer boundary
@@ -61,7 +82,14 @@ public:
ibset ghosts; // ghost zones, as seen from Cactus
ibbox interior; // interior (without ghost zones)
- size_t memory () const;
+ bool operator== (full_dboxes const & b) const;
+ bool operator!= (full_dboxes const & b) const
+ {
+ return not operator==(b);
+ }
+
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ istream & input (istream& is);
ostream & output (ostream & os) const;
};
@@ -78,10 +106,19 @@ public:
// Regridding schedule:
+ bool do_init; // the srpvects below are only defined
+ // if this is true
srpvect fast_old2new_sync_sendrecv;
srpvect fast_old2new_ref_prol_sendrecv;
- size_t memory () const;
+ bool operator== (fast_dboxes const & b) const CCTK_ATTRIBUTE_PURE;
+ bool operator!= (fast_dboxes const & b) const
+ {
+ return not operator==(b);
+ }
+
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ istream & input (istream & is);
ostream & output (ostream & os) const;
};
@@ -91,8 +128,11 @@ private:
typedef vector<cboxes> rboxes; // ... for each refinement level
typedef vector<rboxes> mboxes; // ... for each multigrid level
- typedef vector<fast_dboxes> fast_cboxes; // ... for each component
- typedef vector<fast_cboxes> fast_rboxes; // ... for each refinement level
+ typedef vector<full_dboxes> full_cboxes; // ... for each component
+ typedef vector<full_cboxes> full_rboxes; // ... for each refinement level
+ typedef vector<full_rboxes> full_mboxes; // ... for each multigrid level
+
+ typedef vector<fast_dboxes> fast_rboxes; // ... for each refinement level
typedef vector<fast_rboxes> fast_mboxes; // ... for each multigrid level
@@ -104,16 +144,17 @@ public: // should be readonly
// Fields
gh & h; // hierarchy
+ gh::dh_handle gh_handle;
+
i2vect ghost_width; // number of ghost zones
i2vect buffer_width; // number of buffer zones
int prolongation_order_space; // order of spatial prolongation operator
mboxes boxes; // grid hierarchy
- mboxes oldboxes; // old grid hierarchy, used during regridding
fast_mboxes fast_boxes; // grid hierarchy
- fast_mboxes fast_oldboxes;
+ typedef list<ggf*>::iterator ggf_handle;
list<ggf*> gfs; // list of all grid functions
public:
@@ -127,51 +168,101 @@ public:
~dh ();
// Helpers
- int prolongation_stencil_size () const;
+ int prolongation_stencil_size () const CCTK_ATTRIBUTE_CONST;
// Modifiers
- void regrid ();
+ void regrid (bool do_init);
+ void regrid_free (bool do_init);
void recompose (int rl, bool do_prolongate);
private:
- int this_proc (int rl, int c) const;
- bool on_this_proc (int rl, int c) const;
- bool on_this_proc (int rl, int c, int cc) const;
- int this_oldproc (int rl, int c) const;
- bool on_this_oldproc (int rl, int c) const;
+ int this_proc (int rl, int c) const CCTK_ATTRIBUTE_PURE;
+ bool on_this_proc (int rl, int c) const CCTK_ATTRIBUTE_PURE;
+ bool on_this_proc (int rl, int c, int cc) const CCTK_ATTRIBUTE_PURE;
+ int this_oldproc (int rl, int c) const CCTK_ATTRIBUTE_PURE;
+ bool on_this_oldproc (int rl, int c) const CCTK_ATTRIBUTE_PURE;
+
+ static
+ void
+ broadcast_schedule (vector<fast_dboxes> & fast_level_otherprocs,
+ fast_dboxes & fast_level,
+ srpvect fast_dboxes::* const schedule_item);
public:
// Grid function management
- void add (ggf * f);
- void remove (ggf * f);
+ ggf_handle add (ggf * f);
+ void erase (ggf_handle fi);
// Output
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ static size_t allmemory () CCTK_ATTRIBUTE_PURE;
ostream & output (ostream & os) const;
};
+MPI_Datatype mpi_datatype (dh::dboxes const &) CCTK_ATTRIBUTE_CONST;
+MPI_Datatype mpi_datatype (dh::fast_dboxes const &);
+namespace dist {
+ template<> inline MPI_Datatype mpi_datatype<dh::dboxes> ()
+ CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype<dh::dboxes> ()
+ { dh::dboxes dummy; return mpi_datatype(dummy); }
+ template<> inline MPI_Datatype mpi_datatype<dh::fast_dboxes> ()
+ CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype<dh::fast_dboxes> ()
+ { dh::fast_dboxes dummy; return mpi_datatype(dummy); }
+}
+
+inline size_t memoryof (dh::dboxes const & b) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (dh::dboxes const & b)
{
return b.memory ();
}
+inline size_t memoryof (dh::full_dboxes const & b) CCTK_ATTRIBUTE_PURE;
+inline size_t memoryof (dh::full_dboxes const & b)
+{
+ return b.memory ();
+}
+
+inline size_t memoryof (dh::fast_dboxes const & b) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (dh::fast_dboxes const & b)
{
return b.memory ();
}
+inline size_t memoryof (dh const & d) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (dh const & d)
{
return d.memory ();
}
+inline istream & operator>> (istream & is, dh::dboxes & b)
+{
+ return b.input (is);
+}
+
+inline istream & operator>> (istream & is, dh::full_dboxes & b)
+{
+ return b.input (is);
+}
+
+inline istream & operator>> (istream & is, dh::fast_dboxes & b)
+{
+ return b.input (is);
+}
+
inline ostream & operator<< (ostream & os, dh::dboxes const & b)
{
return b.output (os);
}
+inline ostream & operator<< (ostream & os, dh::full_dboxes const & b)
+{
+ return b.output (os);
+}
+
inline ostream & operator<< (ostream & os, dh::fast_dboxes const & b)
{
return b.output (os);
diff --git a/Carpet/CarpetLib/src/dist.cc b/Carpet/CarpetLib/src/dist.cc
index c870990fb..89acacfad 100644
--- a/Carpet/CarpetLib/src/dist.cc
+++ b/Carpet/CarpetLib/src/dist.cc
@@ -1,4 +1,5 @@
#include <cassert>
+#include <typeinfo>
#include <mpi.h>
#ifdef _OPENMP
@@ -9,6 +10,8 @@
#include "cctk_Parameters.h"
#include "defs.hh"
+#include "limits.hh"
+#include "startup_time.hh"
#include "dist.hh"
@@ -20,9 +23,11 @@ namespace dist {
MPI_Comm comm_ = MPI_COMM_NULL;
- MPI_Datatype mpi_complex8;
- MPI_Datatype mpi_complex16;
- MPI_Datatype mpi_complex32;
+ MPI_Datatype mpi_complex8 = MPI_DATATYPE_NULL;
+ MPI_Datatype mpi_complex16 = MPI_DATATYPE_NULL;
+ MPI_Datatype mpi_complex32 = MPI_DATATYPE_NULL;
+
+ int total_num_threads_ = -1;
void init (int& argc, char**& argv) {
MPI_Init (&argc, &argv);
@@ -34,19 +39,32 @@ namespace dist {
#ifdef HAVE_CCTK_REAL4
CCTK_REAL4 dummy4;
- MPI_Type_contiguous (2, datatype(dummy4), &mpi_complex8);
+ MPI_Type_contiguous (2, mpi_datatype(dummy4), &mpi_complex8);
MPI_Type_commit (&mpi_complex8);
#endif
#ifdef HAVE_CCTK_REAL8
CCTK_REAL8 dummy8;
- MPI_Type_contiguous (2, datatype(dummy8), &mpi_complex16);
+ MPI_Type_contiguous (2, mpi_datatype(dummy8), &mpi_complex16);
MPI_Type_commit (&mpi_complex16);
#endif
#ifdef HAVE_CCTK_REAL16
CCTK_REAL16 dummy16;
- MPI_Type_contiguous (2, datatype(dummy16), &mpi_complex32);
+ MPI_Type_contiguous (2, mpi_datatype(dummy16), &mpi_complex32);
MPI_Type_commit (&mpi_complex32);
#endif
+
+ // Output startup time
+ // cerr << "QQQ: pseudoinit[1]" << endl;
+ CarpetLib::output_startup_time ();
+ // cerr << "QQQ: pseudoinit[2]" << endl;
+
+ // Check and/or modify system limits
+ CarpetLib::set_system_limits ();
+ // cerr << "QQQ: pseudoinit[3]" << endl;
+
+ // cerr << "QQQ: pseudoinit[4]" << endl;
+ collect_total_num_threads ();
+ // cerr << "QQQ: pseudoinit[5]" << endl;
}
void finalize () {
@@ -56,10 +74,27 @@ namespace dist {
// Create an MPI datatype from a C datatype description
- void create_mpi_datatype (size_t const count,
- mpi_struct_descr_t const descr[],
- MPI_Datatype & newtype)
+
+ ostream& operator<< (ostream& os, mpi_struct_descr_t const& descr)
{
+ int type_size;
+ MPI_Type_size (descr.type, &type_size);
+ os << "{"
+ << "blocklength:" << descr.blocklength << ","
+ << "displacement:" << descr.displacement << ","
+ << "type:" << descr.type << ","
+ << "type_size:" << type_size << ","
+ << "field_name:" << descr.field_name << ","
+ << "type_name:" << descr.type_name
+ << "}";
+ return os;
+ }
+
+ MPI_Datatype create_mpi_datatype (size_t const count,
+ mpi_struct_descr_t const descr[],
+ char const * const name, size_t const size)
+ {
+ DECLARE_CCTK_PARAMETERS;
int blocklengths[count];
MPI_Aint displacements[count];
MPI_Datatype types[count];
@@ -68,10 +103,128 @@ namespace dist {
displacements[n] = descr[n].displacement;
types [n] = descr[n].type;
}
+ MPI_Datatype newtype;
MPI_Type_struct (count, blocklengths, displacements, types, &newtype);
MPI_Type_commit (&newtype);
+ if (verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Creating new MPI type for C type %s:", name);
+ cout << " Type has " << count << " components" << endl;
+ for (size_t n=0; n<count; ++n) {
+ cout << " [" << n << "]: " << descr[n] << endl;
+ }
+ cout << " New MPI type ID is " << newtype << endl;
+ int datatypesize;
+ MPI_Type_size (newtype, &datatypesize);
+ cout << " C type size is " << size << endl;
+ cout << " MPI type size is " << datatypesize << endl;
+ }
+ return newtype;
+ }
+
+#if 0
+
+ ostream&
+ generic_mpi_datatype_t::field_t::output (ostream& os) const
+ {
+ int type_size;
+ MPI_Type_size (mpi_datatype, &type_size);
+ os << "{"
+ << "offset:" << offset << ","
+ << "count:" << count << ","
+ << "mpi_datatype:" << mpi_datatype << ","
+ << "type_size:" << type_size << ","
+ << "field_name:" << field_name << ","
+ << "type_name:" << type_name
+ << "}";
+ return os;
+ }
+
+ generic_mpi_datatype_t::generic_mpi_datatype_t (string const type_name_)
+ : type_name (type_name_), type_is_committed (false)
+ {
+ }
+
+ template <typename U>
+ void
+ generic_mpi_datatype_t::add_field (size_t const offset, size_t const count,
+ string const field_name)
+ {
+ assert (not type_is_committed);
+ U u;
+ entries.push_back (field_t (offset, count, mpi_datatype(u),
+ field_name, typeid(U).name()));
+ }
+
+ void
+ generic_mpi_datatype_t::commit ()
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ // Debug output
+ if (verbose) {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Creating new MPI type for C type %s:", type_name.c_str());
+ cout << *this;
+ }
+
+ assert (not type_is_committed);
+ type_is_committed = true;
+
+ // Out of caution -- this could be allowed
+ assert (not entries.empty());
+
+ // Create MPI type
+ size_t const count = entries.size();
+ int blocklengths [count+1];
+ MPI_Aint displacements[count+1];
+ MPI_Datatype types [count+1];
+ {
+ size_t n = 0;
+ for (list<field_t>::const_iterator ifield =
+ entries.begin(); ifield!=entries.end(); ++ifield, ++n)
+ {
+ blocklengths [n] = ifield->count;
+ displacements[n] = ifield->offset;
+ types [n] = ifield->mpi_datatype;
+ }
+ assert (n == count);
+ // Add MPI_UB
+ blocklengths [n] = 1;
+ displacements[n] = type_size();
+ types [n] = MPI_UB;
+ }
+
+ MPI_Type_struct
+ (count+1, blocklengths, displacements, types, &mpi_datatype);
+ MPI_Type_commit (&mpi_datatype);
+ }
+
+ ostream&
+ generic_mpi_datatype_t::output (ostream& os) const
+ {
+ cout << "Datatype: " << type_name << endl;
+ size_t const count = entries.size();
+ cout << " Type has " << count << " components" << endl;
+ {
+ size_t n = 0;
+ for (list<field_t>::const_iterator ifield =
+ entries.begin(); ifield!=entries.end(); ++ifield, ++n)
+ {
+ cout << " [" << n << "]: " << *ifield << endl;
+ }
+ assert (n == count);
+ }
+ cout << " MPI type ID: " << mpi_datatype << endl;
+ int datatypesize;
+ MPI_Type_size (mpi_datatype, &datatypesize);
+ cout << " C type size: " << size << endl;
+ cout << " MPI type size: " << datatypesize << endl;
+ return os;
}
+#endif
+
void checkpoint (const char* file, int line) {
@@ -105,15 +258,48 @@ namespace dist {
}
// Global number of threads
- int total_num_threads_worker ()
+ void collect_total_num_threads ()
{
- int total_num_threads_;
int const mynthreads = num_threads();
+ // cerr << "QQQ: collect_total_num_threads[1]" << endl;
MPI_Allreduce
(const_cast <int *> (& mynthreads), & total_num_threads_, 1, MPI_INT,
MPI_SUM, comm());
+ // cerr << "QQQ: collect_total_num_threads[2]" << endl;
assert (total_num_threads_ >= size());
- return total_num_threads_;
}
-
+
+
+
+ char const * c_datatype_name (unsigned const type)
+ {
+ switch (type) {
+ case 0: return "char";
+ case 1: return "signed char";
+ case 2: return "unsigned char";
+ case 3: return "short";
+ case 4: return "unsigned short";
+ case 5: return "int";
+ case 6: return "unsigned int";
+ case 7: return "long";
+ case 8: return "unsigned long";
+ case 9: return "long long";
+ case 10: return "unsigned long long";
+ case 11: return "float";
+ case 12: return "double";
+ case 13: return "long double";
+#ifdef HAVE_CCTK_COMPLEX8
+ case 14: return "CCTK_COMPLEX8";
+#endif
+#ifdef HAVE_CCTK_COMPLEX16
+ case 15: return "CCTK_COMPLEX16";
+#endif
+#ifdef HAVE_CCTK_COMPLEX32
+ case 16: return "CCTK_COMPLEX32";
+#endif
+ }
+ assert (0); abort();
+ return NULL;
+ }
+
} // namespace dist
diff --git a/Carpet/CarpetLib/src/dist.hh b/Carpet/CarpetLib/src/dist.hh
index 6868d85ce..091da31e4 100644
--- a/Carpet/CarpetLib/src/dist.hh
+++ b/Carpet/CarpetLib/src/dist.hh
@@ -4,6 +4,7 @@
#include <cassert>
#include <cstdio>
#include <cstdlib>
+#include <iostream>
#include <mpi.h>
#ifdef _OPENMP
@@ -26,20 +27,102 @@ namespace dist {
extern MPI_Datatype mpi_complex16;
extern MPI_Datatype mpi_complex32;
+ extern int total_num_threads_;
+
void init (int& argc, char**& argv);
void pseudoinit (MPI_Comm const c);
void finalize ();
+
+
// Create MPI datatypes from C structures
+
struct mpi_struct_descr_t {
int blocklength;
MPI_Aint displacement;
MPI_Datatype type;
+ char const * field_name;
+ char const * type_name;
+ };
+
+ ostream& operator<< (ostream& os, mpi_struct_descr_t const& descr);
+
+ MPI_Datatype create_mpi_datatype (size_t const count,
+ mpi_struct_descr_t const descr[],
+ char const * name, size_t size);
+#if 0
+
+ class generic_mpi_datatype_t {
+
+ string const type_name;
+ virtual size_t type_size() const = 0;
+
+ struct field_t {
+ size_t offset;
+ size_t count;
+ MPI_Datatype mpi_datatype;
+ string field_name;
+ string type_name;
+ field_t (size_t const offset_,
+ size_t const count_,
+ MPI_Datatype const mpi_datatype_,
+ string const field_name_,
+ string const type_name_)
+ : offset(offset_),
+ count(count_),
+ mpi_datatype(mpi_datatype_),
+ field_name(field_name_),
+ type_name(type_name_)
+ {
+ }
+ ostream& output (ostream& os) const;
+ };
+ friend ostream& operator<< (ostream& os,
+ generic_mpi_datatype_t::field_t const& field);
+
+ list<field_t> entries;
+
+ bool type_is_committed;
+ MPI_Datatype mpi_datatype;
+
+ public:
+
+ generic_mpi_datatype_t (string const type_name_);
+
+ template <typename U>
+ void add_field (size_t offset, size_t count, string field_name);
+
+ void commit ();
+
+ MPI_Datatype get () const
+ {
+ assert (type_is_committed);
+ return mpi_datatype;
+ }
+
+ ostream& output (ostream& os) const;
+ };
+
+ template <typename T>
+ class mpi_datatype_t: public generic_mpi_datatype_t {
+ virtual size_t type_size() const
+ {
+ return sizeof(T);
+ }
};
+
+ inline ostream& operator<< (ostream& os,
+ generic_mpi_datatype_t::field_t const& field)
+ {
+ return field.output(os);
+ }
- void create_mpi_datatype (size_t const count,
- mpi_struct_descr_t const descr[],
- MPI_Datatype & newtype);
+ inline ostream& operator<< (ostream& os, generic_mpi_datatype_t const& type)
+ {
+ return type.output(os);
+ }
+
+#endif
@@ -52,18 +135,21 @@ namespace dist {
// Information about the communicator
// Return the communicator
+ inline MPI_Comm comm () CCTK_ATTRIBUTE_CONST;
inline MPI_Comm comm ()
{
return comm_;
}
// Always return a good communicator
+ inline MPI_Comm goodcomm () CCTK_ATTRIBUTE_CONST;
inline MPI_Comm goodcomm ()
{
return comm_ != MPI_COMM_NULL ? comm_ : MPI_COMM_WORLD;
}
// Rank in the communicator (this processor's number, 0 .. size-1)
+ inline int rank () CCTK_ATTRIBUTE_CONST;
inline int rank ()
{
static int rank_ = -1;
@@ -72,6 +158,7 @@ namespace dist {
}
// Size of the communicator
+ inline int size () CCTK_ATTRIBUTE_CONST;
inline int size ()
{
static int size_ = -1;
@@ -83,6 +170,7 @@ namespace dist {
void set_num_threads (int num_threads);
// Local number of threads
+ inline int num_threads () CCTK_ATTRIBUTE_CONST;
inline int num_threads ()
{
static int num_threads_ = -1;
@@ -98,13 +186,10 @@ namespace dist {
}
// Global number of threads
- int total_num_threads_worker ();
+ void collect_total_num_threads ();
+ inline int total_num_threads () CCTK_ATTRIBUTE_CONST;
inline int total_num_threads ()
{
- static int total_num_threads_ = -1;
- if (total_num_threads_ == -1) {
- total_num_threads_ = total_num_threads_worker();
- }
return total_num_threads_;
}
@@ -114,168 +199,248 @@ namespace dist {
// C Datatype helpers
// Map a C datatype to a 0-based index running up to c_ndatatypes().
/////////////////////////////////////////////////////////////////////////
+ inline unsigned int c_datatype (const char&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const char&)
{ return 0; }
- inline unsigned int c_datatype (const signed char&)
+ inline unsigned int c_datatype (const signed char&) CCTK_ATTRIBUTE_CONST;
+ inline unsigned int c_datatype (const signed char&)
{ return 1; }
+ inline unsigned int c_datatype (const unsigned char&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const unsigned char&)
{ return 2; }
+ inline unsigned int c_datatype (const short&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const short&)
{ return 3; }
+ inline unsigned int c_datatype (const unsigned short&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const unsigned short&)
{ return 4; }
+ inline unsigned int c_datatype (const int&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const int&)
{ return 5; }
+ inline unsigned int c_datatype (const unsigned int&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const unsigned int&)
{ return 6; }
+ inline unsigned int c_datatype (const long&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const long&)
{ return 7; }
+ inline unsigned int c_datatype (const unsigned long&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const unsigned long&)
{ return 8; }
+ inline unsigned int c_datatype (const long long&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const long long&)
{ return 9; }
- inline unsigned int c_datatype (const float&)
+ inline unsigned int c_datatype (const unsigned long long&) CCTK_ATTRIBUTE_CONST;
+ inline unsigned int c_datatype (const unsigned long long&)
{ return 10; }
- inline unsigned int c_datatype (const double&)
+ inline unsigned int c_datatype (const float&) CCTK_ATTRIBUTE_CONST;
+ inline unsigned int c_datatype (const float&)
{ return 11; }
- inline unsigned int c_datatype (const long double&)
+ inline unsigned int c_datatype (const double&) CCTK_ATTRIBUTE_CONST;
+ inline unsigned int c_datatype (const double&)
{ return 12; }
+ inline unsigned int c_datatype (const long double&) CCTK_ATTRIBUTE_CONST;
+ inline unsigned int c_datatype (const long double&)
+ { return 13; }
+
#ifdef HAVE_CCTK_COMPLEX8
+ inline unsigned int c_datatype (const CCTK_COMPLEX8&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const CCTK_COMPLEX8&)
- { return 13; }
+ { return 14; }
#endif
#ifdef HAVE_CCTK_COMPLEX16
+ inline unsigned int c_datatype (const CCTK_COMPLEX16&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const CCTK_COMPLEX16&)
- { return 14; }
+ { return 15; }
#endif
#ifdef HAVE_CCTK_COMPLEX32
+ inline unsigned int c_datatype (const CCTK_COMPLEX32&) CCTK_ATTRIBUTE_CONST;
inline unsigned int c_datatype (const CCTK_COMPLEX32&)
- { return 15; }
+ { return 16; }
#endif
// keep this function's return code consistent with functions above
+ inline unsigned int c_ndatatypes () CCTK_ATTRIBUTE_CONST;
inline unsigned int c_ndatatypes ()
- { return 16; }
+ { return 17; }
template <typename T> unsigned int c_datatype () { abort(); }
- template<> inline unsigned int c_datatype <char> () { return 0; }
- template<> inline unsigned int c_datatype <signed char> () { return 1; }
- template<> inline unsigned int c_datatype <unsigned char> () { return 2; }
- template<> inline unsigned int c_datatype <short> () { return 3; }
- template<> inline unsigned int c_datatype <unsigned short> () { return 4; }
- template<> inline unsigned int c_datatype <int> () { return 5; }
- template<> inline unsigned int c_datatype <unsigned int> () { return 6; }
- template<> inline unsigned int c_datatype <long> () { return 7; }
- template<> inline unsigned int c_datatype <unsigned long> () { return 8; }
- template<> inline unsigned int c_datatype <long long> () { return 9; }
- template<> inline unsigned int c_datatype <float> () { return 10; }
- template<> inline unsigned int c_datatype <double> () { return 11; }
- template<> inline unsigned int c_datatype <long double> () { return 12; }
+ template<> inline unsigned int c_datatype <char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <char> () { return 0; }
+ template<> inline unsigned int c_datatype <signed char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <signed char> () { return 1; }
+ template<> inline unsigned int c_datatype <unsigned char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <unsigned char> () { return 2; }
+ template<> inline unsigned int c_datatype <short> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <short> () { return 3; }
+ template<> inline unsigned int c_datatype <unsigned short> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <unsigned short> () { return 4; }
+ template<> inline unsigned int c_datatype <int> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <int> () { return 5; }
+ template<> inline unsigned int c_datatype <unsigned int> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <unsigned int> () { return 6; }
+ template<> inline unsigned int c_datatype <long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <long> () { return 7; }
+ template<> inline unsigned int c_datatype <unsigned long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <unsigned long> () { return 8; }
+ template<> inline unsigned int c_datatype <long long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <long long> () { return 9; }
+ template<> inline unsigned int c_datatype <unsigned long long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <unsigned long long> () { return 10; }
+ template<> inline unsigned int c_datatype <float> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <float> () { return 11; }
+ template<> inline unsigned int c_datatype <double> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <double> () { return 12; }
+ template<> inline unsigned int c_datatype <long double> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <long double> () { return 13; }
#ifdef HAVE_CCTK_COMPLEX8
- template<> inline unsigned int c_datatype <CCTK_COMPLEX8> () { return 13; }
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX8> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX8> () { return 14; }
#endif
#ifdef HAVE_CCTK_COMPLEX16
- template<> inline unsigned int c_datatype <CCTK_COMPLEX16> () { return 14; }
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX16> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX16> () { return 15; }
#endif
#ifdef HAVE_CCTK_COMPLEX32
- template<> inline unsigned int c_datatype <CCTK_COMPLEX32> () { return 15; }
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX32> () CCTK_ATTRIBUTE_CONST;
+ template<> inline unsigned int c_datatype <CCTK_COMPLEX32> () { return 16; }
#endif
+ // Map a C datatype index to a string
+ char const * c_datatype_name (unsigned type) CCTK_ATTRIBUTE_CONST;
+
/////////////////////////////////////////////////////////////////
// MPI Datatype helpers
// Map a C datatype to its corresponding MPI datatype.
/////////////////////////////////////////////////////////////////
- inline MPI_Datatype datatype (const char&)
+ inline MPI_Datatype mpi_datatype (const char&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const char&)
{ return MPI_CHAR; }
- inline MPI_Datatype datatype (const signed char&)
+ inline MPI_Datatype mpi_datatype (const signed char&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const signed char&)
{ return MPI_CHAR; }
- inline MPI_Datatype datatype (const unsigned char&)
+ inline MPI_Datatype mpi_datatype (const unsigned char&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const unsigned char&)
{ return MPI_UNSIGNED_CHAR; }
- inline MPI_Datatype datatype (const short&)
+ inline MPI_Datatype mpi_datatype (const short&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const short&)
{ return MPI_SHORT; }
- inline MPI_Datatype datatype (const unsigned short&)
+ inline MPI_Datatype mpi_datatype (const unsigned short&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const unsigned short&)
{ return MPI_UNSIGNED_SHORT; }
- inline MPI_Datatype datatype (const int&)
+ inline MPI_Datatype mpi_datatype (const int&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const int&)
{ return MPI_INT; }
- inline MPI_Datatype datatype (const unsigned int&)
+ inline MPI_Datatype mpi_datatype (const unsigned int&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const unsigned int&)
{ return MPI_UNSIGNED; }
- inline MPI_Datatype datatype (const long&)
+ inline MPI_Datatype mpi_datatype (const long&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const long&)
{ return MPI_LONG; }
- inline MPI_Datatype datatype (const unsigned long&)
+ inline MPI_Datatype mpi_datatype (const unsigned long&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const unsigned long&)
{ return MPI_UNSIGNED_LONG; }
- inline MPI_Datatype datatype (const long long&)
+ inline MPI_Datatype mpi_datatype (const long long&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const long long&)
{ return MPI_LONG_LONG_INT; }
- inline MPI_Datatype datatype (const float&)
+ inline MPI_Datatype mpi_datatype (const unsigned long long&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const unsigned long long&)
+ { return MPI_LONG_LONG_INT; } // should be unsigned, but this doesn't exist
+
+ inline MPI_Datatype mpi_datatype (const float&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const float&)
{ return MPI_FLOAT; }
- inline MPI_Datatype datatype (const double&)
+ inline MPI_Datatype mpi_datatype (const double&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const double&)
{ return MPI_DOUBLE; }
- inline MPI_Datatype datatype (const long double&)
+ inline MPI_Datatype mpi_datatype (const long double&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const long double&)
{ return MPI_LONG_DOUBLE; }
#ifdef HAVE_CCTK_COMPLEX8
- inline MPI_Datatype datatype (const CCTK_COMPLEX8&)
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX8&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX8&)
{ return mpi_complex8; }
#endif
#ifdef HAVE_CCTK_COMPLEX16
- inline MPI_Datatype datatype (const CCTK_COMPLEX16&)
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX16&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX16&)
{ return mpi_complex16; }
#endif
#ifdef HAVE_CCTK_COMPLEX32
- inline MPI_Datatype datatype (const CCTK_COMPLEX32&)
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX32&) CCTK_ATTRIBUTE_CONST;
+ inline MPI_Datatype mpi_datatype (const CCTK_COMPLEX32&)
{ return mpi_complex32; }
#endif
- template <typename T> MPI_Datatype datatype () { abort(); }
- template<> inline MPI_Datatype datatype <char> () { return MPI_CHAR; }
- template<> inline MPI_Datatype datatype <signed char> () { return MPI_CHAR; }
- template<> inline MPI_Datatype datatype <unsigned char> () { return MPI_UNSIGNED_CHAR; }
- template<> inline MPI_Datatype datatype <short> () { return MPI_SHORT; }
- template<> inline MPI_Datatype datatype <unsigned short> () { return MPI_UNSIGNED_SHORT; }
- template<> inline MPI_Datatype datatype <int> () { return MPI_INT; }
- template<> inline MPI_Datatype datatype <unsigned int> () { return MPI_UNSIGNED; }
- template<> inline MPI_Datatype datatype <long> () { return MPI_LONG; }
- template<> inline MPI_Datatype datatype <unsigned long> () { return MPI_UNSIGNED_LONG; }
- template<> inline MPI_Datatype datatype <long long> () { return MPI_LONG_LONG_INT; }
- template<> inline MPI_Datatype datatype <float> () { return MPI_FLOAT; }
- template<> inline MPI_Datatype datatype <double> () { return MPI_DOUBLE; }
- template<> inline MPI_Datatype datatype <long double> () { return MPI_LONG_DOUBLE; }
+ template <typename T> MPI_Datatype mpi_datatype () { abort(); }
+ template<> inline MPI_Datatype mpi_datatype <char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <char> () { return MPI_CHAR; }
+ template<> inline MPI_Datatype mpi_datatype <signed char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <signed char> () { return MPI_CHAR; }
+ template<> inline MPI_Datatype mpi_datatype <unsigned char> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <unsigned char> () { return MPI_UNSIGNED_CHAR; }
+ template<> inline MPI_Datatype mpi_datatype <short> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <short> () { return MPI_SHORT; }
+ template<> inline MPI_Datatype mpi_datatype <unsigned short> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <unsigned short> () { return MPI_UNSIGNED_SHORT; }
+ template<> inline MPI_Datatype mpi_datatype <int> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <int> () { return MPI_INT; }
+ template<> inline MPI_Datatype mpi_datatype <unsigned int> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <unsigned int> () { return MPI_UNSIGNED; }
+ template<> inline MPI_Datatype mpi_datatype <long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <long> () { return MPI_LONG; }
+ template<> inline MPI_Datatype mpi_datatype <unsigned long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <unsigned long> () { return MPI_UNSIGNED_LONG; }
+ template<> inline MPI_Datatype mpi_datatype <long long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <long long> () { return MPI_LONG_LONG_INT; }
+ template<> inline MPI_Datatype mpi_datatype <unsigned long long> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <unsigned long long> () { return MPI_LONG_LONG_INT; } // should be unsigned, but this doesn't exist
+ template<> inline MPI_Datatype mpi_datatype <float> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <float> () { return MPI_FLOAT; }
+ template<> inline MPI_Datatype mpi_datatype <double> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <double> () { return MPI_DOUBLE; }
+ template<> inline MPI_Datatype mpi_datatype <long double> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <long double> () { return MPI_LONG_DOUBLE; }
#ifdef HAVE_CCTK_COMPLEX8
- template<> inline MPI_Datatype datatype <CCTK_COMPLEX8> () { return mpi_complex8; }
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX8> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX8> () { return mpi_complex8; }
#endif
#ifdef HAVE_CCTK_COMPLEX16
- template<> inline MPI_Datatype datatype <CCTK_COMPLEX16> () { return mpi_complex16; }
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX16> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX16> () { return mpi_complex16; }
#endif
#ifdef HAVE_CCTK_COMPLEX32
- template<> inline MPI_Datatype datatype <CCTK_COMPLEX32> () { return mpi_complex32; }
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX32> () CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype <CCTK_COMPLEX32> () { return mpi_complex32; }
#endif
} // namespace dist
diff --git a/Carpet/CarpetLib/src/fulltree.cc b/Carpet/CarpetLib/src/fulltree.cc
index cb6de5116..3234a73dc 100644
--- a/Carpet/CarpetLib/src/fulltree.cc
+++ b/Carpet/CarpetLib/src/fulltree.cc
@@ -15,6 +15,8 @@ fulltree<T,D,P>::fulltree ()
: type (type_empty)
{
assert (invariant());
+ // This is unused
+ assert (0);
}
@@ -193,6 +195,15 @@ fulltree<T,D,P>::const_iterator::const_iterator (fulltree const & f_)
if (f.is_branch()) {
assert (f.subtrees.size() > 0);
it = new const_iterator (* f.subtrees.at(i));
+ while ((*it).done()) {
+ delete it;
+ it = 0;
+ ++ i;
+ if (done()) break;
+ // to do: use a new function "reset iterator" instead
+ it = new const_iterator (* f.subtrees.at(i));
+ }
+ assert (done() or not (*it).done());
}
}
@@ -253,6 +264,7 @@ fulltree<T,D,P>::const_iterator::operator++ ()
++ i;
} else {
++ *it;
+#if 0
if ((*it).done()) {
delete it;
it = 0;
@@ -260,8 +272,19 @@ fulltree<T,D,P>::const_iterator::operator++ ()
if (not done()) {
// to do: use a new function "reset iterator" instead
it = new const_iterator (* f.subtrees.at(i));
+ assert (not (*it).done());
}
}
+#endif
+ while ((*it).done()) {
+ delete it;
+ it = 0;
+ ++ i;
+ if (done()) break;
+ // to do: use a new function "reset iterator" instead
+ it = new const_iterator (* f.subtrees.at(i));
+ }
+ assert (done() or not (*it).done());
}
return *this;
}
@@ -289,6 +312,15 @@ fulltree<T,D,P>::iterator::iterator (fulltree & f_)
if (f.is_branch()) {
assert (f.subtrees.size() > 0);
it = new iterator (* f.subtrees.at(i));
+ while ((*it).done()) {
+ delete it;
+ it = 0;
+ ++ i;
+ if (done()) break;
+ // to do: use a new function "reset iterator" instead
+ it = new iterator (* f.subtrees.at(i));
+ }
+ assert (done() or not (*it).done());
}
}
@@ -349,6 +381,7 @@ fulltree<T,D,P>::iterator::operator++ ()
++ i;
} else {
++ *it;
+#if 0
if ((*it).done()) {
delete it;
it = 0;
@@ -356,8 +389,19 @@ fulltree<T,D,P>::iterator::operator++ ()
if (not done()) {
// to do: use a new function "reset iterator" instead
it = new iterator (* f.subtrees.at(i));
+ assert (not (*it).done());
}
}
+#endif
+ while ((*it).done()) {
+ delete it;
+ it = 0;
+ ++ i;
+ if (done()) break;
+ // to do: use a new function "reset iterator" instead
+ it = new iterator (* f.subtrees.at(i));
+ }
+ assert (done() or not (*it).done());
}
return *this;
}
@@ -409,7 +453,7 @@ fulltree<T,D,P>::output (ostream & os) const
<< "dir=" << dir << ","
<< "subtrees=[";
for (size_t i=0; i<subtrees.size(); ++i) {
- os << bounds.at(i) << ":[" << i << "]=" << subtrees.at(i) << ":";
+ os << bounds.at(i) << ":[" << i << "]=" << *subtrees.at(i) << ":";
}
os << bounds.at(subtrees.size()) << "]";
} else {
diff --git a/Carpet/CarpetLib/src/fulltree.hh b/Carpet/CarpetLib/src/fulltree.hh
index 4678759b6..82d09be02 100644
--- a/Carpet/CarpetLib/src/fulltree.hh
+++ b/Carpet/CarpetLib/src/fulltree.hh
@@ -163,7 +163,7 @@ public:
#endif
// Memory usage
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
// Output helper
void output (ostream & os) const;
@@ -173,6 +173,8 @@ public:
// Memory usage
template <typename T, int D, typename P>
+inline size_t memoryof (fulltree<T,D,P> const & f) CCTK_ATTRIBUTE_PURE;
+template <typename T, int D, typename P>
inline size_t memoryof (fulltree<T,D,P> const & f) { return f.memory(); }
diff --git a/Carpet/CarpetLib/src/gdata.cc b/Carpet/CarpetLib/src/gdata.cc
index 39c9ebf8c..e1888835c 100644
--- a/Carpet/CarpetLib/src/gdata.cc
+++ b/Carpet/CarpetLib/src/gdata.cc
@@ -26,34 +26,25 @@ using namespace CarpetLib;
-// Hand out the next MPI tag
-static int nexttag ()
-{
- DECLARE_CCTK_PARAMETERS;
-
- int const min_tag = 100;
- static int last = 0;
- ++last;
- if (last >= 30000) last = 0;
- return min_tag + last;
-}
+list<gdata*> gdata::allgdata;
// Constructors
gdata::gdata (const int varindex_,
const centering cent_,
- const operator_type transport_operator_,
- const int tag_)
+ const operator_type transport_operator_)
: _storage(NULL),
varindex(varindex_),
cent(cent_),
transport_operator(transport_operator_),
_has_storage(false),
- comm_active(false),
- tag(tag_ >= 0 ? tag_ : nexttag())
+ comm_active(false)
{
DECLARE_CCTK_PARAMETERS;
+
+ allgdatai = allgdata.insert(allgdata.end(), this);
+
if (barriers) {
MPI_Barrier (dist::comm());
}
@@ -63,6 +54,9 @@ gdata::gdata (const int varindex_,
gdata::~gdata ()
{
DECLARE_CCTK_PARAMETERS;
+
+ allgdata.erase(allgdatai);
+
if (barriers) {
MPI_Barrier (dist::comm());
}
@@ -76,14 +70,17 @@ void
gdata::
copy_from (comm_state & state,
gdata const * const src,
- ibbox const & box)
+ ibbox const & box,
+ int const dstproc,
+ int const srcproc)
{
- vector <gdata const *> srcs (1, src);
+ vector <gdata const *> const srcs (1, src);
CCTK_REAL const time = 0.0;
- vector <CCTK_REAL> times (1, time);
+ vector <CCTK_REAL> const times (1, time);
transfer_from (state,
srcs, times,
box, box,
+ dstproc, srcproc,
time, 0, 0);
}
@@ -96,37 +93,52 @@ transfer_from (comm_state & state,
vector<CCTK_REAL> const & times,
ibbox const & dstbox,
ibbox const & srcbox,
+ int const dstproc,
+ int const srcproc,
CCTK_REAL const time,
int const order_space,
int const order_time)
{
- assert (has_storage());
- assert (not dstbox.empty());
- assert (all(dstbox.lower() >= extent().lower()));
- assert (all(dstbox.upper() <= extent().upper()));
- assert (all(dstbox.stride() == extent().stride()));
- assert (all((dstbox.lower() - extent().lower()) % dstbox.stride() == 0));
-
- assert (not srcbox.empty());
- assert (srcs.size() == times.size() and srcs.size() > 0);
- for (int t=0; t<(int)srcs.size(); ++t) {
- assert (srcs.AT(t)->has_storage());
- assert (all(srcbox.lower() >= srcs.AT(t)->extent().lower()));
- assert (all(srcbox.upper() <= srcs.AT(t)->extent().upper()));
+ bool const is_dst = dist::rank() == dstproc;
+ bool const is_src = dist::rank() == srcproc;
+ // Return early if this communication does not concern us
+ assert (is_dst or is_src); // why should we be here?
+ if (not is_dst and not is_src) return;
+
+ if (is_dst) {
+ assert (proc() == dstproc);
+ assert (has_storage());
+ assert (not dstbox.empty());
+ assert (all(dstbox.lower() >= extent().lower()));
+ assert (all(dstbox.upper() <= extent().upper()));
+ assert (all(dstbox.stride() == extent().stride()));
+ assert (all((dstbox.lower() - extent().lower()) % dstbox.stride() == 0));
}
- gdata const * const src = srcs.AT(0);
- assert (transport_operator != op_error);
- if (transport_operator == op_none) return;
+ if (is_src) {
+ assert (not srcbox.empty());
+ assert (srcs.size() == times.size() and srcs.size() > 0);
+ for (int t=0; t<(int)srcs.size(); ++t) {
+ assert (srcs.AT(t)->proc() == srcproc);
+ assert (srcs.AT(t)->has_storage());
+ assert (all(srcbox.lower() >= srcs.AT(t)->extent().lower()));
+ assert (all(srcbox.upper() <= srcs.AT(t)->extent().upper()));
+ }
+ }
+ gdata const * const src = is_src ? srcs.AT(0) : NULL;
- // Return early if this communication does not concern us
- if (dist::rank() != proc() and dist::rank() != src->proc()) return;
+ operator_type const my_transport_operator =
+ is_dst ? transport_operator : src->transport_operator;
+ assert (my_transport_operator != op_error);
+ assert (my_transport_operator != op_none); // why should we be here?
+ if (my_transport_operator == op_none) return;
// Interpolate either on the source or on the destination processor,
// depending on whether this increases or reduces the amount of data
int timelevel0, ntimelevels;
- find_source_timelevel (times, time, order_time, timelevel0, ntimelevels);
- assert (int (srcs.size()) >= ntimelevels);
+ find_source_timelevel
+ (times, time, order_time, my_transport_operator, timelevel0, ntimelevels);
+ if (is_src) assert (int (srcs.size()) >= ntimelevels);
int const dstpoints = dstbox.size();
int const srcpoints = srcbox.size() * ntimelevels;
bool const interp_on_src = dstpoints <= srcpoints;
@@ -136,46 +148,45 @@ transfer_from (comm_state & state,
case state_get_buffer_sizes:
// don't count processor-local copies
- if (proc() != src->proc()) {
- // if this is a destination processor: advance its recv buffer
- // size
- if (proc() == dist::rank()) {
- state.reserve_recv_space (c_datatype(), src->proc(), npoints);
+ if (not (is_dst and is_src)) {
+ if (is_dst) {
+ // increment the recv buffer size
+ state.reserve_recv_space (c_datatype(), srcproc, npoints);
}
- // if this is a source processor: increment its send buffer size
- if (src->proc() == dist::rank()) {
- state.reserve_send_space (c_datatype(), proc(), npoints);
+ if (is_src) {
+ // increment the send buffer size
+ state.reserve_send_space (src->c_datatype(), dstproc, npoints);
}
}
break;
case state_fill_send_buffers:
- // if this is a source processor: copy its data into the send
- // buffer
- if (proc() != src->proc()) {
- if (src->proc() == dist::rank()) {
+ if (not (is_dst and is_src)) {
+ if (is_src) {
+ // copy the data into the send buffer
if (interp_on_src) {
- size_t const sendbufsize = c_datatype_size() * dstbox.size();
+ size_t const sendbufsize = src->c_datatype_size() * dstbox.size();
void * const sendbuf =
- state.send_buffer (c_datatype(), proc(), dstbox.size());
+ state.send_buffer (src->c_datatype(), dstproc, dstbox.size());
gdata * const buf =
- make_typed (varindex, cent, transport_operator, tag);
- buf->allocate (dstbox, src->proc(), sendbuf, sendbufsize);
+ src->make_typed (src->varindex, src->cent, src->transport_operator);
+ buf->allocate (dstbox, srcproc, sendbuf, sendbufsize);
buf->transfer_from_innerloop
(srcs, times, dstbox, time, order_space, order_time);
delete buf;
- state.commit_send_space (c_datatype(), proc(), dstbox.size());
+ state.commit_send_space (src->c_datatype(), dstproc, dstbox.size());
} else {
for (int tl = timelevel0; tl < timelevel0 + ntimelevels; ++ tl) {
- size_t const sendbufsize = c_datatype_size() * srcbox.size();
+ size_t const sendbufsize = src->c_datatype_size() * srcbox.size();
void * const sendbuf =
- state.send_buffer (c_datatype(), proc(), srcbox.size());
+ state.send_buffer (src->c_datatype(), dstproc, srcbox.size());
gdata * const buf =
- make_typed (varindex, cent, transport_operator, tag);
- buf->allocate (srcbox, src->proc(), sendbuf, sendbufsize);
+ src->make_typed (src->varindex, src->cent,
+ src->transport_operator);
+ buf->allocate (srcbox, srcproc, sendbuf, sendbufsize);
buf->copy_from_innerloop (srcs.AT(tl), srcbox);
delete buf;
- state.commit_send_space (c_datatype(), proc(), srcbox.size());
+ state.commit_send_space (src->c_datatype(), dstproc, srcbox.size());
}
}
}
@@ -184,45 +195,42 @@ transfer_from (comm_state & state,
case state_do_some_work:
// handle the processor-local case
- if (proc() == src->proc()) {
- if (proc() == dist::rank()) {
- transfer_from_innerloop
- (srcs, times, dstbox, time, order_space, order_time);
- }
+ if (is_dst and is_src) {
+ transfer_from_innerloop
+ (srcs, times, dstbox, time, order_space, order_time);
}
break;
case state_empty_recv_buffers:
- // if this is a destination processor: copy it from the recv
- // buffer
- if (proc() != src->proc()) {
- if (proc() == dist::rank()) {
+ if (not (is_dst and is_src)) {
+ if (is_dst) {
+ // copy from the recv buffer
if (interp_on_src) {
size_t const recvbufsize = c_datatype_size() * dstbox.size();
void * const recvbuf =
- state.recv_buffer (c_datatype(), src->proc(), dstbox.size());
- gdata * const buf =
- make_typed (varindex, cent, transport_operator, tag);
- buf->allocate (dstbox, proc(), recvbuf, recvbufsize);
- state.commit_recv_space (c_datatype(), src->proc(), dstbox.size());
+ state.recv_buffer (c_datatype(), srcproc, dstbox.size());
+ gdata * const buf = make_typed (varindex, cent, transport_operator);
+ buf->allocate (dstbox, dstproc, recvbuf, recvbufsize);
+ state.commit_recv_space (c_datatype(), srcproc, dstbox.size());
copy_from_innerloop (buf, dstbox);
delete buf;
} else {
- gdata const * const null = 0;
- vector <gdata const *> bufs (timelevel0 + ntimelevels, null);
- for (int tl = timelevel0; tl < timelevel0 + ntimelevels; ++ tl) {
+ gdata const * const null = NULL;
+ vector <gdata const *> bufs (ntimelevels, null);
+ vector <CCTK_REAL> timebuf (ntimelevels);
+ for (int tl = 0; tl < ntimelevels; ++ tl) {
size_t const recvbufsize = c_datatype_size() * srcbox.size();
void * const recvbuf =
- state.recv_buffer (c_datatype(), src->proc(), srcbox.size());
- gdata * const buf =
- make_typed (varindex, cent, transport_operator, tag);
- buf->allocate (srcbox, proc(), recvbuf, recvbufsize);
- state.commit_recv_space (c_datatype(), src->proc(), srcbox.size());
+ state.recv_buffer (c_datatype(), srcproc, srcbox.size());
+ gdata * const buf = make_typed (varindex, cent, transport_operator);
+ buf->allocate (srcbox, dstproc, recvbuf, recvbufsize);
+ state.commit_recv_space (c_datatype(), srcproc, srcbox.size());
bufs.AT(tl) = buf;
+ timebuf.AT(tl) = times.AT(timelevel0 + tl);
}
transfer_from_innerloop
- (bufs, times, dstbox, time, order_space, order_time);
- for (int tl = timelevel0; tl < timelevel0 + ntimelevels; ++ tl) {
+ (bufs, timebuf, dstbox, time, order_space, order_time);
+ for (int tl = 0; tl < ntimelevels; ++ tl) {
delete bufs.AT(tl);
}
}
@@ -231,7 +239,7 @@ transfer_from (comm_state & state,
break;
default:
- assert (0);
+ assert (0); abort();
}
}
@@ -242,9 +250,9 @@ gdata::
find_source_timelevel (vector <CCTK_REAL> const & times,
CCTK_REAL const time,
int const order_time,
+ operator_type const transport_operator,
int & timelevel0,
int & ntimelevels)
- const
{
// Ensure that the times are consistent
assert (times.size() > 0);
@@ -253,7 +261,8 @@ find_source_timelevel (vector <CCTK_REAL> const & times,
CCTK_REAL const eps = 1.0e-12;
CCTK_REAL const min_time = * min_element (times.begin(), times.end());
CCTK_REAL const max_time = * max_element (times.begin(), times.end());
- CCTK_REAL const some_time = abs (min_time) + abs (max_time);
+ // TODO: Use a real delta-time from somewhere instead of 1.0
+ CCTK_REAL const some_time = abs (min_time) + abs (max_time) + 1.0;
if (transport_operator != op_copy) {
if (time < min_time - eps * some_time or
time > max_time + eps * some_time)
@@ -303,3 +312,18 @@ find_source_timelevel (vector <CCTK_REAL> const & times,
assert (timelevel0 >= 0 and timelevel0 < (int)times.size());
assert (ntimelevels > 0);
}
+
+
+
+size_t
+gdata::
+allmemory ()
+{
+ size_t mem = memoryof(allgdata);
+ for (list<gdata*>::const_iterator
+ gdatai = allgdata.begin(); gdatai != allgdata.end(); ++ gdatai)
+ {
+ mem += memoryof(**gdatai);
+ }
+ return mem;
+}
diff --git a/Carpet/CarpetLib/src/gdata.hh b/Carpet/CarpetLib/src/gdata.hh
index 09622fb34..4b62cf564 100644
--- a/Carpet/CarpetLib/src/gdata.hh
+++ b/Carpet/CarpetLib/src/gdata.hh
@@ -24,14 +24,19 @@ using namespace std;
// A generic data storage without type information
class gdata {
+
+ static list<gdata*> allgdata;
+ list<gdata*>::iterator allgdatai;
protected: // should be readonly
// Fields
void * _storage; // A copy of the storage pointer
-
+
+public:
const int varindex; // Cactus variable index, or -1
+protected:
centering cent;
operator_type transport_operator;
@@ -47,8 +52,6 @@ protected: // should be readonly
bool comm_active; // a communication is going on
MPI_Request request; // outstanding MPI request
- int tag; // MPI tag for this object
-
private:
// Forbid copying and passing by value
gdata (gdata const &);
@@ -59,8 +62,7 @@ public:
// Constructors
gdata (const int varindex,
const centering cent = error_centered,
- const operator_type transport_operator = op_error,
- const int tag = -1);
+ const operator_type transport_operator = op_error);
// Destructors
virtual ~gdata ();
@@ -69,8 +71,7 @@ public:
virtual gdata*
make_typed (const int varindex,
const centering cent = error_centered,
- const operator_type transport_operator = op_error,
- const int tag = -1) const = 0;
+ const operator_type transport_operator = op_error) const = 0;
// Storage management
virtual void allocate (const ibbox& extent, const int proc,
@@ -148,7 +149,9 @@ public:
void
copy_from (comm_state & state,
gdata const * src,
- ibbox const & box);
+ ibbox const & box,
+ int dstproc,
+ int srcproc);
void
transfer_from (comm_state & state,
@@ -156,18 +159,21 @@ public:
vector<CCTK_REAL> const & times,
ibbox const & dstbox,
ibbox const & srcbox,
+ int dstproc,
+ int srcproc,
CCTK_REAL time,
int order_space,
int order_time);
protected:
+ static
void
find_source_timelevel (vector <CCTK_REAL> const & times,
CCTK_REAL time,
int order_time,
+ operator_type transport_operator,
int & timelevel0,
- int & ntimelevels)
- const;
+ int & ntimelevels);
private:
virtual
@@ -186,8 +192,25 @@ private:
int order_time)
= 0;
+public:
+ virtual size_t memory () const CCTK_ATTRIBUTE_PURE = 0;
+ static size_t allmemory () CCTK_ATTRIBUTE_PURE;
+ virtual ostream& output (ostream& os) const = 0;
};
+inline size_t memoryof (gdata const & d) CCTK_ATTRIBUTE_PURE;
+inline size_t memoryof (gdata const & d)
+{
+ return d.memory ();
+}
+
+inline ostream& operator<< (ostream& os, const gdata& d)
+{
+ return d.output(os);
+}
+
+
+
#endif // GDATA_HH
diff --git a/Carpet/CarpetLib/src/gf.cc b/Carpet/CarpetLib/src/gf.cc
index 37b06db75..696628c59 100644
--- a/Carpet/CarpetLib/src/gf.cc
+++ b/Carpet/CarpetLib/src/gf.cc
@@ -41,23 +41,23 @@ gf<T>::~gf ()
// Access to the data
template<typename T>
-const data<T>* gf<T>::operator() (int tl, int rl, int c, int ml) const
+const data<T>* gf<T>::operator() (int tl, int rl, int lc, int ml) const
{
assert (rl>=0 and rl<h.reflevels());
- assert (c>=0 and c<h.components(rl));
+ assert (lc>=0 and lc<h.local_components(rl));
assert (ml>=0 and ml<h.mglevels());
assert (tl>=0 and tl<timelevels(ml, rl));
- return (const data<T>*)storage.AT(ml).AT(rl).AT(c).AT(tl);
+ return (const data<T>*)storage.AT(ml).AT(rl).AT(lc).AT(tl);
}
template<typename T>
-data<T>* gf<T>::operator() (int tl, int rl, int c, int ml)
+data<T>* gf<T>::operator() (int tl, int rl, int lc, int ml)
{
assert (rl>=0 and rl<h.reflevels());
- assert (c>=0 and c<h.components(rl));
+ assert (lc>=0 and lc<h.local_components(rl));
assert (ml>=0 and ml<h.mglevels());
assert (tl>=0 and tl<timelevels(ml, rl));
- return (data<T>*)storage.AT(ml).AT(rl).AT(c).AT(tl);
+ return (data<T>*)storage.AT(ml).AT(rl).AT(lc).AT(tl);
}
diff --git a/Carpet/CarpetLib/src/gf.hh b/Carpet/CarpetLib/src/gf.hh
index d5feb0a63..be0a1bb94 100644
--- a/Carpet/CarpetLib/src/gf.hh
+++ b/Carpet/CarpetLib/src/gf.hh
@@ -46,13 +46,11 @@ public:
// Helpers
-protected:
-
- virtual gdata* typed_data (int tl, int rl, int c, int ml)
+ virtual gdata* typed_data (int tl, int rl, int lc, int ml) const
{
data<T>* const vl =
this->vectorleader
- ? (data<T>*)(*this->vectorleader)(tl,rl,c,ml)
+ ? (data<T>*)(*this->vectorleader)(tl,rl,lc,ml)
: NULL;
return new data<T>(this->varindex,
h.refcent, this->transport_operator,
@@ -64,11 +62,9 @@ protected:
// Access to the data
-public:
-
- virtual const data<T>* operator() (int tl, int rl, int c, int ml) const;
+ virtual const data<T>* operator() (int tl, int rl, int lc, int ml) const;
- virtual data<T>* operator() (int tl, int rl, int c, int ml);
+ virtual data<T>* operator() (int tl, int rl, int lc, int ml);
diff --git a/Carpet/CarpetLib/src/ggf.cc b/Carpet/CarpetLib/src/ggf.cc
index 41e6787dc..d975a55a1 100644
--- a/Carpet/CarpetLib/src/ggf.cc
+++ b/Carpet/CarpetLib/src/ggf.cc
@@ -7,6 +7,8 @@
#include "cctk.h"
+#include "CarpetTimers.hh"
+
#include "defs.hh"
#include "dh.hh"
#include "th.hh"
@@ -19,6 +21,10 @@ using namespace CarpetLib;
+list<ggf*> ggf::allggf;
+
+
+
// Constructors
ggf::ggf (const int varindex_, const operator_type transport_operator_,
th& t_, dh& d_,
@@ -44,12 +50,15 @@ ggf::ggf (const int varindex_, const operator_type transport_operator_,
timelevels_.AT(ml).resize(d.h.reflevels(), 0);
}
- d.add(this);
+ allggfi = allggf.insert(allggf.end(), this);
+
+ dh_handle = d.add(this);
}
// Destructors
ggf::~ggf () {
- d.remove(this);
+ d.erase(dh_handle);
+ allggf.erase(allggfi);
}
// Comparison
@@ -69,23 +78,24 @@ void ggf::set_timelevels (const int ml, const int rl, const int new_timelevels)
if (new_timelevels < timelevels(ml,rl)) {
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
+ for (int lc=0; lc<h.local_components(rl); ++ lc) {
for (int tl=new_timelevels; tl<timelevels(ml,rl); ++tl) {
- delete storage.AT(ml).AT(rl).AT(c).AT(tl);
+ delete storage.AT(ml).AT(rl).AT(lc).AT(tl);
}
- storage.AT(ml).AT(rl).AT(c).resize (new_timelevels);
- } // for c
+ storage.AT(ml).AT(rl).AT(lc).resize (new_timelevels);
+ } // for lc
} else if (new_timelevels > timelevels(ml,rl)) {
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
- storage.AT(ml).AT(rl).AT(c).resize (new_timelevels);
+ for (int lc=0; lc<h.local_components(rl); ++ lc) {
+ int const c = h.get_component(rl,lc);
+ storage.AT(ml).AT(rl).AT(lc).resize (new_timelevels);
for (int tl=timelevels(ml,rl); tl<new_timelevels; ++tl) {
- storage.AT(ml).AT(rl).AT(c).AT(tl) = typed_data(tl,rl,c,ml);
- storage.AT(ml).AT(rl).AT(c).AT(tl)->allocate
- (d.boxes.AT(ml).AT(rl).AT(c).exterior, h.processor(rl,c));
+ storage.AT(ml).AT(rl).AT(lc).AT(tl) = typed_data(tl,rl,lc,ml);
+ storage.AT(ml).AT(rl).AT(lc).AT(tl)->allocate
+ (d.boxes.AT(ml).AT(rl).AT(c).exterior, dist::rank());
} // for tl
- } // for c
+ } // for lc
}
@@ -97,34 +107,39 @@ void ggf::set_timelevels (const int ml, const int rl, const int new_timelevels)
void ggf::recompose_crop ()
{
// Free storage that will not be needed
- static Timer timer ("ggf::recompose_crop");
+ static Carpet::Timer timer ("CarpetLib::ggf::recompose_crop");
timer.start ();
for (int ml=0; ml<h.mglevels(); ++ml) {
for (int rl=h.reflevels(); rl<(int)storage.AT(ml).size(); ++rl) {
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
- for (int tl=0; tl<(int)storage.AT(ml).AT(rl).AT(c).size(); ++tl) {
- delete storage.AT(ml).AT(rl).AT(c).AT(tl);
+ for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) {
+ for (int tl=0; tl<(int)storage.AT(ml).AT(rl).AT(lc).size(); ++tl) {
+ delete storage.AT(ml).AT(rl).AT(lc).AT(tl);
} // for tl
- } // for c
+ } // for lc
} // for rl
storage.AT(ml).resize(h.reflevels());
} // for ml
- timer.stop (0);
+ timer.stop ();
}
void ggf::recompose_allocate (const int rl)
{
// Retain storage that might be needed
- static Timer timer ("ggf::recompose_allocate");
+ static Carpet::Timer timer ("CarpetLib::ggf::recompose_allocate");
timer.start ();
oldstorage.resize(storage.size());
for (int ml=0; ml<(int)storage.size(); ++ml) {
oldstorage.AT(ml).resize(storage.AT(ml).size());
+#if 0
oldstorage.AT(ml).AT(rl) = storage.AT(ml).AT(rl);
storage.AT(ml).AT(rl).clear();
+#else
+ oldstorage.AT(ml).AT(rl).clear();
+ swap (storage.AT(ml).AT(rl), oldstorage.AT(ml).AT(rl));
+#endif
}
for (int ml=0; ml<d.h.mglevels(); ++ml) {
@@ -135,32 +150,36 @@ void ggf::recompose_allocate (const int rl)
storage.resize(h.mglevels());
for (int ml=0; ml<h.mglevels(); ++ml) {
storage.AT(ml).resize(h.reflevels());
- storage.AT(ml).AT(rl).resize(h.components(rl));
- for (int c=0; c<h.components(rl); ++c) {
- storage.AT(ml).AT(rl).AT(c).resize(timelevels(ml,rl));
+ storage.AT(ml).AT(rl).resize(h.local_components(rl));
+ for (int lc=0; lc<h.local_components(rl); ++ lc) {
+ int const c = h.get_component(rl,lc);
+ storage.AT(ml).AT(rl).AT(lc).resize(timelevels(ml,rl));
for (int tl=0; tl<timelevels(ml,rl); ++tl) {
- storage.AT(ml).AT(rl).AT(c).AT(tl) = typed_data(tl,rl,c,ml);
- storage.AT(ml).AT(rl).AT(c).AT(tl)->allocate
- (d.boxes.AT(ml).AT(rl).AT(c).exterior, h.processor(rl,c));
+ storage.AT(ml).AT(rl).AT(lc).AT(tl) = typed_data(tl,rl,lc,ml);
+ storage.AT(ml).AT(rl).AT(lc).AT(tl)->allocate
+ (d.boxes.AT(ml).AT(rl).AT(c).exterior, dist::rank());
} // for tl
- } // for c
+ } // for lc
} // for ml
- timer.stop (0);
+ timer.stop ();
}
void ggf::recompose_fill (comm_state & state, int const rl,
bool const do_prolongate)
{
// Initialise the new storage
- static Timer timer ("ggf::recompose_fill");
+ static Carpet::Timer timer ("CarpetLib::ggf::recompose_fill");
timer.start ();
-
+
for (int ml = 0; ml < h.mglevels(); ++ ml) {
+ assert (d.fast_boxes.AT(ml).AT(rl).do_init);
+
vector <int> tls;
if (do_prolongate and rl > 0 and
- transport_operator != op_none and transport_operator != op_sync)
+ transport_operator != op_none and transport_operator != op_sync and
+ transport_operator != op_restrict)
{
int const numtl = timelevels (ml, rl);
tls.resize (numtl);
@@ -185,7 +204,9 @@ void ggf::recompose_fill (comm_state & state, int const rl,
// Initialise from a coarser level of the new hierarchy, where
// possible
if (rl > 0) {
- if (transport_operator != op_none and transport_operator != op_sync) {
+ if (transport_operator != op_none and transport_operator != op_sync and
+ transport_operator != op_restrict)
+ {
for (int tl = 0; tl < timelevels (ml, rl); ++tl) {
transfer_from_all (state,
tl, rl, ml,
@@ -199,43 +220,43 @@ void ggf::recompose_fill (comm_state & state, int const rl,
} // for ml
- timer.stop (0);
+ timer.stop ();
}
void ggf::recompose_free_old (const int rl)
{
// Delete old storage
- static Timer timer ("dh::recompose_free_old");
+ static Carpet::Timer timer ("dh::recompose_free_old");
timer.start ();
for (int ml=0; ml<(int)oldstorage.size(); ++ml) {
- for (int c=0; c<(int)oldstorage.AT(ml).AT(rl).size(); ++c) {
- for (int tl=0; tl<timelevels(ml,rl); ++tl) {
- delete oldstorage.AT(ml).AT(rl).AT(c).AT(tl);
+ for (int lc=0; lc<(int)oldstorage.AT(ml).AT(rl).size(); ++lc) {
+ for (int tl=0; tl<(int)oldstorage.AT(ml).AT(rl).AT(lc).size(); ++tl) {
+ delete oldstorage.AT(ml).AT(rl).AT(lc).AT(tl);
} // for tl
- } // for c
+ } // for lc
oldstorage.AT(ml).AT(rl).clear();
} // for ml
- timer.stop (0);
+ timer.stop ();
}
void ggf::recompose_free (const int rl)
{
// Delete old storage
- static Timer timer ("dh::recompose_free");
+ static Carpet::Timer timer ("dh::recompose_free");
timer.start ();
for (int ml=0; ml<(int)storage.size(); ++ml) {
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
+ for (int lc=0; lc<h.local_components(rl); ++ lc) {
for (int tl=0; tl<timelevels(ml,rl); ++tl) {
- delete storage.AT(ml).AT(rl).AT(c).AT(tl);
+ delete storage.AT(ml).AT(rl).AT(lc).AT(tl);
} // for tl
- } // for c
+ } // for lc
storage.AT(ml).AT(rl).clear();
} // for ml
- timer.stop (0);
+ timer.stop ();
}
@@ -246,8 +267,8 @@ void ggf::cycle_all (int const rl, int const ml) {
assert (ml>=0 and ml<h.mglevels());
int const ntl = timelevels(ml,rl);
assert (ntl > 0);
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
- fdata & fdatas = storage.AT(ml).AT(rl).AT(c);
+ for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) {
+ fdata & fdatas = storage.AT(ml).AT(rl).AT(lc);
gdata * const tmpdata = fdatas.AT(ntl-1);
for (int tl=ntl-1; tl>0; --tl) {
fdatas.AT(tl) = fdatas.AT(tl-1);
@@ -260,8 +281,8 @@ void ggf::cycle_all (int const rl, int const ml) {
void ggf::flip_all (int const rl, int const ml) {
assert (rl>=0 and rl<h.reflevels());
assert (ml>=0 and ml<h.mglevels());
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
- fdata & fdatas = storage.AT(ml).AT(rl).AT(c);
+ for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) {
+ fdata & fdatas = storage.AT(ml).AT(rl).AT(lc);
for (int tl=0; tl<(timelevels(ml,rl)-1)/2; ++tl) {
const int tl1 = tl;
const int tl2 = timelevels(ml,rl)-1 - tl;
@@ -279,15 +300,13 @@ void ggf::flip_all (int const rl, int const ml) {
void ggf::fill_all (int const rl, int const ml) {
assert (rl>=0 and rl<h.reflevels());
assert (ml>=0 and ml<h.mglevels());
- for (int c=0; c<(int)storage.AT(ml).AT(rl).size(); ++c) {
- if (h.is_local(rl,c)) {
- fdata const & fdatas = storage.AT(ml).AT(rl).AT(c);
- void const * const srcptr = fdatas.AT(0)->storage();
- size_t const size = fdatas.AT(0)->size() * fdatas.AT(0)->elementsize();
- for (int tl=1; tl<timelevels(ml,rl); ++tl) {
- void * const dstptr = fdatas.AT(tl)->storage();
- memcpy (dstptr, srcptr, size);
- }
+ for (int lc=0; lc<(int)storage.AT(ml).AT(rl).size(); ++lc) {
+ fdata const & fdatas = storage.AT(ml).AT(rl).AT(lc);
+ void const * const srcptr = fdatas.AT(0)->storage();
+ size_t const size = fdatas.AT(0)->size() * fdatas.AT(0)->elementsize();
+ for (int tl=1; tl<timelevels(ml,rl); ++tl) {
+ void * const dstptr = fdatas.AT(tl)->storage();
+ memcpy (dstptr, srcptr, size);
}
}
}
@@ -322,7 +341,9 @@ ref_bnd_prolongate_all (comm_state & state,
{
// Interpolate
assert (rl>=1);
- if (transport_operator == op_none or transport_operator == op_sync) return;
+ if (transport_operator == op_none or transport_operator == op_sync or
+ transport_operator == op_restrict)
+ return;
vector<int> tl2s;
static Timer timer ("ref_bnd_prolongate_all");
timer.start ();
@@ -435,7 +456,9 @@ ref_prolongate_all (comm_state & state,
CCTK_REAL const time)
{
assert (rl>=1);
- if (transport_operator == op_none or transport_operator == op_sync) return;
+ if (transport_operator == op_none or transport_operator == op_sync or
+ transport_operator == op_restrict)
+ return;
static Timer timer ("ref_prolongate_all");
timer.start ();
vector<int> tl2s;
@@ -467,8 +490,7 @@ transfer_from_all (comm_state & state,
assert (ml1>=0 and ml1<h.mglevels());
assert (tl1>=0 and tl1<timelevels(ml1,rl1));
- int const p = dist::rank();
- srpvect const & psendrecvs = d.fast_boxes.AT(ml1).AT(rl1).AT(p).*sendrecvs;
+ srpvect const & psendrecvs = d.fast_boxes.AT(ml1).AT(rl1).*sendrecvs;
// Return early if this communication does not concern us
if (psendrecvs.empty()) return;
@@ -482,7 +504,11 @@ transfer_from_all (comm_state & state,
assert (rl2>=0 and rl2<(int)srcstorage.AT(ml2).size());
for (size_t i = 0; i < tl2s.size(); ++ i) {
int const tl2 = tl2s.AT(i);
- assert (tl2>=0 and tl2<(int)srcstorage.AT(ml2).AT(rl2).AT(0).size());
+ assert (tl2>=0);
+ int const lc = 0;
+ if (lc < int(srcstorage.AT(ml2).AT(rl2).size())) {
+ assert (tl2<(int)srcstorage.AT(ml2).AT(rl2).AT(lc).size());
+ }
}
// Set up source times
@@ -514,14 +540,21 @@ transfer_from_all (comm_state & state,
ibbox const & recv = precv.extent;
int const c2 = psend.component;
int const c1 = precv.component;
+ int const lc2 = h.get_local_component(rl2,c2);
+ int const lc1 = h.get_local_component(rl1,c1);
+ int const p2 = h.processor(rl2,c2);
+ int const p1 = h.processor(rl1,c1);
// Source and destination data
- gdata * const dst = storage.AT(ml1).AT(rl1).AT(c1).AT(tl1);
+ gdata * const dst =
+ lc1>=0 ? storage.AT(ml1).AT(rl1).AT(lc1).AT(tl1) : NULL;
cdata const & srcs = srcstorage.AT(ml2).AT(rl2);
for (int i=0; i<(int)gsrcs.size(); ++i) {
- gsrcs.AT(i) = srcs.AT(c2).AT(tl2s.AT(i));
+ gsrcs.AT(i) = lc2>=0 ? srcs.AT(lc2).AT(tl2s.AT(i)) : NULL;
}
- dst->transfer_from (state, gsrcs, times, recv, send, time, pos, pot);
+
+ dst->transfer_from
+ (state, gsrcs, times, recv, send, p1, p2 , time, pos, pot);
}
total.stop (0);
@@ -546,3 +579,16 @@ memory ()
memoryof (vectorleader) +
memoryof (oldstorage);
}
+
+size_t
+ggf::
+allmemory ()
+{
+ size_t mem = memoryof(allggf);
+ for (list<ggf*>::const_iterator
+ ggfi = allggf.begin(); ggfi != allggf.end(); ++ ggfi)
+ {
+ mem += memoryof(**ggfi);
+ }
+ return mem;
+}
diff --git a/Carpet/CarpetLib/src/ggf.hh b/Carpet/CarpetLib/src/ggf.hh
index b2c86b8db..f89a73ee0 100644
--- a/Carpet/CarpetLib/src/ggf.hh
+++ b/Carpet/CarpetLib/src/ggf.hh
@@ -28,6 +28,9 @@ ostream& operator<< (ostream& os, const ggf& f);
// A generic grid function without type information
class ggf {
+
+ static list<ggf*> allggf;
+ list<ggf*>::iterator allggfi;
// Types
typedef list<ibbox> iblist;
@@ -38,7 +41,7 @@ class ggf {
typedef gdata* tdata; // data ...
typedef vector<tdata> fdata; // ... for each time level
- typedef vector<fdata> cdata; // ... for each component
+ typedef vector<fdata> cdata; // ... for each local component
typedef vector<cdata> rdata; // ... for each refinement level
typedef vector<rdata> mdata; // ... for each multigrid level
@@ -53,6 +56,7 @@ public: // should be readonly
const gh &h; // grid hierarchy
dh &d; // data hierarchy
+ dh::ggf_handle dh_handle;
protected:
vector<vector<int> > timelevels_; // time levels [ml][rl]
@@ -80,10 +84,10 @@ public:
virtual ~ggf ();
// Comparison
- bool operator== (const ggf& f) const;
+ bool operator== (const ggf& f) const CCTK_ATTRIBUTE_PURE;
// Querying
- int timelevels (int const ml, int const rl) const
+ int timelevels (int const ml, int const rl) const CCTK_ATTRIBUTE_PURE
{
return timelevels_.AT(ml).AT(rl);
}
@@ -141,9 +145,7 @@ public:
// Helpers
-protected:
-
- virtual gdata* typed_data (int tl, int rl, int c, int ml) = 0;
+ virtual gdata* typed_data (int tl, int rl, int lc, int ml) const = 0;
@@ -181,13 +183,14 @@ protected:
public:
// Access to the data
- virtual const gdata* operator() (int tl, int rl, int c, int ml) const = 0;
- virtual gdata* operator() (int tl, int rl, int c, int ml) = 0;
+ virtual const gdata* operator() (int tl, int rl, int lc, int ml) const CCTK_ATTRIBUTE_PURE = 0;
+ virtual gdata* operator() (int tl, int rl, int lc, int ml) CCTK_ATTRIBUTE_PURE = 0;
// Output
- virtual size_t memory () const;
+ virtual size_t memory () const CCTK_ATTRIBUTE_PURE = 0;
+ static size_t allmemory () CCTK_ATTRIBUTE_PURE;
virtual ostream& output (ostream& os) const = 0;
private:
@@ -199,6 +202,7 @@ private:
+inline size_t memoryof (ggf const & f) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (ggf const & f)
{
return f.memory ();
diff --git a/Carpet/CarpetLib/src/gh.cc b/Carpet/CarpetLib/src/gh.cc
index 9ecdb925c..21cb399a6 100644
--- a/Carpet/CarpetLib/src/gh.cc
+++ b/Carpet/CarpetLib/src/gh.cc
@@ -6,6 +6,8 @@
#include "cctk.h"
#include "cctk_Parameters.h"
+#include "CarpetTimers.hh"
+
#include "defs.hh"
#include "dh.hh"
#include "th.hh"
@@ -19,7 +21,11 @@ using namespace CarpetLib;
- // Constructors
+list<gh*> gh::allgh;
+
+
+
+// Constructors
gh::
gh (vector<ivect> const & reffacts_, centering const refcent_,
int const mgfact_, centering const mgcent_,
@@ -65,12 +71,15 @@ gh (vector<ivect> const & reffacts_, centering const refcent_,
boundary_width[0] + boundary_width[1]));
}
}
+
+ allghi = allgh.insert(allgh.end(), this);
}
// Destructors
gh::
~gh ()
{
+ allgh.erase(allghi);
}
@@ -78,14 +87,16 @@ gh::
// Modifiers
void
gh::
-regrid (rregs const & superregs, mregs const & regs)
+regrid (rregs const & superregs, mregs const & regs, bool const do_init)
{
DECLARE_CCTK_PARAMETERS;
+
+ static Carpet::Timer timer ("CarpetLib::gh::regrid");
+ timer.start();
superregions = superregs;
- // Save the grid hierarchy
- oldregions.clear ();
+ assert (oldregions.empty());
swap (oldregions, regions);
regions = regs;
@@ -182,19 +193,70 @@ regrid (rregs const & superregs, mregs const & regs)
}
}
+
+
+ // Calculate global and local components
+ global_components_.resize(reflevels());
+ local_components_.resize(reflevels());
+ for (int rl=0; rl<reflevels(); ++rl) {
+ {
+ int lc = 0;
+ for (int c=0; c<components(rl); ++c) {
+ lc += is_local(rl,c);
+ }
+ global_components_.AT(rl).resize(lc);
+ }
+ local_components_.AT(rl).resize(components(rl));
+ {
+ int lc = 0;
+ for (int c=0; c<components(rl); ++c) {
+ if (is_local(rl,c)) {
+ global_components_.AT(rl).AT(lc) = c;
+ local_components_.AT(rl).AT(c) = lc;
+ ++lc;
+ } else {
+ local_components_.AT(rl).AT(c) = -1;
+ }
+ }
+ }
+ }
+
+
+
// Output
if (output_bboxes) {
do_output_bboxes (cout);
do_output_bases (cout);
}
+
+
// Regrid the other hierarchies
for (list<th*>::iterator t=ths.begin(); t!=ths.end(); ++t) {
(*t)->regrid();
}
for (list<dh*>::iterator d=dhs.begin(); d!=dhs.end(); ++d) {
- (*d)->regrid();
+ (*d)->regrid(do_init);
+ }
+
+ timer.stop();
+}
+
+
+
+void
+gh::
+regrid_free (bool const do_init)
+{
+ oldregions.clear();
+
+ for (list<th*>::iterator t=ths.begin(); t!=ths.end(); ++t) {
+ (*t)->regrid_free();
+ }
+
+ for (list<dh*>::iterator d=dhs.begin(); d!=dhs.end(); ++d) {
+ (*d)->regrid_free(do_init);
}
}
@@ -205,11 +267,6 @@ gh::
recompose (int const rl,
bool const do_prolongate)
{
- // Handle changes in number of mglevels
- if (oldregions.size() != regions.size()) {
- oldregions.resize (regions.size());
- }
-
bool const do_recompose = level_did_change(rl);
if (do_recompose) {
@@ -219,12 +276,6 @@ recompose (int const rl,
(*d)->recompose (rl, do_prolongate);
}
- // Overwrite old with new grid hierarchy
- for (int ml=0; ml<mglevels(); ++ml) {
- oldregions.AT(ml).resize (regions.AT(ml).size());
- oldregions.AT(ml).AT(rl) = regions.AT(ml).AT(rl);
- }
-
}
return do_recompose;
@@ -235,7 +286,6 @@ recompose (int const rl,
bool
gh::
level_did_change (int const rl)
- const
{
// Find out whether this level changed
if (regions.size() != oldregions.size()) return true;
@@ -263,11 +313,23 @@ gh::
local_components (int const rl)
const
{
- int lc = 0;
- for (int c=0; c<components(rl); ++c) {
- lc += is_local(rl,c);
- }
- return lc;
+ return global_components_.AT(rl).size();
+}
+
+int
+gh::
+get_component (int const rl, int const lc)
+ const
+{
+ return global_components_.AT(rl).AT(lc);
+}
+
+int
+gh::
+get_local_component (int const rl, int const c)
+ const
+{
+ return local_components_.AT(rl).AT(c);
}
@@ -374,36 +436,36 @@ locate_position (ivect const & ipos,
// Time hierarchy management
-void
+gh::th_handle
gh::
add (th * const t)
{
- ths.push_back (t);
+ return ths.insert(ths.end(), t);
}
void
gh::
-remove (th * const t)
+erase (th_handle const ti)
{
- ths.remove (t);
+ ths.erase(ti);
}
// Data hierarchy management
-void
+gh::dh_handle
gh::
add (dh * const d)
{
- dhs.push_back (d);
+ return dhs.insert(dhs.end(), d);
}
void
gh::
-remove (dh * const d)
+erase (dh_handle di)
{
- dhs.remove (d);
+ dhs.erase (di);
}
@@ -416,6 +478,7 @@ memory ()
const
{
return
+ sizeof allghi + // memoryof (allghi) +
memoryof (reffacts) +
memoryof (refcent) +
memoryof (mgfact) +
@@ -428,6 +491,19 @@ memory ()
memoryof (dhs);
}
+size_t
+gh::
+allmemory ()
+{
+ size_t mem = memoryof(allgh);
+ for (list<gh*>::const_iterator
+ ghi = allgh.begin(); ghi != allgh.end(); ++ ghi)
+ {
+ mem += memoryof(**ghi);
+ }
+ return mem;
+}
+
// Output
diff --git a/Carpet/CarpetLib/src/gh.hh b/Carpet/CarpetLib/src/gh.hh
index b80d71ca3..1942ae38b 100644
--- a/Carpet/CarpetLib/src/gh.hh
+++ b/Carpet/CarpetLib/src/gh.hh
@@ -28,6 +28,9 @@ class gh;
// level. The extents do not include ghost zones.
class gh {
+ static list<gh*> allgh;
+ list<gh*>::iterator allghi;
+
public:
// Types
@@ -47,14 +50,21 @@ public: // should be readonly
vector<vector<ibbox> > baseextents; // [ml][rl]
const i2vect boundary_width;
+private:
+ vector<vector<int> > global_components_; // [rl][lc]
+ vector<vector<int> > local_components_; // [rl][c]
+public:
+
// Extents of the regions before distributing them over the
// processors
rregs superregions;
mregs regions; // extents and properties of all grids
- mregs oldregions; // a copy, used during regridding
+ mregs oldregions; // extents and properties of all grids
+ typedef list<th*>::iterator th_handle;
list<th*> ths; // list of all time hierarchies
+ typedef list<dh*>::iterator dh_handle;
list<dh*> dhs; // list of all data hierarchies
public:
@@ -69,64 +79,67 @@ public:
~gh ();
// Modifiers
- void regrid (rregs const & superregs, mregs const & regs);
+ void regrid (rregs const & superregs, mregs const & regs, bool do_init);
+ void regrid_free (bool do_init);
bool recompose (int rl, bool do_prolongate);
private:
- bool level_did_change (int rl) const;
+ bool level_did_change (int rl) CCTK_ATTRIBUTE_PURE;
// Accessors
public:
- ibbox const & extent (const int ml, const int rl, const int c) const
+ ibbox const & extent (const int ml, const int rl, const int c) const CCTK_ATTRIBUTE_PURE
{
return regions.AT(ml).AT(rl).AT(c).extent;
}
- ibbox const & baseextent (const int ml, const int rl) const
+ ibbox const & baseextent (const int ml, const int rl) const CCTK_ATTRIBUTE_PURE
{
return baseextents.AT(ml).AT(rl);
}
- b2vect const & outer_boundaries (const int rl, const int c) const
+ b2vect const & outer_boundaries (const int rl, const int c) const CCTK_ATTRIBUTE_PURE
{
return regions.AT(0).AT(rl).AT(c).outer_boundaries;
}
- int processor (const int rl, const int c) const
+ int processor (const int rl, const int c) const CCTK_ATTRIBUTE_PURE
{
return regions.AT(0).AT(rl).AT(c).processor;
}
- int old_processor (const int rl, const int c) const
+ int old_processor (const int rl, const int c) const CCTK_ATTRIBUTE_PURE
{
return oldregions.AT(0).AT(rl).AT(c).processor;
}
- int mglevels () const
+ int mglevels () const CCTK_ATTRIBUTE_PURE
{
return (int)regions.size();
}
- int reflevels () const
+ int reflevels () const CCTK_ATTRIBUTE_PURE
{
if (mglevels() == 0) return 0;
return (int)regions.AT(0).size();
}
- int components (const int rl) const
+ int components (const int rl) const CCTK_ATTRIBUTE_PURE
{
return (int)regions.AT(0).AT(rl).size();
}
- bool is_local (const int rl, const int c) const
+ bool is_local (const int rl, const int c) const CCTK_ATTRIBUTE_PURE
{
return processor(rl,c) == dist::rank();
}
- int local_components (const int rl) const;
+ int local_components (int rl) const CCTK_ATTRIBUTE_PURE;
+ int get_component (int rl, int lc) const CCTK_ATTRIBUTE_PURE;
+ int get_local_component (int rl, int c) const CCTK_ATTRIBUTE_PURE;
void locate_position (rvect const & rpos,
int const ml,
@@ -139,15 +152,16 @@ public:
int & rl, int & c, ivect & aligned_ipos) const;
// Time hierarchy management
- void add (th * t);
- void remove (th * t);
+ th_handle add (th * t);
+ void erase (th_handle ti);
// Data hierarchy management
- void add (dh * d);
- void remove (dh * d);
+ dh_handle add (dh * d);
+ void erase (dh_handle di);
// Output
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ static size_t allmemory () CCTK_ATTRIBUTE_PURE;
ostream & output (ostream & os) const;
private:
@@ -158,6 +172,7 @@ private:
+inline size_t memoryof (gh const & g) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (gh const & g)
{
return g.memory ();
diff --git a/Carpet/CarpetLib/src/interpolate_3d_2tl.cc b/Carpet/CarpetLib/src/interpolate_3d_2tl.cc
index 0b984b142..9dad6a55d 100644
--- a/Carpet/CarpetLib/src/interpolate_3d_2tl.cc
+++ b/Carpet/CarpetLib/src/interpolate_3d_2tl.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/interpolate_3d_3tl.cc b/Carpet/CarpetLib/src/interpolate_3d_3tl.cc
index c0e8b44fd..6fdaa854d 100644
--- a/Carpet/CarpetLib/src/interpolate_3d_3tl.cc
+++ b/Carpet/CarpetLib/src/interpolate_3d_3tl.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/interpolate_3d_4tl.cc b/Carpet/CarpetLib/src/interpolate_3d_4tl.cc
index 7d4c7fe26..0a2f5c66c 100644
--- a/Carpet/CarpetLib/src/interpolate_3d_4tl.cc
+++ b/Carpet/CarpetLib/src/interpolate_3d_4tl.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/interpolate_3d_5tl.cc b/Carpet/CarpetLib/src/interpolate_3d_5tl.cc
index f4204ea68..848d04a7e 100644
--- a/Carpet/CarpetLib/src/interpolate_3d_5tl.cc
+++ b/Carpet/CarpetLib/src/interpolate_3d_5tl.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/interpolate_eno_3d_3tl.cc b/Carpet/CarpetLib/src/interpolate_eno_3d_3tl.cc
index f3693c220..729bb20b5 100644
--- a/Carpet/CarpetLib/src/interpolate_eno_3d_3tl.cc
+++ b/Carpet/CarpetLib/src/interpolate_eno_3d_3tl.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/Carpet/src/Limits.cc b/Carpet/CarpetLib/src/limits.cc
index 47b92f945..f3c5ed650 100644
--- a/Carpet/Carpet/src/Limits.cc
+++ b/Carpet/CarpetLib/src/limits.cc
@@ -8,7 +8,9 @@
#include "defs.hh"
-namespace Carpet {
+#include "limits.hh"
+
+namespace CarpetLib {
using namespace std;
@@ -29,7 +31,7 @@ namespace Carpet {
void
- SetSystemLimits ()
+ set_system_limits ()
{
DECLARE_CCTK_PARAMETERS;
set_limit (RLIMIT_CORE, "core file size", max_core_size_MB);
@@ -86,7 +88,7 @@ namespace Carpet {
if (value == RLIM_INFINITY) {
s << "[unlimited]";
} else {
- s << (value / (CCTK_REAL) (1024*1024)) << " MB";
+ s << (value / CCTK_REAL (1024*1024)) << " MB";
}
}
diff --git a/Carpet/CarpetLib/src/limits.hh b/Carpet/CarpetLib/src/limits.hh
new file mode 100644
index 000000000..910f02e26
--- /dev/null
+++ b/Carpet/CarpetLib/src/limits.hh
@@ -0,0 +1,8 @@
+#include <cctk.h>
+
+namespace CarpetLib {
+
+ void
+ set_system_limits ();
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/make.code.defn b/Carpet/CarpetLib/src/make.code.defn
index 88f6261ce..81a0352ad 100644
--- a/Carpet/CarpetLib/src/make.code.defn
+++ b/Carpet/CarpetLib/src/make.code.defn
@@ -13,12 +13,16 @@ SRCS = bbox.cc \
gf.cc \
ggf.cc \
gh.cc \
+ limits.cc \
mem.cc \
+ mpi_string.cc \
region.cc \
+ startup_time.cc \
th.cc \
timestat.cc \
vect.cc \
copy_3d.cc \
+ copy_4d.cc \
interpolate_3d_2tl.cc \
interpolate_3d_3tl.cc \
interpolate_3d_4tl.cc \
@@ -26,6 +30,7 @@ SRCS = bbox.cc \
interpolate_eno_3d_3tl.cc \
restrict_3d_cc_rf2.cc \
restrict_3d_rf2.cc \
+ restrict_4d_rf2.cc \
prolongate_3d_cc_rf2.cc \
prolongate_3d_o1_rf2.cc \
prolongate_3d_o3_rf2.cc \
@@ -33,8 +38,13 @@ SRCS = bbox.cc \
prolongate_3d_o7_rf2.cc \
prolongate_3d_o9_rf2.cc \
prolongate_3d_o11_rf2.cc \
+ prolongate_3d_cc_o0_rf2.cc \
+ prolongate_3d_cc_o1_rf2.cc \
+ prolongate_3d_cc_o2_rf2.cc \
+ prolongate_3d_o5_monotone_rf2.cc \
prolongate_3d_real8_eno.F90 \
- prolongate_3d_real8_weno.F90
+ prolongate_3d_real8_weno.F90 \
+ prolongate_4d_o1_rf2.cc
# Subdirectories containing source files
SUBDIRS =
diff --git a/Carpet/CarpetLib/src/mem.cc b/Carpet/CarpetLib/src/mem.cc
index 848988637..b3840a115 100644
--- a/Carpet/CarpetLib/src/mem.cc
+++ b/Carpet/CarpetLib/src/mem.cc
@@ -21,6 +21,11 @@
#include "defs.hh"
#include "dist.hh"
+#include "dh.hh"
+#include "gdata.hh"
+#include "ggf.hh"
+#include "gh.hh"
+#include "th.hh"
#include "mem.hh"
@@ -30,12 +35,18 @@ using namespace std;
+double const MEGA = 1024*1024;
+
+
+
struct mstat {
- // Carpet statistics
+ // Carpet object statistics
double total_bytes;
double total_objects;
double max_bytes;
double max_objects;
+ // Carpet administrative data structure statistics
+ double total_admin_bytes;
// malloc statistics
double malloc_used_bytes;
double malloc_free_bytes;
@@ -71,15 +82,15 @@ mem (size_t const vectorlength, size_t const nelems,
if (memptr == NULL) {
const double nbytes = vectorlength * nelems * sizeof (T);
if (max_allowed_memory_MB > 0
- and (total_allocated_bytes + nbytes > 1.0e6 * max_allowed_memory_MB))
+ and (total_allocated_bytes + nbytes > MEGA * max_allowed_memory_MB))
{
T Tdummy;
CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
"Refusing to allocate %.0f bytes (%.3f MB) of memory for type %s. %.0f bytes (%.3f MB) are currently allocated in %d objects. The parameter file specifies a maximum of %d MB",
- double(nbytes), double(nbytes/1.0e6),
+ double(nbytes), double(nbytes/MEGA),
typestring(Tdummy),
double(total_allocated_bytes),
- double(total_allocated_bytes/1.0e6),
+ double(total_allocated_bytes/MEGA),
int(total_allocated_objects),
int(max_allowed_memory_MB));
}
@@ -90,10 +101,10 @@ mem (size_t const vectorlength, size_t const nelems,
T Tdummy;
CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
"Failed to allocate %.0f bytes (%.3f MB) of memory for type %s. %.0f bytes (%.3f MB) are currently allocated in %d objects",
- double(nbytes), double(nbytes/1.0e6),
+ double(nbytes), double(nbytes/MEGA),
typestring(Tdummy),
double(total_allocated_bytes),
- double(total_allocated_bytes/1.0e6),
+ double(total_allocated_bytes/MEGA),
int(total_allocated_objects));
}
total_allocated_bytes += nbytes;
@@ -214,7 +225,7 @@ alloc (size_t nbytes)
if (not freeptr) {
CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, CCTK_THORNSTRING,
"Failed to allocate %.3f MB of memory",
- double(freesize/1.0e6));
+ double(freesize/MEGA));
}
// Remember the pointer so that it can be freed
chunks.push (freeptr);
@@ -251,40 +262,6 @@ memory ()
-extern "C" void CarpetLib_setmemlimit (CCTK_ARGUMENTS);
-
-void CarpetLib_setmemlimit (CCTK_ARGUMENTS)
-{
- DECLARE_CCTK_ARGUMENTS;
- DECLARE_CCTK_PARAMETERS;
-
- // Set address space limit
- struct rlimit aslimit;
- {
- check (not getrlimit (RLIMIT_AS, & aslimit));
- }
- CCTK_VInfo (CCTK_THORNSTRING,
- "Old address space size limit: hard=%lld, soft=%lld",
- (long long) aslimit.rlim_max, (long long) aslimit.rlim_cur);
- if (max_allowed_memory_MB > 0) {
- aslimit.rlim_cur = max_allowed_memory_MB * 1000000LL;
- }
- {
- check (not setrlimit (RLIMIT_AS, & aslimit));
- }
- {
- check (not getrlimit (RLIMIT_AS, & aslimit));
- }
- CCTK_VInfo (CCTK_THORNSTRING,
- "Old address space size limit: hard=%lld, soft=%lld",
- (long long) aslimit.rlim_max, (long long) aslimit.rlim_cur);
- CCTK_VInfo (CCTK_THORNSTRING,
- "(Unlimited address space size indicated by %lld)",
- (long long) RLIM_INFINITY);
-}
-
-
-
extern "C" void CarpetLib_printmemstats (CCTK_ARGUMENTS);
void CarpetLib_printmemstats (CCTK_ARGUMENTS)
@@ -294,14 +271,17 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
int const ioproc = 0;
- if (print_memstats_every > 0
- and cctk_iteration % print_memstats_every == 0)
+ if ((print_memstats_every == 0 and cctk_iteration == 0) or
+ (print_memstats_every > 0 and cctk_iteration % print_memstats_every == 0))
{
mstat mybuf;
mybuf.total_bytes = total_allocated_bytes;
mybuf.total_objects = total_allocated_objects;
mybuf.max_bytes = max_allocated_bytes;
mybuf.max_objects = max_allocated_objects;
+ mybuf.total_admin_bytes =
+ gh::allmemory() + dh::allmemory() + th::allmemory() +
+ ggf::allmemory() + gdata::allmemory();
#ifdef HAVE_MALLINFO
// NOTE: struct mallinfo returns byte-counts as int, which can
// overflow. In this case, the information is incorrect.
@@ -316,14 +296,23 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
cout << "Memory statistics from CarpetLib:" << eol
<< " Current number of objects: " << total_allocated_objects << eol
<< " Current allocated memory: "
- << setprecision(3) << total_allocated_bytes / 1.0e6 << " MB" << eol
+ << setprecision(3) << total_allocated_bytes / MEGA << " MB" << eol
<< " Maximum number of objects: " << max_allocated_objects << eol
<< " Maximum allocated memory: "
- << setprecision(3) << max_allocated_bytes / 1.0e6 << " MB" << eol
+ << setprecision(3) << max_allocated_bytes / MEGA << " MB" << eol
+ << " Current administrative memory: "
+ << setprecision(3) << mybuf.total_admin_bytes / MEGA << " MB" << eol
<< " Total allocated used system memory: "
- << setprecision(3) << mybuf.malloc_used_bytes / 1.0e6 << " MB" << eol
+ << setprecision(3) << mybuf.malloc_used_bytes / MEGA << " MB" << eol
<< " Total allocated free system memory: "
- << setprecision(3) << mybuf.malloc_free_bytes / 1.0e6 << " MB" << endl;
+ << setprecision(3) << mybuf.malloc_free_bytes / MEGA << " MB" << endl;
+
+#warning "TODO"
+ cout << " gh::allmemory: " << gh ::allmemory() << eol
+ << " dh::allmemory: " << dh ::allmemory() << eol
+ << " th::allmemory: " << th ::allmemory() << eol
+ << " ggf::allmemory: " << ggf ::allmemory() << eol
+ << " gdata::allmemory: " << gdata::allmemory() << endl;
if (strcmp (memstat_file, "") != 0) {
vector<mstat> allbuf (dist::size());
@@ -333,9 +322,15 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
if (dist::rank() == ioproc) {
+ double max_total_bytes = 0;
+ double avg_total_bytes = 0;
+ double cnt_total_bytes = 0;
double max_max_bytes = 0;
double avg_max_bytes = 0;
double cnt_max_bytes = 0;
+ double max_admin_bytes = 0;
+ double avg_admin_bytes = 0;
+ double cnt_admin_bytes = 0;
double max_used_bytes = 0;
double avg_used_bytes = 0;
double cnt_used_bytes = 0;
@@ -343,9 +338,15 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
double avg_free_bytes = 0;
double cnt_free_bytes = 0;
for (size_t n=0; n<allbuf.size(); ++n) {
+ max_total_bytes = max (max_total_bytes, allbuf[n].total_bytes);
+ avg_total_bytes += allbuf[n].total_bytes;
+ ++ cnt_total_bytes;
max_max_bytes = max (max_max_bytes, allbuf[n].max_bytes);
avg_max_bytes += allbuf[n].max_bytes;
++ cnt_max_bytes;
+ max_admin_bytes = max (max_admin_bytes, allbuf[n].total_admin_bytes);
+ avg_admin_bytes += allbuf[n].total_admin_bytes;
+ ++ cnt_admin_bytes;
max_used_bytes = max (max_used_bytes, allbuf[n].malloc_used_bytes);
avg_used_bytes += allbuf[n].malloc_used_bytes;
++ cnt_used_bytes;
@@ -353,7 +354,9 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
avg_free_bytes += allbuf[n].malloc_free_bytes;
++ cnt_free_bytes;
}
+ avg_total_bytes /= cnt_total_bytes;
avg_max_bytes /= cnt_max_bytes;
+ avg_admin_bytes /= cnt_admin_bytes;
avg_used_bytes /= cnt_used_bytes;
avg_free_bytes /= cnt_free_bytes;
@@ -377,13 +380,15 @@ void CarpetLib_printmemstats (CCTK_ARGUMENTS)
}
file << "# Running on " << dist::size() << " processors" << eol;
file << "#" << eol;
- file << "# iteration maxmaxbytes avgmaxbytes maxusedbytes avgusedbytes maxfreebytes avgfreebytes" << eol;
+ file << "# iteration maxtotalbytes avgtotalbytes maxmaxbytes avgm avgfreebytes" << eol;
} else {
file.open (filename.c_str(), ios::out | ios::app);
}
file << cctk_iteration
+ << "\t "<< max_total_bytes << " " << avg_total_bytes
<< "\t "<< max_max_bytes << " " << avg_max_bytes
+ << "\t "<< max_admin_bytes << " " << avg_admin_bytes
<< "\t "<< max_used_bytes << " " << avg_used_bytes
<< "\t "<< max_free_bytes << " " << avg_free_bytes
<< eol;
diff --git a/Carpet/CarpetLib/src/mem.hh b/Carpet/CarpetLib/src/mem.hh
index dbd976c21..fe8694d32 100644
--- a/Carpet/CarpetLib/src/mem.hh
+++ b/Carpet/CarpetLib/src/mem.hh
@@ -24,7 +24,7 @@ public:
T * memptr = NULL, size_t memsize = 0);
~mem ();
- T * storage (size_t vectorindex) const
+ T * storage (size_t vectorindex) const CCTK_ATTRIBUTE_PURE
{
assert (vectorindex < vectorlength_);
assert (clients_.AT(vectorindex));
@@ -33,13 +33,15 @@ public:
void register_client (size_t vectorindex);
void unregister_client (size_t vectorindex);
- bool has_clients () const;
+ bool has_clients () const CCTK_ATTRIBUTE_PURE;
// Memory usage
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
};
template<typename T>
+inline size_t memoryof (mem<T> const & m) CCTK_ATTRIBUTE_PURE;
+template<typename T>
inline size_t memoryof (mem<T> const & m) { return m.memory(); }
@@ -84,9 +86,10 @@ public:
void * alloc (size_t nbytes);
// Memory usage
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
};
+inline size_t memoryof (mempool const & m) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (mempool const & m) { return m.memory(); }
#endif // ifndef MEM_HH
diff --git a/Carpet/CarpetLib/src/mpi_string.cc b/Carpet/CarpetLib/src/mpi_string.cc
new file mode 100644
index 000000000..063ed0bdf
--- /dev/null
+++ b/Carpet/CarpetLib/src/mpi_string.cc
@@ -0,0 +1,480 @@
+#include <algorithm>
+#include <cassert>
+#include <cstring>
+#include <string>
+#include <vector>
+
+#include <mpi.h>
+
+#include "cctk.h"
+
+#include "dh.hh"
+#include "mpi_string.hh"
+#include "region.hh"
+
+
+
+namespace CarpetLib
+{
+
+ using namespace std;
+
+
+
+ vector <string>
+ allgather_string (MPI_Comm const comm,
+ string const & data)
+ {
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Gather the lengths of the data strings
+ int const length = data.length();
+ vector <int> lengths (num_procs);
+
+ MPI_Allgather (const_cast <int *> (& length), 1, MPI_INT,
+ & lengths.front(), 1, MPI_INT,
+ comm);
+
+ // Allocate space for all data strings
+ vector <int> offsets (num_procs + 1);
+ offsets.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets.AT(n + 1) = offsets.AT(n) + lengths.AT(n);
+ }
+ int const total_length = offsets.AT(num_procs);
+ vector <char> alldata_buffer (total_length);
+
+ // Gather all data strings
+ MPI_Allgatherv (const_cast <char *> (data.c_str()), length, MPI_CHAR,
+ & alldata_buffer.front(),
+ const_cast <int *> (& lengths.front()),
+ const_cast <int *> (& offsets.front()),
+ MPI_CHAR,
+ comm);
+
+ // Convert data buffer with C strings to C++ strings
+ vector <string> alldata (num_procs);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ alldata.AT(n) =
+ string (& alldata_buffer.AT (offsets.AT(n)), lengths.AT(n));
+ }
+
+ return alldata;
+ }
+
+
+
+ vector <string>
+ alltoallv_string (MPI_Comm const comm,
+ vector<string> const & data)
+ {
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Exchange the lengths of the data strings
+ vector <int> lengths_in (num_procs);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ lengths_in.AT(n) = data.AT(n).length();
+ }
+ vector <int> lengths (num_procs);
+ MPI_Alltoall (& lengths_in.front(), 1, MPI_INT,
+ & lengths.front(), 1, MPI_INT,
+ comm);
+
+ // Allocate space for all data strings
+ vector <int> offsets_in (num_procs + 1);
+ offsets_in.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_in.AT(n + 1) = offsets_in.AT(n) + lengths_in.AT(n);
+ }
+ int const total_length_in = offsets_in.AT(num_procs);
+ vector <char> alldata_buffer_in (total_length_in);
+
+ vector <int> offsets (num_procs + 1);
+ offsets.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets.AT(n + 1) = offsets.AT(n) + lengths.AT(n);
+ }
+ int const total_length = offsets.AT(num_procs);
+ vector <char> alldata_buffer (total_length);
+
+ // Convert C++ strings to data buffer with C strings
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ memcpy (& alldata_buffer_in.AT (offsets_in.AT(n)),
+ data.AT(n).c_str(),
+ lengths_in.AT(n));
+ }
+
+ // Exchange all data strings
+ MPI_Alltoallv (& alldata_buffer_in.front(),
+ & lengths_in.front(), & offsets_in.front(), MPI_CHAR,
+ & alldata_buffer.front(),
+ & lengths.front(), & offsets.front(), MPI_CHAR,
+ comm);
+
+ // Convert data buffer with C strings to C++ strings
+ vector <string> alldata (num_procs);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ alldata.AT(n) =
+ string (& alldata_buffer.AT (offsets.AT(n)), lengths.AT(n));
+ }
+
+ return alldata;
+ }
+
+
+
+ string
+ broadcast_string (MPI_Comm const comm,
+ int const root,
+ string const & data)
+ {
+ // Get my rank
+ int rank;
+ MPI_Comm_rank (comm, & rank);
+
+ if (rank == root) {
+
+ // Broadcast the length of the data string
+ int const length = data.length();
+ MPI_Bcast (const_cast <int *> (& length), 1, MPI_INT, root, comm);
+
+ // Broadcast data string
+ char const * const buf = data.c_str();
+ MPI_Bcast (const_cast <char *> (buf), length, MPI_CHAR, root, comm);
+
+ // Return original string
+ return data;
+
+ } else {
+
+ // Broadcast the length of the data string
+ int length;
+ MPI_Bcast (& length, 1, MPI_INT, root, comm);
+
+ // Allocate space for data string
+ vector <char> data_buffer (length);
+
+ // Broadcast data string
+ char * const buf = & data_buffer.front();
+ MPI_Bcast (buf, length, MPI_CHAR, root, comm);
+
+ // Convert data buffer with C strings to C++ strings
+ string const result = string (& data_buffer.front(), length);
+
+ return result;
+
+ }
+ }
+
+
+
+ //////////////////////////////////////////////////////////////////////////////
+
+
+
+ template <typename T>
+ vector <vector <T> >
+ allgatherv (MPI_Comm comm,
+ vector <T> const & data)
+ {
+ // cerr << "QQQ: allgatherv[0]" << endl;
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Exchange the sizes of the data vectors
+ int const size_in = data.size();
+ vector <int> sizes_out (num_procs);
+ // cerr << "QQQ: allgatherv[1] size_in=" << size_in << endl;
+ MPI_Allgather (const_cast <int *> (& size_in), 1, MPI_INT,
+ & sizes_out.front(), 1, MPI_INT,
+ comm);
+ // cerr << "QQQ: allgatherv[2]" << endl;
+
+ // Allocate space for all data vectors
+ vector <int> offsets_out (num_procs + 1);
+ offsets_out.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_out.AT(n + 1) = offsets_out.AT(n) + sizes_out.AT(n);
+ }
+ int const total_length_out = offsets_out.AT(num_procs);
+ vector <T> alldata_buffer_out (total_length_out);
+
+ // Exchange all data vectors
+ T const dummy;
+ MPI_Datatype const type = mpi_datatype (dummy);
+ int datatypesize;
+ MPI_Type_size (type, &datatypesize);
+ // cerr << "QQQ: allgatherv[3] total_length_out=" << total_length_out << " datatypesize=" << datatypesize << endl;
+#if 0
+ MPI_Allgatherv (const_cast <T *> (& data.front()),
+ size_in, type,
+ & alldata_buffer_out.front(),
+ & sizes_out.front(), & offsets_out.front(), type,
+ comm);
+#else
+ int const typesize = sizeof(T);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ sizes_out.AT(n) *= typesize;
+ offsets_out.AT(n) *= typesize;
+ }
+ MPI_Allgatherv (const_cast <T *> (& data.front()),
+ size_in * typesize, MPI_CHAR,
+ & alldata_buffer_out.front(),
+ & sizes_out.front(), & offsets_out.front(), MPI_CHAR,
+ comm);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ sizes_out.AT(n) /= typesize;
+ offsets_out.AT(n) /= typesize;
+ }
+#endif
+ // cerr << "QQQ: allgatherv[4]" << endl;
+
+ // Convert data buffer to vectors
+ vector <vector <T> > alldata_out (num_procs);
+ {
+ typename vector <T>::const_iterator p = alldata_buffer_out.begin();
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ typename vector <T>::const_iterator const pold = p;
+ advance (p, sizes_out.AT(n));
+ alldata_out.AT(n).assign (pold, p);
+ }
+ assert (p == alldata_buffer_out.end());
+ }
+
+ // cerr << "QQQ: allgatherv[5]" << endl;
+ return alldata_out;
+ }
+
+
+
+ template <typename T>
+ vector <T>
+ alltoall (MPI_Comm const comm,
+ vector <T> const & data)
+ {
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Allocate space for all data
+ vector <T> alldata (num_procs);
+
+ // Exchange all data vectors
+ T const dummy;
+ MPI_Datatype const type = mpi_datatype (dummy);
+ MPI_Alltoall (& data.front(), 1, type,
+ & alldata.front(), 1, type,
+ comm);
+
+ return alldata;
+ }
+
+
+
+ template <typename T>
+ vector <vector <T> >
+ alltoallv (MPI_Comm const comm,
+ vector <vector <T> > const & data)
+ {
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Exchange the sizes of the data vectors
+ vector <int> sizes_in (num_procs);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ sizes_in.AT(n) = data.AT(n).size();
+ }
+ vector <int> sizes_out (num_procs);
+ MPI_Alltoall (& sizes_in.front(), 1, MPI_INT,
+ & sizes_out.front(), 1, MPI_INT,
+ comm);
+
+ // Copy vectors to data buffer
+ vector <int> offsets_in (num_procs + 1);
+ offsets_in.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_in.AT(n + 1) = offsets_in.AT(n) + sizes_in.AT(n);
+ }
+ int const total_length_in = offsets_in.AT(num_procs);
+ vector <T> alldata_buffer_in;
+ alldata_buffer_in.reserve (total_length_in);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ alldata_buffer_in.insert (alldata_buffer_in.end(),
+ data.AT(n).begin(), data.AT(n).end());
+ }
+
+ // Allocate space for all data vectors
+ vector <int> offsets_out (num_procs + 1);
+ offsets_out.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_out.AT(n + 1) = offsets_out.AT(n) + sizes_out.AT(n);
+ }
+ int const total_length_out = offsets_out.AT(num_procs);
+ vector <T> alldata_buffer_out (total_length_out);
+
+ // Exchange all data vectors
+ T const dummy;
+ MPI_Datatype const type = mpi_datatype (dummy);
+ MPI_Alltoallv (& alldata_buffer_in.front(),
+ & sizes_in.front(), & offsets_in.front(), type,
+ & alldata_buffer_out.front(),
+ & sizes_out.front(), & offsets_out.front(), type,
+ comm);
+
+ // Convert data buffer to vectors
+ vector <vector <T> > alldata_out (num_procs);
+ {
+ typename vector <T>::const_iterator p = alldata_buffer_out.begin();
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ typename vector <T>::const_iterator const pold = p;
+ advance (p, sizes_out.AT(n));
+ alldata_out.AT(n).assign (pold, p);
+ }
+ }
+
+ return alldata_out;
+ }
+
+
+
+ template <typename T>
+ vector <T>
+ alltoallv1 (MPI_Comm const comm,
+ vector <vector <T> > const & data)
+ {
+ // Get the total number of processors
+ int num_procs;
+ MPI_Comm_size (comm, & num_procs);
+
+ // Exchange the sizes of the data vectors
+ vector <int> sizes_in (num_procs);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ sizes_in.AT(n) = data.AT(n).size();
+ }
+ vector <int> sizes_out (num_procs);
+ // cerr << "QQQ: alltoallv1[1]" << endl;
+ MPI_Alltoall (& sizes_in.front(), 1, MPI_INT,
+ & sizes_out.front(), 1, MPI_INT,
+ comm);
+ // cerr << "QQQ: alltoallv1[2]" << endl;
+
+#if 0
+ // Copy vectors to data buffer
+ vector <int> offsets_in (num_procs + 1);
+ offsets_in.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_in.AT(n + 1) = offsets_in.AT(n) + sizes_in.AT(n);
+ }
+ int const total_length_in = offsets_in.AT(num_procs);
+ vector <T> alldata_buffer_in;
+ alldata_buffer_in.reserve (total_length_in);
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ alldata_buffer_in.insert (alldata_buffer_in.end(),
+ data.AT(n).begin(), data.AT(n).end());
+ }
+
+ // Allocate space for all data vectors
+ vector <int> offsets_out (num_procs + 1);
+ offsets_out.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_out.AT(n + 1) = offsets_out.AT(n) + sizes_out.AT(n);
+ }
+ int const total_length_out = offsets_out.AT(num_procs);
+ vector <T> alldata_buffer_out (total_length_out);
+
+ // Exchange all data vectors
+ T const dummy;
+ MPI_Datatype const type = mpi_datatype (dummy);
+ // cerr << "QQQ: alltoallv1[3]" << endl;
+ MPI_Alltoallv (& alldata_buffer_in.front(),
+ & sizes_in.front(), & offsets_in.front(), type,
+ & alldata_buffer_out.front(),
+ & sizes_out.front(), & offsets_out.front(), type,
+ comm);
+ // cerr << "QQQ: alltoallv1[4]" << endl;
+#endif
+
+ // Allocate space for all data vectors
+ vector <int> offsets_out (num_procs + 1);
+ offsets_out.AT(0) = 0;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ offsets_out.AT(n + 1) = offsets_out.AT(n) + sizes_out.AT(n);
+ }
+ int const total_length_out = offsets_out.AT(num_procs);
+ vector <T> alldata_buffer_out (total_length_out);
+
+ // Exchange all data vectors
+ T const dummy;
+ MPI_Datatype const type = mpi_datatype (dummy);
+ int const tag = 4711;
+ vector <MPI_Request> reqs (2 * num_procs);
+ int nreqs = 0;
+ // cerr << "QQQ: alltoallv1[5]" << endl;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ if (sizes_out.AT(n) > 0) {
+ MPI_Irecv (& alldata_buffer_out.AT(offsets_out.AT(n)),
+ sizes_out.AT(n),
+ type,
+ n, tag, comm, & reqs.AT(nreqs));
+ ++ nreqs;
+ }
+ }
+ // cerr << "QQQ: alltoallv1[6]" << endl;
+ for (int n = 0; n < num_procs; ++ n)
+ {
+ if (sizes_in.AT(n) > 0) {
+ MPI_Isend (const_cast <T *> (& data.AT(n).front()),
+ sizes_in.AT(n),
+ type,
+ n, tag, comm, & reqs.AT(nreqs));
+ ++ nreqs;
+ }
+ }
+ // cerr << "QQQ: alltoallv1[7]" << endl;
+ MPI_Waitall (nreqs, & reqs.front(), MPI_STATUSES_IGNORE);
+ // cerr << "QQQ: alltoallv1[8]" << endl;
+
+ return alldata_buffer_out;
+ }
+
+
+
+ template
+ vector <vector <dh::dboxes> >
+ allgatherv (MPI_Comm comm,
+ vector <dh::dboxes> const & data);
+
+ template
+ vector <sendrecv_pseudoregion_t>
+ alltoallv1 (MPI_Comm comm,
+ vector <vector <sendrecv_pseudoregion_t> > const & data);
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/mpi_string.hh b/Carpet/CarpetLib/src/mpi_string.hh
new file mode 100644
index 000000000..6ed8d447d
--- /dev/null
+++ b/Carpet/CarpetLib/src/mpi_string.hh
@@ -0,0 +1,55 @@
+#include <string>
+#include <vector>
+
+#include <cctk.h>
+
+#include <mpi.h>
+
+
+
+namespace CarpetLib
+{
+
+ using namespace std;
+
+
+
+ // String communication
+
+ vector <string>
+ allgather_string (MPI_Comm comm,
+ string const & data);
+
+ vector <string>
+ alltoallv_string (MPI_Comm comm,
+ vector <string> const & data);
+
+ string
+ broadcast_string (MPI_Comm comm, int root,
+ string const & data);
+
+
+
+ // Arbitrary datatypes
+
+ template <typename T>
+ vector <vector <T> >
+ allgatherv (MPI_Comm comm,
+ vector <T> const & data);
+
+ template <typename T>
+ vector <T>
+ alltoall (MPI_Comm comm,
+ vector <T> const & data);
+
+ template <typename T>
+ vector <vector <T> >
+ alltoallv (MPI_Comm comm,
+ vector <vector <T> > const & data);
+
+ template <typename T>
+ vector <T>
+ alltoallv1 (MPI_Comm comm,
+ vector <vector <T> > const & data);
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/operator_prototypes.hh b/Carpet/CarpetLib/src/operator_prototypes.hh
index 0eb990923..1feae8a90 100644
--- a/Carpet/CarpetLib/src/operator_prototypes.hh
+++ b/Carpet/CarpetLib/src/operator_prototypes.hh
@@ -1,253 +1,12 @@
#ifndef OPERATOR_PROTOTYPES
#define OPERATOR_PROTOTYPES
-#include <cstdlib>
-
-#include <cctk.h>
-
-#include <vect.hh>
-#include <bbox.hh>
-
namespace CarpetLib {
- using namespace std;
-
-
-
- static inline
- size_t
- index3 (size_t const i, size_t const j, size_t const k,
- size_t const exti, size_t const extj, size_t const extk)
- {
-#ifdef CARPET_DEBUG
- assert (static_cast <ptrdiff_t> (i) >= 0 and i < exti);
- assert (static_cast <ptrdiff_t> (j) >= 0 and j < extj);
- assert (static_cast <ptrdiff_t> (k) >= 0 and k < extk);
-#endif
-
- return i + exti * (j + extj * k);
- }
-
-
-
- static int const dim3 = 3;
-
- typedef vect <bool, dim3> bvect3;
- typedef vect <int, dim3> ivect3;
- typedef bbox <int, dim3> ibbox3;
-
static int const reffact2 = 2;
-
-
- template <typename T>
- void
- copy_3d (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
- template <typename T>
- void
- prolongate_3d_o1_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_o3_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_o5_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_o7_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_o9_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_o11_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
- template <typename T>
- void
- restrict_3d_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
- template <typename T>
- void
- interpolate_3d_2tl (T const * restrict const src1,
- CCTK_REAL const t1,
- T const * restrict const src2,
- CCTK_REAL const t2,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- CCTK_REAL const t,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- interpolate_3d_3tl (T const * restrict const src1,
- CCTK_REAL const t1,
- T const * restrict const src2,
- CCTK_REAL const t2,
- T const * restrict const src3,
- CCTK_REAL const t3,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- CCTK_REAL const t,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- interpolate_3d_4tl (T const * restrict const src1,
- CCTK_REAL const t1,
- T const * restrict const src2,
- CCTK_REAL const t2,
- T const * restrict const src3,
- CCTK_REAL const t3,
- T const * restrict const src4,
- CCTK_REAL const t4,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- CCTK_REAL const t,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- interpolate_3d_5tl (T const * restrict const src1,
- CCTK_REAL const t1,
- T const * restrict const src2,
- CCTK_REAL const t2,
- T const * restrict const src3,
- CCTK_REAL const t3,
- T const * restrict const src4,
- CCTK_REAL const t4,
- T const * restrict const src5,
- CCTK_REAL const t5,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- CCTK_REAL const t,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- interpolate_eno_3d_3tl (T const * restrict const src1,
- CCTK_REAL const t1,
- T const * restrict const src2,
- CCTK_REAL const t2,
- T const * restrict const src3,
- CCTK_REAL const t3,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- CCTK_REAL const t,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
- template <typename T>
- void
- prolongate_3d_cc_rf2_std2prim (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
- template <typename T>
- void
- prolongate_3d_cc_rf2_prim2std (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
- template <typename T>
- void
- restrict_3d_cc_rf2 (T const * restrict const src,
- ivect3 const & restrict srcext,
- T * restrict const dst,
- ivect3 const & restrict dstext,
- ibbox3 const & restrict srcbbox,
- ibbox3 const & restrict dstbbox,
- ibbox3 const & restrict regbbox);
-
-
-
} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/operator_prototypes_3d.hh b/Carpet/CarpetLib/src/operator_prototypes_3d.hh
new file mode 100644
index 000000000..19deccea8
--- /dev/null
+++ b/Carpet/CarpetLib/src/operator_prototypes_3d.hh
@@ -0,0 +1,305 @@
+#ifndef OPERATOR_PROTOTYPES_3D
+#define OPERATOR_PROTOTYPES_3D
+
+#include <cstdlib>
+
+#include <cctk.h>
+
+#include "defs.hh"
+#include "bbox.hh"
+#include "vect.hh"
+
+#include "operator_prototypes.hh"
+
+
+
+namespace CarpetLib {
+
+ using namespace std;
+
+
+
+ static inline
+ size_t
+ index3 (size_t const i, size_t const j, size_t const k,
+ size_t const exti, size_t const extj, size_t const extk)
+ CCTK_ATTRIBUTE_CONST;
+ static inline
+ size_t
+ index3 (size_t const i, size_t const j, size_t const k,
+ size_t const exti, size_t const extj, size_t const extk)
+ {
+#ifdef CARPET_DEBUG
+ assert (static_cast <ptrdiff_t> (i) >= 0 and i < exti);
+ assert (static_cast <ptrdiff_t> (j) >= 0 and j < extj);
+ assert (static_cast <ptrdiff_t> (k) >= 0 and k < extk);
+#endif
+
+ return i + exti * (j + extj * k);
+ }
+
+
+
+ static int const dim3 = 3;
+
+ typedef vect <bool, dim3> bvect3;
+ typedef vect <int, dim3> ivect3;
+ typedef bbox <int, dim3> ibbox3;
+
+
+
+ template <typename T>
+ void
+ copy_3d (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_o1_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_o3_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_o5_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_o7_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_o9_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_o11_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_o5_monotone_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o0_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o1_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o2_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ restrict_3d_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ interpolate_3d_2tl (T const * restrict const src1,
+ CCTK_REAL const t1,
+ T const * restrict const src2,
+ CCTK_REAL const t2,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ CCTK_REAL const t,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ interpolate_3d_3tl (T const * restrict const src1,
+ CCTK_REAL const t1,
+ T const * restrict const src2,
+ CCTK_REAL const t2,
+ T const * restrict const src3,
+ CCTK_REAL const t3,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ CCTK_REAL const t,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ interpolate_3d_4tl (T const * restrict const src1,
+ CCTK_REAL const t1,
+ T const * restrict const src2,
+ CCTK_REAL const t2,
+ T const * restrict const src3,
+ CCTK_REAL const t3,
+ T const * restrict const src4,
+ CCTK_REAL const t4,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ CCTK_REAL const t,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ interpolate_3d_5tl (T const * restrict const src1,
+ CCTK_REAL const t1,
+ T const * restrict const src2,
+ CCTK_REAL const t2,
+ T const * restrict const src3,
+ CCTK_REAL const t3,
+ T const * restrict const src4,
+ CCTK_REAL const t4,
+ T const * restrict const src5,
+ CCTK_REAL const t5,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ CCTK_REAL const t,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ interpolate_eno_3d_3tl (T const * restrict const src1,
+ CCTK_REAL const t1,
+ T const * restrict const src2,
+ CCTK_REAL const t2,
+ T const * restrict const src3,
+ CCTK_REAL const t3,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ CCTK_REAL const t,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_cc_rf2_std2prim (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+ template <typename T>
+ void
+ prolongate_3d_cc_rf2_prim2std (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ restrict_3d_cc_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox);
+
+
+
+} // namespace CarpetLib
+
+
+
+#endif // #ifndef OPERATOR_PROTOTYPES_3D
diff --git a/Carpet/CarpetLib/src/operator_prototypes_4d.hh b/Carpet/CarpetLib/src/operator_prototypes_4d.hh
new file mode 100644
index 000000000..afd75c655
--- /dev/null
+++ b/Carpet/CarpetLib/src/operator_prototypes_4d.hh
@@ -0,0 +1,92 @@
+#ifndef OPERATOR_PROTOTYPES_4D
+#define OPERATOR_PROTOTYPES_4D
+
+#include <cstdlib>
+
+#include <cctk.h>
+
+#include "defs.hh"
+#include "bbox.hh"
+#include "vect.hh"
+
+#include "operator_prototypes.hh"
+
+
+
+namespace CarpetLib {
+
+ using namespace std;
+
+
+
+ static inline
+ size_t
+ index4 (size_t const i, size_t const j, size_t const k, size_t const kl,
+ size_t const exti, size_t const extj, size_t const extk, size_t const extl)
+ CCTK_ATTRIBUTE_CONST;
+ static inline
+ size_t
+ index4 (size_t const i, size_t const j, size_t const k, size_t const l,
+ size_t const exti, size_t const extj, size_t const extk, size_t const extl)
+ {
+#ifdef CARPET_DEBUG
+ assert (static_cast <ptrdiff_t> (i) >= 0 and i < exti);
+ assert (static_cast <ptrdiff_t> (j) >= 0 and j < extj);
+ assert (static_cast <ptrdiff_t> (k) >= 0 and k < extk);
+ assert (static_cast <ptrdiff_t> (l) >= 0 and l < extl);
+#endif
+
+ return i + exti * (j + extj * (k + extk * l));
+ }
+
+
+
+ static int const dim4 = 4;
+
+ typedef vect <bool, dim4> bvect4;
+ typedef vect <int, dim4> ivect4;
+ typedef bbox <int, dim4> ibbox4;
+
+
+
+ template <typename T>
+ void
+ copy_4d (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ prolongate_4d_o1_rf2 (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox);
+
+
+
+ template <typename T>
+ void
+ restrict_4d_rf2 (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox);
+
+
+
+} // namespace CarpetLib
+
+
+
+#endif // #ifndef OPERATOR_PROTOTYPES_4D
diff --git a/Carpet/CarpetLib/src/operators.hh b/Carpet/CarpetLib/src/operators.hh
index 8ecd308a4..07e4e5616 100644
--- a/Carpet/CarpetLib/src/operators.hh
+++ b/Carpet/CarpetLib/src/operators.hh
@@ -9,11 +9,13 @@ enum operator_type
op_none, // do not transport
op_sync, // transport only on the same level
// (error if called between levels)
+ op_restrict, // restrict only, do not prolongate
op_copy, // use simple copying for prolongation
// (needs only one time level)
op_Lagrange, // Lagrange interpolation (standard)
op_ENO, // use ENO stencils (for hydro)
- op_WENO // use WENO stencils (for hydro)
+ op_WENO, // use WENO stencils (for hydro)
+ op_Lagrange_monotone // monotone Lagrange interpolation (for hydro)
};
#endif // OPERATORS_HH
diff --git a/Carpet/CarpetLib/src/prolongate_3d_cc_o0_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_cc_o0_rf2.cc
new file mode 100644
index 000000000..352f4c380
--- /dev/null
+++ b/Carpet/CarpetLib/src/prolongate_3d_cc_o0_rf2.cc
@@ -0,0 +1,320 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_3d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND3(i,j,k) \
+ index3 (i, j, k, \
+ srciext, srcjext, srckext)
+#define DSTIND3(i,j,k) \
+ index3 (i, j, k, \
+ dstiext, dstjext, dstkext)
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o0_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox)
+ {
+ typedef typename typeprops<T>::real RT;
+
+
+
+ if (any (srcbbox.stride() <= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != reffact2 * dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: source strides are not twice the destination strides");
+ }
+
+ if (any (dstbbox.stride() % 2 != 0)) {
+ CCTK_WARN (0, "Internal error: destination strides are not even");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+
+
+ ivect3 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) % regbbox.stride() == 0));
+ ivect3 const srcoff = (regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) / regbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % regbbox.stride() == 0));
+ ivect3 const dstoff = (regbbox.lower() - dstbbox.lower()) / regbbox.stride();
+
+
+
+ bvect3 const needoffsetlo = srcoff % reffact2 != 0;
+ bvect3 const needoffsethi = (srcoff + regext - 1) % reffact2 != 0;
+ ivect3 const offsetlo = either (needoffsetlo, 1, 0);
+ ivect3 const offsethi = either (needoffsethi, 1, 0);
+
+
+
+ if (not regbbox.expand(offsetlo, offsethi).is_contained_in(srcbbox) or
+ not regbbox .is_contained_in(dstbbox))
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ size_t const srciext = srcext[0];
+ size_t const srcjext = srcext[1];
+ size_t const srckext = srcext[2];
+
+ size_t const dstiext = dstext[0];
+ size_t const dstjext = dstext[1];
+ size_t const dstkext = dstext[2];
+
+ size_t const regiext = regext[0];
+ size_t const regjext = regext[1];
+ size_t const regkext = regext[2];
+
+ size_t const srcioff = srcoff[0];
+ size_t const srcjoff = srcoff[1];
+ size_t const srckoff = srcoff[2];
+
+ size_t const dstioff = dstoff[0];
+ size_t const dstjoff = dstoff[1];
+ size_t const dstkoff = dstoff[2];
+
+
+
+ size_t const fi = srcioff % 2;
+ size_t const fj = srcjoff % 2;
+ size_t const fk = srckoff % 2;
+
+ size_t const i0 = srcioff / 2;
+ size_t const j0 = srcjoff / 2;
+ size_t const k0 = srckoff / 2;
+
+
+
+ // Loop over fine region
+ // Label scheme: l 8 fk fj fi
+
+ size_t is, js, ks;
+ size_t id, jd, kd;
+ size_t i, j, k;
+
+ // begin k loop
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l80;
+ goto l81;
+
+ // begin j loop
+ l80:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l800;
+ goto l801;
+
+ // begin i loop
+ l800:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8000;
+ goto l8001;
+
+ // kernel
+ l8000:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8001;
+ goto l900;
+
+ // kernel
+ l8001:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8000;
+ goto l900;
+
+ // end i loop
+ l900:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l801;
+ goto l90;
+
+ // begin i loop
+ l801:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8010;
+ goto l8011;
+
+ // kernel
+ l8010:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8011;
+ goto l901;
+
+ // kernel
+ l8011:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8010;
+ goto l901;
+
+ // end i loop
+ l901:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l800;
+ goto l90;
+
+ // end j loop
+ l90:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l81;
+ goto l9;
+
+ // begin j loop
+ l81:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l810;
+ goto l811;
+
+ // begin i loop
+ l810:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8100;
+ goto l8101;
+
+ // kernel
+ l8100:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8101;
+ goto l910;
+
+ // kernel
+ l8101:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8100;
+ goto l910;
+
+ // end i loop
+ l910:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l811;
+ goto l91;
+
+ // begin i loop
+ l811:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8110;
+ goto l8111;
+
+ // kernel
+ l8110:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8111;
+ goto l911;
+
+ // kernel
+ l8111:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8110;
+ goto l911;
+
+ // end i loop
+ l911:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l810;
+ goto l91;
+
+ // end j loop
+ l91:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l80;
+ goto l9;
+
+ // end k loop
+ l9:;
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ prolongate_3d_cc_o0_rf2 (T const * restrict const src, \
+ ivect3 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect3 const & restrict dstext, \
+ ibbox3 const & restrict srcbbox, \
+ ibbox3 const & restrict dstbbox, \
+ ibbox3 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // CarpetLib
diff --git a/Carpet/CarpetLib/src/prolongate_3d_cc_o1_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_cc_o1_rf2.cc
new file mode 100644
index 000000000..42fc078ee
--- /dev/null
+++ b/Carpet/CarpetLib/src/prolongate_3d_cc_o1_rf2.cc
@@ -0,0 +1,390 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_3d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND3(i,j,k) \
+ index3 (i, j, k, \
+ srciext, srcjext, srckext)
+#define DSTIND3(i,j,k) \
+ index3 (i, j, k, \
+ dstiext, dstjext, dstkext)
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o1_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox)
+ {
+ typedef typename typeprops<T>::real RT;
+
+
+
+ if (any (srcbbox.stride() <= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != reffact2 * dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: source strides are not twice the destination strides");
+ }
+
+ if (any (dstbbox.stride() % 2 != 0)) {
+ CCTK_WARN (0, "Internal error: destination strides are not even");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+
+
+ ivect3 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) % regbbox.stride() == 0));
+ ivect3 const srcoff = (regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) / regbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % regbbox.stride() == 0));
+ ivect3 const dstoff = (regbbox.lower() - dstbbox.lower()) / regbbox.stride();
+
+
+
+ ivect3 const offsetlo = 1;
+ ivect3 const offsethi = 1;
+
+
+
+ if (not regbbox.expand(offsetlo, offsethi).is_contained_in(srcbbox) or
+ not regbbox .is_contained_in(dstbbox))
+ {
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ size_t const srciext = srcext[0];
+ size_t const srcjext = srcext[1];
+ size_t const srckext = srcext[2];
+
+ size_t const dstiext = dstext[0];
+ size_t const dstjext = dstext[1];
+ size_t const dstkext = dstext[2];
+
+ size_t const regiext = regext[0];
+ size_t const regjext = regext[1];
+ size_t const regkext = regext[2];
+
+ size_t const srcioff = srcoff[0];
+ size_t const srcjoff = srcoff[1];
+ size_t const srckoff = srcoff[2];
+
+ size_t const dstioff = dstoff[0];
+ size_t const dstjoff = dstoff[1];
+ size_t const dstkoff = dstoff[2];
+
+
+
+ size_t const fi = srcioff % 2;
+ size_t const fj = srcjoff % 2;
+ size_t const fk = srckoff % 2;
+
+ size_t const i0 = srcioff / 2;
+ size_t const j0 = srcjoff / 2;
+ size_t const k0 = srckoff / 2;
+
+ RT const one = 1;
+
+ RT const f1 = one/4;
+ RT const f2 = 3*one/4;
+
+
+
+ // Loop over fine region
+ // Label scheme: l 8 fk fj fi
+
+ size_t is, js, ks;
+ size_t id, jd, kd;
+ size_t i, j, k;
+
+ // begin k loop
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l80;
+ goto l81;
+
+ // begin j loop
+ l80:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l800;
+ goto l801;
+
+ // begin i loop
+ l800:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8000;
+ goto l8001;
+
+ // kernel
+ l8000:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1*f1 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8001;
+ goto l900;
+
+ // kernel
+ l8001:
+ dst[DSTIND3(id,jd,kd)] =
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8000;
+ goto l900;
+
+ // end i loop
+ l900:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l801;
+ goto l90;
+
+ // begin i loop
+ l801:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8010;
+ goto l8011;
+
+ // kernel
+ l8010:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8011;
+ goto l901;
+
+ // kernel
+ l8011:
+ dst[DSTIND3(id,jd,kd)] =
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js+1,ks )];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8010;
+ goto l901;
+
+ // end i loop
+ l901:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l800;
+ goto l90;
+
+ // end j loop
+ l90:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l81;
+ goto l9;
+
+ // begin j loop
+ l81:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l810;
+ goto l811;
+
+ // begin i loop
+ l810:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8100;
+ goto l8101;
+
+ // kernel
+ l8100:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f1*f1 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8101;
+ goto l910;
+
+ // kernel
+ l8101:
+ dst[DSTIND3(id,jd,kd)] =
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8100;
+ goto l910;
+
+ // end i loop
+ l910:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l811;
+ goto l91;
+
+ // begin i loop
+ l811:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8110;
+ goto l8111;
+
+ // kernel
+ l8110:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8111;
+ goto l911;
+
+ // kernel
+ l8111:
+ dst[DSTIND3(id,jd,kd)] =
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8110;
+ goto l911;
+
+ // end i loop
+ l911:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l810;
+ goto l91;
+
+ // end j loop
+ l91:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l80;
+ goto l9;
+
+ // end k loop
+ l9:;
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ prolongate_3d_cc_o1_rf2 (T const * restrict const src, \
+ ivect3 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect3 const & restrict dstext, \
+ ibbox3 const & restrict srcbbox, \
+ ibbox3 const & restrict dstbbox, \
+ ibbox3 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // CarpetLib
diff --git a/Carpet/CarpetLib/src/prolongate_3d_cc_o2_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_cc_o2_rf2.cc
new file mode 100644
index 000000000..f55dfe9fa
--- /dev/null
+++ b/Carpet/CarpetLib/src/prolongate_3d_cc_o2_rf2.cc
@@ -0,0 +1,545 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_3d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND3(i,j,k) \
+ index3 (i, j, k, \
+ srciext, srcjext, srckext)
+#define DSTIND3(i,j,k) \
+ index3 (i, j, k, \
+ dstiext, dstjext, dstkext)
+
+
+
+ template <typename T>
+ void
+ prolongate_3d_cc_o2_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox)
+ {
+ typedef typename typeprops<T>::real RT;
+
+
+
+ if (any (srcbbox.stride() <= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != reffact2 * dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: source strides are not twice the destination strides");
+ }
+
+ if (any (dstbbox.stride() % 2 != 0)) {
+ CCTK_WARN (0, "Internal error: destination strides are not even");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+
+
+ ivect3 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) % regbbox.stride() == 0));
+ ivect3 const srcoff = (regbbox.lower() - srcbbox.lower() + regbbox.stride() / 2) / regbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % regbbox.stride() == 0));
+ ivect3 const dstoff = (regbbox.lower() - dstbbox.lower()) / regbbox.stride();
+
+
+
+ bvect3 const needoffsetlo = srcoff % reffact2 != 0;
+ bvect3 const needoffsethi = (srcoff + regext - 1) % reffact2 != 0;
+ ivect3 const offsetlo = either (needoffsetlo, 2, 1);
+ ivect3 const offsethi = either (needoffsethi, 2, 1);
+
+
+
+ if (not regbbox.expand(offsetlo, offsethi).is_contained_in(srcbbox) or
+ not regbbox .is_contained_in(dstbbox))
+ {
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ size_t const srciext = srcext[0];
+ size_t const srcjext = srcext[1];
+ size_t const srckext = srcext[2];
+
+ size_t const dstiext = dstext[0];
+ size_t const dstjext = dstext[1];
+ size_t const dstkext = dstext[2];
+
+ size_t const regiext = regext[0];
+ size_t const regjext = regext[1];
+ size_t const regkext = regext[2];
+
+ size_t const srcioff = srcoff[0];
+ size_t const srcjoff = srcoff[1];
+ size_t const srckoff = srcoff[2];
+
+ size_t const dstioff = dstoff[0];
+ size_t const dstjoff = dstoff[1];
+ size_t const dstkoff = dstoff[2];
+
+
+
+ size_t const fi = srcioff % 2;
+ size_t const fj = srcjoff % 2;
+ size_t const fk = srckoff % 2;
+
+ size_t const i0 = srcioff / 2;
+ size_t const j0 = srcjoff / 2;
+ size_t const k0 = srckoff / 2;
+
+ RT const one = 1;
+
+ RT const f1 = 5*one/32;
+ RT const f2 = 30*one/32;
+ RT const f3 = -3*one/32;
+
+
+
+ // Loop over fine region
+ // Label scheme: l 8 fk fj fi
+
+ size_t is, js, ks;
+ size_t id, jd, kd;
+ size_t i, j, k;
+
+ // begin k loop
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l80;
+ goto l81;
+
+ // begin j loop
+ l80:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l800;
+ goto l801;
+
+ // begin i loop
+ l800:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8000;
+ goto l8001;
+
+ // kernel
+ l8000:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1*f1 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f3*f1*f1 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f3*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f1*f3*f1 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f3*f3*f1 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f1*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f3*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f3*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f1*f3*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f3*f3*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f1*f1*f3 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js-1,ks+1)]
+ + f3*f1*f3 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f1*f2*f3 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks+1)]
+ + f3*f2*f3 * src[SRCIND3(is+1,js ,ks+1)]
+ + f1*f3*f3 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js+1,ks+1)]
+ + f3*f3*f3 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8001;
+ goto l900;
+
+ // kernel
+ l8001:
+ dst[DSTIND3(id,jd,kd)] =
+ + f3*f1*f1 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f3*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f3*f3*f1 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f3*f1 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f3*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f3*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f3*f3*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f3*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f3*f1*f3 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f1*f3 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f3*f2*f3 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f3 * src[SRCIND3(is+1,js ,ks+1)]
+ + f3*f3*f3 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js+1,ks+1)]
+ + f1*f3*f3 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8000;
+ goto l900;
+
+ // end i loop
+ l900:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l801;
+ goto l90;
+
+ // begin i loop
+ l801:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8010;
+ goto l8011;
+
+ // kernel
+ l8010:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f3*f1 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f3*f3*f1 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f3*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f3*f1*f1 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f1*f3*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f3*f3*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f3*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f1*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f3*f1*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f1*f3*f3 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js-1,ks+1)]
+ + f3*f3*f3 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f1*f2*f3 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks+1)]
+ + f3*f2*f3 * src[SRCIND3(is+1,js ,ks+1)]
+ + f1*f1*f3 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js+1,ks+1)]
+ + f3*f1*f3 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8011;
+ goto l901;
+
+ // kernel
+ l8011:
+ dst[DSTIND3(id,jd,kd)] =
+ + f3*f3*f1 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f3*f1 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f3*f2*f1 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks-1)]
+ + f3*f1*f1 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f3*f3*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f3*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f3*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f3*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f3*f3*f3 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f3*f3 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f3*f2*f3 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f3 * src[SRCIND3(is+1,js ,ks+1)]
+ + f3*f1*f3 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js+1,ks+1)]
+ + f1*f1*f3 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8010;
+ goto l901;
+
+ // end i loop
+ l901:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l800;
+ goto l90;
+
+ // end j loop
+ l90:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l81;
+ goto l9;
+
+ // begin j loop
+ l81:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l810;
+ goto l811;
+
+ // begin i loop
+ l810:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8100;
+ goto l8101;
+
+ // kernel
+ l8100:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1*f3 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js-1,ks-1)]
+ + f3*f1*f3 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f1*f2*f3 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks-1)]
+ + f3*f2*f3 * src[SRCIND3(is+1,js ,ks-1)]
+ + f1*f3*f3 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js+1,ks-1)]
+ + f3*f3*f3 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f1*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f3*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f3*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f1*f3*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f3*f3*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f1*f1*f1 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f3*f1*f1 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f3*f2*f1 * src[SRCIND3(is+1,js ,ks+1)]
+ + f1*f3*f1 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js+1,ks+1)]
+ + f3*f3*f1 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8101;
+ goto l910;
+
+ // kernel
+ l8101:
+ dst[DSTIND3(id,jd,kd)] =
+ + f3*f1*f3 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f1*f3 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f3*f2*f3 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f3 * src[SRCIND3(is+1,js ,ks-1)]
+ + f3*f3*f3 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f3*f3 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f3*f1*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f3*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f3*f3*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f3*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f3*f1*f1 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f3*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks+1)]
+ + f3*f3*f1 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js+1,ks+1)]
+ + f1*f3*f1 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8100;
+ goto l910;
+
+ // end i loop
+ l910:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l811;
+ goto l91;
+
+ // begin i loop
+ l811:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8110;
+ goto l8111;
+
+ // kernel
+ l8110:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f3*f3 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js-1,ks-1)]
+ + f3*f3*f3 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f1*f2*f3 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks-1)]
+ + f3*f2*f3 * src[SRCIND3(is+1,js ,ks-1)]
+ + f1*f1*f3 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js+1,ks-1)]
+ + f3*f1*f3 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f1*f3*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f3*f3*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f1*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f3*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f1*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f3*f1*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f1*f3*f1 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f3*f3*f1 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f3*f2*f1 * src[SRCIND3(is+1,js ,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks+1)]
+ + f3*f1*f1 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8111;
+ goto l911;
+
+ // kernel
+ l8111:
+ dst[DSTIND3(id,jd,kd)] =
+ + f3*f3*f3 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f2*f3*f3 * src[SRCIND3(is ,js-1,ks-1)]
+ + f1*f3*f3 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f3*f2*f3 * src[SRCIND3(is-1,js ,ks-1)]
+ + f2*f2*f3 * src[SRCIND3(is ,js ,ks-1)]
+ + f1*f2*f3 * src[SRCIND3(is+1,js ,ks-1)]
+ + f3*f1*f3 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f2*f1*f3 * src[SRCIND3(is ,js+1,ks-1)]
+ + f1*f1*f3 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f3*f3*f2 * src[SRCIND3(is-1,js-1,ks )]
+ + f2*f3*f2 * src[SRCIND3(is ,js-1,ks )]
+ + f1*f3*f2 * src[SRCIND3(is+1,js-1,ks )]
+ + f3*f2*f2 * src[SRCIND3(is-1,js ,ks )]
+ + f2*f2*f2 * src[SRCIND3(is ,js ,ks )]
+ + f1*f2*f2 * src[SRCIND3(is+1,js ,ks )]
+ + f3*f1*f2 * src[SRCIND3(is-1,js+1,ks )]
+ + f2*f1*f2 * src[SRCIND3(is ,js+1,ks )]
+ + f1*f1*f2 * src[SRCIND3(is+1,js+1,ks )]
+ + f3*f3*f1 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f2*f3*f1 * src[SRCIND3(is ,js-1,ks+1)]
+ + f1*f3*f1 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f3*f2*f1 * src[SRCIND3(is-1,js ,ks+1)]
+ + f2*f2*f1 * src[SRCIND3(is ,js ,ks+1)]
+ + f1*f2*f1 * src[SRCIND3(is+1,js ,ks+1)]
+ + f3*f1*f1 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f2*f1*f1 * src[SRCIND3(is ,js+1,ks+1)]
+ + f1*f1*f1 * src[SRCIND3(is+1,js+1,ks+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8110;
+ goto l911;
+
+ // end i loop
+ l911:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l810;
+ goto l91;
+
+ // end j loop
+ l91:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l80;
+ goto l9;
+
+ // end k loop
+ l9:;
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ prolongate_3d_cc_o2_rf2 (T const * restrict const src, \
+ ivect3 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect3 const & restrict dstext, \
+ ibbox3 const & restrict srcbbox, \
+ ibbox3 const & restrict dstbbox, \
+ ibbox3 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // CarpetLib
diff --git a/Carpet/CarpetLib/src/prolongate_3d_cc_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_cc_rf2.cc
index f58295560..04e00b255 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_cc_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_cc_rf2.cc
@@ -11,7 +11,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -120,7 +120,7 @@ namespace CarpetLib {
-#pragma omp parallel for
+ // NOTE: This loop is not parallel
for (int k=0; k<regkext; ++k) {
for (int j=0; j<regjext; ++j) {
for (int i=0; i<regiext; ++i) {
@@ -139,13 +139,13 @@ namespace CarpetLib {
// + src [SRCIND2(i-1, j-1)];
// 3D
dst [DSTIND3(i, j, k)] =
- + dst [DSTIND3(i-1, j, k)]
- + dst [DSTIND3(i, j-1, k)]
- + dst [DSTIND3(i, j, k-1)]
- - dst [DSTIND3(i, j-1, k-1)]
- - dst [DSTIND3(i-1, j, k-1)]
- - dst [DSTIND3(i-1, j-1, k)]
+ dst [DSTIND3(i-1, j-1, k-1)]
+ - dst [DSTIND3(i , j-1, k-1)]
+ - dst [DSTIND3(i-1, j , k-1)]
+ + dst [DSTIND3(i , j , k-1)]
+ - dst [DSTIND3(i-1, j-1, k )]
+ + dst [DSTIND3(i , j-1, k )]
+ + dst [DSTIND3(i-1, j , k )]
+ src [SRCIND3(i-1, j-1, k-1)];
}
}
@@ -172,14 +172,14 @@ namespace CarpetLib {
// Convert from the "primitive" form of the grid function to the
- // "standard" version
+ // "standard" version, i.e., the derivative
template <typename T>
void
prolongate_3d_cc_rf2_prim2std (T const * restrict const src,
- ivect const & restrict srcext,
+ ivect3 const & restrict srcext,
T * restrict const dst,
- ivect const & restrict dstext,
+ ivect3 const & restrict dstext,
ibbox3 const & restrict srcbbox,
ibbox3 const & restrict dstbbox,
ibbox3 const & restrict regbbox)
@@ -253,18 +253,19 @@ namespace CarpetLib {
-#pragma omp parallel for
+ // NOTE: This loop is not parallel
for (int k=0; k<regkext; ++k) {
for (int j=0; j<regjext; ++j) {
for (int i=0; i<regiext; ++i) {
- dst [DSTIND3(i, j, k)] = reffact2 *
- (- src [SRCIND3(i, j+1, k+1)]
- - src [SRCIND3(i+1, j, k+1)]
- - src [SRCIND3(i+1, j+1, k)]
- + src [SRCIND3(i+1, j, k)]
- + src [SRCIND3(i, j+1, k)]
- + src [SRCIND3(i, j, k+1)]
- - src [SRCIND3(i, j, k)]
+ dst [DSTIND3(i, j, k)] =
+ (reffact2 * reffact2 * reffact2) *
+ (- src [SRCIND3(i , j , k )]
+ + src [SRCIND3(i+1, j , k )]
+ + src [SRCIND3(i , j+1, k )]
+ - src [SRCIND3(i+1, j+1, k )]
+ + src [SRCIND3(i , j , k+1)]
+ - src [SRCIND3(i+1, j , k+1)]
+ - src [SRCIND3(i , j+1, k+1)]
+ src [SRCIND3(i+1, j+1, k+1)]);
}
}
@@ -278,9 +279,9 @@ namespace CarpetLib {
template \
void \
prolongate_3d_cc_rf2_prim2std (T const * restrict const src, \
- ivect const & restrict srcext, \
+ ivect3 const & restrict srcext, \
T * restrict const dst, \
- ivect const & restrict dstext, \
+ ivect3 const & restrict dstext, \
ibbox3 const & restrict srcbbox, \
ibbox3 const & restrict dstbbox, \
ibbox3 const & restrict regbbox);
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o11_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o11_rf2.cc
index 6fe17e03d..a1d26660e 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o11_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o11_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -231,7 +231,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -239,7 +239,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -247,7 +247,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = interp0<T> (& src[SRCIND3(is,js,ks)]);
i = i+1;
id = id+1;
@@ -255,7 +255,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is-5,js,ks)], srcdi);
i = i+1;
id = id+1;
@@ -264,14 +264,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -279,7 +279,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js-5,ks)], srcdj);
i = i+1;
id = id+1;
@@ -287,7 +287,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-5,js-5,ks)], srcdi, srcdj);
i = i+1;
@@ -297,7 +297,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -305,14 +305,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -320,7 +320,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -328,7 +328,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js,ks-5)], srcdk);
i = i+1;
id = id+1;
@@ -336,7 +336,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-5,js,ks-5)], srcdi, srcdj);
i = i+1;
@@ -346,14 +346,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -361,7 +361,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is,js-5,ks-5)], srcdj, srcdk);
i = i+1;
@@ -370,7 +370,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
dst[DSTIND3(id,jd,kd)] =
interp3<T> (& src[SRCIND3(is-5,js-5,ks-5)], srcdi, srcdj, srcdk);
@@ -382,7 +382,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -390,7 +390,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -398,7 +398,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o1_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o1_rf2.cc
index 72c52f05e..0b1ff0751 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o1_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o1_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -139,7 +139,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -147,7 +147,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -155,7 +155,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
i = i+1;
id = id+1;
@@ -163,7 +163,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is ,js,ks)]
+ f2 * src[SRCIND3(is+1,js,ks)];
@@ -174,14 +174,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -189,7 +189,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js ,ks)]
+ f2 * src[SRCIND3(is,js+1,ks)];
@@ -199,7 +199,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is ,js ,ks)]
+ f2*f1 * src[SRCIND3(is+1,js ,ks)]
@@ -212,7 +212,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -220,14 +220,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -235,7 +235,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -243,7 +243,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js,ks )]
+ f2 * src[SRCIND3(is,js,ks+1)];
@@ -253,7 +253,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is ,js,ks )]
+ f2*f1 * src[SRCIND3(is+1,js,ks )]
@@ -266,14 +266,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -281,7 +281,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is,js ,ks )]
+ f2*f1 * src[SRCIND3(is,js+1,ks )]
@@ -293,7 +293,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
T const res1 =
+ f1*f1*f1 * src[SRCIND3(is ,js ,ks )]
@@ -314,7 +314,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -322,7 +322,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -330,7 +330,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o3_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o3_rf2.cc
index a55bd69da..91b3e5bc1 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o3_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o3_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -31,7 +31,7 @@ namespace CarpetLib {
prolongate_3d_o3_rf2 (T const * restrict const src,
ivect3 const & restrict srcext,
T * restrict const dst,
- ivect const & restrict dstext,
+ ivect3 const & restrict dstext,
ibbox3 const & restrict srcbbox,
ibbox3 const & restrict dstbbox,
ibbox3 const & restrict regbbox)
@@ -143,7 +143,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -151,7 +151,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -159,7 +159,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
i = i+1;
id = id+1;
@@ -167,7 +167,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is-1,js,ks)]
+ f2 * src[SRCIND3(is ,js,ks)]
@@ -180,14 +180,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -195,7 +195,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js-1,ks)]
+ f2 * src[SRCIND3(is,js ,ks)]
@@ -207,7 +207,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is-1,js-1,ks)]
+ f2*f1 * src[SRCIND3(is ,js-1,ks)]
@@ -232,7 +232,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -240,14 +240,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -255,7 +255,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -263,7 +263,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js,ks-1)]
+ f2 * src[SRCIND3(is,js,ks )]
@@ -275,7 +275,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is-1,js,ks-1)]
+ f2*f1 * src[SRCIND3(is ,js,ks-1)]
@@ -300,14 +300,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -315,7 +315,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is,js-1,ks-1)]
+ f2*f1 * src[SRCIND3(is,js ,ks-1)]
@@ -339,7 +339,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
T const res1 =
+ f1*f1*f1 * src[SRCIND3(is-1,js-1,ks-1)]
@@ -418,7 +418,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -426,7 +426,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -434,7 +434,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o5_monotone_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o5_monotone_rf2.cc
new file mode 100644
index 000000000..9ac0b2f7e
--- /dev/null
+++ b/Carpet/CarpetLib/src/prolongate_3d_o5_monotone_rf2.cc
@@ -0,0 +1,851 @@
+// This is meant to reproduce the prolongation algorithm used in the
+// SACRA code (based on IH's interpretation of their papers and
+// comments in talks, so it might be an idea for someone to talk to
+// them! Of course, given that this is "general purpose" and SACRA is
+// very specific in the variables converted, it probably won't be
+// possible to get a perfect reproduction).
+//
+// The idea is to use fifth order Lagrange interpolation based on the
+// nearest 6 points (in any one dimension). However, we must also
+// ensure monotonicity. To do this we check that the result of the
+// fifth order result (which is just copied from prolongate_3d_o5_rf2)
+// is monotonic with respect to the relevant neighbours), and if not
+// we impose linear interpolation instead (from prolongate_3d_o1_rf2).
+//
+// Note that this code does not work for complex GFs (due to the use
+// of the max and min intrinsics).
+
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_3d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND3(i,j,k) \
+ index3 (i, j, k, \
+ srciext, srcjext, srckext)
+#define DSTIND3(i,j,k) \
+ index3 (i, j, k, \
+ dstiext, dstjext, dstkext)
+
+
+ template <typename T>
+ inline
+ T
+ min4 (T const & x1, T const & x2, T const & x3, T const & x4)
+ {
+ return min (min(x1, x2), min (x3, x4));
+ }
+
+ template <typename T>
+ inline
+ T
+ max4 (T const & x1, T const & x2, T const & x3, T const & x4)
+ {
+ return max (max(x1, x2), max (x3, x4));
+ }
+
+ template <typename T>
+ inline
+ T
+ min8 (T const & x1, T const & x2, T const & x3, T const & x4,
+ T const & x5, T const & x6, T const & x7, T const & x8)
+ {
+ return min( min (min(x1, x2), min (x3, x4)),
+ min (min(x5, x6), min (x7, x8)) );
+ }
+
+ template <typename T>
+ inline
+ T
+ max8 (T const & x1, T const & x2, T const & x3, T const & x4,
+ T const & x5, T const & x6, T const & x7, T const & x8)
+ {
+ return max( max (max(x1, x2), max (x3, x4)),
+ max (max(x5, x6), max (x7, x8)) );
+ }
+
+
+ template <typename T>
+ void
+ prolongate_3d_o5_monotone_rf2 (T const * restrict const src,
+ ivect3 const & restrict srcext,
+ T * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox)
+ {
+ typedef typename typeprops<T>::real RT;
+
+
+
+ if (any (srcbbox.stride() <= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != reffact2 * dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: source strides are not twice the destination strides");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+
+
+ ivect3 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower()) % regbbox.stride() == 0));
+ ivect3 const srcoff = (regbbox.lower() - srcbbox.lower()) / regbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % regbbox.stride() == 0));
+ ivect3 const dstoff = (regbbox.lower() - dstbbox.lower()) / regbbox.stride();
+
+
+
+ bvect3 const needoffsetlo = srcoff % reffact2 != 0 or regext > 1;
+ bvect3 const needoffsethi = (srcoff + regext - 1) % reffact2 != 0 or regext > 1;
+ ivect3 const offsetlo = either (needoffsetlo, 3, 0);
+ ivect3 const offsethi = either (needoffsethi, 3, 0);
+
+
+
+ if (not regbbox.expand(offsetlo, offsethi).is_contained_in(srcbbox) or
+ not regbbox .is_contained_in(dstbbox))
+ {
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ size_t const srciext = srcext[0];
+ size_t const srcjext = srcext[1];
+ size_t const srckext = srcext[2];
+
+ size_t const dstiext = dstext[0];
+ size_t const dstjext = dstext[1];
+ size_t const dstkext = dstext[2];
+
+ size_t const regiext = regext[0];
+ size_t const regjext = regext[1];
+ size_t const regkext = regext[2];
+
+ size_t const srcioff = srcoff[0];
+ size_t const srcjoff = srcoff[1];
+ size_t const srckoff = srcoff[2];
+
+ size_t const dstioff = dstoff[0];
+ size_t const dstjoff = dstoff[1];
+ size_t const dstkoff = dstoff[2];
+
+
+
+ size_t const fi = srcioff % 2;
+ size_t const fj = srcjoff % 2;
+ size_t const fk = srckoff % 2;
+
+ size_t const i0 = srcioff / 2;
+ size_t const j0 = srcjoff / 2;
+ size_t const k0 = srckoff / 2;
+
+ RT const one = 1;
+
+ RT const f1 = 3*one/256;
+ RT const f2 = - 25*one/256;
+ RT const f3 = 150*one/256;
+ RT const f4 = 150*one/256;
+ RT const f5 = - 25*one/256;
+ RT const f6 = 3*one/256;
+
+ RT const o1_f1 = one/2;
+ RT const o1_f2 = one/2;
+
+
+ // Loop over fine region
+ // Label scheme: l 8 fk fj fi
+
+ size_t is, js, ks;
+ size_t id, jd, kd;
+ size_t i, j, k;
+
+ // begin k loop
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l80;
+ goto l81;
+
+ // begin j loop
+ l80:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l800;
+ goto l801;
+
+ // begin i loop
+ l800:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8000;
+ goto l8001;
+
+ // kernel
+ l8000:
+ dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8001;
+ goto l900;
+
+ // kernel
+ l8001:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1 * src[SRCIND3(is-2,js,ks)]
+ + f2 * src[SRCIND3(is-1,js,ks)]
+ + f3 * src[SRCIND3(is ,js,ks)]
+ + f4 * src[SRCIND3(is+1,js,ks)]
+ + f5 * src[SRCIND3(is+2,js,ks)]
+ + f6 * src[SRCIND3(is+3,js,ks)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )]))||
+ (dst[DSTIND3(id,jd,kd)] < min(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1 * src[SRCIND3(is ,js,ks)]
+ + o1_f2 * src[SRCIND3(is+1,js,ks)];
+
+ }
+
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8000;
+ goto l900;
+
+ // end i loop
+ l900:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l801;
+ goto l90;
+
+ // begin i loop
+ l801:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8010;
+ goto l8011;
+
+ // kernel
+ l8010:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1 * src[SRCIND3(is,js-2,ks)]
+ + f2 * src[SRCIND3(is,js-1,ks)]
+ + f3 * src[SRCIND3(is,js ,ks)]
+ + f4 * src[SRCIND3(is,js+1,ks)]
+ + f5 * src[SRCIND3(is,js+2,ks)]
+ + f6 * src[SRCIND3(is,js+3,ks)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )]))||
+ (dst[DSTIND3(id,jd,kd)] < min(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1 * src[SRCIND3(is,js ,ks)]
+ + o1_f2 * src[SRCIND3(is,js+1,ks)];
+
+ }
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8011;
+ goto l901;
+
+ // kernel
+ l8011:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1 * src[SRCIND3(is-2,js-2,ks)]
+ + f2*f1 * src[SRCIND3(is-1,js-2,ks)]
+ + f3*f1 * src[SRCIND3(is ,js-2,ks)]
+ + f4*f1 * src[SRCIND3(is+1,js-2,ks)]
+ + f5*f1 * src[SRCIND3(is+2,js-2,ks)]
+ + f6*f1 * src[SRCIND3(is+3,js-2,ks)]
+ + f1*f2 * src[SRCIND3(is-2,js-1,ks)]
+ + f2*f2 * src[SRCIND3(is-1,js-1,ks)]
+ + f3*f2 * src[SRCIND3(is ,js-1,ks)]
+ + f4*f2 * src[SRCIND3(is+1,js-1,ks)]
+ + f5*f2 * src[SRCIND3(is+2,js-1,ks)]
+ + f6*f2 * src[SRCIND3(is+3,js-1,ks)]
+ + f1*f3 * src[SRCIND3(is-2,js ,ks)]
+ + f2*f3 * src[SRCIND3(is-1,js ,ks)]
+ + f3*f3 * src[SRCIND3(is ,js ,ks)]
+ + f4*f3 * src[SRCIND3(is+1,js ,ks)]
+ + f5*f3 * src[SRCIND3(is+2,js ,ks)]
+ + f6*f3 * src[SRCIND3(is+3,js ,ks)]
+ + f1*f4 * src[SRCIND3(is-2,js+1,ks)]
+ + f2*f4 * src[SRCIND3(is-1,js+1,ks)]
+ + f3*f4 * src[SRCIND3(is ,js+1,ks)]
+ + f4*f4 * src[SRCIND3(is+1,js+1,ks)]
+ + f5*f4 * src[SRCIND3(is+2,js+1,ks)]
+ + f6*f4 * src[SRCIND3(is+3,js+1,ks)]
+ + f1*f5 * src[SRCIND3(is-2,js+2,ks)]
+ + f2*f5 * src[SRCIND3(is-1,js+2,ks)]
+ + f3*f5 * src[SRCIND3(is ,js+2,ks)]
+ + f4*f5 * src[SRCIND3(is+1,js+2,ks)]
+ + f5*f5 * src[SRCIND3(is+2,js+2,ks)]
+ + f6*f5 * src[SRCIND3(is+3,js+2,ks)]
+ + f1*f6 * src[SRCIND3(is-2,js+3,ks)]
+ + f2*f6 * src[SRCIND3(is-1,js+3,ks)]
+ + f3*f6 * src[SRCIND3(is ,js+3,ks)]
+ + f4*f6 * src[SRCIND3(is+1,js+3,ks)]
+ + f5*f6 * src[SRCIND3(is+2,js+3,ks)]
+ + f6*f6 * src[SRCIND3(is+3,js+3,ks)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is+1,js+1,ks )]))||
+ (dst[DSTIND3(id,jd,kd)] < min4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is+1,js+1,ks )]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1*o1_f1 * src[SRCIND3(is ,js ,ks)]
+ + o1_f2*o1_f1 * src[SRCIND3(is+1,js ,ks)]
+ + o1_f1*o1_f2 * src[SRCIND3(is ,js+1,ks)]
+ + o1_f2*o1_f2 * src[SRCIND3(is+1,js+1,ks)];
+ }
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8010;
+ goto l901;
+
+ // end i loop
+ l901:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l800;
+ goto l90;
+
+ // end j loop
+ l90:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l81;
+ goto l9;
+
+ // begin j loop
+ l81:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l810;
+ goto l811;
+
+ // begin i loop
+ l810:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8100;
+ goto l8101;
+
+ // kernel
+ l8100:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1 * src[SRCIND3(is,js,ks-2)]
+ + f2 * src[SRCIND3(is,js,ks-1)]
+ + f3 * src[SRCIND3(is,js,ks )]
+ + f4 * src[SRCIND3(is,js,ks+1)]
+ + f5 * src[SRCIND3(is,js,ks+2)]
+ + f6 * src[SRCIND3(is,js,ks+3)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js ,ks+1)]))||
+ (dst[DSTIND3(id,jd,kd)] < min(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js ,ks+1)]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1 * src[SRCIND3(is,js,ks )]
+ + o1_f2 * src[SRCIND3(is,js,ks+1)];
+ }
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8101;
+ goto l910;
+
+ // kernel
+ l8101:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1 * src[SRCIND3(is-2,js,ks-2)]
+ + f2*f1 * src[SRCIND3(is-1,js,ks-2)]
+ + f3*f1 * src[SRCIND3(is ,js,ks-2)]
+ + f4*f1 * src[SRCIND3(is+1,js,ks-2)]
+ + f5*f1 * src[SRCIND3(is+2,js,ks-2)]
+ + f6*f1 * src[SRCIND3(is+3,js,ks-2)]
+ + f1*f2 * src[SRCIND3(is-2,js,ks-1)]
+ + f2*f2 * src[SRCIND3(is-1,js,ks-1)]
+ + f3*f2 * src[SRCIND3(is ,js,ks-1)]
+ + f4*f2 * src[SRCIND3(is+1,js,ks-1)]
+ + f5*f2 * src[SRCIND3(is+2,js,ks-1)]
+ + f6*f2 * src[SRCIND3(is+3,js,ks-1)]
+ + f1*f3 * src[SRCIND3(is-2,js,ks )]
+ + f2*f3 * src[SRCIND3(is-1,js,ks )]
+ + f3*f3 * src[SRCIND3(is ,js,ks )]
+ + f4*f3 * src[SRCIND3(is+1,js,ks )]
+ + f5*f3 * src[SRCIND3(is+2,js,ks )]
+ + f6*f3 * src[SRCIND3(is+3,js,ks )]
+ + f1*f4 * src[SRCIND3(is-2,js,ks+1)]
+ + f2*f4 * src[SRCIND3(is-1,js,ks+1)]
+ + f3*f4 * src[SRCIND3(is ,js,ks+1)]
+ + f4*f4 * src[SRCIND3(is+1,js,ks+1)]
+ + f5*f4 * src[SRCIND3(is+2,js,ks+1)]
+ + f6*f4 * src[SRCIND3(is+3,js,ks+1)]
+ + f1*f5 * src[SRCIND3(is-2,js,ks+2)]
+ + f2*f5 * src[SRCIND3(is-1,js,ks+2)]
+ + f3*f5 * src[SRCIND3(is ,js,ks+2)]
+ + f4*f5 * src[SRCIND3(is+1,js,ks+2)]
+ + f5*f5 * src[SRCIND3(is+2,js,ks+2)]
+ + f6*f5 * src[SRCIND3(is+3,js,ks+2)]
+ + f1*f6 * src[SRCIND3(is-2,js,ks+3)]
+ + f2*f6 * src[SRCIND3(is-1,js,ks+3)]
+ + f3*f6 * src[SRCIND3(is ,js,ks+3)]
+ + f4*f6 * src[SRCIND3(is+1,js,ks+3)]
+ + f5*f6 * src[SRCIND3(is+2,js,ks+3)]
+ + f6*f6 * src[SRCIND3(is+3,js,ks+3)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is+1,js ,ks+1)]))||
+ (dst[DSTIND3(id,jd,kd)] < min4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is+1,js ,ks+1)]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1*o1_f1 * src[SRCIND3(is ,js,ks )]
+ + o1_f2*o1_f1 * src[SRCIND3(is+1,js,ks )]
+ + o1_f1*o1_f2 * src[SRCIND3(is ,js,ks+1)]
+ + o1_f2*o1_f2 * src[SRCIND3(is+1,js,ks+1)];
+ }
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8100;
+ goto l910;
+
+ // end i loop
+ l910:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l811;
+ goto l91;
+
+ // begin i loop
+ l811:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l8110;
+ goto l8111;
+
+ // kernel
+ l8110:
+ dst[DSTIND3(id,jd,kd)] =
+ + f1*f1 * src[SRCIND3(is,js-2,ks-2)]
+ + f2*f1 * src[SRCIND3(is,js-1,ks-2)]
+ + f3*f1 * src[SRCIND3(is,js ,ks-2)]
+ + f4*f1 * src[SRCIND3(is,js+1,ks-2)]
+ + f5*f1 * src[SRCIND3(is,js+2,ks-2)]
+ + f6*f1 * src[SRCIND3(is,js+3,ks-2)]
+ + f1*f2 * src[SRCIND3(is,js-2,ks-1)]
+ + f2*f2 * src[SRCIND3(is,js-1,ks-1)]
+ + f3*f2 * src[SRCIND3(is,js ,ks-1)]
+ + f4*f2 * src[SRCIND3(is,js+1,ks-1)]
+ + f5*f2 * src[SRCIND3(is,js+2,ks-1)]
+ + f6*f2 * src[SRCIND3(is,js+3,ks-1)]
+ + f1*f3 * src[SRCIND3(is,js-2,ks )]
+ + f2*f3 * src[SRCIND3(is,js-1,ks )]
+ + f3*f3 * src[SRCIND3(is,js ,ks )]
+ + f4*f3 * src[SRCIND3(is,js+1,ks )]
+ + f5*f3 * src[SRCIND3(is,js+2,ks )]
+ + f6*f3 * src[SRCIND3(is,js+3,ks )]
+ + f1*f4 * src[SRCIND3(is,js-2,ks+1)]
+ + f2*f4 * src[SRCIND3(is,js-1,ks+1)]
+ + f3*f4 * src[SRCIND3(is,js ,ks+1)]
+ + f4*f4 * src[SRCIND3(is,js+1,ks+1)]
+ + f5*f4 * src[SRCIND3(is,js+2,ks+1)]
+ + f6*f4 * src[SRCIND3(is,js+3,ks+1)]
+ + f1*f5 * src[SRCIND3(is,js-2,ks+2)]
+ + f2*f5 * src[SRCIND3(is,js-1,ks+2)]
+ + f3*f5 * src[SRCIND3(is,js ,ks+2)]
+ + f4*f5 * src[SRCIND3(is,js+1,ks+2)]
+ + f5*f5 * src[SRCIND3(is,js+2,ks+2)]
+ + f6*f5 * src[SRCIND3(is,js+3,ks+2)]
+ + f1*f6 * src[SRCIND3(is,js-2,ks+3)]
+ + f2*f6 * src[SRCIND3(is,js-1,ks+3)]
+ + f3*f6 * src[SRCIND3(is,js ,ks+3)]
+ + f4*f6 * src[SRCIND3(is,js+1,ks+3)]
+ + f5*f6 * src[SRCIND3(is,js+2,ks+3)]
+ + f6*f6 * src[SRCIND3(is,js+3,ks+3)];
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is ,js+1,ks+1)]))||
+ (dst[DSTIND3(id,jd,kd)] < min4(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is ,js+1,ks+1)]))) {
+ dst[DSTIND3(id,jd,kd)] =
+ + o1_f1*o1_f1 * src[SRCIND3(is,js ,ks )]
+ + o1_f2*o1_f1 * src[SRCIND3(is,js+1,ks )]
+ + o1_f1*o1_f2 * src[SRCIND3(is,js ,ks+1)]
+ + o1_f2*o1_f2 * src[SRCIND3(is,js+1,ks+1)];
+ }
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l8111;
+ goto l911;
+
+ // kernel
+ l8111:
+ {
+ T const res1 =
+ + f1*f1*f1 * src[SRCIND3(is-2,js-2,ks-2)]
+ + f2*f1*f1 * src[SRCIND3(is-1,js-2,ks-2)]
+ + f3*f1*f1 * src[SRCIND3(is ,js-2,ks-2)]
+ + f4*f1*f1 * src[SRCIND3(is+1,js-2,ks-2)]
+ + f5*f1*f1 * src[SRCIND3(is+2,js-2,ks-2)]
+ + f6*f1*f1 * src[SRCIND3(is+3,js-2,ks-2)]
+ + f1*f2*f1 * src[SRCIND3(is-2,js-1,ks-2)]
+ + f2*f2*f1 * src[SRCIND3(is-1,js-1,ks-2)]
+ + f3*f2*f1 * src[SRCIND3(is ,js-1,ks-2)]
+ + f4*f2*f1 * src[SRCIND3(is+1,js-1,ks-2)]
+ + f5*f2*f1 * src[SRCIND3(is+2,js-1,ks-2)]
+ + f6*f2*f1 * src[SRCIND3(is+3,js-1,ks-2)]
+ + f1*f3*f1 * src[SRCIND3(is-2,js ,ks-2)]
+ + f2*f3*f1 * src[SRCIND3(is-1,js ,ks-2)]
+ + f3*f3*f1 * src[SRCIND3(is ,js ,ks-2)]
+ + f4*f3*f1 * src[SRCIND3(is+1,js ,ks-2)]
+ + f5*f3*f1 * src[SRCIND3(is+2,js ,ks-2)]
+ + f6*f3*f1 * src[SRCIND3(is+3,js ,ks-2)]
+ + f1*f4*f1 * src[SRCIND3(is-2,js+1,ks-2)]
+ + f2*f4*f1 * src[SRCIND3(is-1,js+1,ks-2)]
+ + f3*f4*f1 * src[SRCIND3(is ,js+1,ks-2)]
+ + f4*f4*f1 * src[SRCIND3(is+1,js+1,ks-2)]
+ + f5*f4*f1 * src[SRCIND3(is+2,js+1,ks-2)]
+ + f6*f4*f1 * src[SRCIND3(is+3,js+1,ks-2)]
+ + f1*f5*f1 * src[SRCIND3(is-2,js+2,ks-2)]
+ + f2*f5*f1 * src[SRCIND3(is-1,js+2,ks-2)]
+ + f3*f5*f1 * src[SRCIND3(is ,js+2,ks-2)]
+ + f4*f5*f1 * src[SRCIND3(is+1,js+2,ks-2)]
+ + f5*f5*f1 * src[SRCIND3(is+2,js+2,ks-2)]
+ + f6*f5*f1 * src[SRCIND3(is+3,js+2,ks-2)]
+ + f1*f6*f1 * src[SRCIND3(is-2,js+3,ks-2)]
+ + f2*f6*f1 * src[SRCIND3(is-1,js+3,ks-2)]
+ + f3*f6*f1 * src[SRCIND3(is ,js+3,ks-2)]
+ + f4*f6*f1 * src[SRCIND3(is+1,js+3,ks-2)]
+ + f5*f6*f1 * src[SRCIND3(is+2,js+3,ks-2)]
+ + f6*f6*f1 * src[SRCIND3(is+3,js+3,ks-2)];
+ T const res2 =
+ + f1*f1*f2 * src[SRCIND3(is-2,js-2,ks-1)]
+ + f2*f1*f2 * src[SRCIND3(is-1,js-2,ks-1)]
+ + f3*f1*f2 * src[SRCIND3(is ,js-2,ks-1)]
+ + f4*f1*f2 * src[SRCIND3(is+1,js-2,ks-1)]
+ + f5*f1*f2 * src[SRCIND3(is+2,js-2,ks-1)]
+ + f6*f1*f2 * src[SRCIND3(is+3,js-2,ks-1)]
+ + f1*f2*f2 * src[SRCIND3(is-2,js-1,ks-1)]
+ + f2*f2*f2 * src[SRCIND3(is-1,js-1,ks-1)]
+ + f3*f2*f2 * src[SRCIND3(is ,js-1,ks-1)]
+ + f4*f2*f2 * src[SRCIND3(is+1,js-1,ks-1)]
+ + f5*f2*f2 * src[SRCIND3(is+2,js-1,ks-1)]
+ + f6*f2*f2 * src[SRCIND3(is+3,js-1,ks-1)]
+ + f1*f3*f2 * src[SRCIND3(is-2,js ,ks-1)]
+ + f2*f3*f2 * src[SRCIND3(is-1,js ,ks-1)]
+ + f3*f3*f2 * src[SRCIND3(is ,js ,ks-1)]
+ + f4*f3*f2 * src[SRCIND3(is+1,js ,ks-1)]
+ + f5*f3*f2 * src[SRCIND3(is+2,js ,ks-1)]
+ + f6*f3*f2 * src[SRCIND3(is+3,js ,ks-1)]
+ + f1*f4*f2 * src[SRCIND3(is-2,js+1,ks-1)]
+ + f2*f4*f2 * src[SRCIND3(is-1,js+1,ks-1)]
+ + f3*f4*f2 * src[SRCIND3(is ,js+1,ks-1)]
+ + f4*f4*f2 * src[SRCIND3(is+1,js+1,ks-1)]
+ + f5*f4*f2 * src[SRCIND3(is+2,js+1,ks-1)]
+ + f6*f4*f2 * src[SRCIND3(is+3,js+1,ks-1)]
+ + f1*f5*f2 * src[SRCIND3(is-2,js+2,ks-1)]
+ + f2*f5*f2 * src[SRCIND3(is-1,js+2,ks-1)]
+ + f3*f5*f2 * src[SRCIND3(is ,js+2,ks-1)]
+ + f4*f5*f2 * src[SRCIND3(is+1,js+2,ks-1)]
+ + f5*f5*f2 * src[SRCIND3(is+2,js+2,ks-1)]
+ + f6*f5*f2 * src[SRCIND3(is+3,js+2,ks-1)]
+ + f1*f6*f2 * src[SRCIND3(is-2,js+3,ks-1)]
+ + f2*f6*f2 * src[SRCIND3(is-1,js+3,ks-1)]
+ + f3*f6*f2 * src[SRCIND3(is ,js+3,ks-1)]
+ + f4*f6*f2 * src[SRCIND3(is+1,js+3,ks-1)]
+ + f5*f6*f2 * src[SRCIND3(is+2,js+3,ks-1)]
+ + f6*f6*f2 * src[SRCIND3(is+3,js+3,ks-1)];
+ T const res3 =
+ + f1*f1*f3 * src[SRCIND3(is-2,js-2,ks )]
+ + f2*f1*f3 * src[SRCIND3(is-1,js-2,ks )]
+ + f3*f1*f3 * src[SRCIND3(is ,js-2,ks )]
+ + f4*f1*f3 * src[SRCIND3(is+1,js-2,ks )]
+ + f5*f1*f3 * src[SRCIND3(is+2,js-2,ks )]
+ + f6*f1*f3 * src[SRCIND3(is+3,js-2,ks )]
+ + f1*f2*f3 * src[SRCIND3(is-2,js-1,ks )]
+ + f2*f2*f3 * src[SRCIND3(is-1,js-1,ks )]
+ + f3*f2*f3 * src[SRCIND3(is ,js-1,ks )]
+ + f4*f2*f3 * src[SRCIND3(is+1,js-1,ks )]
+ + f5*f2*f3 * src[SRCIND3(is+2,js-1,ks )]
+ + f6*f2*f3 * src[SRCIND3(is+3,js-1,ks )]
+ + f1*f3*f3 * src[SRCIND3(is-2,js ,ks )]
+ + f2*f3*f3 * src[SRCIND3(is-1,js ,ks )]
+ + f3*f3*f3 * src[SRCIND3(is ,js ,ks )]
+ + f4*f3*f3 * src[SRCIND3(is+1,js ,ks )]
+ + f5*f3*f3 * src[SRCIND3(is+2,js ,ks )]
+ + f6*f3*f3 * src[SRCIND3(is+3,js ,ks )]
+ + f1*f4*f3 * src[SRCIND3(is-2,js+1,ks )]
+ + f2*f4*f3 * src[SRCIND3(is-1,js+1,ks )]
+ + f3*f4*f3 * src[SRCIND3(is ,js+1,ks )]
+ + f4*f4*f3 * src[SRCIND3(is+1,js+1,ks )]
+ + f5*f4*f3 * src[SRCIND3(is+2,js+1,ks )]
+ + f6*f4*f3 * src[SRCIND3(is+3,js+1,ks )]
+ + f1*f5*f3 * src[SRCIND3(is-2,js+2,ks )]
+ + f2*f5*f3 * src[SRCIND3(is-1,js+2,ks )]
+ + f3*f5*f3 * src[SRCIND3(is ,js+2,ks )]
+ + f4*f5*f3 * src[SRCIND3(is+1,js+2,ks )]
+ + f5*f5*f3 * src[SRCIND3(is+2,js+2,ks )]
+ + f6*f5*f3 * src[SRCIND3(is+3,js+2,ks )]
+ + f1*f6*f3 * src[SRCIND3(is-2,js+3,ks )]
+ + f2*f6*f3 * src[SRCIND3(is-1,js+3,ks )]
+ + f3*f6*f3 * src[SRCIND3(is ,js+3,ks )]
+ + f4*f6*f3 * src[SRCIND3(is+1,js+3,ks )]
+ + f5*f6*f3 * src[SRCIND3(is+2,js+3,ks )]
+ + f6*f6*f3 * src[SRCIND3(is+3,js+3,ks )];
+ T const res4 =
+ + f1*f1*f4 * src[SRCIND3(is-2,js-2,ks+1)]
+ + f2*f1*f4 * src[SRCIND3(is-1,js-2,ks+1)]
+ + f3*f1*f4 * src[SRCIND3(is ,js-2,ks+1)]
+ + f4*f1*f4 * src[SRCIND3(is+1,js-2,ks+1)]
+ + f5*f1*f4 * src[SRCIND3(is+2,js-2,ks+1)]
+ + f6*f1*f4 * src[SRCIND3(is+3,js-2,ks+1)]
+ + f1*f2*f4 * src[SRCIND3(is-2,js-1,ks+1)]
+ + f2*f2*f4 * src[SRCIND3(is-1,js-1,ks+1)]
+ + f3*f2*f4 * src[SRCIND3(is ,js-1,ks+1)]
+ + f4*f2*f4 * src[SRCIND3(is+1,js-1,ks+1)]
+ + f5*f2*f4 * src[SRCIND3(is+2,js-1,ks+1)]
+ + f6*f2*f4 * src[SRCIND3(is+3,js-1,ks+1)]
+ + f1*f3*f4 * src[SRCIND3(is-2,js ,ks+1)]
+ + f2*f3*f4 * src[SRCIND3(is-1,js ,ks+1)]
+ + f3*f3*f4 * src[SRCIND3(is ,js ,ks+1)]
+ + f4*f3*f4 * src[SRCIND3(is+1,js ,ks+1)]
+ + f5*f3*f4 * src[SRCIND3(is+2,js ,ks+1)]
+ + f6*f3*f4 * src[SRCIND3(is+3,js ,ks+1)]
+ + f1*f4*f4 * src[SRCIND3(is-2,js+1,ks+1)]
+ + f2*f4*f4 * src[SRCIND3(is-1,js+1,ks+1)]
+ + f3*f4*f4 * src[SRCIND3(is ,js+1,ks+1)]
+ + f4*f4*f4 * src[SRCIND3(is+1,js+1,ks+1)]
+ + f5*f4*f4 * src[SRCIND3(is+2,js+1,ks+1)]
+ + f6*f4*f4 * src[SRCIND3(is+3,js+1,ks+1)]
+ + f1*f5*f4 * src[SRCIND3(is-2,js+2,ks+1)]
+ + f2*f5*f4 * src[SRCIND3(is-1,js+2,ks+1)]
+ + f3*f5*f4 * src[SRCIND3(is ,js+2,ks+1)]
+ + f4*f5*f4 * src[SRCIND3(is+1,js+2,ks+1)]
+ + f5*f5*f4 * src[SRCIND3(is+2,js+2,ks+1)]
+ + f6*f5*f4 * src[SRCIND3(is+3,js+2,ks+1)]
+ + f1*f6*f4 * src[SRCIND3(is-2,js+3,ks+1)]
+ + f2*f6*f4 * src[SRCIND3(is-1,js+3,ks+1)]
+ + f3*f6*f4 * src[SRCIND3(is ,js+3,ks+1)]
+ + f4*f6*f4 * src[SRCIND3(is+1,js+3,ks+1)]
+ + f5*f6*f4 * src[SRCIND3(is+2,js+3,ks+1)]
+ + f6*f6*f4 * src[SRCIND3(is+3,js+3,ks+1)];
+ T const res5 =
+ + f1*f1*f5 * src[SRCIND3(is-2,js-2,ks+2)]
+ + f2*f1*f5 * src[SRCIND3(is-1,js-2,ks+2)]
+ + f3*f1*f5 * src[SRCIND3(is ,js-2,ks+2)]
+ + f4*f1*f5 * src[SRCIND3(is+1,js-2,ks+2)]
+ + f5*f1*f5 * src[SRCIND3(is+2,js-2,ks+2)]
+ + f6*f1*f5 * src[SRCIND3(is+3,js-2,ks+2)]
+ + f1*f2*f5 * src[SRCIND3(is-2,js-1,ks+2)]
+ + f2*f2*f5 * src[SRCIND3(is-1,js-1,ks+2)]
+ + f3*f2*f5 * src[SRCIND3(is ,js-1,ks+2)]
+ + f4*f2*f5 * src[SRCIND3(is+1,js-1,ks+2)]
+ + f5*f2*f5 * src[SRCIND3(is+2,js-1,ks+2)]
+ + f6*f2*f5 * src[SRCIND3(is+3,js-1,ks+2)]
+ + f1*f3*f5 * src[SRCIND3(is-2,js ,ks+2)]
+ + f2*f3*f5 * src[SRCIND3(is-1,js ,ks+2)]
+ + f3*f3*f5 * src[SRCIND3(is ,js ,ks+2)]
+ + f4*f3*f5 * src[SRCIND3(is+1,js ,ks+2)]
+ + f5*f3*f5 * src[SRCIND3(is+2,js ,ks+2)]
+ + f6*f3*f5 * src[SRCIND3(is+3,js ,ks+2)]
+ + f1*f4*f5 * src[SRCIND3(is-2,js+1,ks+2)]
+ + f2*f4*f5 * src[SRCIND3(is-1,js+1,ks+2)]
+ + f3*f4*f5 * src[SRCIND3(is ,js+1,ks+2)]
+ + f4*f4*f5 * src[SRCIND3(is+1,js+1,ks+2)]
+ + f5*f4*f5 * src[SRCIND3(is+2,js+1,ks+2)]
+ + f6*f4*f5 * src[SRCIND3(is+3,js+1,ks+2)]
+ + f1*f5*f5 * src[SRCIND3(is-2,js+2,ks+2)]
+ + f2*f5*f5 * src[SRCIND3(is-1,js+2,ks+2)]
+ + f3*f5*f5 * src[SRCIND3(is ,js+2,ks+2)]
+ + f4*f5*f5 * src[SRCIND3(is+1,js+2,ks+2)]
+ + f5*f5*f5 * src[SRCIND3(is+2,js+2,ks+2)]
+ + f6*f5*f5 * src[SRCIND3(is+3,js+2,ks+2)]
+ + f1*f6*f5 * src[SRCIND3(is-2,js+3,ks+2)]
+ + f2*f6*f5 * src[SRCIND3(is-1,js+3,ks+2)]
+ + f3*f6*f5 * src[SRCIND3(is ,js+3,ks+2)]
+ + f4*f6*f5 * src[SRCIND3(is+1,js+3,ks+2)]
+ + f5*f6*f5 * src[SRCIND3(is+2,js+3,ks+2)]
+ + f6*f6*f5 * src[SRCIND3(is+3,js+3,ks+2)];
+ T const res6 =
+ + f1*f1*f6 * src[SRCIND3(is-2,js-2,ks+3)]
+ + f2*f1*f6 * src[SRCIND3(is-1,js-2,ks+3)]
+ + f3*f1*f6 * src[SRCIND3(is ,js-2,ks+3)]
+ + f4*f1*f6 * src[SRCIND3(is+1,js-2,ks+3)]
+ + f5*f1*f6 * src[SRCIND3(is+2,js-2,ks+3)]
+ + f6*f1*f6 * src[SRCIND3(is+3,js-2,ks+3)]
+ + f1*f2*f6 * src[SRCIND3(is-2,js-1,ks+3)]
+ + f2*f2*f6 * src[SRCIND3(is-1,js-1,ks+3)]
+ + f3*f2*f6 * src[SRCIND3(is ,js-1,ks+3)]
+ + f4*f2*f6 * src[SRCIND3(is+1,js-1,ks+3)]
+ + f5*f2*f6 * src[SRCIND3(is+2,js-1,ks+3)]
+ + f6*f2*f6 * src[SRCIND3(is+3,js-1,ks+3)]
+ + f1*f3*f6 * src[SRCIND3(is-2,js ,ks+3)]
+ + f2*f3*f6 * src[SRCIND3(is-1,js ,ks+3)]
+ + f3*f3*f6 * src[SRCIND3(is ,js ,ks+3)]
+ + f4*f3*f6 * src[SRCIND3(is+1,js ,ks+3)]
+ + f5*f3*f6 * src[SRCIND3(is+2,js ,ks+3)]
+ + f6*f3*f6 * src[SRCIND3(is+3,js ,ks+3)]
+ + f1*f4*f6 * src[SRCIND3(is-2,js+1,ks+3)]
+ + f2*f4*f6 * src[SRCIND3(is-1,js+1,ks+3)]
+ + f3*f4*f6 * src[SRCIND3(is ,js+1,ks+3)]
+ + f4*f4*f6 * src[SRCIND3(is+1,js+1,ks+3)]
+ + f5*f4*f6 * src[SRCIND3(is+2,js+1,ks+3)]
+ + f6*f4*f6 * src[SRCIND3(is+3,js+1,ks+3)]
+ + f1*f5*f6 * src[SRCIND3(is-2,js+2,ks+3)]
+ + f2*f5*f6 * src[SRCIND3(is-1,js+2,ks+3)]
+ + f3*f5*f6 * src[SRCIND3(is ,js+2,ks+3)]
+ + f4*f5*f6 * src[SRCIND3(is+1,js+2,ks+3)]
+ + f5*f5*f6 * src[SRCIND3(is+2,js+2,ks+3)]
+ + f6*f5*f6 * src[SRCIND3(is+3,js+2,ks+3)]
+ + f1*f6*f6 * src[SRCIND3(is-2,js+3,ks+3)]
+ + f2*f6*f6 * src[SRCIND3(is-1,js+3,ks+3)]
+ + f3*f6*f6 * src[SRCIND3(is ,js+3,ks+3)]
+ + f4*f6*f6 * src[SRCIND3(is+1,js+3,ks+3)]
+ + f5*f6*f6 * src[SRCIND3(is+2,js+3,ks+3)]
+ + f6*f6*f6 * src[SRCIND3(is+3,js+3,ks+3)];
+ dst[DSTIND3(id,jd,kd)] = res1 + res2 + res3 + res4 + res5 + res6;
+ // Monotonicity enforcement
+ if ((dst[DSTIND3(id,jd,kd)] > max8(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is+1,js+1,ks )],
+ src[SRCIND3(is+1,js ,ks+1)],
+ src[SRCIND3(is ,js+1,ks+1)],
+ src[SRCIND3(is+1,js+1,ks+1)]))||
+ (dst[DSTIND3(id,jd,kd)] < min8(src[SRCIND3(is ,js ,ks )],
+ src[SRCIND3(is+1,js ,ks )],
+ src[SRCIND3(is ,js+1,ks )],
+ src[SRCIND3(is ,js ,ks+1)],
+ src[SRCIND3(is+1,js+1,ks )],
+ src[SRCIND3(is+1,js ,ks+1)],
+ src[SRCIND3(is ,js+1,ks+1)],
+ src[SRCIND3(is+1,js+1,ks+1)]))) {
+ T const res1 =
+ + o1_f1*o1_f1*o1_f1 * src[SRCIND3(is ,js ,ks )]
+ + o1_f2*o1_f1*o1_f1 * src[SRCIND3(is+1,js ,ks )]
+ + o1_f1*o1_f2*o1_f1 * src[SRCIND3(is ,js+1,ks )]
+ + o1_f2*o1_f2*o1_f1 * src[SRCIND3(is+1,js+1,ks )];
+ T const res2 =
+ + o1_f1*o1_f1*o1_f2 * src[SRCIND3(is ,js ,ks+1)]
+ + o1_f2*o1_f1*o1_f2 * src[SRCIND3(is+1,js ,ks+1)]
+ + o1_f1*o1_f2*o1_f2 * src[SRCIND3(is ,js+1,ks+1)]
+ + o1_f2*o1_f2*o1_f2 * src[SRCIND3(is+1,js+1,ks+1)];
+ dst[DSTIND3(id,jd,kd)] = res1 + res2;
+ }
+ }
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l8110;
+ goto l911;
+
+ // end i loop
+ l911:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l810;
+ goto l91;
+
+ // end j loop
+ l91:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l80;
+ goto l9;
+
+ // end k loop
+ l9:;
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ prolongate_3d_o5_monotone_rf2 (T const * restrict const src, \
+ ivect3 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect3 const & restrict dstext, \
+ ibbox3 const & restrict srcbbox, \
+ ibbox3 const & restrict dstbbox, \
+ ibbox3 const & restrict regbbox);
+#define CARPET_NO_COMPLEX
+#include "instantiate"
+#undef CARPET_NO_COMPLEX
+#undef INSTANTIATE
+
+ template <>
+ void
+ prolongate_3d_o5_monotone_rf2 (CCTK_COMPLEX const * restrict const src,
+ ivect3 const & restrict srcext,
+ CCTK_COMPLEX * restrict const dst,
+ ivect3 const & restrict dstext,
+ ibbox3 const & restrict srcbbox,
+ ibbox3 const & restrict dstbbox,
+ ibbox3 const & restrict regbbox)
+ {
+ CCTK_WARN(0, "This should never be called!");
+ }
+
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o5_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o5_rf2.cc
index 71133b004..6cbde8cde 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o5_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o5_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -143,7 +143,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -151,7 +151,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -159,7 +159,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = src[SRCIND3(is,js,ks)];
i = i+1;
id = id+1;
@@ -167,7 +167,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is-2,js,ks)]
+ f2 * src[SRCIND3(is-1,js,ks)]
@@ -182,14 +182,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -197,7 +197,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js-2,ks)]
+ f2 * src[SRCIND3(is,js-1,ks)]
@@ -211,7 +211,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is-2,js-2,ks)]
+ f2*f1 * src[SRCIND3(is-1,js-2,ks)]
@@ -256,7 +256,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -264,14 +264,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -279,7 +279,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -287,7 +287,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] =
+ f1 * src[SRCIND3(is,js,ks-2)]
+ f2 * src[SRCIND3(is,js,ks-1)]
@@ -301,7 +301,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is-2,js,ks-2)]
+ f2*f1 * src[SRCIND3(is-1,js,ks-2)]
@@ -346,14 +346,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -361,7 +361,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
+ f1*f1 * src[SRCIND3(is,js-2,ks-2)]
+ f2*f1 * src[SRCIND3(is,js-1,ks-2)]
@@ -405,7 +405,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
T const res1 =
+ f1*f1*f1 * src[SRCIND3(is-2,js-2,ks-2)]
@@ -638,7 +638,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -646,7 +646,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -654,7 +654,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o7_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o7_rf2.cc
index b65f1632d..44ee78d01 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o7_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o7_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -227,7 +227,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -235,7 +235,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -243,7 +243,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = interp0<T> (& src[SRCIND3(is,js,ks)]);
i = i+1;
id = id+1;
@@ -251,7 +251,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is-3,js,ks)], srcdi);
i = i+1;
id = id+1;
@@ -260,14 +260,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -275,7 +275,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js-3,ks)], srcdj);
i = i+1;
id = id+1;
@@ -283,7 +283,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-3,js-3,ks)], srcdi, srcdj);
i = i+1;
@@ -293,7 +293,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -301,14 +301,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -316,7 +316,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -324,7 +324,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js,ks-3)], srcdk);
i = i+1;
id = id+1;
@@ -332,7 +332,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-3,js,ks-3)], srcdi, srcdj);
i = i+1;
@@ -342,14 +342,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -357,7 +357,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is,js-3,ks-3)], srcdj, srcdk);
i = i+1;
@@ -366,7 +366,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
dst[DSTIND3(id,jd,kd)] =
interp3<T> (& src[SRCIND3(is-3,js-3,ks-3)], srcdi, srcdj, srcdk);
@@ -378,7 +378,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -386,7 +386,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -394,7 +394,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_3d_o9_rf2.cc b/Carpet/CarpetLib/src/prolongate_3d_o9_rf2.cc
index a01a3bd35..04e9a97b8 100644
--- a/Carpet/CarpetLib/src/prolongate_3d_o9_rf2.cc
+++ b/Carpet/CarpetLib/src/prolongate_3d_o9_rf2.cc
@@ -6,7 +6,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
@@ -229,7 +229,7 @@ namespace CarpetLib {
goto l81;
// begin j loop
- l80:
+ l80:
j = 0;
js = j0;
jd = dstjoff;
@@ -237,7 +237,7 @@ namespace CarpetLib {
goto l801;
// begin i loop
- l800:
+ l800:
i = 0;
is = i0;
id = dstioff;
@@ -245,7 +245,7 @@ namespace CarpetLib {
goto l8001;
// kernel
- l8000:
+ l8000:
dst[DSTIND3(id,jd,kd)] = interp0<T> (& src[SRCIND3(is,js,ks)]);
i = i+1;
id = id+1;
@@ -253,7 +253,7 @@ namespace CarpetLib {
goto l900;
// kernel
- l8001:
+ l8001:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is-4,js,ks)], srcdi);
i = i+1;
id = id+1;
@@ -262,14 +262,14 @@ namespace CarpetLib {
goto l900;
// end i loop
- l900:
+ l900:
j = j+1;
jd = jd+1;
if (j < regjext) goto l801;
goto l90;
// begin i loop
- l801:
+ l801:
i = 0;
is = i0;
id = dstioff;
@@ -277,7 +277,7 @@ namespace CarpetLib {
goto l8011;
// kernel
- l8010:
+ l8010:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js-4,ks)], srcdj);
i = i+1;
id = id+1;
@@ -285,7 +285,7 @@ namespace CarpetLib {
goto l901;
// kernel
- l8011:
+ l8011:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-4,js-4,ks)], srcdi, srcdj);
i = i+1;
@@ -295,7 +295,7 @@ namespace CarpetLib {
goto l901;
// end i loop
- l901:
+ l901:
j = j+1;
jd = jd+1;
js = js+1;
@@ -303,14 +303,14 @@ namespace CarpetLib {
goto l90;
// end j loop
- l90:
+ l90:
k = k+1;
kd = kd+1;
if (k < regkext) goto l81;
goto l9;
// begin j loop
- l81:
+ l81:
j = 0;
js = j0;
jd = dstjoff;
@@ -318,7 +318,7 @@ namespace CarpetLib {
goto l811;
// begin i loop
- l810:
+ l810:
i = 0;
is = i0;
id = dstioff;
@@ -326,7 +326,7 @@ namespace CarpetLib {
goto l8101;
// kernel
- l8100:
+ l8100:
dst[DSTIND3(id,jd,kd)] = interp1<T> (& src[SRCIND3(is,js,ks-4)], srcdk);
i = i+1;
id = id+1;
@@ -334,7 +334,7 @@ namespace CarpetLib {
goto l910;
// kernel
- l8101:
+ l8101:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is-4,js,ks-4)], srcdi, srcdj);
i = i+1;
@@ -344,14 +344,14 @@ namespace CarpetLib {
goto l910;
// end i loop
- l910:
+ l910:
j = j+1;
jd = jd+1;
if (j < regjext) goto l811;
goto l91;
// begin i loop
- l811:
+ l811:
i = 0;
is = i0;
id = dstioff;
@@ -359,7 +359,7 @@ namespace CarpetLib {
goto l8111;
// kernel
- l8110:
+ l8110:
dst[DSTIND3(id,jd,kd)] =
interp2<T> (& src[SRCIND3(is,js-4,ks-4)], srcdj, srcdk);
i = i+1;
@@ -368,7 +368,7 @@ namespace CarpetLib {
goto l911;
// kernel
- l8111:
+ l8111:
{
dst[DSTIND3(id,jd,kd)] =
interp3<T> (& src[SRCIND3(is-4,js-4,ks-4)], srcdi, srcdj, srcdk);
@@ -380,7 +380,7 @@ namespace CarpetLib {
goto l911;
// end i loop
- l911:
+ l911:
j = j+1;
jd = jd+1;
js = js+1;
@@ -388,7 +388,7 @@ namespace CarpetLib {
goto l91;
// end j loop
- l91:
+ l91:
k = k+1;
kd = kd+1;
ks = ks+1;
@@ -396,7 +396,7 @@ namespace CarpetLib {
goto l9;
// end k loop
- l9:;
+ l9:;
}
diff --git a/Carpet/CarpetLib/src/prolongate_4d_o1_rf2.cc b/Carpet/CarpetLib/src/prolongate_4d_o1_rf2.cc
new file mode 100644
index 000000000..4c8022916
--- /dev/null
+++ b/Carpet/CarpetLib/src/prolongate_4d_o1_rf2.cc
@@ -0,0 +1,602 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_4d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND4(i,j,k,l) \
+ index4 (i, j, k, l, \
+ srciext, srcjext, srckext, srclext)
+#define DSTIND4(i,j,k,l) \
+ index4 (i, j, k, l, \
+ dstiext, dstjext, dstkext, dstlext)
+
+
+
+ template <typename T>
+ void
+ prolongate_4d_o1_rf2 (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox)
+ {
+ typedef typename typeprops<T>::real RT;
+
+
+
+ if (any (srcbbox.stride() <= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (srcbbox.stride() != reffact2 * dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: source strides are not twice the destination strides");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+
+
+ ivect4 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower()) % regbbox.stride() == 0));
+ ivect4 const srcoff = (regbbox.lower() - srcbbox.lower()) / regbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % regbbox.stride() == 0));
+ ivect4 const dstoff = (regbbox.lower() - dstbbox.lower()) / regbbox.stride();
+
+
+
+ bvect4 const needoffsetlo = srcoff % reffact2 != 0 or regext > 1;
+ bvect4 const needoffsethi = (srcoff + regext - 1) % reffact2 != 0 or regext > 1;
+ ivect4 const offsetlo = either (needoffsetlo, 1, 0);
+ ivect4 const offsethi = either (needoffsethi, 1, 0);
+
+
+
+ if (not regbbox.expand(offsetlo, offsethi).is_contained_in(srcbbox) or
+ not regbbox .is_contained_in(dstbbox))
+ {
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ size_t const srciext = srcext[0];
+ size_t const srcjext = srcext[1];
+ size_t const srckext = srcext[2];
+ size_t const srclext = srcext[3];
+
+ size_t const dstiext = dstext[0];
+ size_t const dstjext = dstext[1];
+ size_t const dstkext = dstext[2];
+ size_t const dstlext = dstext[3];
+
+ size_t const regiext = regext[0];
+ size_t const regjext = regext[1];
+ size_t const regkext = regext[2];
+ size_t const reglext = regext[3];
+
+ size_t const srcioff = srcoff[0];
+ size_t const srcjoff = srcoff[1];
+ size_t const srckoff = srcoff[2];
+ size_t const srcloff = srcoff[3];
+
+ size_t const dstioff = dstoff[0];
+ size_t const dstjoff = dstoff[1];
+ size_t const dstkoff = dstoff[2];
+ size_t const dstloff = dstoff[3];
+
+
+
+ size_t const fi = srcioff % 2;
+ size_t const fj = srcjoff % 2;
+ size_t const fk = srckoff % 2;
+ size_t const fl = srcloff % 2;
+
+ size_t const i0 = srcioff / 2;
+ size_t const j0 = srcjoff / 2;
+ size_t const k0 = srckoff / 2;
+ size_t const l0 = srcloff / 2;
+
+ RT const one = 1;
+
+ RT const f1 = one/2;
+ RT const f2 = one/2;
+
+
+
+ // Loop over fine region
+ // Label scheme: l 8 fl fk fj fi
+
+ size_t is, js, ks, ls;
+ size_t id, jd, kd, ld;
+ size_t i, j, k, l;
+
+ // begin l loop
+ l = 0;
+ ls = l0;
+ ld = dstloff;
+ if (fl == 0) goto l80;
+ goto l81;
+
+ // begin k loop
+ l80:
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l800;
+ goto l801;
+
+ // begin j loop
+ l800:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l8000;
+ goto l8001;
+
+ // begin i loop
+ l8000:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l80000;
+ goto l80001;
+
+ // kernel
+ l80000:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + src[SRCIND4(is,js,ks,ls)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l80001;
+ goto l9000;
+
+ // kernel
+ l80001:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1 * src[SRCIND4(is ,js,ks,ls)]
+ + f2 * src[SRCIND4(is+1,js,ks,ls)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l80000;
+ goto l9000;
+
+ // end i loop
+ l9000:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l8001;
+ goto l900;
+
+ // begin i loop
+ l8001:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l80010;
+ goto l80011;
+
+ // kernel
+ l80010:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1 * src[SRCIND4(is,js ,ks,ls)]
+ + f2 * src[SRCIND4(is,js+1,ks,ls)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l80011;
+ goto l9001;
+
+ // kernel
+ l80011:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is ,js ,ks,ls)]
+ + f2*f1 * src[SRCIND4(is+1,js ,ks,ls)]
+ + f1*f2 * src[SRCIND4(is ,js+1,ks,ls)]
+ + f2*f2 * src[SRCIND4(is+1,js+1,ks,ls)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l80010;
+ goto l9001;
+
+ // end i loop
+ l9001:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l8000;
+ goto l900;
+
+ // end j loop
+ l900:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l800;
+ goto l90;
+
+ // begin j loop
+ l801:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l8010;
+ goto l8011;
+
+ // begin i loop
+ l8010:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l80100;
+ goto l80101;
+
+ // kernel
+ l80100:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1 * src[SRCIND4(is,js,ks ,ls)]
+ + f2 * src[SRCIND4(is,js,ks+1,ls)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l80101;
+ goto l9010;
+
+ // kernel
+ l80101:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is ,js,ks ,ls)]
+ + f2*f1 * src[SRCIND4(is+1,js,ks ,ls)]
+ + f1*f2 * src[SRCIND4(is ,js,ks+1,ls)]
+ + f2*f2 * src[SRCIND4(is+1,js,ks+1,ls)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l80100;
+ goto l9010;
+
+ // end i loop
+ l9010:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l8011;
+ goto l901;
+
+ // begin i loop
+ l8011:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l80110;
+ goto l80111;
+
+ // kernel
+ l80110:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is,js ,ks ,ls)]
+ + f2*f1 * src[SRCIND4(is,js+1,ks ,ls)]
+ + f1*f2 * src[SRCIND4(is,js ,ks+1,ls)]
+ + f2*f2 * src[SRCIND4(is,js+1,ks+1,ls)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l80111;
+ goto l9011;
+
+ // kernel
+ l80111:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1*f1 * src[SRCIND4(is ,js ,ks ,ls)]
+ + f2*f1*f1 * src[SRCIND4(is+1,js ,ks ,ls)]
+ + f1*f2*f1 * src[SRCIND4(is ,js+1,ks ,ls)]
+ + f2*f2*f1 * src[SRCIND4(is+1,js+1,ks ,ls)]
+ + f1*f1*f2 * src[SRCIND4(is ,js ,ks+1,ls)]
+ + f2*f1*f2 * src[SRCIND4(is+1,js ,ks+1,ls)]
+ + f1*f2*f2 * src[SRCIND4(is ,js+1,ks+1,ls)]
+ + f2*f2*f2 * src[SRCIND4(is+1,js+1,ks+1,ls)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l80110;
+ goto l9011;
+
+ // end i loop
+ l9011:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l8010;
+ goto l901;
+
+ // end j loop
+ l901:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l800;
+ goto l90;
+
+ // end k loop
+ l90:
+ l = l+1;
+ ld = ld+1;
+ ls = ls+1;
+ if (l < reglext) goto l81;
+ goto l80;
+
+ // begin k loop
+ l81:
+ k = 0;
+ ks = k0;
+ kd = dstkoff;
+ if (fk == 0) goto l810;
+ goto l811;
+
+ // begin j loop
+ l810:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l8100;
+ goto l8101;
+
+ // begin i loop
+ l8100:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l81000;
+ goto l81001;
+
+ // kernel
+ l81000:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1 * src[SRCIND4(is,js,ks,ls )]
+ + f2 * src[SRCIND4(is,js,ks,ls+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l81001;
+ goto l9100;
+
+ // kernel
+ l81001:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is ,js,ks,ls )]
+ + f2*f1 * src[SRCIND4(is+1,js,ks,ls )]
+ + f1*f2 * src[SRCIND4(is ,js,ks,ls+1)]
+ + f2*f2 * src[SRCIND4(is+1,js,ks,ls+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l81000;
+ goto l9100;
+
+ // end i loop
+ l9100:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l8101;
+ goto l910;
+
+ // begin i loop
+ l8101:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l81010;
+ goto l81011;
+
+ // kernel
+ l81010:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is,js ,ks,ls )]
+ + f2*f1 * src[SRCIND4(is,js+1,ks,ls )]
+ + f1*f2 * src[SRCIND4(is,js ,ks,ls+1)]
+ + f2*f2 * src[SRCIND4(is,js+1,ks,ls+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l81011;
+ goto l9101;
+
+ // kernel
+ l81011:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1*f1 * src[SRCIND4(is ,js ,ks,ls )]
+ + f2*f1*f1 * src[SRCIND4(is+1,js ,ks,ls )]
+ + f1*f2*f1 * src[SRCIND4(is ,js+1,ks,ls )]
+ + f2*f2*f1 * src[SRCIND4(is+1,js+1,ks,ls )]
+ + f1*f1*f2 * src[SRCIND4(is ,js ,ks,ls+1)]
+ + f2*f1*f2 * src[SRCIND4(is+1,js ,ks,ls+1)]
+ + f1*f2*f2 * src[SRCIND4(is ,js+1,ks,ls+1)]
+ + f2*f2*f2 * src[SRCIND4(is+1,js+1,ks,ls+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l81010;
+ goto l9101;
+
+ // end i loop
+ l9101:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l8100;
+ goto l910;
+
+ // end j loop
+ l910:
+ k = k+1;
+ kd = kd+1;
+ if (k < regkext) goto l810;
+ goto l91;
+
+ // begin j loop
+ l811:
+ j = 0;
+ js = j0;
+ jd = dstjoff;
+ if (fj == 0) goto l8110;
+ goto l8111;
+
+ // begin i loop
+ l8110:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l81100;
+ goto l81101;
+
+ // kernel
+ l81100:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1 * src[SRCIND4(is,js,ks ,ls )]
+ + f2*f1 * src[SRCIND4(is,js,ks+1,ls )]
+ + f1*f2 * src[SRCIND4(is,js,ks ,ls+1)]
+ + f2*f2 * src[SRCIND4(is,js,ks+1,ls+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l81101;
+ goto l9110;
+
+ // kernel
+ l81101:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1*f1 * src[SRCIND4(is ,js,ks ,ls )]
+ + f2*f1*f1 * src[SRCIND4(is+1,js,ks ,ls )]
+ + f1*f2*f1 * src[SRCIND4(is ,js,ks+1,ls )]
+ + f2*f2*f1 * src[SRCIND4(is+1,js,ks+1,ls )]
+ + f1*f1*f2 * src[SRCIND4(is ,js,ks ,ls+1)]
+ + f2*f1*f2 * src[SRCIND4(is+1,js,ks ,ls+1)]
+ + f1*f2*f2 * src[SRCIND4(is ,js,ks+1,ls+1)]
+ + f2*f2*f2 * src[SRCIND4(is+1,js,ks+1,ls+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l81100;
+ goto l9110;
+
+ // end i loop
+ l9110:
+ j = j+1;
+ jd = jd+1;
+ if (j < regjext) goto l8111;
+ goto l911;
+
+ // begin i loop
+ l8111:
+ i = 0;
+ is = i0;
+ id = dstioff;
+ if (fi == 0) goto l81110;
+ goto l81111;
+
+ // kernel
+ l81110:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1*f1*f1 * src[SRCIND4(is,js ,ks ,ls )]
+ + f2*f1*f1*f1 * src[SRCIND4(is,js+1,ks ,ls )]
+ + f1*f2*f2*f1 * src[SRCIND4(is,js ,ks+1,ls )]
+ + f2*f2*f2*f1 * src[SRCIND4(is,js+1,ks+1,ls )]
+ + f1*f1*f1*f2 * src[SRCIND4(is,js ,ks ,ls+1)]
+ + f2*f1*f1*f2 * src[SRCIND4(is,js+1,ks ,ls+1)]
+ + f1*f2*f2*f2 * src[SRCIND4(is,js ,ks+1,ls+1)]
+ + f2*f2*f2*f2 * src[SRCIND4(is,js+1,ks+1,ls+1)];
+ i = i+1;
+ id = id+1;
+ if (i < regiext) goto l81111;
+ goto l9111;
+
+ // kernel
+ l81111:
+ dst[DSTIND4(id,jd,kd,ld)] =
+ + f1*f1*f1*f1 * src[SRCIND4(is ,js ,ks ,ls )]
+ + f2*f1*f1*f1 * src[SRCIND4(is+1,js ,ks ,ls )]
+ + f1*f2*f1*f1 * src[SRCIND4(is ,js+1,ks ,ls )]
+ + f2*f2*f1*f1 * src[SRCIND4(is+1,js+1,ks ,ls )]
+ + f1*f1*f2*f1 * src[SRCIND4(is ,js ,ks+1,ls )]
+ + f2*f1*f2*f1 * src[SRCIND4(is+1,js ,ks+1,ls )]
+ + f1*f2*f2*f1 * src[SRCIND4(is ,js+1,ks+1,ls )]
+ + f2*f2*f2*f1 * src[SRCIND4(is+1,js+1,ks+1,ls )]
+ + f1*f1*f1*f2 * src[SRCIND4(is ,js ,ks ,ls+1)]
+ + f2*f1*f1*f2 * src[SRCIND4(is+1,js ,ks ,ls+1)]
+ + f1*f2*f1*f2 * src[SRCIND4(is ,js+1,ks ,ls+1)]
+ + f2*f2*f1*f2 * src[SRCIND4(is+1,js+1,ks ,ls+1)]
+ + f1*f1*f2*f2 * src[SRCIND4(is ,js ,ks+1,ls+1)]
+ + f2*f1*f2*f2 * src[SRCIND4(is+1,js ,ks+1,ls+1)]
+ + f1*f2*f2*f2 * src[SRCIND4(is ,js+1,ks+1,ls+1)]
+ + f2*f2*f2*f2 * src[SRCIND4(is+1,js+1,ks+1,ls+1)];
+ i = i+1;
+ id = id+1;
+ is = is+1;
+ if (i < regiext) goto l81110;
+ goto l9111;
+
+ // end i loop
+ l9111:
+ j = j+1;
+ jd = jd+1;
+ js = js+1;
+ if (j < regjext) goto l8110;
+ goto l911;
+
+ // end j loop
+ l911:
+ k = k+1;
+ kd = kd+1;
+ ks = ks+1;
+ if (k < regkext) goto l810;
+ goto l91;
+
+ // end k loop
+ l91:
+ l = l+1;
+ ld = ld+1;
+ ls = ls+1;
+ if (l < reglext) goto l81;
+ goto l81;
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ prolongate_4d_o1_rf2 (T const * restrict const src, \
+ ivect4 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect4 const & restrict dstext, \
+ ibbox4 const & restrict srcbbox, \
+ ibbox4 const & restrict dstbbox, \
+ ibbox4 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // CarpetLib
diff --git a/Carpet/CarpetLib/src/region.cc b/Carpet/CarpetLib/src/region.cc
index 0230d373d..860d24c6b 100644
--- a/Carpet/CarpetLib/src/region.cc
+++ b/Carpet/CarpetLib/src/region.cc
@@ -251,6 +251,67 @@ operator<< (ostream & os, region_t const & reg)
+// Create an MPI datatype for a pseudoretion
+MPI_Datatype
+mpi_datatype (pseudoregion_t const &)
+{
+ static bool initialised = false;
+ static MPI_Datatype newtype;
+ if (not initialised) {
+ static pseudoregion_t s;
+#define ENTRY(type, name) \
+ { \
+ sizeof s.name / sizeof(type), /* count elements */ \
+ (char*)&s.name - (char*)&s, /* offsetof doesn't work (why?) */ \
+ dist::mpi_datatype<type>(), /* find MPI datatype */ \
+ STRINGIFY(name), /* field name */ \
+ STRINGIFY(type), /* type name */ \
+ }
+ dist::mpi_struct_descr_t const descr[] = {
+ ENTRY(int, extent),
+ ENTRY(int, component),
+ {1, sizeof s, MPI_UB, "MPI_UB", "MPI_UB"}
+ };
+#undef ENTRY
+ newtype =
+ dist::create_mpi_datatype (sizeof descr / sizeof descr[0], descr,
+ "pseudoregion_t", sizeof s);
+ initialised = true;
+ }
+ return newtype;
+}
+
+MPI_Datatype
+mpi_datatype (sendrecv_pseudoregion_t const &)
+{
+ static bool initialised = false;
+ static MPI_Datatype newtype;
+ if (not initialised) {
+ static sendrecv_pseudoregion_t s;
+#define ENTRY(type, name) \
+ { \
+ sizeof s.name / sizeof(type), /* count elements */ \
+ (char*)&s.name - (char*)&s, /* offsetof doesn't work (why?) */ \
+ dist::mpi_datatype<type>(), /* find MPI datatype */ \
+ STRINGIFY(name), /* field name */ \
+ STRINGIFY(type), /* type name */ \
+ }
+ dist::mpi_struct_descr_t const descr[] = {
+ ENTRY(pseudoregion_t, send),
+ ENTRY(pseudoregion_t, recv),
+ {1, sizeof s, MPI_UB, "MPI_UB", "MPI_UB"}
+ };
+#undef ENTRY
+ newtype =
+ dist::create_mpi_datatype (sizeof descr / sizeof descr[0], descr,
+ "sendrecv_pseudoregion_t", sizeof s);
+ initialised = true;
+ }
+ return newtype;
+}
+
+
+
// Compare two pseudoregions for equality.
bool
operator== (pseudoregion_t const & a, pseudoregion_t const & b)
@@ -262,9 +323,45 @@ operator== (pseudoregion_t const & a, pseudoregion_t const & b)
+istream & operator>> (istream & is, pseudoregion_t & p)
+{
+ try {
+ skipws (is);
+ consume (is, "(ext:");
+ is >> p.extent;
+ skipws (is);
+ consume (is, ",c:");
+ is >> p.component;
+ skipws (is);
+ consume (is, ")");
+ } catch (input_error & err) {
+ cout << "Input error while reading a pseudoregion_t" << endl;
+ throw err;
+ }
+ return is;
+}
+
+istream & operator>> (istream & is, sendrecv_pseudoregion_t & srp)
+{
+ try {
+ skipws (is);
+ consume (is, "(send:");
+ is >> srp.send;
+ consume (is, ",recv:");
+ is >> srp.recv;
+ consume (is, ")");
+ } catch (input_error & err) {
+ cout << "Input error while reading a sendrecv_pseudoregion_t" << endl;
+ throw err;
+ }
+ return is;
+}
+
+
+
ostream & operator<< (ostream & os, pseudoregion_t const & p)
{
- return os << p.extent << "/c:" << p.component;
+ return os << "(ext:" << p.extent << ",c:" << p.component << ")";
}
ostream & operator<< (ostream & os, sendrecv_pseudoregion_t const & srp)
diff --git a/Carpet/CarpetLib/src/region.hh b/Carpet/CarpetLib/src/region.hh
index 66037bdc7..ed14b024d 100644
--- a/Carpet/CarpetLib/src/region.hh
+++ b/Carpet/CarpetLib/src/region.hh
@@ -5,6 +5,7 @@
#include <vector>
#include "defs.hh"
+#include "dist.hh"
#include "bbox.hh"
#include "fulltree.hh"
#include "vect.hh"
@@ -24,12 +25,16 @@ struct region_t {
region_t & operator= (region_t const & a);
~region_t ();
- bool invariant () const;
+ bool invariant () const CCTK_ATTRIBUTE_PURE;
};
-bool operator== (region_t const & a, region_t const & b);
+bool operator== (region_t const & a, region_t const & b)
+ CCTK_ATTRIBUTE_PURE;
+inline
+bool operator!= (region_t const & a, region_t const & b)
+ CCTK_ATTRIBUTE_PURE;
inline
bool operator!= (region_t const & a, region_t const & b)
{
@@ -44,7 +49,7 @@ combine_regions (vector<region_t> const & oldregs,
-size_t memoryof (region_t const & reg);
+size_t memoryof (region_t const & reg) CCTK_ATTRIBUTE_PURE;
istream & operator>> (istream & is, region_t & reg);
ostream & operator<< (ostream & os, region_t const & reg);
@@ -61,19 +66,37 @@ struct pseudoregion_t {
pseudoregion_t ()
{
}
+ pseudoregion_t (pseudoregion_t const & p)
+ : extent (p.extent), component (p.component)
+ {
+ }
pseudoregion_t (ibbox const & extent_, int const component_)
: extent (extent_), component (component_)
{
}
};
-bool operator== (pseudoregion_t const & a, pseudoregion_t const & b);
+MPI_Datatype mpi_datatype (pseudoregion_t const &)
+ CCTK_ATTRIBUTE_CONST;
+namespace dist {
+ template<> inline MPI_Datatype mpi_datatype<pseudoregion_t> ()
+ CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype<pseudoregion_t> ()
+ { pseudoregion_t dummy; return mpi_datatype(dummy); }
+}
+
+bool operator== (pseudoregion_t const & a, pseudoregion_t const & b)
+ CCTK_ATTRIBUTE_PURE;
+inline
+bool operator!= (pseudoregion_t const & a, pseudoregion_t const & b)
+ CCTK_ATTRIBUTE_PURE;
inline
bool operator!= (pseudoregion_t const & a, pseudoregion_t const & b)
{
return not (a == b);
}
+inline size_t memoryof (pseudoregion_t const & p) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (pseudoregion_t const & p)
{
return
@@ -81,6 +104,7 @@ inline size_t memoryof (pseudoregion_t const & p)
memoryof (p.component);
}
+istream & operator>> (istream & is, pseudoregion_t & p);
ostream & operator<< (ostream & os, pseudoregion_t const & p);
@@ -90,19 +114,35 @@ struct sendrecv_pseudoregion_t {
sendrecv_pseudoregion_t ()
{
}
+ sendrecv_pseudoregion_t (sendrecv_pseudoregion_t const & srp)
+ : send (srp.send), recv (srp.recv)
+ {
+ }
sendrecv_pseudoregion_t (ibbox const & send_extent, int const send_component,
- ibbox const & recv_extent, int const recv_component)
+ ibbox const & recv_extent, int const recv_component)
: send (pseudoregion_t (send_extent, send_component)),
recv (pseudoregion_t (recv_extent, recv_component))
{
}
};
+MPI_Datatype mpi_datatype (sendrecv_pseudoregion_t const &)
+ CCTK_ATTRIBUTE_CONST;
+namespace dist {
+ template<> inline MPI_Datatype mpi_datatype<sendrecv_pseudoregion_t> ()
+ CCTK_ATTRIBUTE_CONST;
+ template<> inline MPI_Datatype mpi_datatype<sendrecv_pseudoregion_t> ()
+ { sendrecv_pseudoregion_t dummy; return mpi_datatype(dummy); }
+}
+
+inline size_t memoryof (sendrecv_pseudoregion_t const & srp)
+ CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (sendrecv_pseudoregion_t const & srp)
{
return memoryof (srp.send) + memoryof (srp.recv);
}
+istream & operator>> (istream & os, sendrecv_pseudoregion_t & srp);
ostream & operator<< (ostream & os, sendrecv_pseudoregion_t const & srp);
diff --git a/Carpet/CarpetLib/src/restrict_3d_cc_rf2.cc b/Carpet/CarpetLib/src/restrict_3d_cc_rf2.cc
index 7eebd36b0..c2f89ae4d 100644
--- a/Carpet/CarpetLib/src/restrict_3d_cc_rf2.cc
+++ b/Carpet/CarpetLib/src/restrict_3d_cc_rf2.cc
@@ -5,7 +5,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/restrict_3d_rf2.cc b/Carpet/CarpetLib/src/restrict_3d_rf2.cc
index 26031f304..1e0cc6ec4 100644
--- a/Carpet/CarpetLib/src/restrict_3d_rf2.cc
+++ b/Carpet/CarpetLib/src/restrict_3d_rf2.cc
@@ -7,7 +7,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
-#include "operator_prototypes.hh"
+#include "operator_prototypes_3d.hh"
#include "typeprops.hh"
using namespace std;
diff --git a/Carpet/CarpetLib/src/restrict_4d_rf2.cc b/Carpet/CarpetLib/src/restrict_4d_rf2.cc
new file mode 100644
index 000000000..77bf2d28b
--- /dev/null
+++ b/Carpet/CarpetLib/src/restrict_4d_rf2.cc
@@ -0,0 +1,141 @@
+#include <algorithm>
+#include <cassert>
+#include <cmath>
+#include <cstdlib>
+#include <iostream>
+
+#include <cctk.h>
+#include <cctk_Parameters.h>
+
+#include "operator_prototypes_4d.hh"
+#include "typeprops.hh"
+
+using namespace std;
+
+
+
+namespace CarpetLib {
+
+
+
+#define SRCIND4(i,j,k,l) \
+ index4 (srcioff + (i), srcjoff + (j), srckoff + (k), srcloff + (l), \
+ srciext, srcjext, srckext, srclext)
+#define DSTIND4(i,j,k,l) \
+ index4 (dstioff + (i), dstjoff + (j), dstkoff + (k), dstloff + (l), \
+ dstiext, dstjext, dstkext, dstlext)
+
+
+
+ template <typename T>
+ void
+ restrict_4d_rf2 (T const * restrict const src,
+ ivect4 const & restrict srcext,
+ T * restrict const dst,
+ ivect4 const & restrict dstext,
+ ibbox4 const & restrict srcbbox,
+ ibbox4 const & restrict dstbbox,
+ ibbox4 const & restrict regbbox)
+ {
+ if (any (srcbbox.stride() >= regbbox.stride() or
+ dstbbox.stride() != regbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: strides disagree");
+ }
+
+ if (any (reffact2 * srcbbox.stride() != dstbbox.stride())) {
+ CCTK_WARN (0, "Internal error: destination strides are not twice the source strides");
+ }
+
+ // This could be handled, but is likely to point to an error
+ // elsewhere
+ if (regbbox.empty()) {
+ CCTK_WARN (0, "Internal error: region extent is empty");
+ }
+
+ if (not regbbox.is_contained_in(srcbbox) or
+ not regbbox.is_contained_in(dstbbox))
+ {
+ cerr << "srcbbox: " << srcbbox << endl
+ << "dstbbox: " << dstbbox << endl
+ << "regbbox: " << regbbox << endl;
+ CCTK_WARN (0, "Internal error: region extent is not contained in array extent");
+ }
+
+ if (any (srcext != srcbbox.shape() / srcbbox.stride() or
+ dstext != dstbbox.shape() / dstbbox.stride()))
+ {
+ CCTK_WARN (0, "Internal error: array sizes don't agree with bounding boxes");
+ }
+
+
+
+ ivect4 const regext = regbbox.shape() / regbbox.stride();
+ assert (all ((regbbox.lower() - srcbbox.lower()) % srcbbox.stride() == 0));
+ ivect4 const srcoff = (regbbox.lower() - srcbbox.lower()) / srcbbox.stride();
+ assert (all ((regbbox.lower() - dstbbox.lower()) % dstbbox.stride() == 0));
+ ivect4 const dstoff = (regbbox.lower() - dstbbox.lower()) / dstbbox.stride();
+
+
+
+ ptrdiff_t const srciext = srcext[0];
+ ptrdiff_t const srcjext = srcext[1];
+ ptrdiff_t const srckext = srcext[2];
+ ptrdiff_t const srclext = srcext[3];
+
+ ptrdiff_t const dstiext = dstext[0];
+ ptrdiff_t const dstjext = dstext[1];
+ ptrdiff_t const dstkext = dstext[2];
+ ptrdiff_t const dstlext = dstext[3];
+
+ ptrdiff_t const regiext = regext[0];
+ ptrdiff_t const regjext = regext[1];
+ ptrdiff_t const regkext = regext[2];
+ ptrdiff_t const reglext = regext[3];
+
+ ptrdiff_t const srcioff = srcoff[0];
+ ptrdiff_t const srcjoff = srcoff[1];
+ ptrdiff_t const srckoff = srcoff[2];
+ ptrdiff_t const srcloff = srcoff[3];
+
+ ptrdiff_t const dstioff = dstoff[0];
+ ptrdiff_t const dstjoff = dstoff[1];
+ ptrdiff_t const dstkoff = dstoff[2];
+ ptrdiff_t const dstloff = dstoff[3];
+
+
+
+ // Loop over coarse region
+#pragma omp parallel for
+ for (int l=0; l<reglext; ++l) {
+ for (int k=0; k<regkext; ++k) {
+ for (int j=0; j<regjext; ++j) {
+ for (int i=0; i<regiext; ++i) {
+
+ dst [DSTIND4(i, j, k, l)] = src [SRCIND4(2*i, 2*j, 2*k, 2*l)];
+
+ }
+ }
+ }
+ }
+
+ }
+
+
+
+#define INSTANTIATE(T) \
+ template \
+ void \
+ restrict_4d_rf2 (T const * restrict const src, \
+ ivect4 const & restrict srcext, \
+ T * restrict const dst, \
+ ivect4 const & restrict dstext, \
+ ibbox4 const & restrict srcbbox, \
+ ibbox4 const & restrict dstbbox, \
+ ibbox4 const & restrict regbbox);
+#include "instantiate"
+#undef INSTANTIATE
+
+
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/startup_time.cc b/Carpet/CarpetLib/src/startup_time.cc
new file mode 100644
index 000000000..f361345fa
--- /dev/null
+++ b/Carpet/CarpetLib/src/startup_time.cc
@@ -0,0 +1,82 @@
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+
+#include <cctk.h>
+
+// IRIX wants this before <time.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# elif HAVE_TIME_H
+# include <time.h>
+# endif
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "startup_time.hh"
+
+
+
+namespace CarpetLib {
+
+ using namespace std;
+
+
+
+ // Return the current wall time
+ static
+ double
+ get_walltime ()
+ {
+#ifdef HAVE_TIME_GETTIMEOFDAY
+ // get the current time
+ struct timeval tv;
+ gettimeofday (& tv, 0);
+ return tv.tv_sec + tv.tv_usec / 1.0e6;
+#else
+ return 0.0;
+#endif
+ }
+
+
+
+ void
+ output_startup_time ()
+ {
+ char * const cactus_starttime = getenv ("CACTUS_STARTTIME");
+ if (not cactus_starttime) {
+ CCTK_VWarn (CCTK_WARN_PICKY,
+ __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Could not determine Cactus startup time (environment variable CACTUS_STARTTIME is not set; it should be set to the output of \"date +%%s\")");
+ return;
+ }
+
+ double starttime;
+ int const iret = sscanf (cactus_starttime, "%lf", &starttime);
+ if (iret != 1) {
+ CCTK_VWarn (CCTK_WARN_COMPLAIN,
+ __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Could not determine Cactus startup time (environment variable CACTUS_STARTTIME has illegal value \"%s\"; it should instead be set to the output of \"date +%%s\", which is a single number)",
+ cactus_starttime);
+ return;
+ }
+
+ double const currenttime = get_walltime ();
+ double const startuptime = currenttime - starttime;
+
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Process startup time was %.3g seconds", startuptime);
+ }
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/startup_time.hh b/Carpet/CarpetLib/src/startup_time.hh
new file mode 100644
index 000000000..f92b3df4b
--- /dev/null
+++ b/Carpet/CarpetLib/src/startup_time.hh
@@ -0,0 +1,6 @@
+namespace CarpetLib {
+
+ void
+ output_startup_time ();
+
+} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/th.cc b/Carpet/CarpetLib/src/th.cc
index a10dcb289..dd441e455 100644
--- a/Carpet/CarpetLib/src/th.cc
+++ b/Carpet/CarpetLib/src/th.cc
@@ -14,6 +14,10 @@ using namespace std;
+list<th*> th::allth;
+
+
+
// Constructors
th::th (gh& h_, const vector<int> & reffacts_, const CCTK_REAL basedelta)
: h(h_), reffacts(reffacts_), delta(basedelta)
@@ -24,13 +28,15 @@ th::th (gh& h_, const vector<int> & reffacts_, const CCTK_REAL basedelta)
assert (reffacts.AT(n) >= reffacts.AT(n-1));
assert (reffacts.AT(n) % reffacts.AT(n-1) == 0);
}
- h.add(this);
+ allthi = allth.insert(allth.end(), this);
+ gh_handle = h.add(this);
}
// Destructors
th::~th ()
{
- h.remove(this);
+ h.erase(gh_handle);
+ allth.erase(allthi);
}
// Modifiers
@@ -60,6 +66,10 @@ void th::regrid ()
}
}
+void th::regrid_free ()
+{
+}
+
// Memory usage
@@ -75,6 +85,19 @@ memory ()
memoryof (deltas);
}
+size_t
+th::
+allmemory ()
+{
+ size_t mem = memoryof(allth);
+ for (list<th*>::const_iterator
+ thi = allth.begin(); thi != allth.end(); ++ thi)
+ {
+ mem += memoryof(**thi);
+ }
+ return mem;
+}
+
// Output
diff --git a/Carpet/CarpetLib/src/th.hh b/Carpet/CarpetLib/src/th.hh
index 34e9af999..f1a7b72b7 100644
--- a/Carpet/CarpetLib/src/th.hh
+++ b/Carpet/CarpetLib/src/th.hh
@@ -25,10 +25,14 @@ ostream& operator<< (ostream& os, const th& t);
// The time hierarchy (information about the current time)
class th {
+ static list<th*> allth;
+ list<th*>::iterator allthi;
+
public: // should be readonly
// Fields
gh& h; // hierarchy
+ gh::th_handle gh_handle;
private:
@@ -48,9 +52,10 @@ public:
// Modifiers
void regrid ();
+ void regrid_free ();
// Time management
- CCTK_REAL get_time (const int rl, const int ml) const
+ CCTK_REAL get_time (const int rl, const int ml) const CCTK_ATTRIBUTE_PURE
{
assert (rl>=0 and rl<h.reflevels());
assert (ml>=0 and ml<h.mglevels());
@@ -69,7 +74,7 @@ public:
set_time(rl,ml, get_time(rl,ml) + get_delta(rl,ml));
}
- CCTK_REAL get_delta (const int rl, const int ml) const
+ CCTK_REAL get_delta (const int rl, const int ml) const CCTK_ATTRIBUTE_PURE
{
assert (rl>=0 and rl<h.reflevels());
assert (ml>=0 and ml<h.mglevels());
@@ -83,7 +88,7 @@ public:
deltas.AT(ml).AT(rl) = dt;
}
- CCTK_REAL time (const int tl, const int rl, const int ml) const
+ CCTK_REAL time (const int tl, const int rl, const int ml) const CCTK_ATTRIBUTE_PURE
{
assert (rl>=0 and rl<h.reflevels());
assert (ml>=0 and ml<h.mglevels());
@@ -91,12 +96,14 @@ public:
}
// Output
- size_t memory () const;
+ size_t memory () const CCTK_ATTRIBUTE_PURE;
+ static size_t allmemory () CCTK_ATTRIBUTE_PURE;
void output (ostream& os) const;
};
+inline size_t memoryof (th const & t) CCTK_ATTRIBUTE_PURE;
inline size_t memoryof (th const & t)
{
return t.memory ();
diff --git a/Carpet/CarpetLib/src/timestat.cc b/Carpet/CarpetLib/src/timestat.cc
index cbccfe51b..1115a6663 100644
--- a/Carpet/CarpetLib/src/timestat.cc
+++ b/Carpet/CarpetLib/src/timestat.cc
@@ -6,6 +6,7 @@
#include <fstream>
#include <iomanip>
#include <iostream>
+#include <limits>
#include <sstream>
#include <sys/time.h>
@@ -32,6 +33,7 @@ namespace CarpetLib {
static
bool have_cputick = false;
+ // CPU tick time in seconts
static
double cputick = 0.0;
@@ -266,11 +268,11 @@ namespace CarpetLib {
os << timername << ":"
<< " cnt: " << count
- << " time: sum: " << wtime
- << " avg: " << avg
- << " stddev: " << stddev
- << " min: " << wmin
- << " max: " << wmax
+ << " time: sum: " << cputick * wtime
+ << " avg: " << cputick * avg
+ << " stddev: " << cputick * stddev
+ << " min: " << cputick * wmin
+ << " max: " << cputick * wmax
<< " bytes: sum: " << bytes
<< " avg: " << bavg
<< " stddev: " << bstddev
@@ -324,11 +326,11 @@ namespace CarpetLib {
file << "Build ID: " << build_id << eol;
}
if (CCTK_IsFunctionAliased ("UniqueSimulationID")) {
- char const * const job_id =
+ char const * const sim_id =
static_cast <char const *> (UniqueSimulationID (cctkGH));
- file << "Simulation ID: " << job_id << eol;
+ file << "Simulation ID: " << sim_id << eol;
}
- file << "Running on " << dist::size() << " processors" << eol;
+ file << "Running with " << dist::size() << " processes and " << dist::total_num_threads() << " threads" << eol;
} // if do_print_info
file << "********************************************************************************" << eol
@@ -341,4 +343,161 @@ namespace CarpetLib {
}
+
+
+ struct t_cycleclock {
+ double total;
+ double total_squared;
+ double min_total;
+ double max_total;
+ double count;
+ ticks last;
+
+ t_cycleclock ()
+ {
+ reset();
+ }
+
+ ~t_cycleclock ()
+ {
+ }
+
+ void start ()
+ {
+ last = getticks();
+ }
+
+ void stop ()
+ {
+ ticks const current = getticks();
+ double const difference = elapsed (current, last);
+ total += difference;
+ total_squared += pow (difference, 2);
+ min_total = min_total == 0.0 ? difference : min (min_total, difference);
+ max_total = max (min_total, difference);
+ count += 1;
+ }
+
+ void reset ()
+ {
+ total = 0.0;
+ total_squared = 0.0;
+ min_total = 0.0; // numeric_limits<double>::max();
+ max_total = 0.0;
+ count = 0.0;
+ // last = 0.0;
+ }
+
+ };
+
+
+
+ void * cycleclock_create (int const timernum)
+ {
+ return new t_cycleclock;
+ }
+
+ void cycleclock_destroy (int const timernum, void * const data)
+ {
+ if (data) {
+ delete static_cast<t_cycleclock*> (data);
+ }
+ }
+
+ void cycleclock_start (int const timernum, void * const data)
+ {
+ static_cast<t_cycleclock*> (data) -> start();
+ }
+
+ void cycleclock_stop (int const timernum, void * const data)
+ {
+ static_cast<t_cycleclock*> (data) -> stop();
+ }
+
+ void cycleclock_reset (int const timernum, void * const data)
+ {
+ static_cast<t_cycleclock*> (data) -> reset();
+ }
+
+ void cycleclock_get (int const timernum, void * const data_,
+ cTimerVal * const vals)
+ {
+ t_cycleclock const & data = * static_cast<t_cycleclock const *> (data_);
+
+ // Total time
+ vals[0].type = val_double;
+ vals[0].heading = "cycle";
+ vals[0].units = "secs";
+ vals[0].val.d = data.total;
+ vals[0].seconds = cputick * vals[0].val.d;
+ vals[0].resolution = cputick;
+
+ // Average
+ vals[1].type = val_double;
+ vals[1].heading = "cycle[avg]";
+ vals[1].units = "secs";
+ vals[1].val.d = data.count == 0.0 ? 0.0 : data.total / data.count;
+ vals[1].seconds = cputick * vals[1].val.d;
+ vals[1].resolution = cputick;
+
+ // Standard deviation
+ vals[2].type = val_double;
+ vals[2].heading = "cycle[stddev]";
+ vals[2].units = "secs";
+ vals[2].val.d = (data.count == 0.0
+ ? 0.0
+ : sqrt (abs (data.total_squared * data.count -
+ pow (data.total, 2)) / data.count));
+ vals[2].seconds = cputick * vals[2].val.d;
+ vals[2].resolution = cputick;
+
+ // Minimum
+ vals[3].type = val_double;
+ vals[3].heading = "cycle[min]";
+ vals[3].units = "secs";
+ vals[3].val.d = data.min_total;
+ vals[3].seconds = cputick * vals[3].val.d;
+ vals[3].resolution = cputick;
+
+ // Maximum
+ vals[4].type = val_double;
+ vals[4].heading = "cycle[max]";
+ vals[4].units = "secs";
+ vals[4].val.d = data.max_total;
+ vals[4].seconds = cputick * vals[4].val.d;
+ vals[4].resolution = cputick;
+ }
+
+ void cycleclock_set (int const timernum, void * const data_,
+ cTimerVal * const vals)
+ {
+ t_cycleclock & data = * static_cast<t_cycleclock * restrict> (data_);
+
+ data.reset(); // punt
+ data.total = vals[0].val.d;
+ }
+
+ extern "C" {
+ int CarpetLib_registercycleclock (void);
+ }
+
+ int CarpetLib_registercycleclock (void)
+ {
+ if (not have_cputick) calculate_cputick ();
+
+ cClockFuncs functions;
+ functions.n_vals = 5;
+ functions.create = cycleclock_create;
+ functions.destroy = cycleclock_destroy;
+ functions.start = cycleclock_start;
+ functions.stop = cycleclock_stop;
+ functions.reset = cycleclock_reset;
+ functions.get = cycleclock_get;
+ functions.set = cycleclock_set;
+
+ CCTK_ClockRegister("cycle", &functions);
+
+ return 0;
+ }
+
} // namespace CarpetLib
diff --git a/Carpet/CarpetLib/src/vect.cc b/Carpet/CarpetLib/src/vect.cc
index 28eff14dc..e38ed745a 100644
--- a/Carpet/CarpetLib/src/vect.cc
+++ b/Carpet/CarpetLib/src/vect.cc
@@ -43,21 +43,42 @@ void vect<T,D>::output (ostream& os) const {
+// Specialise some constructors for lower dimensions
+// These functions are declared, but must not be used.
+
+template<> vect<int,0>::vect (const int& x, const int& y) { assert(0); }
+template<> vect<int,1>::vect (const int& x, const int& y) { assert(0); }
+template<> vect<int,3>::vect (const int& x, const int& y) { assert(0); }
+template<> vect<int,4>::vect (const int& x, const int& y) { assert(0); }
+
+template<> vect<int,0>::vect (const int& x, const int& y, const int& z) { assert(0); }
+template<> vect<int,1>::vect (const int& x, const int& y, const int& z) { assert(0); }
+template<> vect<int,2>::vect (const int& x, const int& y, const int& z) { assert(0); }
+template<> vect<int,4>::vect (const int& x, const int& y, const int& z) { assert(0); }
+
+template<> vect<int,0>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
+template<> vect<int,1>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
+template<> vect<int,2>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
+template<> vect<int,3>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
+
+
+
// Note: We need all dimensions all the time.
template class vect<int,0>;
template class vect<int,1>;
template class vect<int,2>;
template class vect<int,3>;
+template class vect<int,4>;
-template void vect<CCTK_REAL,3>::input (istream& is);
-template void vect<vect<bool,2>,3>::input (istream& is);
-template void vect<vect<bool,3>,2>::input (istream& is);
+template void vect<CCTK_REAL,dim>::input (istream& is);
+template void vect<vect<bool,2>,dim>::input (istream& is);
+template void vect<vect<bool,dim>,2>::input (istream& is);
template void vect<bool,2>::output (ostream& os) const;
-template void vect<bool,3>::output (ostream& os) const;
+template void vect<bool,dim>::output (ostream& os) const;
template void vect<CCTK_REAL,2>::output (ostream& os) const;
-template void vect<CCTK_REAL,3>::output (ostream& os) const;
-template void vect<vect<bool,2>,3>::output (ostream& os) const;
-template void vect<vect<int,2>,3>::output (ostream& os) const;
-template void vect<vect<bool,3>,2>::output (ostream& os) const;
-template void vect<vect<int,3>,2>::output (ostream& os) const;
+template void vect<CCTK_REAL,dim>::output (ostream& os) const;
+template void vect<vect<bool,2>,dim>::output (ostream& os) const;
+template void vect<vect<int,2>,dim>::output (ostream& os) const;
+template void vect<vect<bool,dim>,2>::output (ostream& os) const;
+template void vect<vect<int,dim>,2>::output (ostream& os) const;
diff --git a/Carpet/CarpetLib/src/vect.hh b/Carpet/CarpetLib/src/vect.hh
index 56898d970..03e62aba6 100644
--- a/Carpet/CarpetLib/src/vect.hh
+++ b/Carpet/CarpetLib/src/vect.hh
@@ -8,39 +8,17 @@
#include "cctk.h"
+#include "defs.hh"
#include "vect_helpers.hh"
using namespace std;
-#if 0
-
-// A pure function returns a value that depends only on the function
-// arguments and on global variables, and the function has no side
-// effects.
-#ifdef HAVE_CCTK_CXX_ATTRIBUTE_PURE
-# define PURE __attribute__((pure))
-#else
-# define PURE
-#endif
-
-// A const function returns a value that depends only on the function
-// arguments, and the function has no side effects. This is even more
-// strict than pure functions. Const functions cannot dereference
-// pointers or references (or this).
-#ifdef HAVE_CCTK_CXX_ATTRIBUTE_CONST
-# define CONST __attribute__((const))
+#ifdef CARPET_DEBUG
+# define ASSERT_VECT(x) assert(x)
#else
-# define CONST
-#endif
-
-#else
-
-// Don't take any risks
-# define PURE
-# define CONST
-
+# define ASSERT_VECT(x)
#endif
@@ -72,38 +50,44 @@ public:
// Constructors
/** Explicit empty constructor. */
- explicit vect () CONST { }
+ explicit vect () CCTK_MEMBER_ATTRIBUTE_CONST { }
/** Copy constructor. */
- vect (const vect& a) PURE {
+ vect (const vect& a) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
for (int d=0; d<D; ++d) elt[d]=a.elt[d];
}
/** Constructor from a single element. This constructor might be
confusing, but it is very convenient. */
- vect (const T& x) PURE {
+ vect (const T& x) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
for (int d=0; d<D; ++d) elt[d]=x;
}
/** Constructor for 2-element vectors from 2 elements. */
- vect (const T& x, const T& y) PURE {
- assert (D==2);
+ vect (const T& x, const T& y) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==2);
// Note: this statement may give "index out of range" warnings.
// You can safely ignore these.
elt[0]=x; elt[1]=y;
}
/** Constructor for 3-element vectors from 3 elements. */
- vect (const T& x, const T& y, const T& z) PURE {
- assert (D==3);
+ vect (const T& x, const T& y, const T& z) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==3);
// Note: this statement may give "index out of range" warnings.
// You can safely ignore these.
elt[0]=x; elt[1]=y; elt[2]=z;
}
/** Constructor for 4-element vectors from 4 elements. */
- vect (const T& x, const T& y, const T& z, const T& t) PURE {
- assert (D==4);
+ vect (const T& x, const T& y, const T& z, const T& t)
+ CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==4);
// Note: this statement may give "index out of range" warnings.
// You can safely ignore these.
elt[0]=x; elt[1]=y; elt[2]=z; elt[3]=t;
@@ -112,7 +96,8 @@ public:
#if 0
// This creates confusion
/** Constructor from a pointer, i.e., a C array. */
- explicit vect (const T* const x) PURE {
+ explicit vect (const T* const x) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
for (int d=0; d<D; ++d) elt[d]=x[d];
}
#endif
@@ -120,7 +105,8 @@ public:
#if 0
// This leads to an ICE on AIX
template<int E>
- operator vect<vect<T,D>,E> () CONST {
+ operator vect<vect<T,D>,E> () CCTK_MEMBER_ATTRIBUTE_CONST
+ {
vect<vect<T,D>,E> r;
for (int e=0; e<E; ++e) r[e]=*this;
return r;
@@ -129,74 +115,88 @@ public:
/** Constructor from a vector with a different type. */
template<typename S>
- /*explicit*/ vect (const vect<S,D>& a) /*PURE*/ {
+ /*explicit*/ vect (const vect<S,D>& a) /*CCTK_MEMBER_ATTRIBUTE_PURE*/
+ {
for (int d=0; d<D; ++d) elt[d]=(T)a[d];
}
/** Create a new 0-element vector with a specific type. */
- static vect make () CONST {
- assert (D==0);
+ static vect make () CCTK_MEMBER_ATTRIBUTE_CONST
+ {
+ ASSERT_VECT (D==0);
return vect();
}
/** Create a new 1-element vector with a specific type. */
- static vect make (const T& x) PURE {
- assert (D==1);
+ static vect make (const T& x) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==1);
return vect(x);
}
/** Create a new 2-element vector with a specific type. */
- static vect make (const T& x, const T& y) PURE {
- assert (D==2);
+ static vect make (const T& x, const T& y) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==2);
return vect(x, y);
}
/** Create a new 3-element vector with a specific type. */
- static vect make (const T& x, const T& y, const T& z) PURE {
- assert (D==3);
+ static vect make (const T& x, const T& y, const T& z)
+ CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==3);
return vect(x, y, z);
}
/** Create a new 4-element vector with a specific type. */
- static vect make (const T& x, const T& y, const T& z, const T& t) PURE {
- assert (D==4);
+ static vect make (const T& x, const T& y, const T& z, const T& t)
+ CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (D==4);
return vect(x, y, z, t);
}
/** Treat a constant pointer as a reference to a constant vector. */
- static const vect& ref (const T* const x) PURE {
+ static const vect& ref (const T* const x) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
return *(const vect*)x;
}
/** Treat a pointer as a reference to a vector. */
- static vect& ref (T* const x) PURE {
+ static vect& ref (T* const x) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
return *(vect*)x;
}
/** Create a vector with one element set to 1 and all other elements
set to zero. */
- static vect dir (const int d) CONST {
+ static vect dir (const int d) CCTK_MEMBER_ATTRIBUTE_CONST
+ {
vect r=(T)0;
r[d]=1;
return r;
}
/** Create a vector with e[i] = i. */
- static vect seq () CONST {
+ static vect seq () CCTK_MEMBER_ATTRIBUTE_CONST
+ {
vect r;
for (int d=0; d<D; ++d) r[d]=d;
return r;
}
/** Create a vector with e[i] = n + i. */
- static vect seq (const int n) CONST {
+ static vect seq (const int n) CCTK_MEMBER_ATTRIBUTE_CONST
+ {
vect r;
for (int d=0; d<D; ++d) r[d]=n+d;
return r;
}
/** Create a vector with e[i] = n + s * i. */
- static vect seq (const int n, const int s) CONST {
+ static vect seq (const int n, const int s) CCTK_MEMBER_ATTRIBUTE_CONST
+ {
vect r;
for (int d=0; d<D; ++d) r[d]=n+s*d;
return r;
@@ -207,21 +207,24 @@ public:
/** Return a non-writable element of a vector. */
// (Don't return a reference; *this might be a temporary)
// Do return a reference, so that a vector can be accessed as array
- const T& operator[] (const int d) const PURE {
- assert(d>=0 && d<D);
+ const T& operator[] (const int d) const CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT(d>=0 && d<D);
return elt[d];
}
/** Return a writable element of a vector as reference. */
- T& operator[] (const int d) PURE {
- assert(d>=0 && d<D);
+ T& operator[] (const int d) CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT(d>=0 && d<D);
return elt[d];
}
#if 0
// This creates confusion
/** Return a pointer to a vector. */
- operator const T* () const PURE {
+ operator const T* () const CCTK_MEMBER_ATTRIBUTE_PURE
+ {
return this;
}
#endif
@@ -229,7 +232,9 @@ public:
/** Return a combination of the vector elements e[a[i]]. The
element combination is selected by another vector. */
template<typename TT, int DD>
- vect<T,DD> operator[] (const vect<TT,DD>& a) const /*PURE*/ {
+ vect<T,DD> operator[] (const vect<TT,DD>& a)
+ const /*CCTK_MEMBER_ATTRIBUTE_PURE*/
+ {
vect<T,DD> r;
// (*this)[] performs index checking
for (int d=0; d<DD; ++d) r[d] = (*this)[a[d]];
@@ -249,14 +254,16 @@ public:
// Non-modifying operators
/** Return a new vector where one element has been replaced. */
- vect replace (const int d, const T& x) const PURE {
- assert (d>=0 && d<D);
+ vect replace (const int d, const T& x) const CCTK_MEMBER_ATTRIBUTE_PURE
+ {
+ ASSERT_VECT (d>=0 && d<D);
vect r;
for (int dd=0; dd<D; ++dd) r[dd]=dd==d?x:elt[dd];
return r;
}
- vect reverse () const PURE {
+ vect reverse () const CCTK_MEMBER_ATTRIBUTE_PURE
+ {
vect r;
for (int d=0; d<D; ++d) r[d]=elt[D-1-d];
return r;
@@ -272,7 +279,9 @@ public:
elements set to either a[i] or b[i], depending on whether
(*this)[i] is true or not. */
template<typename TT>
- vect<TT,D> ifthen (const vect<TT,D>& a, const vect<TT,D>& b) const /*PURE*/ {
+ vect<TT,D> ifthen (const vect<TT,D>& a, const vect<TT,D>& b)
+ const /*CCTK_MEMBER_ATTRIBUTE_PURE*/
+ {
vect<TT,D> r;
for (int d=0; d<D; ++d) r[d]=elt[d]?a[d]:b[d];
return r;
@@ -286,15 +295,16 @@ public:
vect &vec;
int d;
public:
- iter (vect &a) PURE: vec(a), d(0) { }
- iter& operator++ () { assert(d<D); ++d; return *this; }
- bool operator bool () const PURE { return d==D; }
- T& operator* () PURE { return vec[d]; }
+ iter (vect &a) CCTK_MEMBER_ATTRIBUTE_PURE: vec(a), d(0) { }
+ iter& operator++ () { ASSERT_VECT(d<D); ++d; return *this; }
+ bool operator bool () const CCTK_MEMBER_ATTRIBUTE_PURE { return d==D; }
+ T& operator* () CCTK_MEMBER_ATTRIBUTE_PURE { return vec[d]; }
};
#endif
// Memory usage
- size_t memory () const { return D * memoryof (*elt); }
+ size_t memory () const CCTK_MEMBER_ATTRIBUTE_CONST
+ { return D * memoryof (*elt); }
// Input/Output helpers
void input (istream& is);
@@ -310,7 +320,8 @@ public:
true or not. */
template<typename S,typename T,int D>
inline vect<T,D> either (const vect<S,D>& a,
- const vect<T,D>& b, const vect<T,D>& c) PURE;
+ const vect<T,D>& b, const vect<T,D>& c)
+ CCTK_ATTRIBUTE_PURE;
template<typename S,typename T,int D>
inline vect<T,D> either (const vect<S,D>& a,
const vect<T,D>& b, const vect<T,D>& c)
@@ -322,7 +333,8 @@ inline vect<T,D> either (const vect<S,D>& a,
template<typename S,typename T,int D>
inline vect<T,D> either (const vect<S,D>& a,
- const T& b, const T& c) PURE;
+ const T& b, const T& c)
+ CCTK_ATTRIBUTE_PURE;
template<typename S,typename T,int D>
inline vect<T,D> either (const vect<S,D>& a,
const T& b, const T& c)
@@ -332,9 +344,11 @@ inline vect<T,D> either (const vect<S,D>& a,
/** Transpose a vector of a vector */
template<typename T, int D, int DD>
-inline vect<vect<T,D>,DD> xpose (vect<vect<T,DD>,D> const & a) PURE;
+inline vect<vect<T,D>,DD> xpose (vect<vect<T,DD>,D> const & a)
+ CCTK_ATTRIBUTE_PURE;
template<typename T, int D, int DD>
-inline vect<vect<T,D>,DD> xpose (vect<vect<T,DD>,D> const & a) {
+inline vect<vect<T,D>,DD> xpose (vect<vect<T,DD>,D> const & a)
+{
vect<vect<T,D>,DD> r;
for (int dd=0; dd<DD; ++dd) for (int d=0; d<D; ++d) r[dd][d] = a[d][dd];
return r;
@@ -342,9 +356,11 @@ inline vect<vect<T,D>,DD> xpose (vect<vect<T,DD>,D> const & a) {
/** Return the element-wise integer power of two vectors. */
template<typename T,int D>
-inline vect<T,D> ipow (const vect<T,D>& a, const vect<int,D>& b) PURE;
+inline vect<T,D> ipow (const vect<T,D>& a, const vect<int,D>& b)
+ CCTK_ATTRIBUTE_PURE;
template<typename T,int D>
-inline vect<T,D> ipow (const vect<T,D>& a, const vect<int,D>& b) {
+inline vect<T,D> ipow (const vect<T,D>& a, const vect<int,D>& b)
+{
vect<T,D> r;
for (int d=0; d<D; ++d) r[d]=ipow(a[d],b[d]);
return r;
@@ -398,26 +414,29 @@ DECLARE_REDUCTION_OPERATOR_2 (hypot,0,+=,*,sqrt)
/** Count the number of elements in the vector. */
template<typename T,int D>
-inline int count (const vect<T,D>& a) PURE;
+inline int count (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE;
template<typename T,int D>
-inline int count (const vect<T,D>& a) {
+inline int count (const vect<T,D>& a)
+{
return D;
}
/** Return the size (number of elements) of the vector. */
template<typename T,int D>
-inline int size (const vect<T,D>& a) CONST;
+inline int size (const vect<T,D>& a) CCTK_ATTRIBUTE_CONST;
template<typename T,int D>
-inline int size (const vect<T,D>& a) {
+inline int size (const vect<T,D>& a)
+{
return D;
}
/** Return the index of the first maximum element. */
template<typename T,int D>
-inline int maxloc (const vect<T,D>& a) PURE;
+inline int maxloc (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE;
template<typename T,int D>
-inline int maxloc (const vect<T,D>& a) {
- assert (D>0);
+inline int maxloc (const vect<T,D>& a)
+{
+ ASSERT_VECT (D>0);
int r(0);
for (int d=1; d<D; ++d) if (a[d]>a[r]) r=d;
return r;
@@ -425,10 +444,11 @@ inline int maxloc (const vect<T,D>& a) {
/** Return the index of the first minimum element. */
template<typename T,int D>
-inline int minloc (const vect<T,D>& a) PURE;
+inline int minloc (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE;
template<typename T,int D>
-inline int minloc (const vect<T,D>& a) {
- assert (D>0);
+inline int minloc (const vect<T,D>& a)
+{
+ ASSERT_VECT (D>0);
int r(0);
for (int d=1; d<D; ++d) if (a[d]<a[r]) r=d;
return r;
@@ -436,15 +456,16 @@ inline int minloc (const vect<T,D>& a) {
/** Return the n-dimensional linear array index. */
template<typename T,int D>
-inline T index (const vect<T,D>& lsh, const vect<T,D>& ind) PURE;
+inline T index (const vect<T,D>& lsh, const vect<T,D>& ind) CCTK_ATTRIBUTE_PURE;
template<typename T,int D>
-inline T index (const vect<T,D>& lsh, const vect<T,D>& ind) {
+inline T index (const vect<T,D>& lsh, const vect<T,D>& ind)
+{
T r(0);
for (int d=D-1; d>=0; --d) {
- assert (lsh[d]>=0);
+ ASSERT_VECT (lsh[d]>=0);
// Be generous, and allow relative indices which may be negtive
- // assert (ind[d]>=0 and ind[d]<lsh[d]);
- assert (abs(ind[d])<=lsh[d]);
+ // ASSERT_VECT (ind[d]>=0 and ind[d]<lsh[d]);
+ ASSERT_VECT (abs(ind[d])<=lsh[d]);
r = r * lsh[d] + ind[d];
}
return r;
@@ -460,7 +481,11 @@ inline T index (const vect<T,D>& lsh, const vect<T,D>& ind) {
/** Return a new vector where the function func() has been applied to
all elements. */
template<typename T, typename U, int D>
-inline vect<U,D> map (U (* const func)(T x), const vect<T,D>& a) {
+inline vect<U,D> map (U (* const func)(T x), const vect<T,D>& a)
+ CCTK_ATTRIBUTE_PURE;
+template<typename T, typename U, int D>
+inline vect<U,D> map (U (* const func)(T x), const vect<T,D>& a)
+{
vect<U,D> r;
for (int d=0; d<D; ++d) r[d] = func(a[d]);
return r;
@@ -471,6 +496,10 @@ inline vect<U,D> map (U (* const func)(T x), const vect<T,D>& a) {
template<typename S, typename T, typename U, int D>
inline vect<U,D> zip (U (* const func)(S x, T y),
const vect<S,D>& a, const vect<T,D>& b)
+ CCTK_ATTRIBUTE_PURE;
+template<typename S, typename T, typename U, int D>
+inline vect<U,D> zip (U (* const func)(S x, T y),
+ const vect<S,D>& a, const vect<T,D>& b)
{
vect<U,D> r;
for (int d=0; d<D; ++d) r[d] = func(a[d], b[d]);
@@ -481,6 +510,9 @@ inline vect<U,D> zip (U (* const func)(S x, T y),
the vector a, starting with the scalar value val. */
template<typename T, typename U, int D>
inline U fold (U (* const func)(U val, T x), U val, const vect<T,D>& a)
+ CCTK_ATTRIBUTE_PURE;
+template<typename T, typename U, int D>
+inline U fold (U (* const func)(U val, T x), U val, const vect<T,D>& a)
{
for (int d=0; d<D; ++d) val = func(val, a[d]);
return val;
@@ -490,8 +522,11 @@ inline U fold (U (* const func)(U val, T x), U val, const vect<T,D>& a)
the vector a, starting with element 0. */
template<typename T, typename U, int D>
inline U fold1 (U (* const func)(U val, T x), const vect<T,D>& a)
+ CCTK_ATTRIBUTE_PURE;
+template<typename T, typename U, int D>
+inline U fold1 (U (* const func)(U val, T x), const vect<T,D>& a)
{
- assert (D>=1);
+ ASSERT_VECT (D>=1);
U val = a[0];
for (int d=1; d<D; ++d) val = func(val, a[d]);
return val;
@@ -502,6 +537,10 @@ inline U fold1 (U (* const func)(U val, T x), const vect<T,D>& a)
template<typename T, typename U, int D>
inline vect<U,D> scan0 (U (* const func)(U val, T x), U val,
const vect<T,D>& a)
+ CCTK_ATTRIBUTE_PURE;
+template<typename T, typename U, int D>
+inline vect<U,D> scan0 (U (* const func)(U val, T x), U val,
+ const vect<T,D>& a)
{
vect<U,D> r;
for (int d=0; d<D; ++d) {
@@ -516,6 +555,10 @@ inline vect<U,D> scan0 (U (* const func)(U val, T x), U val,
template<typename T, typename U, int D>
inline vect<U,D> scan1 (U (* const func)(U val, T x), U val,
const vect<T,D>& a)
+ CCTK_ATTRIBUTE_PURE;
+template<typename T, typename U, int D>
+inline vect<U,D> scan1 (U (* const func)(U val, T x), U val,
+ const vect<T,D>& a)
{
vect<U,D> r;
for (int d=0; d<D; ++d) {
@@ -531,7 +574,10 @@ inline vect<U,D> scan1 (U (* const func)(U val, T x), U val,
// Memory usage
template<typename T,int D>
-inline size_t memoryof (vect<T,D> const & a) { return a.memory(); }
+inline size_t memoryof (vect<T,D> const & a) CCTK_ATTRIBUTE_CONST;
+template<typename T,int D>
+inline size_t memoryof (vect<T,D> const & a)
+{ return a.memory(); }
@@ -562,23 +608,26 @@ inline ostream& operator<< (ostream& os, const vect<T,D>& a) {
/** Constructor for 2-element vectors from 2 elements. */
template<typename T>
-inline vect<T,2>::vect<T,2> (const T& x, const T& y) PURE;
+inline vect<T,2>::vect<T,2> (const T& x, const T& y) CCTK_ATTRIBUTE_PURE;
template<typename T>
-inline vect<T,2>::vect<T,2> (const T& x, const T& y) {
+inline vect<T,2>::vect<T,2> (const T& x, const T& y)
+{
elt[0]=x; elt[1]=y;
}
/** Constructor for 3-element vectors from 3 elements. */
-vect (const T& x, const T& y, const T& z) PURE;
-vect (const T& x, const T& y, const T& z) {
- assert (D==3);
+vect (const T& x, const T& y, const T& z) CCTK_ATTRIBUTE_PURE;
+vect (const T& x, const T& y, const T& z)
+{
+ ASSERT_VECT (D==3);
elt[0]=x; elt[1]=y; elt[2]=z;
}
/** Constructor for 4-element vectors from 4 elements. */
-vect (const T& x, const T& y, const T& z, const T& t) PURE;
-vect (const T& x, const T& y, const T& z, const T& t) {
- assert (D==4);
+vect (const T& x, const T& y, const T& z, const T& t) CCTK_ATTRIBUTE_PURE;
+vect (const T& x, const T& y, const T& z, const T& t)
+{
+ ASSERT_VECT (D==4);
elt[0]=x; elt[1]=y; elt[2]=z; elt[3]=t;
}
#endif
@@ -590,29 +639,30 @@ vect (const T& x, const T& y, const T& z, const T& t) {
// Specialise some constructors for lower dimensions
-// These functions are declared, but never defined, so that using them
-// will result in a linker error
-
-template<> inline vect<int,0>::vect (const int& x, const int& y) { assert(0); }
-template<> inline vect<int,1>::vect (const int& x, const int& y) { assert(0); }
+// These functions are declared, but must not be used.
-template<> inline vect<int,0>::vect (const int& x, const int& y, const int& z) { assert(0); }
-template<> inline vect<int,1>::vect (const int& x, const int& y, const int& z) { assert(0); }
-template<> inline vect<int,2>::vect (const int& x, const int& y, const int& z) { assert(0); }
+template<> vect<int,0>::vect (const int& x, const int& y);
+template<> vect<int,1>::vect (const int& x, const int& y);
+template<> vect<int,3>::vect (const int& x, const int& y);
+template<> vect<int,4>::vect (const int& x, const int& y);
-template<> inline vect<int,0>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
-template<> inline vect<int,1>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
-template<> inline vect<int,2>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
-template<> inline vect<int,3>::vect (const int& x, const int& y, const int& z, const int& t) { assert(0); }
+template<> vect<int,0>::vect (const int& x, const int& y, const int& z);
+template<> vect<int,1>::vect (const int& x, const int& y, const int& z);
+template<> vect<int,2>::vect (const int& x, const int& y, const int& z);
+template<> vect<int,4>::vect (const int& x, const int& y, const int& z);
+template<> vect<int,0>::vect (const int& x, const int& y, const int& z, const int& t);
+template<> vect<int,1>::vect (const int& x, const int& y, const int& z, const int& t);
+template<> vect<int,2>::vect (const int& x, const int& y, const int& z, const int& t);
+template<> vect<int,3>::vect (const int& x, const int& y, const int& z, const int& t);
// Specialise for CCTK_REAL
template<>
-inline vect<CCTK_REAL,3>& vect<CCTK_REAL,3>::operator%=(const vect<CCTK_REAL,3>& a) {
- for (int d=0; d<3; ++d) {
+inline vect<CCTK_REAL,dim>& vect<CCTK_REAL,dim>::operator%=(const vect<CCTK_REAL,dim>& a) {
+ for (int d=0; d<dim; ++d) {
elt[d]=fmod(elt[d],a[d]);
if (elt[d]>a[d]*(CCTK_REAL)(1.0-1.0e-10)) elt[d]=(CCTK_REAL)0;
if (elt[d]<a[d]*(CCTK_REAL)( 1.0e-10)) elt[d]=(CCTK_REAL)0;
@@ -621,9 +671,9 @@ inline vect<CCTK_REAL,3>& vect<CCTK_REAL,3>::operator%=(const vect<CCTK_REAL,3>&
}
template<>
-inline vect<CCTK_REAL,3> operator%(const vect<CCTK_REAL,3>& a, const vect<CCTK_REAL,3>& b) {
- vect<CCTK_REAL,3> r;
- for (int d=0; d<3; ++d) {
+inline vect<CCTK_REAL,dim> operator%(const vect<CCTK_REAL,dim>& a, const vect<CCTK_REAL,dim>& b) {
+ vect<CCTK_REAL,dim> r;
+ for (int d=0; d<dim; ++d) {
r[d]=fmod(a[d],b[d]);
if (r[d]>b[d]*(CCTK_REAL)(1.0-1.0e-10)) r[d]=(CCTK_REAL)0;
if (r[d]<b[d]*(CCTK_REAL)( 1.0e-10)) r[d]=(CCTK_REAL)0;
diff --git a/Carpet/CarpetLib/src/vect_helpers.hh b/Carpet/CarpetLib/src/vect_helpers.hh
index afcce6e7e..471ae02ba 100644
--- a/Carpet/CarpetLib/src/vect_helpers.hh
+++ b/Carpet/CarpetLib/src/vect_helpers.hh
@@ -7,7 +7,8 @@
#define DECLARE_MEMBER_OPERATOR_0(fn,op) \
\
- vect fn () const PURE { \
+ vect fn () const CCTK_ATTRIBUTE_PURE \
+ { \
vect r; \
for (int d=0; d<D; ++d) r[d]=op elt[d]; \
return r; \
@@ -20,7 +21,8 @@
#define DECLARE_MEMBER_OPERATOR_0_RET(fn,op,R) \
\
- vect<R,D> fn () const PURE { \
+ vect<R,D> fn () const CCTK_ATTRIBUTE_PURE \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=op elt[d]; \
return r; \
@@ -33,12 +35,14 @@
#define DECLARE_MEMBER_OPERATOR_1_REF(fn,op) \
\
- vect& fn (const T& x) { \
+ vect& fn (const T& x) \
+ { \
for (int d=0; d<D; ++d) elt[d] op x; \
return *this; \
} \
\
- vect& fn (const vect& a) { \
+ vect& fn (const vect& a) \
+ { \
for (int d=0; d<D; ++d) elt[d] op a[d]; \
return *this; \
}
@@ -47,25 +51,26 @@
// Declare a function which takes 1 argument and returns type R
-#define DECLARE_FUNCTION_1_RET(fn,R) \
- \
- template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a) PURE; \
- template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a) { \
- vect<R,D> r; \
- for (int d=0; d<D; ++d) r[d]=fn(a[d]); \
- return r; \
- } \
- \
- template<typename T,int D,int E> \
- inline vect<R,D> fn (const vect<vect<T,D>,E>& a) PURE; \
- template<typename T,int D,int E> \
- inline vect<R,D> fn (const vect<vect<T,D>,E>& a) \
- { \
- vect<R,D> r; \
- for (int e=0; e<E; ++e) r[e]=fn(a[e]); \
- return r; \
+#define DECLARE_FUNCTION_1_RET(fn,R) \
+ \
+ template<typename T,int D> \
+ inline vect<R,D> fn (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE; \
+ template<typename T,int D> \
+ inline vect<R,D> fn (const vect<T,D>& a) \
+ { \
+ vect<R,D> r; \
+ for (int d=0; d<D; ++d) r[d]=fn(a[d]); \
+ return r; \
+ } \
+ \
+ template<typename T,int D,int E> \
+ inline vect<R,D> fn (const vect<vect<T,D>,E>& a) CCTK_ATTRIBUTE_PURE; \
+ template<typename T,int D,int E> \
+ inline vect<R,D> fn (const vect<vect<T,D>,E>& a) \
+ { \
+ vect<R,D> r; \
+ for (int e=0; e<E; ++e) r[e]=fn(a[e]); \
+ return r; \
}
@@ -81,36 +86,45 @@
#define DECLARE_FUNCTION_2_RET(fn,R) \
\
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) PURE; \
+ inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) { \
+ inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=fn(a[d],b[d]); \
return r; \
} \
\
template<typename T,int D> \
- inline vect<R,D> fn (const T& a, const vect<T,D>& b) PURE; \
+ inline vect<R,D> fn (const T& a, const vect<T,D>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const T& a, const vect<T,D>& b) { \
+ inline vect<R,D> fn (const T& a, const vect<T,D>& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=fn(a,b[d]); \
return r; \
} \
\
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const T& b) PURE; \
+ inline vect<R,D> fn (const vect<T,D>& a, const T& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const T& b) { \
+ inline vect<R,D> fn (const vect<T,D>& a, const T& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=fn(a[d],b); \
return r; \
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const vect<vect<T,D>,E>& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, \
+ const vect<vect<T,D>,E>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const vect<vect<T,D>,E>& b) \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, \
+ const vect<vect<T,D>,E>& b) \
{ \
vect<vect<R,D>,E> r; \
for (int e=0; e<E; ++e) r[e]=fn(a[e],b[e]); \
@@ -118,7 +132,8 @@
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) \
{ \
@@ -128,7 +143,8 @@
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) \
{ \
@@ -150,25 +166,28 @@
#define DECLARE_OPERATOR_1_RET(fn,op,R) \
\
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a) PURE; \
+ inline vect<R,D> fn (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a) { \
+ inline vect<R,D> fn (const vect<T,D>& a) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=op a[d]; \
return r; \
} \
\
template<typename T,int D> \
- inline vect<R,D> fn (const T& a) PURE; \
+ inline vect<R,D> fn (const T& a) CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const T& a) { \
+ inline vect<R,D> fn (const T& a) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=op a; \
return r; \
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a) PURE; \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a) \
{ \
@@ -178,7 +197,7 @@
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const T& a) PURE; \
+ inline vect<vect<R,D>,E> fn (const T& a) CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const T& a) \
{ \
@@ -194,36 +213,45 @@
#define DECLARE_OPERATOR_2_RET(fn,op,R) \
\
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) PURE; \
+ inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) { \
+ inline vect<R,D> fn (const vect<T,D>& a, const vect<T,D>& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=a[d] op b[d]; \
return r; \
} \
\
template<typename T,int D> \
- inline vect<R,D> fn (const T& a, const vect<T,D>& b) PURE; \
+ inline vect<R,D> fn (const T& a, const vect<T,D>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const T& a, const vect<T,D>& b) { \
+ inline vect<R,D> fn (const T& a, const vect<T,D>& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=a op b[d]; \
return r; \
} \
\
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const T& b) PURE; \
+ inline vect<R,D> fn (const vect<T,D>& a, const T& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline vect<R,D> fn (const vect<T,D>& a, const T& b) { \
+ inline vect<R,D> fn (const vect<T,D>& a, const T& b) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=a[d] op b; \
return r; \
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const vect<vect<T,D>,E>& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, \
+ const vect<vect<T,D>,E>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const vect<vect<T,D>,E>& b) \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, \
+ const vect<vect<T,D>,E>& b) \
{ \
vect<vect<R,D>,E> r; \
for (int e=0; e<E; ++e) r[e]=a[e] op b[e]; \
@@ -231,7 +259,8 @@
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const T& a, const vect<vect<T,D>,E>& b) \
{ \
@@ -241,14 +270,15 @@
} \
\
template<typename T,int D,int E> \
- inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) PURE; \
+ inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) \
+ CCTK_ATTRIBUTE_PURE; \
template<typename T,int D,int E> \
inline vect<vect<R,D>,E> fn (const vect<vect<T,D>,E>& a, const T& b) \
{ \
vect<vect<R,D>,E> r; \
for (int e=0; e<E; ++e) r[e]=a[e] op b; \
return r; \
- }
+ }
@@ -264,18 +294,20 @@
#define DECLARE_REDUCTION_OPERATOR_1_T_RET(fn,init,op,final,T,R) \
\
template<typename U,int D> \
- inline vect<R,D> fn (const vect<U,D>& a) PURE; \
+ inline vect<R,D> fn (const vect<U,D>& a) CCTK_ATTRIBUTE_PURE; \
template<typename U,int D> \
- inline vect<R,D> fn (const vect<U,D>& a) { \
+ inline vect<R,D> fn (const vect<U,D>& a) \
+ { \
vect<R,D> r; \
for (int d=0; d<D; ++d) r[d]=fn(a[d]); \
return r; \
} \
\
template<int D> \
- inline R fn (const vect<T,D>& a) PURE; \
+ inline R fn (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE; \
template<int D> \
- inline R fn (const vect<T,D>& a) { \
+ inline R fn (const vect<T,D>& a) \
+ { \
R r(init); \
for (int d=0; d<D; ++d) r op a[d]; \
return final(r); \
@@ -285,15 +317,16 @@
// Declare a reduction function which takes 1 argument
-#define DECLARE_REDUCTION_OPERATOR_1(fn,init,op,final) \
- \
- template<typename T,int D> \
- inline T fn (const vect<T,D>& a) PURE; \
- template<typename T,int D> \
- inline T fn (const vect<T,D>& a) { \
- T r(init); \
- for (int d=0; d<D; ++d) r op a[d]; \
- return final(r); \
+#define DECLARE_REDUCTION_OPERATOR_1(fn,init,op,final) \
+ \
+ template<typename T,int D> \
+ inline T fn (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE; \
+ template<typename T,int D> \
+ inline T fn (const vect<T,D>& a) \
+ { \
+ T r(init); \
+ for (int d=0; d<D; ++d) r op a[d]; \
+ return final(r); \
}
@@ -303,9 +336,10 @@
#define DECLARE_REDUCTION_FUNCTION_1(fn,init,op,final) \
\
template<typename T,int D> \
- inline T fn (const vect<T,D>& a) PURE; \
+ inline T fn (const vect<T,D>& a) CCTK_ATTRIBUTE_PURE; \
template<typename T,int D> \
- inline T fn (const vect<T,D>& a) { \
+ inline T fn (const vect<T,D>& a) \
+ { \
T r(init); \
for (int d=0; d<D; ++d) op(r,a[d]); \
return final(r); \
@@ -315,15 +349,17 @@
// Declare a reduction function which takes 2 arguments
-#define DECLARE_REDUCTION_OPERATOR_2(fn,init,op,op2,final) \
- \
- template<typename T,int D> \
- inline T fn (const vect<T,D>& a, const vect<T,D>& b) PURE; \
- template<typename T,int D> \
- inline T fn (const vect<T,D>& a, const vect<T,D>& b) { \
- T r(init); \
- for (int d=0; d<D; ++d) r op (a[d] op2 b[d]); \
- return final(r); \
+#define DECLARE_REDUCTION_OPERATOR_2(fn,init,op,op2,final) \
+ \
+ template<typename T,int D> \
+ inline T fn (const vect<T,D>& a, const vect<T,D>& b) \
+ CCTK_ATTRIBUTE_PURE; \
+ template<typename T,int D> \
+ inline T fn (const vect<T,D>& a, const vect<T,D>& b) \
+ { \
+ T r(init); \
+ for (int d=0; d<D; ++d) r op (a[d] op2 b[d]); \
+ return final(r); \
}
diff --git a/Carpet/CarpetMask/README b/Carpet/CarpetMask/README
index 9c2fde769..a54ac4dbb 100644
--- a/Carpet/CarpetMask/README
+++ b/Carpet/CarpetMask/README
@@ -1,9 +1,10 @@
Cactus Code Thorn CarpetMask
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
Remove unwanted regions from Carpet's reduction operations. This can
be used e.g. to excise the interior of horizons.
diff --git a/Carpet/CarpetMask/configuration.ccl b/Carpet/CarpetMask/configuration.ccl
new file mode 100644
index 000000000..505f2b2b9
--- /dev/null
+++ b/Carpet/CarpetMask/configuration.ccl
@@ -0,0 +1,5 @@
+# Configuration definitions for thorn CarpetMask
+
+REQUIRES LoopControl
+
+REQUIRES THORNS: LoopControl
diff --git a/Carpet/CarpetMask/schedule.ccl b/Carpet/CarpetMask/schedule.ccl
index a7b972557..1b136ff9a 100644
--- a/Carpet/CarpetMask/schedule.ccl
+++ b/Carpet/CarpetMask/schedule.ccl
@@ -1,5 +1,11 @@
# Schedule definitions for thorn CarpetMask
+SCHEDULE CarpetSurfaceParamCheck AT paramcheck
+{
+ LANG: C
+ OPTIONS: global
+} "Check parameters"
+
# TODO: Schedule this only if there is an excluded centre which is active
SCHEDULE GROUP MaskBase_SetupMask AT poststep AFTER SphericalSurface_HasBeenSet
{
diff --git a/Carpet/CarpetMask/src/mask_excluded.cc b/Carpet/CarpetMask/src/mask_excluded.cc
index e842caf31..e179bc268 100644
--- a/Carpet/CarpetMask/src/mask_excluded.cc
+++ b/Carpet/CarpetMask/src/mask_excluded.cc
@@ -4,6 +4,8 @@
#include <cctk_Arguments.h>
#include <cctk_Parameters.h>
+#include <loopcontrol.h>
+
#include "mask_excluded.hh"
@@ -46,25 +48,26 @@ namespace CarpetMask {
bool const exterior = exclude_exterior[n];
- for (int k = 0; k < cctk_lsh[2]; ++ k) {
- for (int j = 0; j < cctk_lsh[1]; ++ j) {
- for (int i = 0; i < cctk_lsh[0]; ++ i) {
- int const ind = CCTK_GFINDEX3D (cctkGH, i, j, k);
-
- CCTK_REAL const dx2 = pow (x[ind] - x0, 2);
- CCTK_REAL const dy2 = pow (y[ind] - y0, 2);
- CCTK_REAL const dz2 = pow (z[ind] - z0, 2);
-
- if (exterior ?
- dx2 + dy2 + dz2 >= r2 :
- dx2 + dy2 + dz2 <= r2)
- {
- weight[ind] = 0.0;
- }
-
- }
+#pragma omp parallel
+ LC_LOOP3(CarpetExcludedSetup,
+ i,j,k,
+ 0,0,0, cctk_lsh[0],cctk_lsh[1],cctk_lsh[2],
+ cctk_lsh[0],cctk_lsh[1],cctk_lsh[2])
+ {
+ int const ind = CCTK_GFINDEX3D (cctkGH, i, j, k);
+
+ CCTK_REAL const dx2 = pow (x[ind] - x0, 2);
+ CCTK_REAL const dy2 = pow (y[ind] - y0, 2);
+ CCTK_REAL const dz2 = pow (z[ind] - z0, 2);
+
+ if (exterior ?
+ dx2 + dy2 + dz2 >= r2 :
+ dx2 + dy2 + dz2 <= r2)
+ {
+ weight[ind] = 0.0;
}
- }
+
+ } LC_ENDLOOP3(CarpetExcludedSetup);
} // if r>=0
} // for n
diff --git a/Carpet/CarpetMask/src/mask_surface.cc b/Carpet/CarpetMask/src/mask_surface.cc
index e1a02079f..d23dc5461 100644
--- a/Carpet/CarpetMask/src/mask_surface.cc
+++ b/Carpet/CarpetMask/src/mask_surface.cc
@@ -23,6 +23,33 @@ namespace CarpetMask {
/**
+ * Check parameters.
+ */
+
+ void
+ CarpetSurfaceParamCheck (CCTK_ARGUMENTS)
+ {
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ for (int n = 0; n < num_excluded; ++ n) {
+
+ int const sn = excluded_surface[n];
+ if (sn >= 0) {
+
+ if (not (sn < nsurfaces)) {
+ CCTK_VParamWarn (CCTK_THORNSTRING,
+ "Mask %d depends on spherical surface %d, but there are only %d spherical surfaces",
+ n, sn, int(nsurfaces));
+ }
+
+ } // if sn >= 0
+ } // for n
+ }
+
+
+
+ /**
* Set the weight in the excluded regions to zero.
*/
@@ -52,6 +79,11 @@ namespace CarpetMask {
int const sn = excluded_surface[n];
if (sn >= 0) {
+ if (not (sn < nsurfaces)) {
+ CCTK_VWarn (CCTK_WARN_ABORT, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Mask %d depends on spherical surface %d, but there are only %d spherical surfaces",
+ n, sn, int(nsurfaces));
+ }
assert (sn < nsurfaces);
if (sf_active[sn]) {
@@ -81,6 +113,7 @@ namespace CarpetMask {
}
}
+#pragma omp parallel for
for (int k = 0; k < cctk_lsh[2]; ++ k) {
for (int j = 0; j < cctk_lsh[1]; ++ j) {
for (int i = 0; i < cctk_lsh[0]; ++ i) {
diff --git a/Carpet/CarpetMask/src/mask_surface.hh b/Carpet/CarpetMask/src/mask_surface.hh
index a3e1f19d0..63e46d35b 100644
--- a/Carpet/CarpetMask/src/mask_surface.hh
+++ b/Carpet/CarpetMask/src/mask_surface.hh
@@ -5,6 +5,8 @@ namespace CarpetMask {
extern "C" {
void
+ CarpetSurfaceParamCheck (CCTK_ARGUMENTS);
+ void
CarpetSurfaceSetup (CCTK_ARGUMENTS);
}
diff --git a/Carpet/CarpetReduce/README b/Carpet/CarpetReduce/README
index d28f8cb3a..38a70d075 100644
--- a/Carpet/CarpetReduce/README
+++ b/Carpet/CarpetReduce/README
@@ -1,8 +1,10 @@
Cactus Code Thorn CarpetReduce
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides parallel reduction operators for Carpet.
diff --git a/Carpet/CarpetReduce/src/mask_carpet.cc b/Carpet/CarpetReduce/src/mask_carpet.cc
index 679c85392..6a87db4a9 100644
--- a/Carpet/CarpetReduce/src/mask_carpet.cc
+++ b/Carpet/CarpetReduce/src/mask_carpet.cc
@@ -75,9 +75,8 @@ namespace CarpetMask {
// Enlarge this set
ibset enlarged[dim];
for (int d=0; d<dim; ++d) {
- for (ibset::const_iterator bi = notrefined.begin();
- bi != notrefined.end();
- ++bi)
+ for (ibset::const_iterator
+ bi = notrefined.begin(); bi != notrefined.end(); ++bi)
{
enlarged[d] |= (*bi).expand(ivect::dir(d), ivect::dir(d));
}
diff --git a/Carpet/CarpetReduce/src/reduce.cc b/Carpet/CarpetReduce/src/reduce.cc
index 3034d72ef..b72c089f9 100644
--- a/Carpet/CarpetReduce/src/reduce.cc
+++ b/Carpet/CarpetReduce/src/reduce.cc
@@ -5,6 +5,7 @@
#include <cmath>
#include <cstdio>
#include <cstdlib>
+#include <cstring>
#include <complex>
#include <limits>
#include <vector>
@@ -56,6 +57,18 @@ namespace CarpetReduce {
}
template<typename T> inline T
+ mysqr (const T x)
+ {
+ return x*x;
+ }
+
+ template<typename T> inline T
+ mysqrabs (const T x)
+ {
+ return x*x;
+ }
+
+ template<typename T> inline T
mysqrt (const T x)
{
return sqrt(x);
@@ -112,9 +125,22 @@ namespace CarpetReduce {
// return 0;
// }
+ template<> inline CCTK_BYTE mysqr (CCTK_BYTE const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
+ template<> inline CCTK_BYTE mysqrabs (CCTK_BYTE const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
template<> inline CCTK_BYTE mysqrt (CCTK_BYTE const x)
{
- return static_cast<CCTK_BYTE> (sqrt (static_cast<CCTK_REAL> (x)));
+ // return static_cast<CCTK_BYTE> (sqrt (static_cast<CCTK_REAL> (x)));
+ return 0;
}
#endif
@@ -124,9 +150,22 @@ namespace CarpetReduce {
// return 0;
// }
+ template<> inline CCTK_INT1 mysqr (CCTK_INT1 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
+ template<> inline CCTK_INT1 mysqrabs (CCTK_INT1 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
template<> inline CCTK_INT1 mysqrt (CCTK_INT1 const x)
{
- return static_cast<CCTK_INT1> (sqrt (static_cast<CCTK_REAL> (x)));
+ // return static_cast<CCTK_INT1> (sqrt (static_cast<CCTK_REAL> (x)));
+ return 0;
}
#endif
@@ -136,23 +175,72 @@ namespace CarpetReduce {
// return 0;
// }
+ template<> inline CCTK_INT2 mysqr (CCTK_INT2 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
+ template<> inline CCTK_INT2 mysqrabs (CCTK_INT2 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
template<> inline CCTK_INT2 mysqrt (CCTK_INT2 const x)
{
- return static_cast<CCTK_INT2> (sqrt (static_cast<CCTK_REAL> (x)));
+ // return static_cast<CCTK_INT2> (sqrt (static_cast<CCTK_REAL> (x)));
+ return 0;
}
#endif
#ifdef HAVE_CCTK_INT4
+// template<> inline int myisnan (CCTK_INT4 const x)
+// {
+// return 0;
+// }
+
+ template<> inline CCTK_INT4 mysqr (CCTK_INT4 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
+ template<> inline CCTK_INT4 mysqrabs (CCTK_INT4 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
template<> inline CCTK_INT4 mysqrt (CCTK_INT4 const x)
{
- return static_cast<CCTK_INT4> (sqrt (static_cast<CCTK_REAL> (x)));
+ // return static_cast<CCTK_INT4> (sqrt (static_cast<CCTK_REAL> (x)));
+ return 0;
}
#endif
#ifdef HAVE_CCTK_INT8
+// template<> inline int myisnan (CCTK_INT8 const x)
+// {
+// return 0;
+// }
+
+ template<> inline CCTK_INT8 mysqr (CCTK_INT8 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
+ template<> inline CCTK_INT8 mysqrabs (CCTK_INT8 const x)
+ {
+ // prevent overflow
+ return 0;
+ }
+
template<> inline CCTK_INT8 mysqrt (CCTK_INT8 const x)
{
- return static_cast<CCTK_INT8> (sqrt (static_cast<CCTK_REAL> (x)));
+ // return static_cast<CCTK_INT8> (sqrt (static_cast<CCTK_REAL> (x)));
+ return 0;
}
#endif
@@ -181,6 +269,12 @@ namespace CarpetReduce {
mymax(x.imag(), y.imag()));
}
+ template<> inline complex<CCTK_REAL4>
+ mysqrabs (const complex<CCTK_REAL4> x)
+ {
+ return mysqr(abs(x));
+ }
+
template<>
struct my_numeric_limits<complex<CCTK_REAL4> > {
static complex<CCTK_REAL4> min ()
@@ -224,6 +318,12 @@ namespace CarpetReduce {
mymax(x.imag(), y.imag()));
}
+ template<> inline complex<CCTK_REAL8>
+ mysqrabs (const complex<CCTK_REAL8> x)
+ {
+ return mysqr(abs(x));
+ }
+
template<>
struct my_numeric_limits<complex<CCTK_REAL8> > {
static complex<CCTK_REAL8> min ()
@@ -267,6 +367,12 @@ namespace CarpetReduce {
mymax(x.imag(), y.imag()));
}
+ template<> inline complex<CCTK_REAL16>
+ mysqrabs (const complex<CCTK_REAL16> x)
+ {
+ return mysqr(abs(x));
+ }
+
template<>
struct my_numeric_limits<complex<CCTK_REAL16> > {
static complex<CCTK_REAL16> min ()
@@ -399,7 +505,7 @@ namespace CarpetReduce {
template<class T>
struct op {
static inline void initialise (T& accum, T& cnt) { accum = T(0); cnt = T(0); }
- static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*val*val; cnt += T(weight); }
+ static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*mysqr(val); cnt += T(weight); }
static inline void combine (T& accum, T& cnt, const T& accum2, const T& cnt2) { accum += accum2; cnt += cnt2; }
static inline void finalise (T& accum, const T& cnt) { }
};
@@ -413,7 +519,7 @@ namespace CarpetReduce {
template<class T>
struct op {
static inline void initialise (T& accum, T& cnt) { accum = T(0); cnt = T(0); }
- static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*abs(val*val); cnt += T(weight); }
+ static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*mysqrabs(val); cnt += T(weight); }
static inline void combine (T& accum, T& cnt, const T& accum2, const T& cnt2) { accum += accum2; cnt += cnt2; }
static inline void finalise (T& accum, const T& cnt) { }
};
@@ -455,7 +561,7 @@ namespace CarpetReduce {
template<class T>
struct op {
static inline void initialise (T& accum, T& cnt) { accum = T(0); cnt = T(0); }
- static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*abs(val)*abs(val); cnt += T(weight); }
+ static inline void reduce (T& accum, T& cnt, const T& val, const CCTK_REAL weight) { if (weight!=0) accum += weight*mysqrabs(val); cnt += T(weight); }
static inline void combine (T& accum, T& cnt, const T& accum2, const T& cnt2) { accum += accum2; cnt += cnt2; }
static inline void finalise (T& accum, const T& cnt) { accum = mysqrt(accum / cnt); }
};
@@ -503,13 +609,13 @@ namespace CarpetReduce {
imin[d] = (bbox[2*d ] ? 0 : nghostzones[d]);
imax[d] = lsh[d] - (bbox[2*d+1] ? 0 : nghostzones[d]);
}
- static_assert (dim==3, "Only 3 dimensions are currently supported");
#pragma omp parallel
{
T myoutval_local;
T mycnt_local;
OP::initialise (myoutval_local, mycnt_local);
#pragma omp for nowait
+#if CARPET_DIM == 3
for (int k=imin[2]; k<imax[2]; ++k) {
for (int j=imin[1]; j<imax[1]; ++j) {
for (int i=imin[0]; i<imax[0]; ++i) {
@@ -524,6 +630,26 @@ namespace CarpetReduce {
}
}
}
+#elif CARPET_DIM == 4
+ for (int l=imin[3]; l<imax[3]; ++l) {
+ for (int k=imin[2]; k<imax[2]; ++k) {
+ for (int j=imin[1]; j<imax[1]; ++j) {
+ for (int i=imin[0]; i<imax[0]; ++i) {
+ const int index = i + lsh[0] * (j + lsh[1] * (k + lsh[2] * l));
+ CCTK_REAL const w = weight ? weight[index] * levfac : levfac;
+ T myinval = T(0);
+ for (size_t tl=0; tl<inarrays.size(); ++tl) {
+ myinval +=
+ static_cast<const T*>(inarrays.AT(tl))[index] * tfacs.AT(tl);
+ }
+ OP::reduce (myoutval_local, mycnt_local, myinval, w);
+ }
+ }
+ }
+ }
+#else
+# error "Value of CARPET_DIM is not supported"
+#endif
#pragma omp critical
{
OP::combine (myoutval, mycnt, myoutval_local, mycnt_local);
@@ -762,48 +888,60 @@ namespace CarpetReduce {
assert (num_outvals>=0);
assert (outvals or (proc!=-1 and proc!=CCTK_MyProc(cgh)));
+ assert (num_outvals==0 or myoutvals);
+ assert (num_outvals==0 or mycounts);
+
const int vartypesize = CCTK_VarTypeSize(outtype);
assert (vartypesize>=0);
+ const int mpilength = CarpetSimpleMPIDatatypeLength(outtype);
- assert (num_outvals==0 or myoutvals);
- assert (num_outvals==0 or mycounts);
+ char* const sendbuf = static_cast<char*>(const_cast<void*>(myoutvals));
+ const int bufsize = num_outvals * vartypesize;
+ const int mpicount = num_outvals * mpilength * (red->uses_cnt() ? 2 : 1);
+ if (red->uses_cnt()) {
+ if (not (sendbuf + bufsize == static_cast<const char*>(mycounts))) {
+ cerr << "sendbuf=" << (void*)sendbuf << endl
+ << "bufsize=" << bufsize << endl
+ << "mycounts=" << mycounts << endl
+ << "num_outvals=" << num_outvals << endl
+ << "outtype=" << outtype << endl
+ << "vartypesize=" << vartypesize << endl
+ << "mpilength=" << mpilength << endl
+ << "mpicount=" << mpicount << endl;
+ }
+ assert (sendbuf + bufsize == static_cast<const char*>(mycounts));
+ assert (red->mpi_op() == MPI_SUM);
+ }
- vector<char> counts;
+ char* recvbuf = static_cast<char*>(outvals);
+ vector<char> buffer;
if (proc==-1 or proc==CCTK_MyProc(cgh)) {
- counts.resize(vartypesize * num_outvals);
+ if (red->uses_cnt()) {
+ buffer.resize (2*bufsize);
+ recvbuf = &buffer[0];
+ }
}
const MPI_Datatype mpitype = CarpetSimpleMPIDatatype(outtype);
- const int mpilength = CarpetSimpleMPIDatatypeLength(outtype);
if (proc == -1) {
- MPI_Allreduce (const_cast<void*>(myoutvals), outvals,
- mpilength*num_outvals,
- mpitype, red->mpi_op(),
- CarpetMPIComm());
- if (red->uses_cnt()) {
- MPI_Allreduce (const_cast<void*>(mycounts), &counts[0],
- num_outvals*mpilength,
- mpitype, MPI_SUM,
- CarpetMPIComm());
- }
+ MPI_Allreduce (sendbuf, recvbuf, mpicount,
+ mpitype, red->mpi_op(), CarpetMPIComm());
} else {
- MPI_Reduce (const_cast<void*>(myoutvals), outvals,
- num_outvals*mpilength,
- mpitype, red->mpi_op(), proc, CarpetMPIComm());
- if (red->uses_cnt()) {
- MPI_Reduce (const_cast<void*>(mycounts), &counts[0],
- num_outvals*mpilength,
- mpitype, MPI_SUM, proc, CarpetMPIComm());
- }
+ MPI_Reduce (sendbuf, recvbuf, mpicount,
+ mpitype, red->mpi_op(), proc, CarpetMPIComm());
}
if (proc==-1 or proc==CCTK_MyProc(cgh)) {
+ assert (outvals);
+ char* counts = NULL;
+ if (red->uses_cnt()) {
+ memcpy (outvals, recvbuf, bufsize);
+ counts = recvbuf + bufsize;
+ }
+
for (int n=0; n<num_outvals; ++n) {
- assert (outvals);
- assert ((int)counts.size() == vartypesize * num_outvals);
-
switch (outtype) {
#define FINALISE(OP,S) \
case do_##OP: { \
@@ -915,24 +1053,27 @@ namespace CarpetReduce {
const int vartypesize = CCTK_VarTypeSize(outtype);
assert (vartypesize>=0);
- vector<char> myoutvals (vartypesize * num_inarrays * num_outvals);
- vector<char> mycounts (vartypesize * num_inarrays * num_outvals);
+ // keep local outvals and counts in a single buffer
+ // to save a copy operation in the Finalise() step
+ vector<char> buffer (2 * vartypesize * num_inarrays * num_outvals);
+ char* const myoutvals = &buffer[0];
+ char* const mycounts = &buffer[vartypesize * num_inarrays * num_outvals];
- Initialise (cgh, proc, num_inarrays * num_outvals, &myoutvals[0], outtype,
- &mycounts[0], red);
+ Initialise (cgh, proc, num_inarrays * num_outvals, myoutvals, outtype,
+ mycounts, red);
if (do_local_reduction) {
Reduce (cgh, proc, &mylsh[0], &mybbox[0][0], &mynghostzones[0],
num_inarrays, myinarrays, tfacs, intype,
- num_inarrays * num_outvals, &myoutvals[0], outtype,
- &mycounts[0], red,
+ num_inarrays * num_outvals, myoutvals, outtype,
+ mycounts, red,
NULL, 1.0);
} else {
Copy (cgh, proc, lsize, num_inarrays, inarrays, intype,
- num_inarrays * num_outvals, &myoutvals[0], outtype,
- &mycounts[0]);
+ num_inarrays * num_outvals, myoutvals, outtype,
+ mycounts);
}
Finalise (cgh, proc, num_inarrays * num_outvals, outvals, outtype,
- &myoutvals[0], &mycounts[0], red);
+ myoutvals, mycounts, red);
return 0;
}
@@ -1020,11 +1161,14 @@ namespace CarpetReduce {
- vector<char> myoutvals (vartypesize * num_invars * num_outvals);
- vector<char> mycounts (vartypesize * num_invars * num_outvals);
+ // keep local outvals and counts in a single buffer
+ // to save a copy operation in the Finalise() step
+ vector<char> buffer (2 * vartypesize * num_invars * num_outvals);
+ char* const myoutvals = &buffer[0];
+ char* const mycounts = &buffer[vartypesize * num_invars * num_outvals];
- Initialise (cgh, proc, num_invars * num_outvals, &myoutvals[0], outtype,
- &mycounts[0], red);
+ Initialise (cgh, proc, num_invars * num_outvals, myoutvals, outtype,
+ mycounts, red);
BEGIN_GLOBAL_MODE(cgh) {
for (int rl=minrl; rl<maxrl; ++rl) {
@@ -1062,32 +1206,44 @@ namespace CarpetReduce {
} else {
assert (0);
}
+ assert (num_tl >= 1);
- // Are there enough time levels?
- int const max_tl = CCTK_MaxTimeLevelsVI(vi);
- int const active_tl = CCTK_ActiveTimeLevelsVI(cgh, vi);
- if (max_tl == 1 and active_tl == 1) {
- num_tl = 1;
+ if (num_tl == 1) {
+ // One time level does not count as interpolation
need_time_interp = false;
- static vector<bool> have_warned;
- if (have_warned.empty()) {
- have_warned.resize (CCTK_NumVars(), false);
- }
- if (not have_warned.at(vi)) {
- char * const fullname = CCTK_FullName(vi);
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Grid function \"%s\" has only %d time levels on refinement level %d; this is not enough for time interpolation",
- fullname, max_tl, reflevel);
- free (fullname);
- have_warned.at(vi) = true;
+ } else {
+ // Are there enough time levels?
+ int const active_tl = CCTK_ActiveTimeLevelsVI(cgh, vi);
+ if (active_tl < num_tl) {
+ int const max_tl = CCTK_MaxTimeLevelsVI(vi);
+ if (max_tl == 1 and active_tl == 1) {
+ static vector<bool> have_warned;
+ if (have_warned.empty()) {
+ have_warned.resize (CCTK_NumVars(), false);
+ }
+ if (not have_warned.at(vi)) {
+ char * const fullname = CCTK_FullName(vi);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Grid function \"%s\" has only %d time levels on refinement level %d; this is not enough for time interpolation",
+ fullname, max_tl, reflevel);
+ free (fullname);
+ have_warned.at(vi) = true;
+ }
+ // fall back to no time interpolation
+ num_tl = 1;
+ need_time_interp = false;
+ } else {
+ char * const fullname = CCTK_FullName(vi);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Grid function \"%s\" has only %d active time levels out of %d maximum time levels on refinement level %d; this is not enough for time interpolation",
+ fullname, active_tl, max_tl, reflevel);
+ if (not do_allow_past_timelevels) {
+ CCTK_WARN (1, "(Note: access to past time levels is disabled at this point, probably because of the schedule bin from which this code is called.)");
+ }
+ free (fullname);
+ return 1; // error
+ }
}
- } else if (active_tl < num_tl) {
- char * const fullname = CCTK_FullName(vi);
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Grid function \"%s\" has only %d active time levels out of %d maximum time levels on refinement level %d; this is not enough for time interpolation",
- fullname, active_tl, max_tl, reflevel);
- free (fullname);
- return 1; // error
}
} else {
@@ -1155,93 +1311,98 @@ namespace CarpetReduce {
int const grouptype = reduce_arrays ? CCTK_ARRAY : CCTK_GF;
for (int m=minm; m<maxm; ++m) {
- ENTER_SINGLEMAP_MODE(cgh, m, grouptype) {
- BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
-
-
-
- assert (grpdim<=dim);
- int lsh[dim], bbox[2*dim], nghostzones[dim];
- ierr = CCTK_GrouplshVI(cgh, grpdim, lsh, vi);
- assert (not ierr);
- ierr = CCTK_GroupbboxVI(cgh, 2*grpdim, bbox, vi);
- assert (not ierr);
- ierr = CCTK_GroupnghostzonesVI(cgh, grpdim, nghostzones, vi);
- assert (not ierr);
- for (int d=0; d<grpdim; ++d) {
- assert (lsh[d]>=0);
- assert (nghostzones[d]>=0 and 2*nghostzones[d]<=lsh[d]);
- }
-
- vect<int,dim> mylsh, mynghostzones;
- vect<vect<int,2>,dim> mybbox;
- for (int d=0; d<grpdim; ++d) {
- mylsh[d] = lsh[d];
- mybbox[d][0] = bbox[2*d ];
- mybbox[d][1] = bbox[2*d+1];
- mynghostzones[d] = nghostzones[d];
- }
- for (int d=grpdim; d<dim; ++d) {
- mylsh[d] = 1;
- mybbox[d][0] = 0;
- mybbox[d][1] = 0;
- mynghostzones[d] = 0;
- }
-
-
-
- CCTK_REAL const * weight;
- CCTK_REAL levfac;
- if (want_global_mode or want_level_mode) {
- static int iweight = -1;
- if (iweight == -1) {
- iweight = CCTK_VarIndex ("CarpetReduce::weight");
- assert (iweight >= 0);
+ int const maxlc =
+ grouptype == CCTK_GF ? vhh.AT(m)->local_components(reflevel) : 1;
+ if (maxlc > 0) {
+ ENTER_SINGLEMAP_MODE(cgh, m, grouptype) {
+ BEGIN_LOCAL_COMPONENT_LOOP(cgh, grouptype) {
+
+
+
+ assert (grpdim<=dim);
+ int lsh[dim], bbox[2*dim], nghostzones[dim];
+ ierr = CCTK_GrouplshVI(cgh, grpdim, lsh, vi);
+ assert (not ierr);
+ ierr = CCTK_GroupbboxVI(cgh, 2*grpdim, bbox, vi);
+ assert (not ierr);
+ ierr = CCTK_GroupnghostzonesVI(cgh, grpdim, nghostzones, vi);
+ assert (not ierr);
+ for (int d=0; d<grpdim; ++d) {
+ assert (lsh[d]>=0);
+ assert (nghostzones[d]>=0 and 2*nghostzones[d]<=lsh[d]);
}
- weight = (static_cast<CCTK_REAL const *>
- (CCTK_VarDataPtrI (cgh, 0, iweight)));
- assert (weight);
- CCTK_REAL const levfac1 =
- 1.0 / prod (rvect (spacereflevelfact));
- levfac = want_level_mode or igrid ? 1.0 : levfac1;
- } else {
- weight = NULL;
- levfac = 1.0;
- }
-
- vector<vector<const void*> > myinarrays (num_tl);
- vector<const void* const*> inarrays (num_tl);
- for (int tl=0; tl<num_tl; ++tl) {
- myinarrays.at(tl).resize (num_invars);
- for (int n=0; n<num_invars; ++n) {
+
+ vect<int,dim> mylsh, mynghostzones;
+ vect<vect<int,2>,dim> mybbox;
+ for (int d=0; d<grpdim; ++d) {
+ mylsh[d] = lsh[d];
+ mybbox[d][0] = bbox[2*d ];
+ mybbox[d][1] = bbox[2*d+1];
+ mynghostzones[d] = nghostzones[d];
+ }
+ for (int d=grpdim; d<dim; ++d) {
+ mylsh[d] = 1;
+ mybbox[d][0] = 0;
+ mybbox[d][1] = 0;
+ mynghostzones[d] = 0;
+ }
+
+
+
+ CCTK_REAL const * weight;
+ CCTK_REAL levfac;
+ if (want_global_mode or want_level_mode) {
+ static int iweight = -1;
+ if (iweight == -1) {
+ iweight = CCTK_VarIndex ("CarpetReduce::weight");
+ assert (iweight >= 0);
+ }
+ weight = (static_cast<CCTK_REAL const *>
+ (CCTK_VarDataPtrI (cgh, 0, iweight)));
+ assert (weight);
+ CCTK_REAL const levfac1 =
+ 1.0 / prod (rvect (spacereflevelfact));
+ levfac = want_level_mode or igrid ? 1.0 : levfac1;
+ } else {
+ weight = NULL;
+ levfac = 1.0;
+ }
+
+ vector<vector<const void*> > myinarrays (num_tl);
+ vector<const void* const*> inarrays (num_tl);
+ for (int tl=0; tl<num_tl; ++tl) {
+ myinarrays.at(tl).resize (num_invars);
+ for (int n=0; n<num_invars; ++n) {
#if 0
- myinarrays.at(tl).at(n)
- = CCTK_VarDataPtrI(cgh, tl, invars[n]);
+ myinarrays.at(tl).at(n)
+ = CCTK_VarDataPtrI(cgh, tl, invars[n]);
#else
- int const vi = invars[n];
- int const gi = CCTK_GroupIndexFromVarI (vi);
- int const vi0 = CCTK_FirstVarIndexI (gi);
- myinarrays.at(tl).at(n)
- = ((*arrdata.at(gi).at(Carpet::map).data.at(vi-vi0))
- (tl, reflevel, component, mglevel)->storage());
+ int const vi = invars[n];
+ int const gi = CCTK_GroupIndexFromVarI (vi);
+ int const vi0 = CCTK_FirstVarIndexI (gi);
+ myinarrays.at(tl).at(n)
+ = ((*arrdata.at(gi).at(Carpet::map).data.at(vi-vi0))
+ (tl, reflevel, local_component, mglevel)->storage());
#endif
- assert (myinarrays.at(tl).at(n));
+ assert (myinarrays.at(tl).at(n));
+ }
+ inarrays.at(tl) = &myinarrays.at(tl).at(0);
}
- inarrays.at(tl) = &myinarrays.at(tl).at(0);
- }
-
-
-
- Reduce (cgh, proc, &mylsh[0], &mybbox[0][0], &mynghostzones[0],
- num_invars, inarrays, tfacs, intype,
- num_invars * num_outvals, &myoutvals[0], outtype,
- &mycounts[0], red,
- weight, levfac);
-
-
-
- } END_LOCAL_COMPONENT_LOOP;
- } LEAVE_SINGLEMAP_MODE;
+
+
+
+ Reduce (cgh, proc,
+ &mylsh[0], &mybbox[0][0], &mynghostzones[0],
+ num_invars, inarrays, tfacs, intype,
+ num_invars * num_outvals, myoutvals, outtype,
+ mycounts, red,
+ weight, levfac);
+
+
+
+ } END_LOCAL_COMPONENT_LOOP;
+ } LEAVE_SINGLEMAP_MODE;
+ } // if maxlc > 0
} // for m
} LEAVE_LEVEL_MODE;
@@ -1249,7 +1410,7 @@ namespace CarpetReduce {
} END_GLOBAL_MODE;
Finalise (cgh, proc, num_invars * num_outvals, outvals, outtype,
- &myoutvals[0], &mycounts[0], red);
+ myoutvals, mycounts, red);
return 0;
}
diff --git a/Carpet/CarpetRegrid/README b/Carpet/CarpetRegrid/README
index edcf5e710..315d55e0d 100644
--- a/Carpet/CarpetRegrid/README
+++ b/Carpet/CarpetRegrid/README
@@ -1,7 +1,9 @@
Cactus Code Thorn CarpetRegrid
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn handles regridding for Carpet.
diff --git a/Carpet/CarpetRegrid2/README b/Carpet/CarpetRegrid2/README
index fe220ac82..12db67f2d 100644
--- a/Carpet/CarpetRegrid2/README
+++ b/Carpet/CarpetRegrid2/README
@@ -1,9 +1,10 @@
Cactus Code Thorn CarpetRegrid2
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
Set up refined regions by specifying a set of centres and radii about
them. The refined regions are then the conjunction of these regions.
diff --git a/Carpet/CarpetRegrid2/interface.ccl b/Carpet/CarpetRegrid2/interface.ccl
index 6eb913280..f5a32a7f6 100644
--- a/Carpet/CarpetRegrid2/interface.ccl
+++ b/Carpet/CarpetRegrid2/interface.ccl
@@ -11,6 +11,7 @@ USES INCLUDE HEADER: region.hh
USES INCLUDE HEADER: vect.hh
USES INCLUDE HEADER: carpet.hh
+USES INCLUDE HEADER: CarpetTimers.hh
diff --git a/Carpet/CarpetRegrid2/src/regrid.cc b/Carpet/CarpetRegrid2/src/regrid.cc
index b0d4c4d7c..85f1c0b83 100644
--- a/Carpet/CarpetRegrid2/src/regrid.cc
+++ b/Carpet/CarpetRegrid2/src/regrid.cc
@@ -19,6 +19,7 @@
#include <vect.hh>
#include <carpet.hh>
+#include <CarpetTimers.hh>
#include "indexing.hh"
@@ -829,6 +830,10 @@ namespace CarpetRegrid2 {
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
+ char const * const where = "CarpetRegrid2::Regrid";
+ static Carpet::Timer timer (where);
+ timer.start();
+
assert (is_singlemap_mode());
// Decide whether to change the grid hierarchy
@@ -950,7 +955,7 @@ namespace CarpetRegrid2 {
Regrid (cctkGH, superregss);
// Make multiprocessor aware
- vector <vector <region_t> > regss;
+ vector <vector <region_t> > regss (superregss.size());
for (size_t rl = 0; rl < regss.size(); ++ rl) {
SplitRegions (cctkGH, superregss.at(rl), regss.at(rl));
} // for rl
@@ -973,6 +978,8 @@ namespace CarpetRegrid2 {
} // if do_recompose
+ timer.stop();
+
return do_recompose;
}
@@ -989,6 +996,10 @@ namespace CarpetRegrid2 {
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
+ char const * const where = "CarpetRegrid2::RegridMaps";
+ static Carpet::Timer timer (where);
+ timer.start();
+
assert (is_level_mode());
// Decide whether to change the grid hierarchy
@@ -1161,6 +1172,8 @@ namespace CarpetRegrid2 {
} // if do_recompose
+ timer.stop();
+
return do_recompose;
}
diff --git a/Carpet/CarpetSlab/README b/Carpet/CarpetSlab/README
index 04ae8cd8c..983f62701 100644
--- a/Carpet/CarpetSlab/README
+++ b/Carpet/CarpetSlab/README
@@ -1,7 +1,9 @@
Cactus Code Thorn CarpetSlab
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn provides hyperslabbing for Carpet.
diff --git a/Carpet/CarpetSlab/src/GetHyperslab.cc b/Carpet/CarpetSlab/src/GetHyperslab.cc
index 9a4e07117..8f86d8568 100644
--- a/Carpet/CarpetSlab/src/GetHyperslab.cc
+++ b/Carpet/CarpetSlab/src/GetHyperslab.cc
@@ -196,7 +196,8 @@ namespace CarpetSlab {
++ext_iter) {
// Copy data
- alldata->copy_from (state, mydata, *ext_iter);
+ int const proc = myhh->processor(reflevel, component);
+ alldata->copy_from (state, mydata, *ext_iter, collect_proc, proc);
}
@@ -207,26 +208,25 @@ namespace CarpetSlab {
// Copy result to all processors
if (dest_proc == -1) {
vector<gdata*> tmpdata(CCTK_nProcs(cgh));
- vector<comm_state> state;
for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
if (proc != collect_proc) {
void* myhdata = rank==proc ? hdata : 0;
tmpdata.at(proc) = mydata->make_typed (-1, error_centered, op_sync);
tmpdata.at(proc)->allocate (alldata->extent(), proc, myhdata);
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
}
}
- for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
- if (proc != collect_proc) {
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
+ for (comm_state state; not state.done(); state.step()) {
+ for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
+ if (proc != collect_proc) {
+ tmpdata.at(proc)->copy_from (state, alldata, alldata->extent(), proc, collect_proc);
+ }
}
}
for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
if (proc != collect_proc) {
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
delete tmpdata.at(proc);
}
}
diff --git a/Carpet/CarpetSlab/src/slab.cc b/Carpet/CarpetSlab/src/slab.cc
index ba88e16a6..b20566d47 100644
--- a/Carpet/CarpetSlab/src/slab.cc
+++ b/Carpet/CarpetSlab/src/slab.cc
@@ -228,7 +228,8 @@ namespace CarpetSlab {
++ext_iter) {
// Copy data
- alldata->copy_from (state, mydata, *ext_iter);
+ int const proc = myhh->processor(reflevel, component);
+ alldata->copy_from (state, mydata, *ext_iter, collect_proc, proc);
}
@@ -239,26 +240,25 @@ namespace CarpetSlab {
// Copy result to all processors
if (dest_proc == -1) {
vector<gdata*> tmpdata(CCTK_nProcs(cgh));
- vector<comm_state> state;
for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
if (proc != collect_proc) {
void* myhdata = rank==proc ? hdata : 0;
tmpdata.at(proc) = mydata->make_typed (-1, error_centered, op_sync);
tmpdata.at(proc)->allocate (alldata->extent(), proc, myhdata);
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
}
}
- for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
- if (proc != collect_proc) {
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
+ for (comm_state state; not state.done(); state.step()) {
+ for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
+ if (proc != collect_proc) {
+ tmpdata.at(proc)->copy_from (state, alldata, alldata->extent(), proc, collect_proc);
+ }
}
}
for (int proc=0; proc<CCTK_nProcs(cgh); ++proc) {
if (proc != collect_proc) {
- tmpdata.at(proc)->copy_from (state.at(proc), alldata, alldata->extent());
delete tmpdata.at(proc);
}
}
diff --git a/Carpet/CarpetTest/README b/Carpet/CarpetTest/README
index cc28f9b36..8b25fe66d 100644
--- a/Carpet/CarpetTest/README
+++ b/Carpet/CarpetTest/README
@@ -1,8 +1,10 @@
Cactus Code Thorn CarpetTest
-Authors : Erik Schnetter <schnetter@uni-tuebingen.de>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
This thorn contains a few test grid functions, grid arrays, and
scalars to test the driver.
diff --git a/Carpet/CarpetTracker/README b/Carpet/CarpetTracker/README
index 798c9445d..e28e16360 100644
--- a/Carpet/CarpetTracker/README
+++ b/Carpet/CarpetTracker/README
@@ -1,8 +1,9 @@
Cactus Code Thorn CarpetTracker
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
Track black holes and update the location of the refinement regions.
diff --git a/Carpet/CarpetWeb/CarpetMonth/index.html b/Carpet/CarpetWeb/CarpetMonth/index.html
index b967aacfb..663364358 100644
--- a/Carpet/CarpetWeb/CarpetMonth/index.html
+++ b/Carpet/CarpetWeb/CarpetMonth/index.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Month</title>
</head>
@@ -103,7 +103,7 @@
<li>Scott Hawley <b>(away)</b></li>
<li>Christian Ott <b>(away)</b></li>
<li>Werner Benger</li>
- <li>Ralf Kähler</li>
+ <li>Ralf Kähler</li>
</ul>
diff --git a/Carpet/CarpetWeb/contributors.html b/Carpet/CarpetWeb/contributors.html
index f00fc2cc6..7f9255c39 100644
--- a/Carpet/CarpetWeb/contributors.html
+++ b/Carpet/CarpetWeb/contributors.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Contributors</title>
</head>
@@ -33,7 +33,7 @@
<tr><td> 17</td> <td><a href="http://www.cct.lsu.edu/~bzink/">Burkhard Zink</a></td></tr>
<tr><td> 10</td> <td><a href="http://www.nongnu.org/cvs/">cvs_anon</a></td></tr>
<tr><td> 5</td> <td>Luca Baiotti</td></tr>
- <tr><td> 2</td> <td><a href="http://www.aei.mpg.de/~knarf/">Frank Löffler</a></td></tr>
+ <tr><td> 2</td> <td><a href="http://www.aei.mpg.de/~knarf/">Frank Löffler</a></td></tr>
</table>
diff --git a/Carpet/CarpetWeb/design-walkthrough.html b/Carpet/CarpetWeb/design-walkthrough.html
index e453e8238..f39954d3f 100644
--- a/Carpet/CarpetWeb/design-walkthrough.html
+++ b/Carpet/CarpetWeb/design-walkthrough.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Design Walkthrough</title>
</head>
<body>
diff --git a/Carpet/CarpetWeb/feature-requests.html b/Carpet/CarpetWeb/feature-requests.html
index 606eee0bc..4156a859e 100644
--- a/Carpet/CarpetWeb/feature-requests.html
+++ b/Carpet/CarpetWeb/feature-requests.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Feature Requests</title>
</head>
diff --git a/Carpet/CarpetWeb/get-carpet.html b/Carpet/CarpetWeb/get-carpet.html
index 9d6d909ca..319d8291f 100644
--- a/Carpet/CarpetWeb/get-carpet.html
+++ b/Carpet/CarpetWeb/get-carpet.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Obtaining Carpet</title>
</head>
@@ -153,8 +153,8 @@
up with a fully functional local repository.</p>
<p>We thank
- the <a href="http://www.tat.physik.cct.lsu.edu/">Institut für
- Astronomie und Astrophysik</a> of the Universität Tübingen for
+ the <a href="http://www.tat.physik.cct.lsu.edu/">Institut für
+ Astronomie und Astrophysik</a> of the Universität Tübingen for
hosting the CVS and darcs servers.</p>
<h3>Git Repository</h3>
diff --git a/Carpet/CarpetWeb/index.html b/Carpet/CarpetWeb/index.html
index 44f987855..236defe56 100644
--- a/Carpet/CarpetWeb/index.html
+++ b/Carpet/CarpetWeb/index.html
@@ -5,17 +5,20 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>CarpetCode</title>
+ <title>Carpet &mdash; AMR for Cactus</title>
</head>
<body>
- <h1 align="center">CarpetCode</h1>
+ <h1 align="center">Carpet &mdash; Adaptive Mesh Refinement for the
+ Cactus Framework</h1>
<table>
<tr>
<td valign="top" bgcolor="#ffcc77" width="1%">
+<a href="logo/Sierpinski.pdf"><img src="logo/Sierpinski.png" width="150" alt="Carpet logo (a Sierpiński carpet)" /></a>
+
<p><b>CarpetCode</b><br />
<a href="http://www.carpetcode.org/">home page</a></p>
@@ -47,7 +50,7 @@
<a href="https://mailserv.aei.mpg.de/mailman/listinfo/visualization/">Mailing&nbsp;List</a></p>
<p><b>Results</b><br />
-<a href="publications.html">Publications</a></p>
+<a href="publications/publications.html">Publications</a></p>
<p><b>Related</b><br />
<a href="http://www.cactuscode.org/">Cactus</a><br />
@@ -56,13 +59,14 @@
<a href="http://numrel.aei.mpg.de/">numrel@aei</a><br />
<a href="http://www.whiskycode.org/">Whisky</a><br />
<a href="http://relativity.phys.lsu.edu/postdocs/matt/taka.php">Taka</a><br />
-<a href="http://sbir.nasa.gov/SBIR/abstracts/05/sttr/phase1/STTR-05-1-T4.02-9864.html?solicitationId=STTR_05_P1">parca</a></p>
+<a href="http://sbir.nasa.gov/SBIR/abstracts/05/sttr/phase1/STTR-05-1-T4.02-9864.html?solicitationId=STTR_05_P1">ParCa</a></p>
<p><b>Carpet Users</b><br />
<a href="http://numrel.aei.mpg.de/">AEI&nbsp;Potsdam</a><br />
<!-- <a href="http://www.as.arizona.edu/">University&nbsp;of&nbsp;Arizona</a><br /> -->
<!-- <a href="http://www.astro.auth.gr/Science-Subjects/Gravity.html">AUTH</a><br /> -->
<a href="http://www.tapir.caltech.edu/">Caltech</a><br />
+<!-- <a href="http://astrosun2.astro.cornell.edu/research/projects/blackholes/">Cornell</a><br /> -->
<a href="http://www.cra.gatech.edu/">Georgia&nbsp;Tech</a><br />
<a href="http://ww2.tpi.uni-jena.de/gravity/">Jena</a><br />
<a href="http://www.kisti.re.kr/english/">KISTI</a><br />
@@ -80,7 +84,8 @@
<a href="http://research.physics.uiuc.edu/CTA/IRG/">UIUC</a><br />
<a href="http://www.nuclecu.unam.mx/~gravit/Gravit/">UNAM</a><br />
<!-- <a href="http://cgwa.phys.utb.edu/">UTB</a><br /> -->
-<a href="http://wugrav.wustl.edu/">WashU</a></p>
+<a href="http://wugrav.wustl.edu/">WashU</a><br />
+<a href="http://www.yukawa.kyoto-u.ac.jp/english/contents/labs/astro.html">YITP</a></p>
<p><b>Feedback</b><br />
<a href="mailto:schnetter@carpetcode.org">Send&nbsp;email</a></p>
@@ -88,7 +93,7 @@
</td>
<td valign="top">
- <p>Carpet is an adaptive mesh refinement driver for
+ <p>Carpet is an adaptive mesh refinement and multi-patch driver for
the <a href="http://www.cactuscode.org/">Cactus Framework</a>.
Cactus is a software framework for solving time-dependent partial
differential equations on block-structured grids, and Carpet acts
@@ -114,248 +119,127 @@
<h2>News</h2>
<table><tr><td valign="top">
- <p><b>March 29, 2008:</b> We have benchmarked McLachlan, a new
- BSSN-type vacuum Einstein code, using Carpet for unigrid and AMR
- calculations. We compare several current large machines:
- Franklin (NERSC), Queen Bee (LONI), and Ranger (TACC).
- <!-- These machines have different architectures and
- interconnects.--></p>
- </td><td valign="top">
- <p><a
- href="scaling-amr/results-carpet-1lev.pdf"><img
- src="scaling-amr/results-carpet-1lev.png" width="180"
- alt="Unigrid benchmark results"/></a></p>
+ <p><b>March 30, 2009:</b> We have ported Carpet to
+ the <a href="http://www-03.ibm.com/systems/deepcomputing/bluegene/">BlueGene/P</a>
+ architecture, using
+ the <a href="http://www.alcf.anl.gov/resources/storage.php">Surveyor</a>
+ system at the <a href="http://www.alcf.anl.gov/">ALCF</a>. The
+ graph to the right shows preliminary performance and scaling
+ results, comparing different compilers and options
+ (<a href="http://gcc.gnu.org/">gcc</a>, <a href="http://www.ibm.com/software/awdtools/xlcpp/">IBM's
+ XL compilers</a> without OpenMP, and IBM's XL compilers
+ with <a href="http://www.openmp.org/">OpenMP</a>, which required
+ reducing the optimisation level). For these benchmarks, the
+ problem size was reduced to about one eighth of the standard
+ size, using 13<sup>3</sup> grid points per core. The results
+ show that Carpet scales fine up to the size of the total machine
+ (4k cores), but further work on compiler options is
+ required.</p>
</td><td valign="top">
- <p><a
- href="scaling-amr/results-carpet-9lev.pdf"><img
- src="scaling-amr/results-carpet-9lev.png" width="180"
- alt="AMR benchmark results"/></a></p>
+ <p><a href="scaling-surveyor/results-surveyor.pdf"><img
+ src="scaling-surveyor/results-surveyor.png"
+ width="180" alt="AMR benchmark results" /></a></p>
</td></tr></table>
<table><tr><td valign="top">
- <p><b>March 1, 2008:</b> Carpet has a logo! This logo is
- a <a href="http://en.wikipedia.org/wiki/Sierpinski_carpet">Sierpiński
- carpet</a>, which is a fractal pattern with
- a <a href="http://en.wikipedia.org/wiki/Hausdorff_dimension">Hausdorff
- dimension</a> of 1.89279.</p>
+ <p><b>March 20, 2009:</b> Carpet can now perform <i>performance
+ experiments</i> by artificially increasing the size or the
+ number of MPI messages exchanged between processes. This can
+ help determine whether either the communication bandwidth or the
+ communication latency are a bottleneck of a particular
+ simulation. The figure to the right shows results for the
+ standard <a href="http://www.cct.lsu.edu/~eschnett/McLachlan/">McLachlan</a>
+ AMR benchmark run on
+ the <a href="http://en.wikipedia.org/wiki/Cray_XT4">Cray XT4</a>
+ <a href="http://www.nics.tennessee.edu/computing-resources/kraken">Kraken</a>, using 25<sup>3</sup> grid points per core. These
+ results indicate that the additional latency from increasing the
+ number of messages has no significant effect, and hence the
+ benchmark is bandwidth limited for this problem size.</p>
</td><td valign="top">
- <p><a href="logo/Sierpinski.pdf"><img src="logo/Sierpinski.png"
- width="100" alt="Carpet logo (a Sierpiński
- carpet)"/></a></p>
+ <p><a href="scaling-whatif/results-whatif.pdf"><img
+ src="scaling-whatif/results-whatif.png"
+ width="180" alt="AMR benchmark results" /></a></p>
</td></tr></table>
-
- <p><b>March 1, 2008:</b> We have improved the development version
- of Carpet significantly:<br /></p>
- <ul>
- <li><p>The data structures and algorithms storing and handling
- the communication schedule are much more efficient on large
- numbers (several hundred or more) processors. This makes Carpet
- scale to more than 8,000 cores.</p></li>
-
- <li><p>The interface for defining and making dynamic changes to
- grid hierarchies is simpler, and buffer zones are handled in a
- cleaner manner. This makes it easier to write user code which
- defines or updates the grid hierarchy, and reduces the chance of
- inconsistencies therein.</p></li>
-
- <li><p>During checkpointing and recovery, the grid structure is
- saved and restored by default. This avoids accidental changes
- upon recovery.</p></li>
-
- <li><p>The efficiency of I/O has been increased, especially for
- HDF5 based binary I/O. It is possible to combine several
- variables into one file to reduce the number of output
- files.</p></li>
-
- <li><p>A new thorn LoopControl offers iterators over grid
- points, implemented as C-style macros. These iterators allow
- additional important loop-level optimisations, such
- as <a href="http://en.wikipedia.org/wiki/Loop_tiling">loop
- tiling</a> or
- <a href="http://www.openmp.org/">OpenMP</a> parallelisation.
- Efficient cache handling and hybrid communication models have a
- large potential for performance improvements on current and
- future architectures.</p></li>
- </ul>
- <p>More details can be found <a href="version-4.html">here</a>.
- These improvements are largely due
- to <a href="http://www.cct.lsu.edu/~eschnett/">Erik Schnetter</a>
- (LSU),
- <a href="http://www.aei.mpg.de/~tradke/">Thomas Radke</a> (AEI), and
- <a href="http://www.tapir.caltech.edu/~cott/">Christian D. Ott</a>
- (UA). Special thanks go to Christian Reisswig and Luca
- Baiotti.</p>
-
- <p><b>March 1, 2008:</b> The development version of Carpet is now
- maintained using <a href="http://git.or.cz/">git</a> instead
- of <a href="http://www.darcs.net/">darcs</a>. Git offers a very
- similar set of features to darcs, most importantly supporting
- decentralised development. Git has a much larger user community
- than darcs, and we hope that this makes it easier to use.
- The <a href="get-carpet.html">download instructions</a> contain
- details on using git to obtain Carpet, and point to further
- information. (The darcs repository for the development version
- will not see any further changes.)</p>
-
- <p><b>March 1, 2008:</b> The repository for the development
- version of Carpet moved today to
- a <a href="http://carpetcode.dyndns.org/">new server</a>. The
- stable versions of Carpet continue to be served from the old
- server for the time being. We plan to move all of carpetcode.org
- to this new server in the future. The new server is a courtesy
- of <a href="http://www.tapir.caltech.edu/~cott/">Christian
- D. Ott</a>.</p>
-
+
<table><tr><td valign="top">
- <p><b>January 14, 2008:</b> Carpet's communication
- infrastructure has been improved significantly, making Carpet
- scale to at least 4,000 processors, including mesh refinement.
- Using "friendly user time"
- on <a
- href="http://www.tacc.utexas.edu/services/userguides/ranger/">Ranger</a>,
- the new 60,000
- core <a href="http://www.teragrid.org/">TeraGrid</a>
- supercomputer
- at <a href="http://www.tacc.utexas.edu/">TACC</a>, we measured
- the benchmark results below for a numerical relativity kernel
- solving the BSSN equations. These benchmarks emply a hybrid
- communication scheme
- combining <a href="http://www-unix.mcs.anl.gov/mpi/">MPI</a>
- and
- <a href="http://www.openmp.org/">OpenMP</a>, using the shared
- memory capabilities of Ranger's nodes to reduce the memory
- overhead of parallelisation. We are grateful for the help we
- received from Ranger's support team.</p>
- <p>The graph below shows weak scaling tests for both unigrid and
- mesh refinement benchmarks. The problem size per core was
- kept fixed, and there were 4 OpenMP threads per MPI process,
- with 1 MPI process per socket. The benchmark was also run
- with the PUGH driver for comparison for certain core counts.
- As the graphs show, this benchmark scales near perfectly for
- unigrid, and has only small variations in run time for nine
- levels of mesh refinement.</p>
+ <p><b>March 16, 2009:</b> Erik Schnetter and Steve Brandt
+ published a white
+ paper <a href="http://www.cct.lsu.edu/CCT-TR/CCT-TR-2009-4"><i>Relativistic
+ Astrophysics on the SiCortex Architecture</i></a>. This paper
+ expands on a
+ <a href="http://www.sicortex.com/news_events/campaigns/lsu_webinar">webinar</a>
+ by Erik and Steve that was hosted
+ by <a href="http://www.sicortex.com/">SiCortex</a>.</p>
+ <p>The graph at the right shows Carpet's parallel scalability
+ using
+ the <a href="http://www.cct.lsu.edu/~eschnett/McLachlan/">McLachlan</a>
+ code with nine levels of AMR for a set of current HPC systems.
+ The results have been rescaled to the architectures' theoretical
+ single-core peak performance. This makes it possible to compare
+ Carpet's scalability on different architectures. (It is not
+ possible to compare the systems' absolute performance in this
+ figure.)</p>
</td><td valign="top">
- <p><a
- href="scaling-ranger/results-ranger.pdf"><img
- src="scaling-ranger/results-ranger.png" width="234"
- alt="Scaling graph for Ranger"/></a></p>
+ <p><a href="sicortex/results-scaled.pdf"><img
+ src="sicortex/results-scaled.png"
+ width="180" alt="AMR benchmark results" /></a></p>
+ </td></tr></table>
+
+ <table><tr><td valign="top">
+ <p><b>November 9, 2008:</b> In the context of
+ the <a href="http://www.cct.lsu.edu/xirel/">XiRel project</a>,
+ we re-designed Carpet's communication layer to avoid many
+ operations that had a cost of O(<var>N</var>), growing linearly
+ with the number of MPI processes. Such costs are generally not
+ acceptable when running on several thousand cores, and have to
+ be reduced e.g. to O(log <var>N</var>). Carpet now stores the
+ communication schedule (mostly) in a distributed manner,
+ increasing performance and reducing its memory requirement.
+ These improvements are currently being tested; preliminary
+ scaling results are shown in the figure to the right.</p>
+ </td><td valign="top">
+ <p><a href="scaling-improved/results-best.pdf"><img
+ src="scaling-improved/results-best.png"
+ width="180" alt="AMR benchmark results" /></a></p>
</td></tr></table>
-<!--
- <p><b>October 4, 2007:</b> Announcement: <i>The BBH factory</i><br />
- <b>Physicist version:</b> The BBH factory is a glorified set of shell
- scripts which help maintaining source code on different machines
- and building Cactus executables there. They also simplify the
- task of managing many simulations on many machines and try to
- prevent stupid errors.<br />
- <b>Computer scientist version:</b> The BBH factory is a set of
- abstractions over the various low-level interface that current
- supercomputers offer for maintaining source code and performing
- simulations. As middleware, they encompass policies and best
- practices that prevent common human errors. They would also be
- well suited for implementing graphical user interfaces.</p>
--->
-
- <p><b>October 3, 2007:</b> Carpet's timing infrastructure has been
- extended to automatically measure both time spent computing and
- time spent in I/O. The performance of large simulations depends
- not only on the computational efficiency and communication
- latency, but also on the throughput to file servers. These new
- statistics give a real-time overview and can point out
- performance problems. The statistics are collected in the
- existing <tt>Carpet::timing</tt> variables.</p>
-
- <p><b>August 30, 2007:</b> So far this year, ten of the
- publications from three research groups examining the dynamics
- of binary black hole systems are based on simulations performed
- with Cactus and Carpet:<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://www.journals.uchicago.edu/ApJ/journal/issues/ApJ/v661n1/71342/71342.html">Astrophys. J. <b>661</b>, 430-436 (2007)</a>
- (<a href="http://arxiv.org/abs/gr-qc/0701143">arXiv:gr-qc/0701143</a>)<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://link.aps.org/abstract/PRL/v99/e041102">Phys. Rev. Lett. <b>99</b>, 041102 (2007)</a>
- (<a href="http://arxiv.org/abs/gr-qc/0701163">arXiv:gr-qc/0701163</a>)<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://www.journals.uchicago.edu/ApJ/journal/issues/ApJL/v659n1/21515/brief/21515.abstract.html">Astrophys. J. <b>659</b>, L5-L8 (2007)</a>
- (<a href="http://arxiv.org/abs/gr-qc/0701164">arXiv:gr-qc/0701164</a>)<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://link.aps.org/abstract/PRL/v98/e231102">Phys. Rev. Lett. <b>98</b>, 231102 (2007)</a>
- (<a href="http://arxiv.org/abs/gr-qc/0702133">arXiv:gr-qc/0702133</a>)<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://www.iop.org/EJ/abstract/0264-9381/24/15/009/">Class. Quantum Grav. <b>24</b>, 3911-3918 (2007)</a>
- (<a href="http://arxiv.org/abs/gr-qc/0701038">arXiv:gr-qc/0701038</a>)<br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://arxiv.org/abs/0705.3829">arXiv:0705.3829 [gr-qc]</a><br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://arxiv.org/abs/0706.2541">arXiv:0706.2541 [gr-qc]</a><br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://arxiv.org/abs/0707.2559">arXiv:0707.2559 [gr-qc]</a><br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://arxiv.org/abs/0708.3999">arXiv:0708.3999 [gr-qc]</a><br />
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- <a href="http://arxiv.org/abs/0708.4048">arXiv:0708.4048 [gr-qc]</a><br />
- These publications mainly examine the spin dynamics and the
- gravitational wave recoil in BBH systems. Since not all
- research groups use Cactus and Carpet, this represents only part
- of the published work on this subject.</p>
+ <p><b>June 25, 2008:</b> We are happy to announce
+ the <a href="http://www.cct.lsu.edu/~eschnett/SimFactory"><i>Simulation
+ Factory</i></a>, a tool to help access remote HPC systems,
+ manage source trees, and submit and control simulations. The
+ Simulation Factory contains a set of abstractions of the tasks
+ which are necessary to set up and successfully finish numerical
+ simulations using the Cactus framework. These abstractions hide
+ tedious low-level management tasks, they capture "best
+ practices" of experienced users, and they create a log trail
+ ensuring repeatable and well-documented scientific results.
+ Using these abstractions, many types of potentially disastrous
+ user errors are avoided, and different supercomputers can be
+ used in a uniform manner.</p>
<table><tr><td valign="top">
- <p><b>August 26, 2007:</b> In experiments with hybrid
- communication schemes
- combining <a href="http://www-unix.mcs.anl.gov/mpi/">MPI</a>
- and
- <a href="http://www.openmp.org/">OpenMP</a>, we found a 20%
- speed improvement when using a single node
- of <a
- href="http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/Intel64Cluster/">Abe</a>
- at <a href="http://www.ncsa.uiuc.edu">NCSA</a>, and a
- substantial scaling improvement when using 1024 and more CPUs.
- (Abe has 8 CPUs per node.) These experiments included cache
- optimisations when traversing the 3D arrays. The tests were
- performed with a modified version of
- the <a
- href="http://www.cactuscode.org/">Cactus</a> <a
- href="http://www.cactuscode.org/WaveToyDemo/">WaveToy</a>
- example application without using I/O or analysis methods.</p>
+ <p><b>March 29, 2008:</b> We have benchmarked McLachlan, a new
+ BSSN-type vacuum Einstein code, using Carpet for unigrid and AMR
+ calculations. We compare several current large machines:
+ <a href="http://www.nersc.gov/nusers/systems/franklin/">Franklin</a>
+ (NERSC), <a href="http://www.loni.org/systems/system.php?system=QueenBee">Queen
+ Bee</a> (LONI),
+ and <a href="http://www.tacc.utexas.edu/services/userguides/ranger/">Ranger</a>
+ (TACC).
+ <!-- These machines have different architectures and
+ interconnects.--></p>
</td><td valign="top">
<p><a
- href="hybrid-scaling/results-wavetoy-abe.pdf"><img
- src="hybrid-scaling/results-wavetoy-abe.png" width="200"
- alt="Scaling graph for Abe"/></a></p>
+ href="scaling-amr/results-carpet-1lev.pdf"><img
+ src="scaling-amr/results-carpet-1lev.png" width="180"
+ alt="Unigrid benchmark results" /></a></p>
+ </td><td valign="top">
+ <p><a
+ href="scaling-amr/results-carpet-9lev.pdf"><img
+ src="scaling-amr/results-carpet-9lev.png" width="180"
+ alt="AMR benchmark results" /></a></p>
</td></tr></table>
- <p><b>August 15, 2007:</b> We are happy to hear that our
- proposal <i>ALPACA: Cactus tools for Application Level Profiling
- And Correctness Analysis</i> will be funded by
- <a
- href="http://www.nsf.gov/">NSF's</a> <a
- href="http://www.nsf.gov/publications/pub_summ.jsp?ods_key=nsf07503">SDCI</a>
- programme for three years.
- The <a
- href="http://www.cactuscode.org/Development/alpaca">ALPACA</a>
- project is aiming at developing complex, collaborative
- scientific applications, appropriate for highly scalable
- hardware architectures, providing fault tolerance, advanced
- debugging, and transparency against new developments in
- communication, programming, and execution models. Such tools
- are especially rare at the application level, where they are
- most critically needed.</p>
-
- <p><b>July 31, 2007:</b> We are happy to hear that our
- proposal <i>XiRel: Cyberinfrastructure for Numerical
- Relativity</i> will be funded by
- <a href="http://www.nsf.gov/">NSF's</a> <a href="http://www.nsf.gov/funding/pgm_summ.jsp?pims_id=6681">PIF</a>
- programme for three
- years. <a href="http://www.cct.lsu.edu/xirel/">XiRel</a> is
- collaborative proposal
- by <a href="http://www.cct.lsu.edu/">LSU</a>, <a href="http://gravity.psu.edu/numrel/">PSU</a>,
- and <a href="http://www.phys.utb.edu/numrel/">UTB</a>
- (now <a href="http://ccrg.rit.edu/">RIT</a>). The central goal of
- XiRel is the development of a highly scalable, efficient, and
- accurate adaptive mesh refinement layer based on the current
- Carpet driver, which will be fully integrated and supported in
- Cactus and optimised for numerical relativity.</p>
-
<p><a href="olds.html"><b>Old News...</b></a></p>
<hr />
@@ -436,7 +320,7 @@
<td valign="top" width="10%">
<p><a href="pictures/meudon-lapse-height.png"><img
src="pictures/thumbnail-meudon-lapse-height.png" height="80"
- width="80" alt="lapse height field"/></a></p>
+ width="80" alt="lapse height field" /></a></p>
</td>
<td valign="top" width="38%">
@@ -606,7 +490,7 @@
<p>
<!-- Created: Tue Aug 12 12:12:08 CEST 2003 -->
<!-- hhmts start -->
-Last modified: Sat Mar 01 2008
+Last modified: Mon Mar 30 2009
<!-- hhmts end -->
</p>
diff --git a/Carpet/CarpetWeb/logo/Sierpinski.pl b/Carpet/CarpetWeb/logo/Sierpinski.pl
index b2970aa1d..b2970aa1d 100755..100644
--- a/Carpet/CarpetWeb/logo/Sierpinski.pl
+++ b/Carpet/CarpetWeb/logo/Sierpinski.pl
diff --git a/Carpet/CarpetWeb/olds.html b/Carpet/CarpetWeb/olds.html
index 8bd58f747..1d29d2cc8 100644
--- a/Carpet/CarpetWeb/olds.html
+++ b/Carpet/CarpetWeb/olds.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Old News</title>
</head>
@@ -14,6 +14,217 @@
<p><a href="index.html"><b>New News...</b></a></p>
+ <table><tr><td valign="top">
+ <p><b>March 1, 2008:</b> Carpet has a logo! This logo is
+ a <a href="http://en.wikipedia.org/wiki/Sierpinski_carpet">Sierpiński
+ carpet</a>, which is a fractal pattern with
+ a <a href="http://en.wikipedia.org/wiki/Hausdorff_dimension">Hausdorff
+ dimension</a> of 1.89279.</p>
+ </td><td valign="top">
+ <p><a href="logo/Sierpinski.pdf"><img src="logo/Sierpinski.png"
+ width="100" alt="Carpet logo (a Sierpiński
+ carpet)" /></a></p>
+ </td></tr></table>
+
+ <p><b>March 1, 2008:</b> We have improved the development version
+ of Carpet significantly:<br /></p>
+ <ul>
+ <li><p>The data structures and algorithms storing and handling
+ the communication schedule are much more efficient on large
+ numbers (several hundred or more) processors. This makes Carpet
+ scale to more than 8,000 cores.</p></li>
+
+ <li><p>The interface for defining and making dynamic changes to
+ grid hierarchies is simpler, and buffer zones are handled in a
+ cleaner manner. This makes it easier to write user code which
+ defines or updates the grid hierarchy, and reduces the chance of
+ inconsistencies therein.</p></li>
+
+ <li><p>During checkpointing and recovery, the grid structure is
+ saved and restored by default. This avoids accidental changes
+ upon recovery.</p></li>
+
+ <li><p>The efficiency of I/O has been increased, especially for
+ HDF5 based binary I/O. It is possible to combine several
+ variables into one file to reduce the number of output
+ files.</p></li>
+
+ <li><p>A new thorn LoopControl offers iterators over grid
+ points, implemented as C-style macros. These iterators allow
+ additional important loop-level optimisations, such
+ as <a href="http://en.wikipedia.org/wiki/Loop_tiling">loop
+ tiling</a> or
+ <a href="http://www.openmp.org/">OpenMP</a> parallelisation.
+ Efficient cache handling and hybrid communication models have a
+ large potential for performance improvements on current and
+ future architectures.</p></li>
+ </ul>
+ <p>More details can be found <a href="version-4.html">here</a>.
+ These improvements are largely due
+ to <a href="http://www.cct.lsu.edu/~eschnett/">Erik Schnetter</a>
+ (LSU),
+ <a href="http://www.aei.mpg.de/~tradke/">Thomas Radke</a> (AEI), and
+ <a href="http://www.tapir.caltech.edu/~cott/">Christian D. Ott</a>
+ (UA). Special thanks go to Christian Reisswig and Luca
+ Baiotti.</p>
+
+ <p><b>March 1, 2008:</b> The development version of Carpet is now
+ maintained using <a href="http://git.or.cz/">git</a> instead
+ of <a href="http://www.darcs.net/">darcs</a>. Git offers a very
+ similar set of features to darcs, most importantly supporting
+ decentralised development. Git has a much larger user community
+ than darcs, and we hope that this makes it easier to use.
+ The <a href="get-carpet.html">download instructions</a> contain
+ details on using git to obtain Carpet, and point to further
+ information. (The darcs repository for the development version
+ will not see any further changes.)</p>
+
+ <p><b>March 1, 2008:</b> The repository for the development
+ version of Carpet moved today to
+ a <a href="http://carpetcode.dyndns.org/">new server</a>. The
+ stable versions of Carpet continue to be served from the old
+ server for the time being. We plan to move all of carpetcode.org
+ to this new server in the future. The new server is a courtesy
+ of <a href="http://www.tapir.caltech.edu/~cott/">Christian
+ D. Ott</a>.</p>
+
+ <table><tr><td valign="top">
+ <p><b>January 14, 2008:</b> Carpet's communication
+ infrastructure has been improved significantly, making Carpet
+ scale to at least 4,000 processors, including mesh refinement.
+ Using "friendly user time"
+ on <a
+ href="http://www.tacc.utexas.edu/services/userguides/ranger/">Ranger</a>,
+ the new 60,000
+ core <a href="http://www.teragrid.org/">TeraGrid</a>
+ supercomputer
+ at <a href="http://www.tacc.utexas.edu/">TACC</a>, we measured
+ the benchmark results below for a numerical relativity kernel
+ solving the BSSN equations. These benchmarks emply a hybrid
+ communication scheme
+ combining <a href="http://www-unix.mcs.anl.gov/mpi/">MPI</a>
+ and
+ <a href="http://www.openmp.org/">OpenMP</a>, using the shared
+ memory capabilities of Ranger's nodes to reduce the memory
+ overhead of parallelisation. We are grateful for the help we
+ received from Ranger's support team.</p>
+ <p>The graph below shows weak scaling tests for both unigrid and
+ mesh refinement benchmarks. The problem size per core was
+ kept fixed, and there were 4 OpenMP threads per MPI process,
+ with 1 MPI process per socket. The benchmark was also run
+ with the PUGH driver for comparison for certain core counts.
+ As the graphs show, this benchmark scales near perfectly for
+ unigrid, and has only small variations in run time for nine
+ levels of mesh refinement.</p>
+ </td><td valign="top">
+ <p><a
+ href="scaling-ranger/results-ranger.pdf"><img
+ src="scaling-ranger/results-ranger.png" width="234"
+ alt="Scaling graph for Ranger" /></a></p>
+ </td></tr></table>
+
+ <hr />
+
+ <p><b>October 3, 2007:</b> Carpet's timing infrastructure has been
+ extended to automatically measure both time spent computing and
+ time spent in I/O. The performance of large simulations depends
+ not only on the computational efficiency and communication
+ latency, but also on the throughput to file servers. These new
+ statistics give a real-time overview and can point out
+ performance problems. The statistics are collected in the
+ existing <tt>Carpet::timing</tt> variables.</p>
+
+ <p><b>August 30, 2007:</b> So far this year, ten of the
+ publications from three research groups examining the dynamics
+ of binary black hole systems are based on simulations performed
+ with Cactus and Carpet:<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://www.journals.uchicago.edu/ApJ/journal/issues/ApJ/v661n1/71342/71342.html">Astrophys. J. <b>661</b>, 430-436 (2007)</a>
+ (<a href="http://arxiv.org/abs/gr-qc/0701143">arXiv:gr-qc/0701143</a>)<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://link.aps.org/abstract/PRL/v99/e041102">Phys. Rev. Lett. <b>99</b>, 041102 (2007)</a>
+ (<a href="http://arxiv.org/abs/gr-qc/0701163">arXiv:gr-qc/0701163</a>)<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://www.journals.uchicago.edu/ApJ/journal/issues/ApJL/v659n1/21515/brief/21515.abstract.html">Astrophys. J. <b>659</b>, L5-L8 (2007)</a>
+ (<a href="http://arxiv.org/abs/gr-qc/0701164">arXiv:gr-qc/0701164</a>)<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://link.aps.org/abstract/PRL/v98/e231102">Phys. Rev. Lett. <b>98</b>, 231102 (2007)</a>
+ (<a href="http://arxiv.org/abs/gr-qc/0702133">arXiv:gr-qc/0702133</a>)<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://www.iop.org/EJ/abstract/0264-9381/24/15/009/">Class. Quantum Grav. <b>24</b>, 3911-3918 (2007)</a>
+ (<a href="http://arxiv.org/abs/gr-qc/0701038">arXiv:gr-qc/0701038</a>)<br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://arxiv.org/abs/0705.3829">arXiv:0705.3829 [gr-qc]</a><br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://arxiv.org/abs/0706.2541">arXiv:0706.2541 [gr-qc]</a><br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://arxiv.org/abs/0707.2559">arXiv:0707.2559 [gr-qc]</a><br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://arxiv.org/abs/0708.3999">arXiv:0708.3999 [gr-qc]</a><br />
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="http://arxiv.org/abs/0708.4048">arXiv:0708.4048 [gr-qc]</a><br />
+ These publications mainly examine the spin dynamics and the
+ gravitational wave recoil in BBH systems. Since not all
+ research groups use Cactus and Carpet, this represents only part
+ of the published work on this subject.</p>
+
+ <table><tr><td valign="top">
+ <p><b>August 26, 2007:</b> In experiments with hybrid
+ communication schemes
+ combining <a href="http://www-unix.mcs.anl.gov/mpi/">MPI</a>
+ and
+ <a href="http://www.openmp.org/">OpenMP</a>, we found a 20%
+ speed improvement when using a single node
+ of <a
+ href="http://www.ncsa.uiuc.edu/UserInfo/Resources/Hardware/Intel64Cluster/">Abe</a>
+ at <a href="http://www.ncsa.uiuc.edu">NCSA</a>, and a
+ substantial scaling improvement when using 1024 and more CPUs.
+ (Abe has 8 CPUs per node.) These experiments included cache
+ optimisations when traversing the 3D arrays. The tests were
+ performed with a modified version of
+ the <a
+ href="http://www.cactuscode.org/">Cactus</a> <a
+ href="http://www.cactuscode.org/WaveToyDemo/">WaveToy</a>
+ example application without using I/O or analysis methods.</p>
+ </td><td valign="top">
+ <p><a
+ href="hybrid-scaling/results-wavetoy-abe.pdf"><img
+ src="hybrid-scaling/results-wavetoy-abe.png" width="200"
+ alt="Scaling graph for Abe" /></a></p>
+ </td></tr></table>
+
+ <p><b>August 15, 2007:</b> We are happy to hear that our
+ proposal <i>ALPACA: Cactus tools for Application Level Profiling
+ And Correctness Analysis</i> will be funded by
+ <a
+ href="http://www.nsf.gov/">NSF's</a> <a
+ href="http://www.nsf.gov/publications/pub_summ.jsp?ods_key=nsf07503">SDCI</a>
+ programme for three years.
+ The <a
+ href="http://www.cactuscode.org/Development/alpaca">ALPACA</a>
+ project is aiming at developing complex, collaborative
+ scientific applications, appropriate for highly scalable
+ hardware architectures, providing fault tolerance, advanced
+ debugging, and transparency against new developments in
+ communication, programming, and execution models. Such tools
+ are especially rare at the application level, where they are
+ most critically needed.</p>
+
+ <p><b>July 31, 2007:</b> We are happy to hear that our
+ proposal <i>XiRel: Cyberinfrastructure for Numerical
+ Relativity</i> will be funded by
+ <a href="http://www.nsf.gov/">NSF's</a> <a href="http://www.nsf.gov/funding/pgm_summ.jsp?pims_id=6681">PIF</a>
+ programme for three
+ years. <a href="http://www.cct.lsu.edu/xirel/">XiRel</a> is
+ collaborative proposal
+ by <a href="http://www.cct.lsu.edu/">LSU</a>, <a href="http://gravity.psu.edu/numrel/">PSU</a>,
+ and <a href="http://www.phys.utb.edu/numrel/">UTB</a>
+ (now <a href="http://ccrg.rit.edu/">RIT</a>). The central goal of
+ XiRel is the development of a highly scalable, efficient, and
+ accurate adaptive mesh refinement layer based on the current
+ Carpet driver, which will be fully integrated and supported in
+ Cactus and optimised for numerical relativity.</p>
+
<p><b>February 26, 2007:</b> The thorn <tt>LSUPETSc</tt>
implements a generic elliptic solver for Carpet's multi-patch
infrastructure, based
diff --git a/Carpet/CarpetWeb/publications.html b/Carpet/CarpetWeb/publications.html
deleted file mode 100644
index 4cc367634..000000000
--- a/Carpet/CarpetWeb/publications.html
+++ /dev/null
@@ -1,1040 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Publications using Carpet</title>
- </head>
-
- <body>
-
- <h1 align="center">Publications using Carpet</h1>
-
- <h2>How to cite Carpet</h2>
-
- <p>Thank you for using Carpet.
- When you write a publication using data produced with the help
- Cactus or Carpet, consider citing the following if
- appropriate:</p>
-
-<ol>
-
-<li>
-<p>Tom Goodale, Gabrielle Allen, Gerd Lanfermann, Joan Massó, Thomas
- Radke, Edward Seidel, John Shalf,<br />
-<i>The Cactus Framework and Toolkit: Design and Applications,</i><br />
-in: Vector and Parallel Processing - VECPAR'2002, 5th International
-Conference, Lecture Notes in Computer Science,
-Springer, Berlin 2003
-<a href="http://www.springerlink.com/content/2fapcbeyyc1xg0mm/">(Springer)</a>
-<a
- href="http://www.cactuscode.org/Articles/Cactus_Goodale03a.pre.pdf">(PDF,
- 269&nbsp;kB)</a>.</p>
-</li>
-
-<li>
-<p>Cactus web site,<br />
- URL <a
- href="http://www.cactuscode.org/">http://www.cactuscode.org/</a>.</p>
-</li>
-
-<li>
-<p>Erik Schnetter, Scott H. Hawley, Ian Hawke,<br />
-<i>Evolutions in 3D numerical relativity using fixed mesh
- refinement,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/21/6/014">Class. Quantum
- Grav. <b>21</b>, 1465-1488 (2004)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0310042">arXiv:gr-qc/0310042</a>.</p>
-</li>
-
-<li>
-<p>Carpet web site,<br />
- URL <a
- href="http://www.carpetcode.org/">http://www.carpetcode.org/</a>.</p>
-</li>
-
-</ol>
-
- <p><a href="http://www.citebase.org/">Citebase</a> collects
- statistics about citations
- of <a href="http:www.arXiv.org/">arXiv.org</a> eprints. Its entry
- for the
- original <a
- href="http://www.citebase.org/abstract?id=oai%3AarXiv.org%3Agr-qc%2F0310042">Carpet
- paper</a> lists other eprints which refer to it or are co-cited with
- it.</p>
-
-
-
- <hr />
-
-
-
- <h2>Publications in refereed journals</h2>
-
-<!-- Refereed publications are sorted by their "received" date -->
-
-<ol>
-
-<li>
-<!-- Schnetter-etal-03b -->
-<!-- received 2003-10-07 -->
-<p>Erik Schnetter, Scott H. Hawley, Ian Hawke,<br />
-<i>Evolutions in 3D numerical relativity using fixed mesh
- refinement,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/21/6/014">Class. Quantum
- Grav. <b>21</b>, 1465-1488 (2004)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0310042">arXiv:gr-qc/0310042</a>.</p>
-</li>
-
-<li>
-<!-- Baiotti04b -->
-<!-- received 2004-10-12 -->
-<p>Luca Baiotti, Ian Hawke, Luciano Rezzolla, Erik Schnetter,<br />
-<i>Gravitational-Wave Emission from Rotating Gravitational Collapse in
- three Dimensions,</i><br />
-<a href="http://link.aps.org/abstract/PRL/v94/e131101">Phys. Rev. Lett. <b>94</b>, 131101 (2005)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0503016">arXiv:gr-qc/0503016</a>.</p>
-</li>
-
-<li>
-<!-- Zink2005a -->
-<!-- received 2005-02-11 -->
-<p>Burkhard Zink, Nikolaos Stergioulas, Ian Hawke, Christian D. Ott, Erik
-Schnetter, Ewald Müller,<br />
-<i>Formation of Supermassive Black Holes through Fragmentation of
- Torodial Supermassive Stars,</i><br />
-<a href="http://link.aps.org/abstract/PRL/v96/e161101">Phys. Rev. Lett. <b>96</b>, 161101 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0501080">arXiv:gr-qc/0501080</a>.</p>
-</li>
-
-<li>
-<!-- Sperhake2005a -->
-<!-- received 2005-03-16 -->
-<p>Ulrich Sperhake, Bernard Kelly, Pablo Laguna, Kenneth L. Smith, Erik
-Schnetter,<br />
-<i>Black hole head-on collisions and gravitational waves with fixed
- mesh-refinement and dynamic singularity excision,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v71/e124042">Phys. Rev. D <b>71</b>, 124042 (2005)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0503071">arXiv:gr-qc/0503071</a>.</p>
-</li>
-
-<li>
-<!-- Diener-etal-2006a -->
-<!-- received 2005-12-21 -->
-<p>Peter Diener, Frank Herrmann, Denis Pollney, Erik Schnetter, Edward
-Seidel, Ryoji Takahashi, Jonathan Thornburg, Jason Ventrella,<br />
-<i>Accurate Evolution of Orbiting Binary Black Holes</i>,<br />
-<a href="http://link.aps.org/abstract/PRL/v96/e121101">Phys. Rev. Lett. <b>96</b>, 121101 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0512108">arXiv:gr-qc/0512108</a>.</p>
-</li>
-
-<li>
-<!-- Diener05b -->
-<!-- received 2005-12-22 -->
-<p>Peter Diener, Ernst Nils Dorband, Erik Schnetter, Manuel Tiglio,<br />
-<i>Optimized high-order derivative and dissipation operators
- satisfying summation by parts, and applications in three-dimensional
- multi-block evolutions,</i><br />
-<a
- href="http://www.springerlink.com/content/l724hr0846n2/">J. Sci. Comput. <b>32</b>,
- 109-145 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0512001">arXiv:gr-qc/0512001</a>.</p>
-</li>
-
-<li>
-<!-- Schnetter06a -->
-<!-- received 2006-02-20 -->
-<p>Erik Schnetter, Peter Diener, Ernst Nils Dorband, Manuel Tiglio,<br />
-<i>A multi-block infrastructure for three-dimensional time-dependent
- numerical relativity</i>,<br />
-<a href="http://dx.doi.org/10.1088/0264-9381/23/16/S14">Class. Quantum
- Grav. <b>23</b>, S553-S578 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0602104">arXiv:gr-qc/0602104</a>.</p>
-</li>
-
-<li>
-<!-- Sopuerta:2006bw -->
-<!-- received 2006-03-20 -->
-<p>Carlos F. Sopuerta, Ulrich Sperhake, Pablo Laguna,<br />
-<i>Hydro-without-Hydro Framework for Simulations of Black Hole-Neutron
- Star Binaries</i>,<br />
-<a href="http://dx.doi.org/10.1088/0264-9381/23/16/S15">Class. Quantum
- Grav. <b>23</b>, S579-S598 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0605018">arXiv:gr-qc/0605018</a>.</p>
-</li>
-
-<li>
-<!-- Schnetter-Krishnan-Beyer-2006 -->
-<!-- received 2006-04-11 -->
-<p>Erik Schnetter, Badri Krishnan, Florian Beyer,<br />
-<i>Introduction to dynamical horizons in numerical relativity</i>,<br />
-<a href="http://link.aps.org/abstract/PRD/v74/e024028">Phys. Rev. D <b>74</b>, 024028 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0604015">arXiv:gr-qc/0604015</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-06-13 -->
-<p>Frank Löffler, Luciano Rezzolla, Marcus Ansorg,<br />
-<i>Numerical evolutions of a black hole-neutron star system in full
- General Relativity: Head-on collision</i>,<br />
-<a href="http://link.aps.org/abstract/PRD/v74/e104018">Phys. Rev. D <b>74</b>, 104018 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0606104">arXiv:gr-qc/0606104</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-06-18 -->
-<!-- Sperhake:2006cy -->
-<p>Ulrich Sperhake,<br />
-<i>Binary black-hole evolutions of excision and puncture data,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v76/e104015">Phys. Rev. D <b>76</b>,
- 104015 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0606079">arXiv:gr-qc/0606079</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-08-22 -->
-<p>Ernst Nils Dorband, Emanuele Berti, Peter Diener, Erik Schnetter,
- Manuel Tiglio,<br />
-<i>A numerical study of the quasinormal mode excitation of Kerr black
- holes</i>,<br />
-<a href="http://link.aps.org/abstract/PRD/v74/e084028">Phys. Rev. D <b>74</b>, 084028 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0608091">arXiv:gr-qc/0608091</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-08-26 -->
-<p>Luca Baiotti, Luciano Rezzolla,<br />
-<i>Challenging the paradigm of singularity excision in gravitational
- collapse,</i><br />
-<a href="http://link.aps.org/abstract/PRL/v97/e141101">Phys. Rev. Lett. <b>97</b>, 141101 (2006)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0608113">arXiv:gr-qc/0608113</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-09-29 -->
-<p>Christian D. Ott, Harald Dimmelmeier, Andreas Marek, Hans-Thomas
-Janka, Ian Hawke, Burkhard Zink, Erik Schnetter,<br />
-<i>3D Collapse of Rotating Stellar Iron Cores in General Relativity
- Including Deleptonization and a Nuclear Equation of State,</i><br />
-<a
- href="http://link.aps.org/abstract/PRL/v98/e261101">Phys. Rev. Lett. <b>98</b>, 261101 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/astro-ph/0609819">arXiv:astro-ph/0609819</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-10-05 -->
-<p>Christian Reisswig, Nigel T. Bishop, Chi Wai Lai, Jonathan
- Thornburg, Béla Szilágyi,<br />
-<i>Characteristic evolutions in numerical relativity using six angular
- patches,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S21">Class. Quantum
- Grav. <b>24</b>, S327-S339 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0610019">arXiv:gr-qc/0610019</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-11-03 -->
-<p>Bernd Brügmann, José A. González, Mark Hannam, Sascha Husa, Ulrich
- Sperhake, Wolfgang Tichy,<br />
-<i>Calibration of Moving Puncture Simulations,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v77/e024027">Phys. Rev. D <b>77</b>,
- 024027 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0610128">arXiv:gr-qc/0610128</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-11-19 -->
-<p>Burkhard Zink, Nikolaos Stergioulas, Ian Hawke, Christian D. Ott,
-Erik Schnetter, Ewald Müller,<br />
-<i>Non-axisymmetric instability and fragmentation of general
- relativistic quasitoroidal stars,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v76/e024019">Phys. Rev. D <b>76</b>, 024019 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/astro-ph/0611601">arXiv:astro-ph/0611601</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-12-20 -->
-<p>Christian D. Ott, Harald Dimmelmeier, Andreas Marek, Hans-Thomas
-Janka, Burkhard Zink, Ian Hawke, Erik Schnetter,<br />
-<i>Rotating collapse of stellar iron cores in general relativity,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S10">Class. Quantum
- Grav. <b>24</b> S139-S154 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/astro-ph/0612638">arXiv:astro-ph/0612638</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-12-21 -->
-<p>Luca Baiotti, Ian Hawke, Luciano Rezzolla,<br />
-<i>On the gravitational radiation from the collapse of neutron stars
- to rotating black holes,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S13">Class. Quantum
- Grav. <b>24</b> S187-S206 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701043">arXiv:gr-qc/0701043</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-12-22 -->
-<p>Enrique Pazos, Ernst Nils Dorband, Alessandro Nagar, Carlos
-Palenzuela, Erik Schnetter, Manuel Tiglio,<br />
-<i>How far away is far enough for extracting numerical waveforms, and
- how much do they depend on the extraction method?</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S22">Class. Quantum
- Grav. <b>24</b>, S341-S368 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0612149">arXiv:gr-qc/0612149</a>.</p>
-</li>
-
-<li>
-<!-- received 2006-12-22 -->
-<p>Béla Szilágyi, Denis Pollney, Luciano Rezzolla, Jonathan Thornburg,
- Jeffrey Winicour,<br />
-<i>An explicit harmonic code for black-hole evolution using
- excision,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S18">Class. Quantum
- Grav. <b>24</b>, S275-S293 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0612150">arXiv:gr-qc/0612150</a>.</p>
-</li>
-
-<li>
- <!-- received 2006-12-26 -->
- <p>Comparisons of binary black hole merger waveforms,<br />
- <i>John G. Baker, Manuela Campanelli, Frans Pretorius, Yosef
- Zlochower,</i><br />
- <a href="http://dx.doi.org/10.1088/0264-9381/24/12/S03">Class. Quantum
- Grav. <b>24</b>, S25-S31 (2007)</a>,<br />
- <a href="http://arxiv.org/abs/gr-qc/0701016">arXiv:gr-qc/0701016</a>.</p>
-</li>
-
-<li>
-<!-- Herrmann:2006ks -->
-<!-- received 2007-01-04 -->
-<p>Frank Herrmann, Ian Hinder, Deirdre M. Shoemaker, Pablo Laguna,<br />
-<i>Unequal mass binary black hole plunges and gravitational
- recoil,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S04">Class. Quantum
- Grav. <b>24</b>, S33-S42 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0601026">arXiv:gr-qc/0601026</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-01-20 -->
-<p>Bruno Giacomazzo, Luciano Rezzolla,<br />
-<i>WhiskyMHD: a new numerical code for general relativistic
- magnetohydrodynamics,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S16">Class. Quantum
- Grav. <b>24</b>, S235-S258 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701109">arXiv:gr-qc/0701109</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-01-22 -->
-<p>Pedro Marronetti, Wolfgang Tichy, Bernd Brügmann, José González,
- Mark Hannam, Sascha Husa, Ulrich Sperhake,<br />
-<i>Binary black holes on a budget: simulations using workstations,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S05">Class. Quantum
- Grav. <b>24</b>, S45-S58 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701123">arXiv:gr-qc/0701123</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-01-29 -->
-<p>Frank Herrmann, Ian Hinder, Deirdre M. Shoemaker, Pablo Laguna,
- Richard A. Matzner,<br />
-<i>Gravitational Recoil from Spinning Binary Black Hole Mergers,</i><br />
-<a
- href="http://www.journals.uchicago.edu/doi/abs/10.1086/513603">Astrophys. J. <b>661</b>,
- 430-436 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701143">arXiv:gr-qc/0701143</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-01-29 -->
-<p>Michael Koppitz, Denis Pollney, Christian Reisswig, Luciano
- Rezzolla, Jonathan Thornburg, Peter Diener, Erik Schnetter,<br />
-<i>Recoil Velocities from Equal-Mass Binary-Black-Hole Mergers,</i><br />
-<a
- href="http://link.aps.org/abstract/PRL/v99/e041102">Phys. Rev. Lett. <b>99</b>,
- 041102 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701163">arXiv:gr-qc/0701163</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-02-08 -->
-<p>Manuela Campanelli, Carlos O. Lousto, Yosef Zlochower, David
- Merritt,<br />
-<i>Large Merger Recoils and Spin Flips From Generic Black-Hole Binaries,</i><br />
-<a href="http://www.journals.uchicago.edu/doi/abs/10.1086/516712">Astrophys. J. Lett.<b>659</b>,
- L5-L8 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701164">arXiv:gr-qc/0701164</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-02-26 -->
-<p>José A. González, Mark D. Hannam, Ulrich Sperhake, Bernd Brügmann,
- Sascha Husa,<br />
-<i>Supermassive recoil velocities for binary black-hole mergers with
- antialigned spins,</i><br />
-<a
- href="http://link.aps.org/abstract/PRL/v98/e231101">Phys. Rev. Lett. <b>98</b>,
- 231101 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0702052">arXiv:gr-qc/0702052</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-02-26 -->
-<p>Manuela Campanelli, Carlos O. Lousto, Yosef Zlochower, David
- Merritt,<br />
-<i>Maximum gravitational recoil,</i><br />
-<a
- href="http://link.aps.org/abstract/PRL/v98/e231102">Phys. Rev. Lett. <b>98</b>,
- 231102 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0702133">arXiv:gr-qc/0702133</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-03-22 -->
-<p>Jonathan Thornburg, Peter Diener, Denis Pollney, Luciano Rezzolla,
- Erik Schnetter, Ed Seidel, Ryoji Takahashi,<br />
-<i>Are moving punctures equivalent to moving black holes?,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/15/009">Class. Quantum
- Grav. <b>24</b>, 3911-3918 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/gr-qc/0701038">arXiv:gr-qc/0701038</a>.</p>
-</li>
-
-<!-- received 2007-04-30 -->
-<li>
-<p>Parameswaran Ajith, Stanislav Babak, Yanbei Chen, Martin Hewitson,
- Badri Krishnan, John T. Whelan, Bernd Brügmann, Peter Diener, José
- González, Mark Hannam, Sascha Husa, Michael Koppitz, Denis Pollney,
- Luciano Rezzolla, Lucía Santamaría, Alicia M. Sintes, Ulrich
- Sperhake, Jonathan Thornburg,<br />
-<i>Phenomenological template family for black-hole coalescence
- waveforms,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/24/19/S31">Class. Quantum
- Grav. <b>24</b> S689-S699 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0704.3764">arXiv:0704.3764
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-06-13 -->
-<p>Birjoo Vaishnav, Ian Hinder, Frank Herrmann, Deirdre M. Shoemaker,<br />
-<i>Matched Filtering of Numerical Relativity Templates of Spinning
- Binary Black Holes,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v76/e084020">Phys. Rev. D <b>76</b>,
- 084020 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0705.3829">arXiv:0705.3829
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-06-18 -->
-<p>Frank Herrmann, Ian Hinder, Deirdre M. Shoemaker, Pablo Laguna,
- Richard A. Matzner,<br />
-<i>Binary Black Holes: Spin Dynamics and Gravitational Recoil,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v76/e084032">Phys. Rev. D <b>76</b>, 084032 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0706.2541">arXiv:0706.2541
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-07-06 -->
-<p>Badri Krishnan, Carlos O. Lousto, Yosef Zlochower,<br />
-<i>Quasi-Local Linear Momentum in Black-Hole Binaries,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v76/e081501">Phys. Rev. D <b>76</b>,
- 081501(R) (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0707.0876">arXiv:0707.0876
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-07-20 -->
-<p>David Brown, Olivier Sarbach, Erik Schnetter, Manuel Tiglio, Peter
- Diener, Ian Hawke, Denis Pollney,<br />
-<i>Excision without excision,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v76/e081503">Phys. Rev. D <b>76</b>,
- 081503(R) (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0707.3101">arXiv:0707.3101
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- Rezzolla2007a -->
-<!-- received 2007-08-29 -->
-<p>Luciano Rezzolla, Ernst Nils Dorband, Christian Reisswig, Peter
- Diener, Denis Pollney, Erik Schnetter, Béla Szilágyi,<br />
-<i>Spin Diagrams for Equal-Mass Black-Hole Binaries with Aligned
- Spins,</i><br />
-<a href="http://www.journals.uchicago.edu/doi/abs/10.1086/587679">Astrophys. J. <b>679</b>,
- 1422-1426 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0708.3999">arXiv:0708.3999
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-08-30 -->
-<p>Carlos O. Lousto, Yosef Zlochower,<br />
-<i>Further insight into gravitational recoil,</i><br />
-<a
- href="http://link.aps.org/abstract/PRD/v77/e044028">Phys. Rev. D <b>77</b>,
- 044028 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0708.4048">arXiv:0708.4048
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-09-06 -->
-<p>Denis Pollney, Christian Reisswig, Luciano Rezzolla, Bela Szilagyi,
- Marcus Ansorg, Barrett Deris, Peter Diener, Ernst Nils Dorband,
- Michael Koppitz, Alessandro Nagar, Erik Schnetter,<br />
-<i>Recoil velocities from equal-mass binary black-hole mergers: a
- systematic investigation of spin-orbit aligned configurations,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v76/e124002">Phys. Rev. D <b>76</b>,
- 124002 (2007)</a>,<br />
-<a href="http://arxiv.org/abs/0707.2559">arXiv:0707.2559
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-10-15 -->
-<p>Parameswaran Ajith, Stanislav Babak, Yanbei Chen, Martin Hewitson,
- Badri Krishnan, Alicia M. Sintes, John T. Whelan, Bernd Brügmann,
- Peter Diener, Ernst Nils Dorband, José González, Mark Hannam, Sascha Husa,
- Denis Pollney, Luciano Rezzolla, Lucía Santamaría, Ulrich Sperhake,
- Jonathan Thornburg,<br />
-<i>A template bank for gravitational waveforms from coalescing binary
- black holes: I. non-spinning binaries,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v77/e104017">Phys. Rev. D <b>77</b>,
- 104017 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0710.2335">arXiv:0710.2335
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-10-18 -->
-<p>Luciano Rezzolla, Peter Diener, Ernst Nils Dorband, Denis Pollney,
- Christian Reisswig, Erik Schnetter, Jennifer Seiler,<br />
-<i>The final spin from the coalescence of aligned-spin black-hole
- binaries,</i><br />
-<a href="http://www.journals.uchicago.edu/doi/abs/10.1086/528935">Astrophys. J. Lett.<b>674</b>,
- L29-L32 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0710.3345">arXiv:0710.3345
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-10-22 -->
-<!-- uses Carpet only indirectly -->
-<p>Latham Boyle, Michael Kesden, Samaya Nissanke,<br />
-<i>Binary black hole merger: symmetry and the spin expansion,</i><br />
-<a href="http://link.aps.org/abstract/PRL/v100/e151101">Phys. Rev. Lett. <b>100</b>, 151101 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0709.0299">arXiv:0709.0299
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-11-07 -->
-<p>Emanuele Berti, Vitor Cardoso, José A. González, Ulrich Sperhake,
- Bernd Brügmann,<br />
-<i>Multipolar analysis of spinning binaries,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/25/11/114035">Class. Quantum
- Grav. <b>25</b>, 114035 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0711.1097">arXiv:0711.1097
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-12-04 -->
-<p>Burkhard Zink, Erik Schnetter, Manuel Tiglio,<br />
-<i>Multi-patch methods in general relativistic astrophysics -
- I. Hydrodynamical flows on fixed backgrounds,</i><br />
-<a href="http://link.aps.org/abstract/PRD/v77/e103015">Phys. Rev. D <b>77</b>,
- 103015 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0712.0353">arXiv:0712.0353
- [astro-ph]</a>.</p>
-</li>
-
-<li>
-<!-- received 2007-12-14 -->
-<p>Deirdre M. Shoemaker, Birjoo Vaishnav, Ian Hinder, Frank
- Herrmann,<br />
-<i>Numerical relativity meets data analysis: spinning binary black
- hole case,</i><br />
-<a href="http://dx.doi.org/10.1088/0264-9381/25/11/114047">Class. Quantum
- Grav. <b>25</b>, 114047 (2008)</a>,<br />
-<a href="http://arxiv.org/abs/0802.4427">arXiv:0802.4427
- [gr-qc]</a>.</p>
-</li>
-
-</ol>
-
-
-
-<h2>Conference Proceedings, Preprints, and Technical Reports</h2>
-
-<!-- Preprints are sorted by their date -->
-
-<ol>
-
-<li>
-<p>Burkhard Zink, Nikolaos Stergioulas, Ian Hawke, Christian D. Ott,
- Erik Schnetter, Ewald Müller,<br />
-<i>Rotational instabilities in supermassive stars: a new way to form
- supermassive black holes,</i>,<br /> in N. K. Spyrou,
- N. Stergioulas, and C. Tsagas, editors, <i>International Scientific
- Workshop on Cosmology and Gravitational Physics, Thessaloniki,
- December 15-16, 2005,</i> pages 155–160, Thessaloniki, 2006.
- ZITI.</p>
-</li>
-
-<li>
-<p>Burkhard Zink, Nikolaos Stergioulas, Ian Hawke, Christian D. Ott,
- Erik Schnetter, Ewald Müller,<br />
-<i>Fragmentation of general relativistic quasi-toroidal
- polytropes,</i><br />
-<a href="http://arxiv.org/abs/0704.0431">arXiv:0704.0431 [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Dylan Stark, Gabrielle Allen, Tom Goodale, Thomas Radke, Erik
- Schnetter,<br />
-<i>An Extensible Timing Infrastructure for Adaptive Large-scale
- Applications,</i><br />
-<a href="http://www.springer.com/computer/lncs?SGWID=0-164-6-73659-0">in
- Roman Wyrzykowski, editor, <i>Parallel Processing and Applied
- Mathematics (PPAM), 2007, Gdansk, Poland (in print),</i> volume 4967
- of Lecture Notes in Computer Science. Springer, 2007</a>,<br />
-<a href="http://arxiv.org/abs/0705.3015">arXiv:0705.3015
- [cs.PF]</a>.</p>
-</li>
-
-<li>
-<p>Ulrich Sperhake, Bernd Brügmann, José González, Mark Hannam, Sascha
- Husa,<br />
-<i>Head-On collisions of different initial data,</i><br />
-<a href="http://arxiv.org/abs/0705.2035">arXiv:0705.2035
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Luca Baiotti, Ian Hawke, Luciano Rezzolla, Erik Schnetter,
-<i>Details on the gravitational-wave emission from rotating
- gravitational collapse in 3D,</i><br />
-<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012045">J. Phys.:
- Conf. Ser. <b>66</b>, 012045 (2007)</a>.</p>
-</li>
-
-<li>
-<p>Ulrich Sperhake,<br />
-<i>Black-hole binary evolutions with the LEAN code,</i><br />
-<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012049">J. Phys.:
- Conf. Ser. <b>66</b> 012049 (2007)</a>.</p>
-</li>
-
-<li>
-<!-- uses Carpet only indirectly -->
-<p>José A. Font,<br />
-<i>Current status of relativistic core collapse simulations,</i><br />
-<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012063">J. Phys.:
- Conf. Ser. <b>66</b>, 012063 (2007)</a>.</p>
-</li>
-
-<li>
-<p>Burkhard Zink, Nikolaos Stergioulas, Ian Hawke, Christian D. Ott,
- Erik Schnetter, Ewald Müller,<br />
-<i>Supermassive Black Hole Formation through Rotational
- Instabilities,</i><br />
-<a href="http://dx.doi.org/10.1088/1742-6596/68/1/012050">J. Phys.:
- Conf. Ser. <b>68</b>, 012050 (2007)</a>.</p>
-</li>
-
-<li>
-<p>Bernd Brügmann, José A. González, Mark Hannam, Sascha Husa, Ulrich
- Sperhake,<br />
-<i>Exploring black hole superkicks,</i><br />
-<a href="http://arxiv.org/abs/0707.0135">arXiv:0707.0135
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Erik Schnetter, Christian D. Ott, Gabrielle Allen, Peter Diener, Tom
-Goodale, Thomas Radke, Edward Seidel, John Shalf,<br />
-<i>Cactus Framework: Black Holes to Gamma Ray Bursts,</i><br />
-<a href="http://arxiv.org/abs/0707.1607">arXiv:0707.1607 [cs.DC]</a>.</p>
-</li>
-
-<li>
-<!-- uses Carpet only indirectly -->
-<p>John G. Baker, William D. Boggs, Joan M. Centrella, Bernard
- J. Kelly, Sean T. McWilliams, James R. van Meter,<br />
-<i>Gravitational waves from black-hole mergers,</i><br />
-<a href="http://arxiv.org/abs/0708.4202">arXiv:0708.4202
- [astro-ph]</a>.</p>
-</li>
-
-<li>
-<!-- uses Carpet only indirectly -->
-<p>Alessandra Buonanno, Lawrence E. Kidder, Luis Lehner,<br />
-<i>Estimating the final spin of a binary black hole
- coalescence,</i><br />
-<a href="http://arxiv.org/abs/0709.3839">arXiv:0709.3839
- [astro-ph]</a>.</p>
-</li>
-
-<li>
-<p>Manuela Campanelli, Carlos O. Lousto, Yosef Zlochower,<br />
-<i>Close encounters of three black holes,</i><br />
-<a href="http://arxiv.org/abs/0710.0879">arXiv:0710.0879
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Ulrich Sperhake, Emanuele Berti, Vitor Cardoso, José A. González,
- Bernd Brügmann, Marcus Ansorg,<br />
-<i>Eccentric binary black-hole mergers: The transition from inspiral
- to plunge in general relativity,</i><br />
-<a href="http://arxiv.org/abs/0710.3823">arXiv:0710.3823
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Ian Hinder, Birjoo Vaishnav, Frank Herrmann, Deirdre M. Shoemaker,
- Pablo Laguna,<br />
-<i>Universality and Final Spin in Eccentric Binary Black Hole
- Inspirals,</i><br />
-<a href="http://arxiv.org/abs/0710.5167">arXiv:0710.5167
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Tanja Bode, Deirdre M. Shoemaker, Frank Herrmann, Ian Hinder,<br />
-<i>Delicacy of Binary Black Hole Mergers in the Presence of Spurious
- Radiation,</i><br />
-<a href="http://arxiv.org/abs/0711.0669">arXiv:0711.0669
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Thibault Damour, Alessandro Nagar, Ernst Nils Dorband, Denis
- Pollney, Luciano Rezzolla,<br />
-<i>Faithful Effective-One-Body waveforms of equal-mass coalescing
- black-hole binaries,</i><br />
-<a href="http://arxiv.org/abs/0712.3003">arXiv:0712.3003
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Luciano Rezzolla, Enrico Barausse, Ernst Nils Dorband, Denis
- Pollney, Christian Reisswig, Jennifer Seiler, Sascha Husa,<br />
-<i>On the final spin from the coalescence of two black holes,</i><br />
-<a href="http://arxiv.org/abs/0712.3541">arXiv:0712.3541
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Oleg Korobkin, Burak Aksoylu, Michael Holst, Enrique Pazos, Manuel
- Tiglio ,<br />
-<i>Solving the Einstein constraint equations on multi-block
-triangulations using finite element methods,</i><br />
-<a href="http://arxiv.org/abs/0801.1823">arXiv:0801.1823
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Eloisa Bentivegna, Deirdre M. Shoemaker, Ian Hinder, Frank
- Herrmann,<br />
-<i>Probing the Binary Black Hole Merger Regime with Scalar
- Perturbations,</i><br />
-<a href="http://arxiv.org/abs/0801.3478">arXiv:0801.3478
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Matthew C. Washik, James Healy, Frank Herrmann, Ian Hinder, Deirdre
- M. Shoemaker, Pablo Laguna, Richard A. Matzner,<br />
-<i>Binary Black Hole Encounters, Gravitational Bursts and Maximum
- Final Spin,</i><br />
-<a href="http://arxiv.org/abs/0802.2520">arXiv:0802.2520
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Jennifer Seiler, Béla Szilágyi, Denis Pollney, Luciano
- Rezzolla,<br />
-<i>Constraint-preserving boundary treatment for a harmonic formulation
- of the Einstein equations,</i><br />
-<a href="http://arxiv.org/abs/0802.3341">arXiv:0802.3341
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Sergio Dain, Carlos O. Lousto, Yosef Zlochower,<br />
-<i>Extra-Large Remnant Recoil Velocities and Spins from
- Near-Extremal-Bowen-York-Spin Black-Hole Binaries,</i><br />
-<a href="http://arxiv.org/abs/0803.0351">arXiv:0803.0351
- [gr-qc]</a>.</p>
-</li>
-
-<li>
-<p>Accurate evolutions of inspiralling neutron-star binaries: prompt
- and delayed collapse to black hole,<br />
-<i>Luca Baiotti, Bruno Giacomazzo, Luciano Rezzolla,</i><br />
-<a href="http://arxiv.org/abs/0804.0594">arXiv:0804.0594
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Modeling gravitational recoil from precessing highly-spinning
- unequal-mass black-hole binaries,<br />
-<i>Carlos O. Lousto, Yosef Zlochower,</i><br />
-<a href="http://arxiv.org/abs/0805.0159">arXiv:0805.0159
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Transformation of the multipolar components of gravitational
- radiation under rotations and boosts,<br />
- <i>Leonardo Gualtieri, Emanuele Berti, Vitor Cardoso, Ulrich
- Sperhake,</i><br />
- <a href="http://arxiv.org/abs/0805.1017">arXiv:0805.1017
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <!-- 2008-06-13 -->
- <p>XiRel: Standard Benchmarks for Numerical Relativity Codes Using
- Cactus and Carpet,<br />
- <i>Jian Tao, Gabrielle Allen, Ian Hinder, Erik Schnetter, Yosef
- Zlochower,</i><br />
- <a href="http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5">Technical
- Report CCT-TR-2008-5, Louisiana State University (2008)</a>.</p>
-</li>
-
-<li>
- <p>Comparisons of eccentric binary black hole simulations with
- post-Newtonian models,<br />
- <i>Ian Hinder, Frank Herrmann, Pablo Lagona, Deirdre Shoemaker,</i><br />
- <a href="http://arxiv.org/abs/0806.1037">arXiv:0806.1037
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>The high-energy collision of two black holes,<br />
- <i>Ulrich Sperhake, Vitor Cardoso, Frans Pretorius, Emanuele
- Berti, José A. González,</i><br />
- <a href="http://arxiv.org/abs/0806.1738">arXiv:0806.1738
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Superkicks in Hyperbolic Encounters of Binary Black Holes,<br />
- <i>James Healy, Frank Herrmann, Ian Hinder, Deirdre M. Shoemaker,
- Pablo Laguna, Richard A. Matzner,</i><br />
- <a href="http://arxiv.org/abs/0807.3292">arXiv:0807.3292
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Comparison of Numerical and Post-Newtonian Waveforms for Generic
- Precessing Black-Hole Binaries,<br />
- <i>Manuela Campanelli, Carlos O. Lousto, Hiroyuki Nakano, Yosef
- Zlochower,</i><br />
- <a href="http://arxiv.org/abs/0808.0713">arXiv:0808.0713
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Gravitational-Wave Extraction from Neutron-Star Oscillations:
- comparing linear and nonlinear techniques,<br />
- <i>Luca Baiotti, Sebastiano Bernuzzi, Giovanni Corvino, Roberto De
- Pietri, Alessandro Nagar,</i><br />
- <a href="http://arxiv.org/abs/0808.4002">arXiv:0808.4002
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Turduckening black holes: an analytical and computational study,<br />
- <i>David Brown, Peter Diener, Olivier Sarbach, Erik Schnetter,
- Manuel Tiglio,</i><br />
- <a href="http://arxiv.org/abs/0809.3533">arXiv:0809.3533
- [gr-qc]</a>.</p>
-</li>
-
-</ol>
-
-
-
-<h2>Theses</h2>
-
-<!-- Theses are sorted by year, then by the last name -->
-
-<ol>
-
-<li>
-<p>Michael Koppitz,<br />
-Numerical Studies Of Black Hole Initial Data,<br />
-<a href="http://opus.kobv.de/ubp/volltexte/2005/134">PhD thesis,
- Universität Potsdam, 2004</a>.</p>
-</li>
-
-<li>
-<!-- Herrmann2005:PhD -->
-<p>Frank Herrmann,<br />
-Evolution and analysis of binary black hole spacetimes,<br />
-PhD thesis, Universität Potsdam, 2005.</p>
-</li>
-
-<li>
-<!-- Loeffler05 -->
-<p>Frank Löffler,<br />
-Numerical Simulations of Neutron Star-Black Hole Mergers,<br />
-<a href="http://opus.kobv.de/ubp/volltexte/2006/774/">PhD thesis,
- Universität Potsdam, 2006</a>.</p>
-</li>
-
-<li>
-<p>Sasanka Madiraju,<br />
-Performance Profiling with Cactus Benchmarks,<br />
-Masters thesis, Louisiana State University, 2006
-<a href="http://www.cactuscode.org/Articles/Cactus_Madiraju06.pdf">(PDF, 600&nbsp;kB)</a>.</p>
-</li>
-
-<li>
-<p>Burkhard Zink,<br />
-Black hole formation from non-axisymmetric instabilities in
-quasi-toroidal stars,<br />
-PhD thesis, Technische Universität München, 2006
-<a href="http://nbn-resolving.de/urn/resolver.pl?urn=urn:nbn:de:bvb:91-diss20060623-1915123970">(PDF, 8.6&nbsp;MB)</a>.</p>
-</li>
-
-<li>
-<p>Ernst Nils Dorband,<br />
-Computing and Analyzing Gravitational Radiation in Black Hole
-Simulations Using a New Multi-Block Approach to Numerical Relativity,<br />
-PhD thesis, Louisiana State University, 2007
-<a href="http://www.cct.lsu.edu/~dorband/thesis.pdf">(PDF, 2.4&nbsp;MB)</a>.</p>
-</li>
-
-<li>
-<p>Wolfgang Kastaun,<br />
-Developing a code for general relativistic hydrodynamics with
- application to neutron star oscillations,<br />
-<a href="http://tobias-lib.ub.uni-tuebingen.de/volltexte/2007/2803/">PhD
- thesis, Universität Tübingen, 2007</a>).</p>
-</li>
-
-<li>
-<p>Gian Mario Manca,<br />
-Dynamical instabilities in rapidly rotating neutron star models,<br />
-PhD thesis, Università di Parma, 2007.</p>
-</li>
-
-<li>
-<p>Christian D. Ott,<br />
-Stellar Iron Core Collapse in {3+1} General Relativity and The
- Gravitational Wave Signature of Core-Collapse Supernovae,<br />
-PhD thesis, Universität Potsdam, 2007
-(available
- from <a href="http://www.tapir.caltech.edu/~cott/">Chrisitan's home
- page</a>).</p>
-</li>
-
-<li>
-<p>Anıl Zenginoğlu,<br />
-A conformal approach to numerical calculations of asymptotically flat
- spacetimes,<br />
-PhD thesis, Max-Planck Institute for Gravitational Physics (AEI) and
- University of Potsdam, 2007,
-<a href="http://arxiv.org/abs/0711.0873">arXiv:0711.0873
- [gr-qc]</a>.</p>
-</li>
-
-<li>
- <p>Eloisa Bentivegna,<br /> Ringing in unison: exploring black hole
- coalescence with quasinormal modes,<br /> PhD thesis, Pennsylvania
- State University, 2008,
- <a href="http://etda.libraries.psu.edu/theses/approved/WorldWideIndex/ETD-2570/index.html">ETD
- 2570</a>.</p>
-</li>
-
-<li>
-<p>Michael Jasiulek,<br />
-Spin Measures on Isolated and Dynamical Horizons in Numerical
- Relativity,<br />
-Diplomarbeit, Humboldt-Universität zu Berlin, 2008.</p>
-</li>
-
-</ol>
-
-
-
-<!--
-
-Luca Baiotti,
-Numerical relativity simulations of non-vacuum spacetimes in three
-dimensions,
-PhD thesis, SISSA, 2004.
-[does not use Carpet]
-
-Bernard Kelly,
-The Next Generation of Binary Black Hole Head-On Collisions, and their
-Aftermath,
-PhD thesis, Penn State University, 2004.
-[does not use Carpet]
-
-Kenneth Smith,
-Dynamic Singularity Excision in Numerical Relativity,
-PhD thesis, Penn State University, 2004.
-[does not use Carpet]
-
-Bruno Giacomazzo,
-General Relativistic Magnetohydrodynamics: fundamental aspects and applications,
-PhD thesis, SISSA, 2006.
-[does not use Carpet]
-
--->
-
-
-
- <hr />
-
- <p>Please tell us if you have written a publication or a thesis
- using Carpet.</p>
-
- <hr />
-
- <p>Go back to the <a href=".">Carpet home page</a>.</p>
-
- <hr />
-
- <p>
- <a href="http://www.xemacs.org/About/created.html"><img
- src="cbxSmall.jpg" alt="Created with XEmacs!" height="36"
- width="100" /></a>
-
- <a href="http://www.anybrowser.org/campaign/"><img
- src="logoab8.png" alt="Best Viewed With Any Browser" height="31"
- width="88" /></a>
-
- <a href="http://validator.w3.org/check?uri=referer"><img
- src="valid-xhtml10.png" alt="Valid XHTML 1.0!" height="31"
- width="88" /></a>
- </p>
-
- <address><a href="mailto:schnetter@cct.lsu.edu">Erik Schnetter</a></address>
-<p>
-<!-- Created: Sun Feb 26 2006 -->
-<!-- hhmts start -->
-Last modified: 2008-09-26
-<!-- hhmts end -->
-</p>
-
- </body>
-</html>
diff --git a/Carpet/CarpetWeb/publications/Makefile b/Carpet/CarpetWeb/publications/Makefile
new file mode 100644
index 000000000..d385e223f
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/Makefile
@@ -0,0 +1,46 @@
+SECTIONS = background refereed book report thesis webpage
+
+ALLSECTIONS = $(SECTIONS) internal
+
+all: carpet-publications.pdf publications.html
+
+carpet-publications.pdf: carpet-publications.tex carpet-publications.bib $(SECTIONS:%=citations-%.bibitems)
+ rubber -d carpet-publications
+
+publications.html: $(SECTIONS:%=citations-%.html-updated)
+
+.PRECIOUS: $(SECTIONS:%=citations-%.tex)
+citations-%.tex: citations.template
+ sed -e 's/STATUS/$*/g' citations.template > $@
+
+.PRECIOUS: $(SECTIONS:%=citations-%.bib)
+citations-%.bib: carpet-publications.bib
+ bibtool -q -- 'select.by.string{status "$*"}' -- 'sort{on}' -- 'sort.reverse{on}' -- 'sort.format{%N(receiveddate)}' < carpet-publications.bib > $@
+
+# this produces also %.aux and %.bbl
+.PRECIOUS: $(SECTIONS:%=citations-%.pdf)
+citations-%.pdf: citations-%.tex citations-%.bib
+ rubber -d citations-$*
+
+citations-%.bibitems: citations-%.pdf
+ cat citations-$*.bbl | grep -v thebibliography | sed -e 's/bibitem/blurb/' > $@
+
+# http://www.spinellis.gr/sw/textproc/bib2xhtml/
+# Sorted alphabetically:
+# ./bib2xhtml -r -s empty -u $*.aux publications.html
+# ./bib2xhtml -s unsort -u $*.aux publications.html
+# ./bib2xhtml -s unsortlist -u $*.aux publications.html
+citations-%.html-updated: citations-%.pdf
+ ./bib2xhtml -s unsortlist -u citations-$*.aux publications.html
+ : > $@
+
+EMPTY :=
+SPACE := $(EMPTY) $(EMPTY)
+check:
+ bibtool -q -- 'select.non{status "$(subst $(SPACE),\|,$(ALLSECTIONS))"}' < carpet-publications.bib
+
+clean:
+ rubber -d --clean carpet-publications
+ $(RM) $(SECTIONS:%=citations-%.*)
+
+.PHONY: all check clean
diff --git a/Carpet/CarpetWeb/publications/apsrev-titles-manyauthors.bst b/Carpet/CarpetWeb/publications/apsrev-titles-manyauthors.bst
new file mode 100644
index 000000000..13f3e1eed
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/apsrev-titles-manyauthors.bst
@@ -0,0 +1,2410 @@
+%%
+%% This is file `apsrev.bst',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% merlin.mbs (with options: `head,ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% physjour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% geojour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% photjour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% merlin.mbs (with options: `tail,ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% ----------------------------------------
+%% *** REVTeX-compatible apsrev.bst 1702 ***
+%%
+%% Copyright 1994-2000 Patrick W Daly
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This bibliographic style (bst) file has been generated from one or
+ % more master bibliographic style (mbs) files, listed above.
+ %
+ % This generated file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ % Name and version information of the main mbs file:
+ % \ProvidesFile{merlin.mbs}[2000/05/04 4.01 (PWD, AO, DPC)]
+ % For use with BibTeX version 0.99a or later
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is an author-year citation style bibliography. As such, it is
+ % non-standard LaTeX, and requires a special package file to function properly.
+ % Such a package is natbib.sty by Patrick W. Daly
+ % The form of the \bibitem entries is
+ % \bibitem[Jones et al.(1990)]{key}...
+ % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
+ % The essential feature is that the label (the part in brackets) consists
+ % of the author names, as they should appear in the citation, with the year
+ % in parentheses following. There must be no space before the opening
+ % parenthesis!
+ % With natbib v5.3, a full list of authors may also follow the year.
+ % In natbib.sty, it is possible to define the type of enclosures that is
+ % really wanted (brackets or parentheses), but in either case, there must
+ % be parentheses in the label.
+ % The \cite command functions as follows:
+ % \citet{key} ==>> Jones et al. (1990)
+ % \citet*{key} ==>> Jones, Baker, and Smith (1990)
+ % \citep{key} ==>> (Jones et al., 1990)
+ % \citep*{key} ==>> (Jones, Baker, and Smith, 1990)
+ % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2)
+ % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990)
+ % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32)
+ % \citeauthor{key} ==>> Jones et al.
+ % \citeauthor*{key} ==>> Jones, Baker, and Smith
+ % \citeyear{key} ==>> 1990
+ %---------------------------------------------------------------------
+
+ENTRY
+ { address
+ archive
+ author
+ booktitle
+ chapter
+ collaboration
+ edition
+ editor
+ eid
+ eprint
+ howpublished
+ institution
+ isbn
+ issn
+ journal
+ key
+ month
+ note
+ number
+ numpages
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ url
+ volume
+ year
+ }
+ {}
+ { label extra.label sort.label short.list }
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+STRINGS { s t}
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+FUNCTION {add.blank}
+{ " " * before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ skip$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\textbf{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bib.name.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\bibnamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bib.fname.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\bibfnamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {cite.name.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\citenamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {tie.or.space.prefix}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$
+}
+
+FUNCTION {capitalize}
+{ "u" change.case$ "t" change.case$ }
+
+FUNCTION {space.word}
+{ " " swap$ * " " * }
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+FUNCTION {bbl.and}
+{ "and"}
+
+FUNCTION {bbl.etal}
+{ "et~al." }
+
+FUNCTION {bbl.editors}
+{ "eds." }
+
+FUNCTION {bbl.editor}
+{ "ed." }
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+{ "ed." }
+
+FUNCTION {bbl.volume}
+{ "vol." }
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+{ "no." }
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{ "pp." }
+
+FUNCTION {bbl.page}
+{ "p." }
+
+FUNCTION {bbl.eidpp}
+{ "pages" }
+
+FUNCTION {bbl.chapter}
+{ "chap." }
+
+FUNCTION {bbl.techrep}
+{ "Tech. Rep." }
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+FUNCTION {bbl.first}
+{ "1st" }
+
+FUNCTION {bbl.second}
+{ "2nd" }
+
+FUNCTION {bbl.third}
+{ "3rd" }
+
+FUNCTION {bbl.fourth}
+{ "4th" }
+
+FUNCTION {bbl.fifth}
+{ "5th" }
+
+FUNCTION {bbl.st}
+{ "st" }
+
+FUNCTION {bbl.nd}
+{ "nd" }
+
+FUNCTION {bbl.rd}
+{ "rd" }
+
+FUNCTION {bbl.th}
+{ "th" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+FUNCTION {eng.ord}
+{ duplicate$ "1" swap$ *
+ #-2 #1 substring$ "1" =
+ { bbl.th * }
+ { duplicate$ #-1 #1 substring$
+ duplicate$ "1" =
+ { pop$ bbl.st * }
+ { duplicate$ "2" =
+ { pop$ bbl.nd * }
+ { "3" =
+ { bbl.rd * }
+ { bbl.th * }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-------------------------------------------------------------------
+
+ % Begin module:
+
+
+ % \ProvidesFile{physjour.mbs}[1999/10/05 2.1 (PWD)]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+MACRO {aa}{"Astron. \& Astrophys."}
+
+
+MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."}
+
+
+MACRO {aj} {"Astron. J."}
+
+
+MACRO {aph} {"Acta Phys."}
+
+MACRO {advp} {"Adv. Phys."}
+
+MACRO {ajp} {"Amer. J. Phys."}
+
+MACRO {ajm} {"Amer. J. Math."}
+
+MACRO {amsci} {"Amer. Sci."}
+
+MACRO {anofd} {"Ann. Fluid Dyn."}
+
+MACRO {am} {"Ann. Math."}
+
+MACRO {ap} {"Ann. Phys. (NY)"}
+
+MACRO {adp} {"Ann. Phys. (Leipzig)"}
+
+MACRO {ao} {"Appl. Opt."}
+
+MACRO {apl} {"Appl. Phys. Lett."}
+
+MACRO {app} {"Astroparticle Phys."}
+
+MACRO {apj} {"Astrophys. J."}
+
+
+MACRO {apjsup} {"Astrophys. J. Suppl."}
+
+
+MACRO {apss} {"Astrophys. Space Sci."}
+
+
+MACRO {araa} {"Ann. Rev. Astron. Astrophys."}
+
+
+MACRO {baas} {"Bull. Amer. Astron. Soc."}
+
+
+MACRO {baps} {"Bull. Amer. Phys. Soc."}
+
+MACRO {cmp} {"Comm. Math. Phys."}
+
+MACRO {cpam} {"Commun. Pure Appl. Math."}
+
+MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"}
+
+MACRO {cpc} {"Comp. Phys. Comm."}
+
+MACRO {cqg} {"Class. Quant. Grav."}
+
+MACRO {cra} {"C. R. Acad. Sci. A"}
+
+MACRO {fed} {"Fusion Eng. \& Design"}
+
+MACRO {ft} {"Fusion Tech."}
+
+MACRO {grg} {"Gen. Relativ. Gravit."}
+
+MACRO {ieeens} {"IEEE Trans. Nucl. Sci."}
+
+MACRO {ieeeps} {"IEEE Trans. Plasma Sci."}
+
+MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"}
+
+MACRO {ip} {"Infrared Phys."}
+
+MACRO {irp} {"Infrared Phys."}
+
+MACRO {jap} {"J. Appl. Phys."}
+
+MACRO {jasa} {"J. Acoust. Soc. America"}
+
+MACRO {jcp} {"J. Comp. Phys."}
+
+MACRO {jetp} {"Sov. Phys.--JETP"}
+
+MACRO {jfe} {"J. Fusion Energy"}
+
+MACRO {jfm} {"J. Fluid Mech."}
+
+MACRO {jmp} {"J. Math. Phys."}
+
+MACRO {jne} {"J. Nucl. Energy"}
+
+MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."}
+
+MACRO {jnm} {"J. Nucl. Mat."}
+
+MACRO {jpc} {"J. Phys. Chem."}
+
+MACRO {jpp} {"J. Plasma Phys."}
+
+MACRO {jpsj} {"J. Phys. Soc. Japan"}
+
+MACRO {jsi} {"J. Sci. Instrum."}
+
+MACRO {jvst} {"J. Vac. Sci. \& Tech."}
+
+MACRO {nat} {"Nature"}
+
+MACRO {nature} {"Nature"}
+
+
+
+MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"}
+
+MACRO {nf} {"Nucl. Fusion"}
+
+MACRO {nim} {"Nucl. Inst. \& Meth."}
+
+MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."}
+
+MACRO {np} {"Nucl. Phys."}
+
+MACRO {npb} {"Nucl. Phys. B"}
+
+MACRO {nt/f} {"Nucl. Tech./Fusion"}
+
+MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"}
+
+MACRO {inc} {"Nuovo Cimento"}
+
+MACRO {nc} {"Nuovo Cimento"}
+
+MACRO {pf} {"Phys. Fluids"}
+
+MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."}
+
+MACRO {pfb} {"Phys. Fluids B: Plasma Phys."}
+
+MACRO {pl} {"Phys. Lett."}
+
+MACRO {pla} {"Phys. Lett. A"}
+
+MACRO {plb} {"Phys. Lett. B"}
+
+MACRO {prep} {"Phys. Rep."}
+
+MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"}
+
+MACRO {pp} {"Phys. Plasmas"}
+
+MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"}
+
+MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"}
+
+MACRO {prl} {"Phys. Rev. Lett."}
+
+MACRO {pr} {"Phys. Rev."}
+
+MACRO {physrev} {"Phys. Rev."}
+
+MACRO {pra} {"Phys. Rev. A"}
+
+MACRO {prb} {"Phys. Rev. B"}
+
+MACRO {prc} {"Phys. Rev. C"}
+
+MACRO {prd} {"Phys. Rev. D"}
+
+MACRO {pre} {"Phys. Rev. E"}
+
+MACRO {ps} {"Phys. Scripta"}
+
+MACRO {procrsl} {"Proc. Roy. Soc. London"}
+
+MACRO {rmp} {"Rev. Mod. Phys."}
+
+MACRO {rsi} {"Rev. Sci. Inst."}
+
+MACRO {science} {"Science"}
+
+
+MACRO {sciam} {"Sci. Am."}
+
+MACRO {sam} {"Stud. Appl. Math."}
+
+MACRO {sjpp} {"Sov. J. Plasma Phys."}
+
+MACRO {spd} {"Sov. Phys.--Doklady"}
+
+MACRO {sptp} {"Sov. Phys.--Tech. Phys."}
+
+MACRO {spu} {"Sov. Phys.--Uspeki"}
+
+MACRO {st} {"Sky and Telesc."}
+
+
+
+
+
+ % End module: physjour.mbs
+
+
+
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{geojour.mbs}[1999/11/16 2.0g (PWD)]
+MACRO {aisr} {"Adv. Space Res."}
+MACRO {ag} {"Ann. Geophys."}
+MACRO {anigeo} {"Ann. Geofis."}
+MACRO {angl} {"Ann. Glaciol."}
+MACRO {andmet} {"Ann. d. Meteor."}
+MACRO {andgeo} {"Ann. d. Geophys."}
+MACRO {andphy} {"Ann. Phys.-Paris"}
+MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."}
+MACRO {atph} {"Atm\'osphera"}
+MACRO {aao} {"Atmos. Ocean"}
+MACRO {ass}{"Astrophys. Space Sci."}
+MACRO {atenv} {"Atmos. Environ."}
+MACRO {aujag} {"Aust. J. Agr. Res."}
+MACRO {aumet} {"Aust. Meteorol. Mag."}
+MACRO {blmet} {"Bound.-Lay. Meteorol."}
+MACRO {bams} {"Bull. Amer. Meteorol. Soc."}
+MACRO {cch} {"Clim. Change"}
+MACRO {cdyn} {"Clim. Dynam."}
+MACRO {cbul} {"Climatol. Bull."}
+MACRO {cap} {"Contrib. Atmos. Phys."}
+MACRO {dsr} {"Deep-Sea Res."}
+MACRO {dhz} {"Dtsch. Hydrogr. Z."}
+MACRO {dao} {"Dynam. Atmos. Oceans"}
+MACRO {eco} {"Ecology"}
+MACRO {empl}{"Earth, Moon and Planets"}
+MACRO {envres} {"Environ. Res."}
+MACRO {envst} {"Environ. Sci. Technol."}
+MACRO {ecms} {"Estuarine Coastal Mar. Sci."}
+MACRO {expa}{"Exper. Astron."}
+MACRO {geoint} {"Geofis. Int."}
+MACRO {geopub} {"Geofys. Publ."}
+MACRO {geogeo} {"Geol. Geofiz."}
+MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."}
+MACRO {gfd} {"Geophys. Fluid Dyn."}
+MACRO {geomag} {"Geophys. Mag."}
+MACRO {georl} {"Geophys. Res. Lett."}
+MACRO {grl} {"Geophys. Res. Lett."}
+MACRO {ga} {"Geophysica"}
+MACRO {gs} {"Geophysics"}
+MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."}
+MACRO {ijawp} {"Int. J. Air Water Pollut."}
+MACRO {ijc} {"Int. J. Climatol."}
+MACRO {ijrs} {"Int. J. Remote Sens."}
+MACRO {jam} {"J. Appl. Meteorol."}
+MACRO {jaot} {"J. Atmos. Ocean. Technol."}
+MACRO {jatp} {"J. Atmos. Terr. Phys."}
+MACRO {jce} {"J. Climate"}
+MACRO {jcam} {"J. Climate Appl. Meteor."}
+MACRO {jcm} {"J. Climate Meteor."}
+MACRO {jcy} {"J. Climatol."}
+MACRO {jgr} {"J. Geophys. Res."}
+MACRO {jga} {"J. Glaciol."}
+MACRO {jh} {"J. Hydrol."}
+MACRO {jmr} {"J. Mar. Res."}
+MACRO {jmrj} {"J. Meteor. Res. Japan"}
+MACRO {jm} {"J. Meteor."}
+MACRO {jpo} {"J. Phys. Oceanogr."}
+MACRO {jra} {"J. Rech. Atmos."}
+MACRO {jaes} {"J. Aeronaut. Sci."}
+MACRO {japca} {"J. Air Pollut. Control Assoc."}
+MACRO {jas} {"J. Atmos. Sci."}
+MACRO {jmts} {"J. Mar. Technol. Soc."}
+MACRO {jmsj} {"J. Meteorol. Soc. Japan"}
+MACRO {josj} {"J. Oceanogr. Soc. Japan"}
+MACRO {jwm} {"J. Wea. Mod."}
+MACRO {lao} {"Limnol. Oceanogr."}
+MACRO {mwl} {"Mar. Wea. Log"}
+MACRO {mau} {"Mausam"}
+MACRO {meteor} {"``Meteor'' Forschungsergeb."}
+MACRO {map} {"Meteorol. Atmos. Phys."}
+MACRO {metmag} {"Meteor. Mag."}
+MACRO {metmon} {"Meteor. Monogr."}
+MACRO {metrun} {"Meteor. Rundsch."}
+MACRO {metzeit} {"Meteor. Z."}
+MACRO {metgid} {"Meteor. Gidrol."}
+MACRO {mwr} {"Mon. Weather Rev."}
+MACRO {nwd} {"Natl. Weather Dig."}
+MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."}
+MACRO {npg} {"Nonlin. Proc. Geophys."}
+MACRO {om} {"Oceanogr. Meteorol."}
+MACRO {ocac} {"Oceanol. Acta"}
+MACRO {oceanus} {"Oceanus"}
+MACRO {paleoc} {"Paleoceanography"}
+MACRO {pce} {"Phys. Chem. Earth"}
+MACRO {pmg} {"Pap. Meteor. Geophys."}
+MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."}
+MACRO {physzeit} {"Phys. Z."}
+MACRO {pps} {"Planet. Space Sci."}
+MACRO {pss} {"Planet. Space Sci."}
+MACRO {pag} {"Pure Appl. Geophys."}
+MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."}
+MACRO {quatres} {"Quat. Res."}
+MACRO {rsci} {"Radio Sci."}
+MACRO {rse} {"Remote Sens. Environ."}
+MACRO {rgeo} {"Rev. Geophys."}
+MACRO {rgsp} {"Rev. Geophys. Space Phys."}
+MACRO {rdgeo} {"Rev. Geofis."}
+MACRO {revmeta} {"Rev. Meteorol."}
+MACRO {sgp}{"Surveys in Geophys."}
+MACRO {sp} {"Solar Phys."}
+MACRO {ssr} {"Space Sci. Rev."}
+MACRO {tellus} {"Tellus"}
+MACRO {tac} {"Theor. Appl. Climatol."}
+MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"}
+MACRO {wrr} {"Water Resour. Res."}
+MACRO {weather} {"Weather"}
+MACRO {wafc} {"Weather Forecast."}
+MACRO {ww} {"Weatherwise"}
+MACRO {wmob} {"WMO Bull."}
+MACRO {zeitmet} {"Z. Meteorol."}
+ % End module: geojour.mbs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-------------------------------------------------------------------
+
+ % Begin module:
+
+
+ % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+MACRO {appopt} {"Appl. Opt."}
+
+MACRO {bell} {"Bell Syst. Tech. J."}
+
+MACRO {ell} {"Electron. Lett."}
+
+MACRO {jasp} {"J. Appl. Spectr."}
+
+MACRO {jqe} {"IEEE J. Quantum Electron."}
+
+MACRO {jlwt} {"J. Lightwave Technol."}
+
+MACRO {jmo} {"J. Mod. Opt."}
+
+MACRO {josa} {"J. Opt. Soc. America"}
+
+MACRO {josaa} {"J. Opt. Soc. Amer.~A"}
+
+MACRO {josab} {"J. Opt. Soc. Amer.~B"}
+
+MACRO {jdp} {"J. Phys. (Paris)"}
+
+MACRO {oc} {"Opt. Commun."}
+
+MACRO {ol} {"Opt. Lett."}
+
+MACRO {phtl} {"IEEE Photon. Technol. Lett."}
+
+MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."}
+
+MACRO {sse} {"Solid-State Electron."}
+
+MACRO {sjot} {"Sov. J. Opt. Technol."}
+
+MACRO {sjqe} {"Sov. J. Quantum Electron."}
+
+MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."}
+
+MACRO {stph} {"Sov. Phys.--Techn. Phys."}
+
+MACRO {stphl} {"Sov. Techn. Phys. Lett."}
+
+MACRO {vr} {"Vision Res."}
+
+MACRO {zph} {"Z. f. Physik"}
+
+MACRO {zphb} {"Z. f. Physik~B"}
+
+MACRO {zphd} {"Z. f. Physik~D"}
+
+MACRO {CLEO} {"CLEO"}
+
+MACRO {ASSL} {"Adv. Sol.-State Lasers"}
+
+MACRO {OSA} {"OSA"}
+
+
+
+
+ % End module: photjour.mbs
+
+
+
+%% Copyright 1994-2000 Patrick W Daly
+MACRO {acmcs} {"ACM Comput. Surv."}
+
+MACRO {acta} {"Acta Inf."}
+
+MACRO {cacm} {"Commun. ACM"}
+
+MACRO {ibmjrd} {"IBM J. Res. Dev."}
+
+MACRO {ibmsj} {"IBM Syst.~J."}
+
+MACRO {ieeese} {"IEEE Trans. Software Eng."}
+
+MACRO {ieeetc} {"IEEE Trans. Comput."}
+
+MACRO {ieeetcad}
+ {"IEEE Trans. Comput. Aid. Des."}
+
+MACRO {ipl} {"Inf. Process. Lett."}
+
+MACRO {jacm} {"J.~ACM"}
+
+MACRO {jcss} {"J.~Comput. Syst. Sci."}
+
+MACRO {scp} {"Sci. Comput. Program."}
+
+MACRO {sicomp} {"SIAM J. Comput."}
+
+MACRO {tocs} {"ACM Trans. Comput. Syst."}
+
+MACRO {tods} {"ACM Trans. Database Syst."}
+
+MACRO {tog} {"ACM Trans. Graphic."}
+
+MACRO {toms} {"ACM Trans. Math. Software"}
+
+MACRO {toois} {"ACM Trans. Office Inf. Syst."}
+
+MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
+
+MACRO {tcs} {"Theor. Comput. Sci."}
+
+FUNCTION {bibinfo.check}
+{ swap$
+ duplicate$ missing$
+ {
+ pop$ pop$
+ ""
+ }
+ { duplicate$ empty$
+ {
+ swap$ pop$
+ }
+ { swap$
+ "\bibinfo{" swap$ * "}{" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {bibinfo.warn}
+{ swap$
+ duplicate$ missing$
+ {
+ swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
+ ""
+ }
+ { duplicate$ empty$
+ {
+ swap$ "empty " swap$ * " in " * cite$ * warning$
+ }
+ { swap$
+ "\bibinfo{" swap$ * "}{" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {format.eprint}
+{ eprint duplicate$ empty$
+ 'skip$
+ { "\eprint"
+ archive empty$
+ 'skip$
+ { "[" * archive * "]" * }
+ if$
+ "{" * swap$ * "}" *
+ }
+ if$
+}
+FUNCTION {format.url}
+{ url empty$
+ { "" }
+ { "\urlprefix\url{" url * "}" * }
+ if$
+}
+
+STRINGS { bibinfo}
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 'bibinfo :=
+ duplicate$ empty$ 'skip$ {
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{f.}" format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ *
+ bibinfo bibinfo.check
+ 't :=
+ nameptr #1 >
+ {
+ nameptr #0
+ #100 +
+ #1 + =
+ numnames #0
+ #100 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ " " * bbl.etal bib.name.font *
+ }
+ {
+ bbl.and
+ bib.name.font
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+}
+FUNCTION {format.names.ed}
+{
+ format.names
+}
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.authors}
+{ author "author" format.names
+ duplicate$ empty$ 'skip$
+ { collaboration "collaboration" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { " (" swap$ * ")" * }
+ if$
+ *
+ }
+ if$
+}
+FUNCTION {get.bbl.editor}
+{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
+
+FUNCTION {format.editors}
+{ editor "editor" format.names duplicate$ empty$ 'skip$
+ {
+ "," *
+ " " *
+ get.bbl.editor
+ *
+ }
+ if$
+}
+FUNCTION {format.isbn}
+{ isbn "isbn" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ "ISBN " swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.issn}
+{ issn "issn" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ "ISSN " swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ { output.state mid.sentence =
+ { "l" }
+ { "u" }
+ if$
+ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ * "note" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title
+ duplicate$ empty$
+ { skip$ }
+ { "t" change.case$ }
+ if$
+ "title" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ }
+ if$
+}
+
+FUNCTION {format.full.names}
+{'s :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv~}{ll}" format.name$
+ 't :=
+ nameptr #1 >
+ {
+ nameptr #0
+ #100 +
+ #1 + =
+ numnames #0
+ #100 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ " " * bbl.etal *
+ cite.name.font
+ }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ t "others" =
+ 'skip$
+ { cite.name.font }
+ if$
+}
+
+FUNCTION {author.editor.key.full}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.full.names }
+ if$
+ }
+ { author format.full.names }
+ if$
+}
+
+FUNCTION {author.key.full}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.full.names }
+ if$
+}
+
+FUNCTION {editor.key.full}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.full.names }
+ if$
+}
+
+FUNCTION {make.full.names}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.full
+ { type$ "proceedings" =
+ 'editor.key.full
+ 'author.key.full
+ if$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem[{" write$
+ label write$
+ ")" make.full.names duplicate$ short.list =
+ { pop$ }
+ { * }
+ if$
+ "}]{" * write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {n.dashify}
+{
+ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{ bbl.in
+ " " * }
+
+FUNCTION {format.date}
+{ year "year" bibinfo.check duplicate$ empty$
+ {
+ "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????"
+ }
+ 'skip$
+ if$
+ extra.label *
+ before.all 'output.state :=
+ " (" swap$ * ")" *
+}
+FUNCTION {format.date.misc}
+{
+ year empty$ 'skip$ {
+ format.date "year" output.check
+ } if$
+}
+FUNCTION {format.monthdate}
+{ month "month" bibinfo.check duplicate$ empty$ 'skip$
+ {
+ " " *
+ }
+ if$
+ year "year" bibinfo.check duplicate$ empty$
+ {
+ "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????"
+ }
+ 'skip$
+ if$
+ extra.label *
+ before.all 'output.state :=
+ * " (" swap$ * ")" *
+}
+FUNCTION {format.monthdate.misc}
+{
+ year empty$ 'skip$ {
+ format.monthdate "year" output.check
+ } if$
+}
+FUNCTION {format.btitle}
+{ title "title" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ }
+ if$
+}
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { bbl.volume volume tie.or.space.prefix
+ "volume" bibinfo.check * *
+ series "series" bibinfo.check
+ duplicate$ empty$ 'pop$
+ { swap$ bbl.of space.word * swap$
+ emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { series empty$
+ { number "number" bibinfo.check }
+ { output.state mid.sentence =
+ { bbl.number }
+ { bbl.number capitalize }
+ if$
+ number tie.or.space.prefix "number" bibinfo.check * *
+ bbl.in space.word *
+ series "series" bibinfo.check *
+ }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+FUNCTION {is.num}
+{ chr.to.int$
+ duplicate$ "0" chr.to.int$ < not
+ swap$ "9" chr.to.int$ > not and
+}
+
+FUNCTION {extract.num}
+{ duplicate$ 't :=
+ "" 's :=
+ { t empty$ not }
+ { t #1 #1 substring$
+ t #2 global.max$ substring$ 't :=
+ duplicate$ is.num
+ { s swap$ * 's := }
+ { pop$ "" 't := }
+ if$
+ }
+ while$
+ s empty$
+ 'skip$
+ { pop$ s }
+ if$
+}
+
+FUNCTION {convert.edition}
+{ extract.num "l" change.case$ 's :=
+ s "first" = s "1" = or
+ { bbl.first 't := }
+ { s "second" = s "2" = or
+ { bbl.second 't := }
+ { s "third" = s "3" = or
+ { bbl.third 't := }
+ { s "fourth" = s "4" = or
+ { bbl.fourth 't := }
+ { s "fifth" = s "5" = or
+ { bbl.fifth 't := }
+ { s #1 #1 substring$ is.num
+ { s eng.ord 't := }
+ { edition 't := }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ t
+}
+
+FUNCTION {format.edition}
+{ edition duplicate$ empty$ 'skip$
+ {
+ convert.edition
+ output.state mid.sentence =
+ { "l" }
+ { "t" }
+ if$ change.case$
+ "edition" bibinfo.check
+ " " * bbl.edition *
+ }
+ if$
+}
+INTEGERS { multiresult }
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+FUNCTION {format.pages}
+{ pages duplicate$ empty$ 'skip$
+ { duplicate$ multi.page.check
+ {
+ bbl.pages swap$
+ n.dashify
+ }
+ {
+ bbl.page swap$
+ }
+ if$
+ tie.or.space.prefix
+ "pages" bibinfo.check
+ * *
+ }
+ if$
+}
+FUNCTION {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+
+FUNCTION {format.journal.pages}
+{ pages duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$
+ { pop$ pop$ format.pages }
+ {
+ ", " *
+ swap$
+ first.page
+ "pages" bibinfo.check
+ *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {format.journal.eid}
+{ eid "eid" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { swap$ duplicate$ empty$ 'skip$
+ {
+ ", " *
+ }
+ if$
+ swap$
+ numpages empty$ 'skip$
+ { bbl.eidpp numpages tie.or.space.prefix
+ "numpages" bibinfo.check * *
+ " (" swap$ * ")" * *
+ }
+ if$
+ }
+ if$ *
+}
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ duplicate$ empty$ 'skip$
+ {
+ "volume" bibinfo.check
+ }
+ if$
+ bolden
+ eid empty$
+ { format.journal.pages }
+ { format.journal.eid }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { bbl.chapter }
+ { type "l" change.case$
+ "type" bibinfo.check
+ }
+ if$
+ chapter tie.or.space.prefix
+ "chapter" bibinfo.check
+ * *
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.booktitle}
+{
+ booktitle "booktitle" bibinfo.check
+ emphasize
+}
+FUNCTION {format.in.ed.booktitle}
+{ format.booktitle duplicate$ empty$ 'skip$
+ {
+ editor "editor" format.names.ed duplicate$ empty$ 'pop$
+ {
+ bbl.edby
+ " " * swap$ *
+ swap$
+ "," *
+ " " * swap$
+ * }
+ if$
+ word.in swap$ *
+ }
+ if$
+}
+FUNCTION {format.thesis.type}
+{ type duplicate$ empty$
+ 'pop$
+ { swap$ pop$
+ "t" change.case$ "type" bibinfo.check
+ }
+ if$
+}
+FUNCTION {format.tr.number}
+{ number "number" bibinfo.check
+ type duplicate$ empty$
+ { pop$ bbl.techrep }
+ 'skip$
+ if$
+ "type" bibinfo.check
+ swap$ duplicate$ empty$
+ { pop$ "t" change.case$ }
+ { tie.or.space.prefix * * }
+ if$
+}
+FUNCTION {format.article.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.book.crossref}
+{ volume duplicate$ empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ pop$ word.in
+ }
+ { bbl.volume
+ swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
+ }
+ if$
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.incoll.inproc.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+ add.blank "(" *
+ t empty$
+ { address "address" bibinfo.check *
+ }
+ { t *
+ address empty$
+ 'skip$
+ { ", " * address "address" bibinfo.check * }
+ if$
+ }
+ if$
+ year duplicate$ empty$
+ { "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????" }
+ { "year" bibinfo.check extra.label * }
+ if$
+ t empty$ address empty$ and
+ { * }
+ { ", " swap$ * * }
+ if$
+ ")" *
+}
+FUNCTION {format.publisher.address}
+{ publisher "publisher" bibinfo.warn format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization "organization" bibinfo.check format.org.or.pub
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ crossref missing$
+ {
+ ""
+ journal
+ duplicate$ empty$
+ { pop$ pop$ } {
+ "journal" bibinfo.check
+ * "journal" output.check
+ add.blank
+ } if$
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.issn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.publisher.address output
+ }
+ {
+ format.book.crossref output.nonnull
+ format.date "year" output.check
+ }
+ if$
+ format.edition output
+ format.isbn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ format.title "title" output.check
+ howpublished "howpublished" bibinfo.check output
+ address "address" bibinfo.check output
+ format.date "year" output.check
+ format.isbn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ format.btitle "title" output.check
+ crossref missing$
+ {
+ format.publisher.address output
+ format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ format.number.series output
+ }
+ {
+ format.chapter.pages "chapter and pages" output.check
+ format.book.crossref output.nonnull
+ format.date "year" output.check
+ }
+ if$
+ format.edition output
+ crossref missing$
+ { format.isbn output }
+ 'skip$
+ if$
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ crossref missing$
+ { format.title output
+ format.in.ed.booktitle "booktitle" output.check
+ format.publisher.address output
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ format.edition output
+ format.isbn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ publisher empty$
+ { format.organization.address output }
+ { organization "organization" bibinfo.check output
+ format.publisher.address output
+ }
+ if$
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ format.isbn output
+ format.issn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {conference} { inproceedings }
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ format.btitle "title" output.check
+ organization "organization" bibinfo.check output
+ address "address" bibinfo.check output
+ format.edition output
+ format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ bbl.mthesis format.thesis.type output.nonnull
+ school "school" bibinfo.warn output
+ address "address" bibinfo.check output
+ format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ format.title output
+ howpublished "howpublished" bibinfo.check output
+ format.date.misc
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ bbl.phdthesis format.thesis.type output.nonnull
+ school "school" bibinfo.warn output
+ address "address" bibinfo.check output
+ format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ publisher empty$
+ { format.organization.address output }
+ { organization "organization" bibinfo.check output
+ format.publisher.address output
+ }
+ if$
+ format.isbn output
+ format.issn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ format.tr.number output.nonnull
+ institution "institution" bibinfo.warn output
+ address "address" bibinfo.check output
+ format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+ format.title output
+ format.monthdate.misc
+ format.note "note" output.check
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+READ
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+INTEGERS { len }
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$
+ " " * bbl.etal *
+ cite.name.font
+ "others" 't :=
+ }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+ " " * bbl.etal *
+ cite.name.font
+ "others" 't :=
+ }
+ { bbl.and space.word * s #2 "{vv~}{ll}" format.name$
+ * }
+ if$
+ }
+ if$
+ }
+ if$
+ t "others" =
+ 'skip$
+ { cite.name.font }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.label}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.short.authors}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ 'short.list :=
+}
+
+FUNCTION {calc.label}
+{ calc.short.authors
+ short.list
+ "("
+ *
+ year duplicate$ empty$
+ short.list key field.or.null = or
+ { pop$ "" }
+ 'skip$
+ if$
+ *
+ 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ nameptr #0
+ #100 +
+ #1 + =
+ numnames #0
+ #100 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ { t sortify * }
+ if$
+ }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+INTEGERS { seq.num }
+FUNCTION {init.seq}
+{ #0 'seq.num :=}
+EXECUTE {init.seq}
+FUNCTION {int.to.fix}
+{ "000000000" swap$ int.to.str$ *
+ #-1 #10 substring$
+}
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ seq.num #1 + 'seq.num :=
+ seq.num int.to.fix
+ 'sort.label :=
+ sort.label
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+SORT
+STRINGS { last.label next.extra }
+INTEGERS { last.extra.num number.label }
+FUNCTION {initialize.extra.label.stuff}
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+FUNCTION {forward.pass}
+{ last.label label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ label 'last.label :=
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+ extra.label
+ duplicate$ empty$
+ 'skip$
+ { "{\natexlab{" swap$ * "}}" * }
+ if$
+ 'extra.label :=
+ label extra.label * 'label :=
+}
+EXECUTE {initialize.extra.label.stuff}
+ITERATE {forward.pass}
+REVERSE {reverse.pass}
+FUNCTION {bib.sort.order}
+{ sort.label
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+ITERATE {bib.sort.order}
+SORT
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" number.label int.to.str$ * "}" *
+ write$ newline$
+ "\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname bibnamefont\endcsname\relax"
+ write$ newline$
+ " \def\bibnamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname bibfnamefont\endcsname\relax"
+ write$ newline$
+ " \def\bibfnamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname citenamefont\endcsname\relax"
+ write$ newline$
+ " \def\citenamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname url\endcsname\relax"
+ write$ newline$
+ " \def\url#1{\texttt{#1}}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi"
+ write$ newline$
+ "\providecommand{\bibinfo}[2]{#2}"
+ write$ newline$
+ "\providecommand{\eprint}[2][]{\url{#2}}"
+ write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+ITERATE {call.type$}
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
+%% End of customized bst file
+%%
+%% End of file `apsrev.bst'.
diff --git a/Carpet/CarpetWeb/publications/bib2xhtml b/Carpet/CarpetWeb/publications/bib2xhtml
new file mode 100644
index 000000000..1b63bc196
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/bib2xhtml
@@ -0,0 +1,1254 @@
+#!/opt/local/bin/perl -w
+eval 'exec /opt/local/bin/perl -w -S $0 ${1+"$@"}'
+ if 0;
+
+$version = '$Id: bib2xhtml 2.26 2007/06/14 14:59:44 dds Exp $';
+
+#
+# Convert from bibtex to XHTML.
+#
+# (C) Copyright 1995, 1996 David Hull.
+# (David Hull / hull@cs.uiuc.edu / http://www.uiuc.edu/ph/www/dlhull)
+#
+# (C) Copyright 2002-2007 Diomidis Spinellis
+# http://www.spinellis.gr
+#
+# This program is free software. You can redistribute it and/or modify
+# it under the terms of the GNU General Public License. See the
+# files README and COPYING for details.
+#
+# This source code contains UTF-8 characters. You might want to use
+# an appropriate editor, if you want to view/modify the LaTeX to Unicode
+# substitution commands.
+#
+
+use Getopt::Std;
+
+require 'ctime.pl';
+
+eval {use PDF::API2};
+$have_pdf_api = 1 unless (defined $@ && $@ ne '');
+
+# Label styles.
+$label_styles{'plain'} = $LABEL_PLAIN = 1;
+$label_styles{'ordered'} = $LABEL_ORDERED = 2;
+$label_styles{'numbered'} = $LABEL_NUMBERED = 3;
+$label_styles{'default'} = $LABEL_DEFAULT = 4;
+
+$list_start[$LABEL_PLAIN] = 'ul class="bib2xhtml"';
+$list_end[$LABEL_PLAIN] = "/ul";
+$list_start[$LABEL_ORDERED] = 'ol class="bib2xhtml"';
+$list_end[$LABEL_ORDERED] = "/ol";
+$list_start[$LABEL_NUMBERED] = 'dl compact="1" class="bib2xhtml"';
+$list_end[$LABEL_NUMBERED] = "/dl";
+$list_start[$LABEL_DEFAULT] = 'dl class="bib2xhtml"';
+$list_end[$LABEL_DEFAULT] = "/dl";
+
+@tmpfiles = ();
+
+sub usage {
+ $program = $0;
+ $program =~ s+^.*/++;
+ print STDERR <<_EOF_;
+usage: $program [-a] [-b bibtex-options] [-c] [-d delim] [-D mappings]
+ [-e extended-information] [-h heading] [-i] [-k]
+ [-m macro file] [-r] [-s style] [-t] [-u] [-v]
+ sourcefile [htmlfile]
+
+ -a Write abstract to htmlfile.
+ -b bibtex-options
+ Options to pass to bibtex.
+ -c Sort chronologically, by year and then by author.
+ -d delim
+ Specify bibliography delimiter.
+ -D mappings
+ Specify file path to URL mappings.
+ -e extended-information
+ Specify the extended metadata information (page count, size, PDF icon)
+ that will be included in each citation.
+ -h heading
+ String to use instead of default title when creating a new htmlfile.
+ If updating an existing htmlfile, this option is ignored.
+ -i Use included citations
+ -k In labeled styles append to the label of each entry its bibtex key.
+ -m macro file
+ Specify an additional macro file.
+ -r Sort in reverse chronological order.
+ -s style
+ Control style of bibliography:
+ (empty, plain, alpha, named, unsort, or unsortlist).
+ -t Write timestamp to htmlfile.
+ -u Output a Unicode-coded document.
+ -v Report the version number.
+_EOF_
+ exit(1);
+}
+
+# Return the command needed to open a (perhaps compressed) file,
+# as well as the type of compression.
+sub openCommand {
+ local($path) = @_;
+ local($cmd);
+ local($cmp);
+
+command: {
+ ($path =~ m/\.Z$/ &&
+ ($cmd = "uncompress -c $path |", $cmp = "Compressed", last command));
+ ($path =~ m/\.g?z$/ &&
+ ($cmd = "gzip -d -c $path |", $cmp = "Gzipped", last command));
+ ($cmd = "<$path", $cmp = "", last command);
+ }
+
+ ($cmd, $cmp);
+}
+
+@paperTypes = ("PostScript", "PDF", "DVI", "DOI");
+
+sub PostScriptPageCount {
+ local($cmd) = @_;
+ local($pageCount);
+
+ #print "in PostScriptPageCount $cmd\n";
+
+ open(FILE, $cmd) || (warn "error opening $cmd: $!\n", return undef);
+
+ local($_);
+ local($/) = "\n";
+
+line:
+ while (<FILE>) {
+ last line if m/^%%EndComments/;
+ if (m/^%%Pages:\s*(\d+)/) {
+ $pageCount = $1 if ($1 > 0);
+ last line;
+ }
+ }
+ close(FILE);
+
+ $pageCount;
+}
+
+sub PDFPageCount {
+ return undef unless ($have_pdf_api);
+ my($file) = @_;
+ $file =~ s/^\<//;
+ # print "in PDFPageCount $file\n";
+ my($pdf);
+ eval {$pdf = PDF::API2->open($file)};
+ return undef if (defined $@ && $@ ne '');
+ return $pdf->pages;
+}
+
+sub DVIPageCount {
+ local($cmd) = @_;
+ local($pageCount);
+
+ #print "in DVIPageCount $cmd\n";
+
+ if ($cmd =~ m/^</) {
+ # Simple file.
+ $cmd = "dviselect : $cmd >/dev/null";
+ } else {
+ # Compressed file.
+ $cmd .= "dviselect : >/dev/null";
+ }
+
+ # Look at dviselect's stderr.
+ open(DVISELECT, "-|") || (open(STDERR, ">&STDOUT"), exec $cmd);
+
+ local($_);
+ local($/) = "\n";
+line:
+ while (<DVISELECT>) {
+ if (m/[Ww]rote (\d+) pages/) {
+ $pageCount = $1;
+ last line;
+ }
+ }
+ close(DVISELECT);
+
+ $pageCount;
+}
+
+# Make an intelligent link to a paper file.
+sub doPaperLinks {
+ local($file);
+ local($url);
+ local($paper, $ppaper);
+ local($cstr, $pstr, $sstr);
+
+papertype:
+ foreach $paper (@paperTypes) {
+
+ $ppaper = $paper unless defined($notype); # Paper type
+ $sstr = ""; # size string
+ $pstr = ""; # pages string
+ $cstr = ""; # compression type string
+
+ if (($url) = m/\<\!\-\- $paper:[\s\n]+(\S+)[\s\n]+\-\-\>/) {
+
+ # If $url looks like a file (doesn't begin with http://, ftp://,
+ # etc.), get more info.
+ if ($paper ne 'DOI' && $url !~ m/^[^\:\/]+\:\//) {
+ local($file) = $url;
+ local($path);
+ local($dir);
+ foreach $dir (@filedir) {
+ $path = join('/', $dir, $file);
+ if ( -f $path) {
+ if (defined $dirmap{$dir}) {
+ $url = join('/', $dirmap{$dir}, $file);
+ } else {
+ $url = $path;
+ }
+ last;
+ }
+ }
+
+ if (! -f $path) {
+ print STDERR "couldn't find $file\n";
+ next papertype;
+ }
+
+ local($opencmd);
+ local($size);
+ local($pageCountRoutine);
+ local($pageCount) = 0;
+
+ ($opencmd, $cstr) = &openCommand($path);
+
+ # Get size.
+ $size = -s _;
+ if (! defined $nosize) {
+ if ($size < 1000) {
+ $sstr = ", $size bytes";
+ } elsif ($size < 1000000) {
+ $sstr = sprintf ", %.1f kbyte", $size / 1000;
+ } elsif ($size < 1000000000) {
+ $sstr = sprintf ", %.1f Mbyte", $size / 1000000;
+ } else {
+ $sstr = sprintf ", %.1f Gbyte", $size / 1000000000;
+ }
+ }
+
+ # Get page count.
+ $pageCountRoutine = $paper . "PageCount";
+ $pageCount = &$pageCountRoutine($opencmd);
+ $pstr = ", $pageCount pages" if (defined $pageCount && !defined $nopages);
+
+ # Get compression type.
+ $cstr = "$cstr " if ($cstr ne "");
+ undef $cstr if (defined $nocompression);
+ } elsif ($paper eq 'DOI' &&
+ (($url =~ m/^doi:(.*)/i) ||
+ ($url =~ m/^http:\/\/[\w.]+\/(.*)/i) ||
+ ($url =~ m/^(.*)$/))) {
+ # Convert the DOI URL into an HTTP link
+ $url = "http://dx.doi.org/$1";
+ $ppaper = "doi:$1" unless (defined($nodoi));
+ }
+
+ $ppaper = $typeicon{$paper} if (defined $typeicon{$paper});
+
+ #print STDERR "found $paper $file$pstr$sstr\n";
+
+ if ($nobrackets) {
+ s/\<\!\-\- $paper:[\s\n]+\S+[\s\n]+\-\-\>/<a href=\"$url\">${cstr}$ppaper<\/a>$pstr$sstr/;
+ } else {
+ s/\<\!\-\- $paper:[\s\n]+\S+[\s\n]+\-\-\>/(<a href=\"$url\">${cstr}$ppaper<\/a>$pstr$sstr)/;
+ }
+ }
+ }
+}
+
+# html_encode(string)
+# Protect character entities in string.
+sub html_encode {
+ local($_) = @_;
+
+ s/&/&amp;/g; # Must be first.
+ s/</&lt;/g;
+ s/>/&gt;/g;
+ s/"/&quot;/g;
+
+ $_;
+}
+
+# Convert $_ into an HTML entity representation
+sub html_ent {
+ # Accents.
+ s/\\i\b/i/g; # dotless i.
+ s/\\\'(\001\d+)\{([AEIOUaeiou])\1\}/&$2acute;/g; # acute accent \'{x}
+ s/\\\'([AEIOUaeiou])/&$1acute;/g; # acute accent \'x
+ s/\\\`(\001\d+)\{([AEIOUaeiou])\1\}/&$2grave;/g; # grave accent \`{x}
+ s/\\\`([AEIOUaeiou])/&$1grave;/g; # grave accent \`x
+ s/\\\"(\001\d+)\{([AEIOUaeiouy])\1\}/&$2uml;/g; # umlaut \"{x}
+ s/\\\"([AEIOUaeiouy])/&$1uml;/g; # umlaut \"x
+ s/\\\~(\001\d+)\{([ANOano])\1\}/&$2tilde;/g; # tilde \~{x}
+ s/\\\~([ANOano])/&$1tilde;/g; # tilde \~x
+ s/\\\^(\001\d+)\{([AEIOUaeiou])\1\}/&$2circ;/g; # circumflex \^{x}
+ s/\\\^([AEIOUaeiou])/&$1circ;/g; # circumflex \^x
+ s/\\c(\001\d+)\{([Cc])\1\}/&$2cedil;/g; # cedilla \c{x}
+ # The following accents have no HTML equivalent.
+ # (This list is still not complete.)
+ s/\\u(\001\d+)\{(.)\1\}/$2/g; # breve accent \u{x}
+ s/\\v(\001\d+)\{(.)\1\}/$2/g; # hacek accent \v{x}
+ s/\\([lL])\b/$1/g; # slashed l
+ s/\\\=(\001\d+)\{(.)\1\}/$2/g; # macron \={x}
+ s/\\\=(.)/$1/g; # macron accent \=x
+ s/\\\.(\001\d+)\{(.)\1\}/$2/g; # dot \.{x}
+ s/\\\.(.)/$1/g; # dot accent \.x
+
+ # Other special characters.
+ s/\\([Oo])\b\s*/&$1slash;/g; # \[Oo] -> &[Oo]slash;
+ s/\\AA\b\s*/&Aring;/g; # \AA -> &Aring;
+ s/\\aa\b\s*/&aring;/g; # \aa -> &aring;
+ s/\\AE\b\s*/&AElig;/g; # \AE -> &AElig;
+ s/\\ae\b\s*/&aelig;/g; # \ae -> &aelig;
+ s/\\ss\b\s*/&szlig;/g; # \ss -> &szlig;
+ s/\\S\b\s*/&sect;/g; # \S -> &sect;
+ s/\\P\b\s*/&para;/g; # \P -> &para;
+ s/\\pounds\b\s*/&pound;/g; # \pounds -> &pound;
+ s/\?\`/&iquest;/g; # ?` -> &iquest;
+ s/\!\`/&iexcl;/g; # !` -> &iexcl;
+
+ # Other special characters.
+ # Try to be careful to not change the dashes in HTML comments
+ # (<!-- comment -->) to &ndash;s.
+ s/\-\-\-/&mdash;/g; # --- -> &mdash;
+ s/([^\!])\-\-([^\>])/$1&ndash;$2/g; # -- -> &ndash;
+ #s/\-\-\-/\227/g; # --- -> &mdash;
+ #s/([^\!])\-\-([^\>])/$1\226$2/g; # -- -> &ndash;
+
+ # Upper and lower case greek
+ s/\\([aA]lpha)\b/&$1;/g;
+ s/\\([bB]eta)\b/&$1;/g;
+ s/\\([gG]amma)\b/&$1;/g;
+ s/\\([dD]elta)\b/&$1;/g;
+ s/\\varepsilon\b/&epsilon;/g;
+ s/\\([eE]psilon)\b/&$1;/g;
+ s/\\([zZ]eta)\b/&$1;/g;
+ s/\\([eE]ta)\b/&$1;/g;
+ s/\\([tT]heta)\b/&$1;/g;
+ s/\\vartheta\b/&theta;/g;
+ s/\\([iI]ota)\b/&$1;/g;
+ s/\\([kK]appa)\b/&$1;/g;
+ s/\\([lL]ambda)\b/&$1;/g;
+ s/\\([mM]u)\b/&$1;/g;
+ s/\\([nN]u)\b/&$1;/g;
+ s/\\([xX]i)\b/&$1;/g;
+ s/\\([oO]micron)\b/&$1;/g;
+ s/\\([pP]i)\b/&$1;/g;
+ s/\\varpi\b/&pi;/g;
+ s/\\([rR]ho)\b/&$1;/g;
+ s/\\varrho\b/&rho;/g;
+ s/\\([sS]igma)\b/&$1;/g;
+ s/\\varsigma\b/&sigmaf;/g;
+ s/\\([tT]au)\b/&$1;/g;
+ s/\\([uU]psilon)\b/&$1;/g;
+ s/\\([pP]hi)\b/&$1;/g;
+ s/\\varphi\b/&phi;/g;
+ s/\\([cC]hi)\b/&$1;/g;
+ s/\\([pP]si)\b/&$1;/g;
+ s/\\([oO]mega)\b/&$1;/g;
+}
+
+# Convert $_ into a UTF-8 character
+sub utf_ent {
+ # Accents.
+ s/\\i\b/ı/g; # dotless i.
+
+ # acute accent \'{x}
+ s/\\\'(\001\d+)\{A\1\}/Ã/g;
+ s/\\\'(\001\d+)\{C\1\}/Ć/g;
+ s/\\\'(\001\d+)\{E\1\}/É/g;
+ s/\\\'(\001\d+)\{I\1\}/Ã/g;
+ s/\\\'(\001\d+)\{L\1\}/Ĺ/g;
+ s/\\\'(\001\d+)\{N\1\}/Ń/g;
+ s/\\\'(\001\d+)\{O\1\}/Ó/g;
+ s/\\\'(\001\d+)\{R\1\}/Å”/g;
+ s/\\\'(\001\d+)\{S\1\}/Åš/g;
+ s/\\\'(\001\d+)\{U\1\}/Ú/g;
+ s/\\\'(\001\d+)\{Y\1\}/Ã/g;
+ s/\\\'(\001\d+)\{Z\1\}/Ź/g;
+ s/\\\'(\001\d+)\{a\1\}/á/g;
+ s/\\\'(\001\d+)\{c\1\}/ć/g;
+ s/\\\'(\001\d+)\{e\1\}/é/g;
+ s/\\\'(\001\d+)\{ı\1\}/í/g;
+ s/\\\'(\001\d+)\{i\1\}/í/g;
+ s/\\\'(\001\d+)\{l\1\}/ĺ/g;
+ s/\\\'(\001\d+)\{n\1\}/Å„/g;
+ s/\\\'(\001\d+)\{o\1\}/ó/g;
+ s/\\\'(\001\d+)\{r\1\}/Å•/g;
+ s/\\\'(\001\d+)\{s\1\}/Å›/g;
+ s/\\\'(\001\d+)\{u\1\}/ú/g;
+ s/\\\'(\001\d+)\{y\1\}/ý/g;
+ s/\\\'(\001\d+)\{z\1\}/ź/g;
+
+ # acute accent \'x
+ s/\\\'A/Ã/g;
+ s/\\\'C/Ć/g;
+ s/\\\'E/É/g;
+ s/\\\'I/Ã/g;
+ s/\\\'L/Ĺ/g;
+ s/\\\'N/Ń/g;
+ s/\\\'O/Ó/g;
+ s/\\\'R/Å”/g;
+ s/\\\'S/Åš/g;
+ s/\\\'U/Ù/g;
+ s/\\\'Y/Ã/g;
+ s/\\\'Z/Ź/g;
+ s/\\\'a/á/g;
+ s/\\\'c/ć/g;
+ s/\\\'e/é/g;
+ s/\\\'i/í/g;
+ s/\\\'ı/í/g;
+ s/\\\'l/ĺ/g;
+ s/\\\'n/Å„/g;
+ s/\\\'o/ó/g;
+ s/\\\'r/Å•/g;
+ s/\\\'s/Å›/g;
+ s/\\\'u/ú/g;
+ s/\\\'y/ý/g;
+ s/\\\'z/ź/g;
+
+ # grave accent \`{x}
+ s/\\\`(\001\d+)\{A\1\}/À/g;
+ s/\\\`(\001\d+)\{E\1\}/È/g;
+ s/\\\`(\001\d+)\{I\1\}/Ì/g;
+ s/\\\`(\001\d+)\{O\1\}/Ã’/g;
+ s/\\\`(\001\d+)\{U\1\}/Ù/g;
+ s/\\\`(\001\d+)\{a\1\}/à/g;
+ s/\\\`(\001\d+)\{e\1\}/è/g;
+ s/\\\`(\001\d+)\{i\1\}/ì/g;
+ s/\\\`(\001\d+)\{o\1\}/ò/g;
+ s/\\\`(\001\d+)\{u\1\}/ù/g;
+
+ # grave accent \`x
+ s/\\\`A/À/g;
+ s/\\\`E/È/g;
+ s/\\\`I/Ì/g;
+ s/\\\`O/Ã’/g;
+ s/\\\`U/Ù/g;
+ s/\\\`a/à/g;
+ s/\\\`e/è/g;
+ s/\\\`i/ì/g;
+ s/\\\`o/ò/g;
+ s/\\\`u/ù/g;
+
+ # umlaut \"{x}
+ s/\\\"(\001\d+)\{A\1\}/Ä/g;
+ s/\\\"(\001\d+)\{E\1\}/Ë/g;
+ s/\\\"(\001\d+)\{I\1\}/Ã/g;
+ s/\\\"(\001\d+)\{O\1\}/Ö/g;
+ s/\\\"(\001\d+)\{U\1\}/Ü/g;
+ s/\\\"(\001\d+)\{Y\1\}/Ÿ/g;
+ s/\\\"(\001\d+)\{a\1\}/ä/g;
+ s/\\\"(\001\d+)\{e\1\}/ë/g;
+ s/\\\"(\001\d+)\{i\1\}/ï/g;
+ s/\\\"(\001\d+)\{o\1\}/ö/g;
+ s/\\\"(\001\d+)\{u\1\}/ü/g;
+ s/\\\"(\001\d+)\{y\1\}/ÿ/g;
+
+ # umlaut \"x
+ s/\\\"A/Ä/g;
+ s/\\\"E/Ë/g;
+ s/\\\"I/Ã/g;
+ s/\\\"O/Ö/g;
+ s/\\\"U/Ü/g;
+ s/\\\"Y/Ÿ/g;
+ s/\\\"a/ä/g;
+ s/\\\"e/ë/g;
+ s/\\\"i/ï/g;
+ s/\\\"o/ö/g;
+ s/\\\"u/ü/g;
+ s/\\\"y/ÿ/g;
+
+ # tilde \~{x}
+ s/\\\~(\001\d+)\{A\1\}/Ã/g;
+ s/\\\~(\001\d+)\{N\1\}/Ñ/g;
+ s/\\\~(\001\d+)\{O\1\}/Õ/g;
+ s/\\\~(\001\d+)\{a\1\}/ã/g;
+ s/\\\~(\001\d+)\{n\1\}/ñ/g;
+ s/\\\~(\001\d+)\{o\1\}/õ/g;
+
+ # tilde \~x
+ s/\\\~A/Ã/g;
+ s/\\\~N/Ñ/g;
+ s/\\\~O/Õ/g;
+ s/\\\~a/ã/g;
+ s/\\\~n/ñ/g;
+ s/\\\~O/õ/g;
+
+ # circumflex \^{x}
+ s/\\\^(\001\d+)\{A\1\}/Â/g;
+ s/\\\^(\001\d+)\{E\1\}/Ê/g;
+ s/\\\^(\001\d+)\{G\1\}/Ĝ/g;
+ s/\\\^(\001\d+)\{H\1\}/Ĥ/g;
+ s/\\\^(\001\d+)\{I\1\}/ÃŽ/g;
+ s/\\\^(\001\d+)\{J\1\}/Ä´/g;
+ s/\\\^(\001\d+)\{O\1\}/Ô/g;
+ s/\\\^(\001\d+)\{U\1\}/Û/g;
+ s/\\\^(\001\d+)\{W\1\}/Å´/g;
+ s/\\\^(\001\d+)\{Y\1\}/Ŷ/g;
+ s/\\\^(\001\d+)\{a\1\}/â/g;
+ s/\\\^(\001\d+)\{e\1\}/ê/g;
+ s/\\\^(\001\d+)\{g\1\}/Ä/g;
+ s/\\\^(\001\d+)\{h\1\}/Ä¥/g;
+ s/\\\^(\001\d+)\{i\1\}/î/g;
+ s/\\\^(\001\d+)\{j\1\}/ĵ/g;
+ s/\\\^(\001\d+)\{o\1\}/ô/g;
+ s/\\\^(\001\d+)\{u\1\}/û/g;
+ s/\\\^(\001\d+)\{w\1\}/ŵ/g;
+ s/\\\^(\001\d+)\{y\1\}/Å·/g;
+
+ # circumflex \^x
+ s/\\\^A/Â/g;
+ s/\\\^E/Ê/g;
+ s/\\\^G/Ĝ/g;
+ s/\\\^H/Ĥ/g;
+ s/\\\^I/ÃŽ/g;
+ s/\\\^J/Ä´/g;
+ s/\\\^O/Ô/g;
+ s/\\\^U/Û/g;
+ s/\\\^W/Å´/g;
+ s/\\\^Y/Ŷ/g;
+ s/\\\^a/â/g;
+ s/\\\^e/ê/g;
+ s/\\\^g/Ä/g;
+ s/\\\^h/Ä¥/g;
+ s/\\\^i/î/g;
+ s/\\\^J/ĵ/g;
+ s/\\\^o/ô/g;
+ s/\\\^u/û/g;
+ s/\\\^w/ŵ/g;
+ s/\\\^y/Å·/g;
+
+ # cedilla \c{x}
+ s/\\c(\001\d+)\{C\1\}/Ç/g;
+ s/\\c(\001\d+)\{c\1\}/ç/g;
+ s/\\c(\001\d+)\{K\1\}/Ķ/g;
+ s/\\c(\001\d+)\{k\1\}/Ä·/g;
+ s/\\c(\001\d+)\{L\1\}/Ä»/g;
+ s/\\c(\001\d+)\{l\1\}/ļ/g;
+ s/\\c(\001\d+)\{N\1\}/Å…/g;
+ s/\\c(\001\d+)\{n\1\}/ņ/g;
+ s/\\c(\001\d+)\{N\1\}/Å–/g;
+ s/\\c(\001\d+)\{n\1\}/Å—/g;
+
+ # double acute accent \H{x}
+ s/\\H(\001\d+)\{O\1\}/Å/g;
+ s/\\H(\001\d+)\{U\1\}/Å°/g;
+ s/\\H(\001\d+)\{o\1\}/Å‘/g;
+ s/\\H(\001\d+)\{u\1\}/ű/g;
+
+ # breve accent \u{x}
+ s/\\u(\001\d+)\{A\1\}/Ä‚/g;
+ s/\\u(\001\d+)\{E\1\}/Ä”/g;
+ s/\\u(\001\d+)\{G\1\}/Äž/g;
+ s/\\u(\001\d+)\{I\1\}/Ĭ/g;
+ s/\\u(\001\d+)\{O\1\}/ÅŽ/g;
+ s/\\u(\001\d+)\{U\1\}/Ŭ/g;
+ s/\\u(\001\d+)\{a\1\}/ă/g;
+ s/\\u(\001\d+)\{e\1\}/Ä•/g;
+ s/\\u(\001\d+)\{g\1\}/ÄŸ/g;
+ s/\\u(\001\d+)\{i\1\}/Ä­/g;
+ s/\\u(\001\d+)\{o\1\}/Å/g;
+ s/\\u(\001\d+)\{u\1\}/Å­/g;
+
+ # hacek/caron? accent \v{x}
+ s/\\v(\001\d+)\{C\1\}/Č/g;
+ s/\\v(\001\d+)\{D\1\}/ÄŽ/g;
+ s/\\v(\001\d+)\{E\1\}/Äš/g;
+ s/\\v(\001\d+)\{L\1\}/Ľ/g;
+ s/\\v(\001\d+)\{N\1\}/Ň/g;
+ s/\\v(\001\d+)\{R\1\}/Ř/g;
+ s/\\v(\001\d+)\{S\1\}/Å /g;
+ s/\\v(\001\d+)\{T\1\}/Ť/g;
+ s/\\v(\001\d+)\{Z\1\}/Ž/g;
+ s/\\v(\001\d+)\{c\1\}/Ä/g;
+ s/\\v(\001\d+)\{d\1\}/Ä/g;
+ s/\\v(\001\d+)\{e\1\}/Ä›/g;
+ s/\\v(\001\d+)\{l\1\}/ľ/g;
+ s/\\v(\001\d+)\{n\1\}/ň/g;
+ s/\\v(\001\d+)\{r\1\}/Å™/g;
+ s/\\v(\001\d+)\{s\1\}/Å¡/g;
+ s/\\v(\001\d+)\{t\1\}/Å¥/g;
+ s/\\v(\001\d+)\{z\1\}/ž/g;
+
+ # macron \={x}
+ s/\\\=(\001\d+)\{A\1\}/Ä€/g;
+ s/\\\=(\001\d+)\{E\1\}/Ä’/g;
+ s/\\\=(\001\d+)\{O\1\}/Ō/g;
+ s/\\\=(\001\d+)\{U\1\}/Ū/g;
+ s/\\\=(\001\d+)\{a\1\}/Ä/g;
+ s/\\\=(\001\d+)\{e\1\}/Ä“/g;
+ s/\\\=(\001\d+)\{o\1\}/Å/g;
+ s/\\\=(\001\d+)\{u\1\}/Å«/g;
+
+ # macron \=x
+ s/\\\=A/Ä€/g;
+ s/\\\=E/Ä’/g;
+ s/\\\=O/Ō/g;
+ s/\\\=U/Ū/g;
+ s/\\\=a/Ä/g;
+ s/\\\=e/Ä“/g;
+ s/\\\=o/Å/g;
+ s/\\\=u/Å«/g;
+
+ # dot \.{x}
+ s/\\\.(\001\d+)\{G\1\}/Ä /g;
+ s/\\\.(\001\d+)\{L\1\}/Ä¿/g;
+ s/\\\.(\001\d+)\{Z\1\}/Å»/g;
+ s/\\\.(\001\d+)\{g\1\}/Ä¡/g;
+ s/\\\.(\001\d+)\{l\1\}/Å€/g;
+ s/\\\.(\001\d+)\{z\1\}/ż/g;
+
+ # dot \.x
+ s/\\\.G/Ä /g;
+ s/\\\.L/Ä¿/g;
+ s/\\\.Z/Å»/g;
+ s/\\\.g/Ä¡/g;
+ s/\\\.l/Å€/g;
+ s/\\\.z/ż/g;
+
+
+ # slashed l
+ s/\\l\b/Å‚/g;
+ s/\\L\b/Å/g;
+
+ # krouzek \accent23x or \accent'27
+ s/\{\\accent2[37]\s*u\}/ů/g;
+ s/\\accent2[37]\s*u/ů/g;
+
+ # Other special characters.
+ s/\\O\b\s*/Ø/g;
+ s/\\o\b\s*/ø/g;
+ s/\\AA\b\s*/Ã…/g;
+ s/\\aa\b\s*/Ã¥/g;
+ s/\\AE\b\s*/Æ/g;
+ s/\\ae\b\s*/æ/g;
+ s/\\OE\b\s*/Å’/g;
+ s/\\oe\b\s*/Å“/g;
+ s/\\ss\b\s*/ß/g;
+ s/\\S\b\s*/§/g;
+ s/\\P\b\s*/¶/g;
+ s/\\pounds\b\s*/£/g;
+ s/\?\`/¿/g;
+ s/\!\`/¡/g;
+
+ # en and em dashes
+ # Try to be careful to not change the dashes in HTML comments
+ # (<!-- comment -->) to &ndash;s.
+ s/\-\-\-/—/g; # --- -> &#x2014
+ s/([^\!])\-\-([^\>])/$1–$2/g; # -- -> &#x2013
+
+ # Upper case Greek
+ s/\\Alpha\b/Α/g;
+ s/\\Beta\b/Î’/g;
+ s/\\Gamma\b/Γ/g;
+ s/\\Delta\b/Δ/g;
+ s/\\Epsilon\b/Ε/g;
+ s/\\Zeta\b/Ζ/g;
+ s/\\Eta\b/Η/g;
+ s/\\Theta\b/Θ/g;
+ s/\\Iota\b/Ι/g;
+ s/\\Kappa\b/Κ/g;
+ s/\\Lambda\b/Λ/g;
+ s/\\Mu\b/Μ/g;
+ s/\\Nu\b/Î/g;
+ s/\\Xi\b/Ξ/g;
+ s/\\Omicron\b/Ο/g;
+ s/\\Pi\b/Π/g;
+ s/\\Rho\b/Ρ/g;
+ s/\\Sigma\b/Σ/g;
+ s/\\Tau\b/Τ/g;
+ s/\\Upsilon\b/Î¥/g;
+ s/\\Phi\b/Φ/g;
+ s/\\Chi\b/Χ/g;
+ s/\\Psi\b/Ψ/g;
+ s/\\Omega\b/Ω/g;
+
+ # Lower case Greek
+ s/\\alpha\b/α/g;
+ s/\\beta\b/β/g;
+ s/\\gamma\b/γ/g;
+ s/\\delta\b/δ/g;
+ s/\\varepsilon\b/ε/g;
+ s/\\epsilon\b/ε/g;
+ s/\\zeta\b/ζ/g;
+ s/\\eta\b/η/g;
+ s/\\theta\b/θ/g;
+ s/\\vartheta\b/θ/g;
+ s/\\iota\b/ι/g;
+ s/\\kappa\b/κ/g;
+ s/\\lambda\b/λ/g;
+ s/\\mu\b/μ/g;
+ s/\\nu\b/ν/g;
+ s/\\xi\b/ξ/g;
+ s/\\omicron\b/ο/g;
+ s/\\pi\b/Ï€/g;
+ s/\\varpi\b/Ï€/g;
+ s/\\rho\b/Ï/g;
+ s/\\varrho\b/Ï/g;
+ s/\\sigma\b/σ/g;
+ s/\\varsigma\b/Ï‚/g;
+ s/\\tau\b/Ï„/g;
+ s/\\upsilon\b/Ï…/g;
+ s/\\phi\b/φ/g;
+ s/\\varphi\b/φ/g;
+ s/\\chi\b/χ/g;
+ s/\\psi\b/ψ/g;
+ s/\\omega\b/ω/g;
+}
+
+
+# Prevent "identifier used only once" warnings.
+$opt_a = $opt_b = $opt_c = $opt_D = $opt_d = $opt_e = $opt_h = $opt_m = $opt_r = undef;
+$opt_i = $opt_k = $opt_s = $opt_t = $opt_v = $opt_u = undef;
+
+$macrofile = '';
+
+$command_line = &html_encode(join(' ', $0, @ARGV));
+
+getopts("ab:cd:D:e:h:ikm:rs:tuv") || &usage;
+
+if (defined($opt_v)) {
+ print "$version\n";
+ exit 0;
+}
+
+&usage if (($#ARGV < 0) || ($#ARGV > 1));
+
+if ($ARGV[0] =~ m/\.bib$/) {
+ $bibfile = $ARGV[0];
+ $bibfile =~ s/\.bib$//;
+ $delimiter = $bibfile;
+} elsif ($ARGV[0] =~ m/\.aux$/) {
+ if ($opt_i) {
+ print STDERR "source file must be a bibliography (.bib) file when run with the -i switch \n";
+ &usage;
+ }
+ $citefile = $ARGV[0];
+ $citefile =~ s/\.aux$//;
+ $delimiter = $citefile;
+} else {
+ print STDERR "Unknown file extension on $ARGV[0]\n";
+ &usage;
+}
+
+$htmlfile = $ARGV[1] if ($#ARGV == 1);
+
+$delimiter = $opt_d if (defined($opt_d));
+$title = (defined($opt_h) ? $opt_h : "Bibliography generated from $ARGV[0]");
+$macrofile = "$opt_m," if (defined($opt_m));
+
+$opt_s = 'empty' if (! defined $opt_s);
+style: {
+ ($opt_s eq 'empty') &&
+ ($bstfile = "html-n",
+ $label_style = $LABEL_PLAIN,
+ last style);
+ ($opt_s eq 'plain') &&
+ ($bstfile = "html-n",
+ $label_style = $LABEL_NUMBERED,
+ last style);
+ ($opt_s eq 'alpha') &&
+ ($bstfile = "html-a",
+ $label_style = $LABEL_DEFAULT,
+ last style);
+ ($opt_s eq 'named') &&
+ ($bstfile = "html-n",
+ $label_style = $LABEL_DEFAULT,
+ last style);
+ ($opt_s eq 'unsort') &&
+ ($bstfile = "html-u",
+ $label_style = $LABEL_NUMBERED,
+ last style);
+ ($opt_s eq 'unsortlist') &&
+ ($bstfile = "html-u",
+ #$label_style = $LABEL_PLAIN,
+ $label_style = $LABEL_ORDERED,
+ last style);
+ ($opt_s =~ s/\.bst$//) &&
+ ($bstfile = $opt_s,
+ # label-style will be defined in .bst file.
+ last style);
+ print STDERR "Unknown style: $_\n";
+ &usage;
+}
+
+if ($bstfile eq "html-u" && ($opt_r || $opt_c)) {
+ print STDERR "Unsorted styles do not support a sort specification\n";
+ exit(1);
+}
+
+$bstfile .= "c" if (defined ($opt_c));
+$bstfile .= "r" if (defined ($opt_r));
+$bstfile .= "a" if (defined ($opt_a));
+
+# Extended information is specified as a sequence of
+# (PostScript|PDF|DVI|DOI):icon or
+# (notype|nosize|nopages|nocompression|nodoi|nobrackets)
+# Set correspondingly the associative array %typeicon and the no* variables
+# Example usage:
+# perl bib2xhtml -e 'nosize,nopages,PDF:<img src="pdficon_small.gif" alt="PDF" border="0" />' example.bib >example.html
+undef $nopages;
+undef $nosize;
+undef $nodoi;
+undef $notype;
+undef $nocompression;
+undef $nobrackets;
+
+if (defined($opt_e)) {
+ my(@opts) = split(/,/, $opt_e);
+ for $opt (@opts) {
+ if ($opt =~ m/(PostScript|PDF|DVI|DOI):(.*)/) {
+ $typeicon{$1} = $2;
+ } elsif ($opt =~ m/(notype|nosize|nopages|nocompression|nodoi|nobrackets)/) {
+ eval "\$$1 = 1";
+ } else {
+ print STDERR qq{Invalid extended information specification: $opt
+This can be a comma-separated list of the following specifications:
+PostScript|PDF|DVI|DOI:new-text (e.g. PDF file icon)
+notype|nosize|nopages|nocompression|nodoi|nobrackets
+};
+ exit 1;
+ }
+ }
+}
+
+# PostScript and PDF files are assumed to be in same directory
+# as the target HTML file.
+if (defined($htmlfile) && ($htmlfile =~ m+(^.*)/+)) {
+ push @filedir, $1;
+} else {
+ push @filedir, "."
+}
+if (defined $opt_D) {
+ local($dir, $url);
+ foreach $dir (split(/\,/, $opt_D)) {
+ $url = $dir;
+ if ($dir =~ s/\@(.*)$//) { $url = $1; }
+ push @filedir, $dir;
+ $dirmap{$dir} = $url;
+ }
+}
+
+umask(077);
+
+open(HTMLFILE, (defined($htmlfile) ? ">$htmlfile$$" : ">&STDOUT"));
+if (defined($htmlfile) && open(OHTMLFILE, "$htmlfile")) {
+ $mode = (stat OHTMLFILE)[2] & 0xfff;
+ $updating = 1;
+} else {
+ $mode = 0644;
+ $updating = 0;
+
+ # An existing HTML file does not exist, so output some boilerplate.
+ if ($opt_u) {
+ $enc = 'UTF-8';
+ } else {
+ $enc = 'US-ASCII';
+ }
+ print HTMLFILE
+qq{<?xml version="1.0" encoding="$enc"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>$title</title>
+<meta http-equiv="Content-type" content="text/html; charset=$enc" />} . q{
+<meta name="Generator" content="$Id: bib2xhtml 2.26 2007/06/14 14:59:44 dds Exp $" />
+</head>
+<body>
+}
+}
+
+$beginstring = "<!-- BEGIN CITATIONS $delimiter -->";
+$endstring = "<!-- END CITATIONS $delimiter -->";
+
+@citations = ();
+
+if ($opt_i && $updating) {
+ loop:
+ while (<OHTMLFILE>) {
+ print HTMLFILE;
+ last loop if m/^$beginstring$/;
+ }
+ loop:
+ while (<OHTMLFILE>) {
+ print HTMLFILE;
+ last loop if m/^$endstring$/;
+ push(@citations, $2) if m/^([^\\]*)?(.+\})(.*)?$/;
+ }
+ push(@citations, "\\bibdata{$bibfile}");
+}
+
+# Create an .aux file for bibtex to read.
+
+$auxfile = "bib$$";
+push(@tmpfiles, "$auxfile.aux");
+
+open(AUXFILE, ">$auxfile" . ".aux");
+
+print AUXFILE "\\relax\n\\bibstyle{$bstfile}\n";
+
+if (defined($citefile)) {
+ $citefile .= ".aux";
+ open(CITEFILE, "<$citefile") || die "error opening $citefile: $!\n";
+ while (<CITEFILE>) {
+ print AUXFILE $_ if (m/^\\(citation|bibdata){/);
+ }
+ close(CITEFILE);
+} elsif (@citations) {
+ foreach $citation (@citations) {
+ print AUXFILE "$citation\n";
+ }
+} else {
+ print AUXFILE "\\citation{*}\n\\bibdata{$macrofile$bibfile}\n";
+}
+
+close(AUXFILE);
+
+
+# run bibtex, redirecting bibtex's output from STDOUT to STDERR.
+
+push(@tmpfiles, "$auxfile.blg");
+push(@tmpfiles, "$auxfile.bbl");
+
+#Flush HTMLFILE to avoid duplicate buffer writes after the fork
+select(HTMLFILE);
+$| = 1; $| = 0;
+select(STDOUT);
+
+# We attempt to fork in order to redirect bibtex's stdout to stderr.
+# This is needed when bib2xhtml is generating its output on the
+# standard output.
+# The shell redirection syntax used in the system() alternative
+# is by no means portable.
+eval { fork || (open(STDOUT, ">&STDERR"),
+ # Handle leakage in Win32 prevents the final rename()
+ close(HTMLFILE),
+ close(OHTMLFILE),
+ exec('bibtex', (split(/\s+/, ($opt_b ? $opt_b : "")), $auxfile)));
+ wait; };
+# fork is not implemented on some non-Unix platforms.
+if ($@) {
+ # The fork failed (perhaps not implemented on this system).
+ system("bibtex $opt_b $auxfile 1>&2");
+}
+
+$beginstring = "<!-- BEGIN BIBLIOGRAPHY $delimiter -->";
+$endstring = "<!-- END BIBLIOGRAPHY $delimiter -->";
+
+if ($updating) {
+loop:
+ while (<OHTMLFILE>) {
+ last loop if m/^$beginstring$/;
+ print HTMLFILE;
+ }
+loop:
+ while (<OHTMLFILE>) {
+ last loop if m/^$endstring$/;
+ }
+}
+
+print HTMLFILE "$beginstring\n";
+print HTMLFILE <<EOF;
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: $command_line -->
+EOF
+# Now we make two passes over the .bbl file. In the first pass, we
+# just collect the {cite, label} pairs, which we will use later for
+# crossrefs.
+
+$t = $auxfile . ".bbl";
+
+$/ = "";
+
+# Make a first pass through the .bbl file, collecting citation/label pairs.
+open(BBLFILE, "<$t") || die "error opening $t: $!\n";
+$nentry = 0;
+loop:
+while (<BBLFILE>) {
+ # Check for definitions at start of .bbl file.
+ if (($nentry == 0) && (m/^#/)) {
+ if ((m/#\s*label-style:\s*(\S+)/) && (! defined $label_style)) {
+ $label_style = $label_styles{$1};
+ if (! defined $label_style) {
+ print STDERR "label style unknown: \n";
+ next loop;
+ }
+ }
+ next loop;
+ }
+ $nentry++;
+ ($bcite, $blabel) = m+<dt><a name=\"([^\"]*)\">\[([^\]]*)\]</a></dt><dd>+;
+ $blabel = "$nentry" if ($label_style == $LABEL_NUMBERED);
+ $bibcite{$bcite} = $blabel;
+}
+close(BBLFILE);
+
+$label_style = $LABEL_DEFAULT if (! defined $label_style);
+$list_start = $list_start[$label_style];
+$list_end = $list_end[$label_style];
+
+if (defined($opt_t)) {
+ print HTMLFILE "$nentry references, last updated " . &ctime(time) . "<p />\n";
+}
+
+print HTMLFILE "<$list_start>\n\n";
+
+#foreach $key (sort (keys(%bibcite))) {
+# print "$key : $bibcite{$key}\n";
+#}
+
+open(BBLFILE, "<$t") || die "error opening $t: $!\n";
+$nentry = 0;
+loop:
+while (<BBLFILE>) {
+ # Skip definitions at start of .bbl file.
+ next loop if (($nentry == 0) && (m/^#/));
+
+ $nentry++;
+
+ # Protect \{, \}, and \$, and then assign matching {} pairs a unique ID.
+ s/\\\{/\002/g;
+ s/\\\}/\003/g;
+ s/\\\$/\004/g;
+ {
+ local ($c, $l, $z) = (0, 0, ());
+ s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge;
+ }
+
+ # bibtex sometimes breaks long lines by inserting "%\n". We remove
+ # that because it might accidently break the line in the middle
+ # of a URL. We don't need to deal with TeX comments in general
+ # because bibtex seems to munge them up anyway, so there shouldn't
+ # be any in the bibliography file.
+ s/\%\n//g;
+
+ # bibtex's add.period$ knows how to avoid adding extra periods
+ # when a block already ends in a period. bib2xhtml's modifications
+ # of bibtex's style files break that. We fix it here.
+ s/(\.(<\/cite>|<\/a>|\')+)\./$1/g;
+
+ # Adjust beginning of entry based on bibliography style.
+ if ($label_style == $LABEL_PLAIN || $label_style == $LABEL_ORDERED) {
+ s:<dt>(<a name=\"[^\"]*\">)\[[^\]]*\](</a>)</dt><dd>:<li>$1$2:;
+ s:</dd>:</li>:;
+
+ # Attempt to fix up empty <a name=...></a> tag, which some browsers
+ # don't handle properly (even though it *is* legal HTML).
+ # First try to combine a <a name=...></a> with a following <A ".
+ s:(<a name=\"[^\"]*\")></a><a\b:$1:
+ # If that doesn't work, try to swallow following word.
+ or s:(<a name=\"[^\"]*\">)</a>([\w]+):$1$2<\/a>:;
+ } elsif ($label_style == $LABEL_NUMBERED) {
+ s:(<dt><a name=\"[^\"]*\">\[)[^\]]*(\]</a></dt><dd>):$1$nentry$2:;
+ }
+
+ # Append the key name, if asked so
+ if ($opt_k && ($label_style == $LABEL_NUMBERED || $label_style == $LABEL_DEFAULT)) {
+ # $1 $2 $3 $4 $5
+ s:(<dt><a name=\")([^\"]*)(\">\[)([^\]]*)(\]</a></dt><dd>):$1$2$3$4 --- $2$5:;
+ }
+
+ # Attempt to fix up crossrefs.
+ while (m/(\\(cite(label)?)(\001\d+)\{([^\001]+)\4\})/) {
+ $old = $1;
+ $cmd = $2;
+ $doxref = defined($3);
+ $bcite = $5;
+ if (! defined $bibcite{$bcite}) {
+ $blabel = " [" . $bcite . "]";
+ } elsif ($doxref) {
+ $blabel = " <a href=\"#$bcite\">[" . $bibcite{$bcite} . "]<\/a>";
+ } else {
+ $blabel = " [" . $bibcite{$bcite} . "]";
+ }
+ $old =~ s/(\W)/\\$1/g;
+ s/\s*$old/$blabel/g;
+ }
+ # In some styles crossrefs become something like
+ # "In Doe and Roe [Doe and Roe, 1995]." Change this to
+ # "In [Doe and Roe, 1995]." to remove the redundancy.
+ s/In (<a href=\"[^\"]*\">)([^\[]+) \[(\2)/In $1\[$2/;
+
+ # Handle the latex2html commands \htmladdnormallink{text}{url}
+ # and \htmladdnormallinkfoot{text}{url}.
+ s/\\htmladdnormallink(foot)?(\001\d+)\{([^\001]+)\2\}(\001\d+)\{([^\001]+)\4\}/<a href="$5">$3<\/a>/g;
+
+ s/\&amp;/\005/g; # Protect original &amp; sequences
+ s/\\?&/&amp;/g; # \& -> &amp; and & -> &amp;
+ s/\005/&amp;/g; # Restore original &amp; sequences
+
+ if ($opt_u) {
+ utf_ent();
+ } else {
+ html_ent();
+ }
+
+ # Handle \char123 -> &123;.
+ while (m/\\char([\'\"]?[0-9a-fA-F]+)/) {
+ $o = $r = $1;
+ if ($r =~ s/^\'//) {
+ $r = oct($r);
+ } elsif ($r =~ s/^\"//) {
+ $r = hex($r);
+ }
+ s/\\char$o\s*/&#$r;/g;
+ }
+
+ s/{\\etalchar\001(\d+)\{(.)}\001\1\}/$2/g; # {\etalchar{x}} -> x
+
+ s/\\par\b/<p \/>/g;
+
+ # \url{text} -> <a href"text">text</a>
+ s/\\url(\001\d+)\{([^\001]*)\1\}/<a href="$2">$2<\/a>/g;
+
+ # remove spaces from urls
+ while (m+<a href="(.*?)">(.*?)</a>+s) {
+ my $before = $`;
+ my $url = $1;
+ my $text = $2;
+ my $after = $'; #'
+ $url =~ s/ //g;
+ $_ = "$before\<a_ href=\"$url\">$text</a>$after";
+ }
+ s/<a_ /<a /g;
+
+ # There's no way to easily handle \rm and \textrm because
+ # HTML has no tag to convert back to plain text. Since it's very
+ # difficult to do the right thing, we do the wrong thing, and just
+ # remove them.
+ s/(\001\d+)\{\\rm\s+([^\001]*)\1\}/$2/g; # {\rm text} -> text
+ s/\\textrm(\001\d+)\{([^\001]*)\1\}/$2/g; # \textrm{text} -> text
+
+ # This doesn't create correct HTML, because HTML doesn't allow nested
+ # character style tags. Oh well.
+ s/(\001\d+)\{\\em\s+([^\001]*)\1\}/<em>$2<\/em>/g; # {\em text} -> <EM>text</EM>
+ s/(\001\d+)\{\\it\s+([^\001]*)\1\}/<i>$2<\/i>/g; # {\it text} -> <I>text</I>
+ s/(\001\d+)\{\\bf\s+([^\001]*)\1\}/<b>$2<\/b>/g; # {\bf text} -> <B>text</B>
+ s/(\001\d+)\{\\tt\s+([^\001]*)\1\}/<tt>$2<\/tt>/g; # {\tt text} -> <TT>text</TT>
+
+ s/\\emph(\001\d+)\{([^\001]*)\1\}/<em>$2<\/em>/g; # \emph{text} -> <EM>text</EM>
+ s/\\textit(\001\d+)\{([^\001]*)\1\}/<i>$2<\/i>/g; # \textit{text} -> <I>text</I>
+ s/\\textbf(\001\d+)\{([^\001]*)\1\}/<b>$2<\/b>/g; # \textbf{text} -> <B>text</B>
+ s/\\texttt(\001\d+)\{([^\001]*)\1\}/<tt>$2<\/tt>/g;# \textit{text} -> <TT>text</TT>
+
+ s/\\mathrm(\001\d+)\{([^\001]*)\1\}/$2/g; # \mathrm{text} -> text
+ s/\\mathnormal(\001\d+)\{([^\001]*)\1\}/$2/g; # \mathnormal{text} -> text
+ s/\\mathsf(\001\d+)\{([^\001]*)\1\}/$2/g; # \mathsf{text} -> text
+ s/\\mathbf(\001\d+)\{([^\001]*)\1\}/<b>$2<\/b>/g; # \mathbf{text} -> <B>text</B>
+ s/\\mathcal(\001\d+)\{([^\001]*)\1\}/<i>$2<\/i>/g;# \mathcal{text} -> <I>text</I>
+ s/\\mathit(\001\d+)\{([^\001]*)\1\}/<i>$2<\/i>/g; # \mathit{text} -> <I>text</I>
+ s/\\mathtt(\001\d+)\{([^\001]*)\1\}/<tt>$2<\/tt>/g;# \mathtt{text} -> <TT>text</TT>
+
+ # {\boldmath $mathstuff$} -> <B>mathstuff</B>
+# s/(\001\d+)\{\s*\\boldmath ?([^A-Za-z\{\}][^\{\}]*)\}/<b>$1<\/b>/g;
+
+
+sub domath {
+ local($t) = @_;
+ $t =~ s/\^(\001\d+)\{\\circ\1\}/\&\#176;/g; # ^{\circ}->degree
+ $t =~ s/\^\\circ/\&\#176;/g; # ^\circ->degree
+# $t =~ s/\^(\001\d+)\{([^\001]*)\1\}/<sup>$2<\/sup>/g; # ^{x}
+ $t =~ s/\^(\001\d+)\{(.*)\1\}/<sup>$2<\/sup>/g; # ^{x}
+ $t =~ s/\^(\w)/<sup>$1<\/sup>/g; # ^x
+# $t =~ s/\_(\001\d+)\{([^\001]*)\1\}/<sub>$2<\/sub>/g; # _{x}
+ $t =~ s/\_(\001\d+)\{(.*)\1\}/<sub>$2<\/sub>/g; # _{x}
+ $t =~ s/\_(\w)/<sub>$1<\/sub>/g; # _x
+ $t;
+}
+
+ # Handle superscripts and subscripts in inline math mode.
+ s/(\$([^\$]+)\$)/&domath($2)/ge; # $ ... $
+ s/(\\\((([^\\]|\\[^\(\)])+)\\\))/&domath($2)/ge; # \( ... \)
+
+ # Remove \mbox.
+ s/\\mbox(\001\d+)\{([^\001]*)\1\}/$2/g; # \mbox{x}
+
+ # Escape tildes protecting URLs
+ # For some reason /g doesn't work
+ while (s/(\<a href\=\"[^<]*?)\~/$1\005/g) { ; }
+ if ($opt_u) {
+ s/([^\\])~/$1 /g; # ~ non-breaking space - &#xa0;
+ s/\\\,/ /g; # \, thin space - &#x2009;
+ s/\\ldots\b\s*/…/g; # Horizontal ellipsis
+ s/\\dots\b\s*/…/g; # Horizontal ellipsis
+ } else {
+ s/([^\\])~/$1&nbsp;/g; # ~ non-breaking space
+ s/\\\,/&thinsp;/g; # \, thin space
+ s/\\ldots\b/&hellip;/g; # Horizontal ellipsis
+ s/\\dots\b/&hellip;/g; # Horizontal ellipsis
+
+ }
+ s/\005/\~/g; # Unescape tildes
+ s/\\ / /g; # \ (normal space)
+ s/\\textasciitilde\b\s*/~/g; # \textasciitilde -> ~
+
+ # Non-alphabetic macros that we keep.
+ s/\\([\#\&\%\~\_\^\|])/$1/g;
+
+ # Non-alphabetic macros that we remove.
+ # (discretionary hyphen)
+ # (italic correction)
+ s/\\\W//g;
+
+ # Clean up things we don't handle.
+# s/\\//g;
+
+ # The format {\Xyz{Abc}} is interpreted by BibTeX as a single letter
+ # whose text is given by "Abc". If we see this pattern, it is
+ # likely that discarding the \Xyz will do the right thing.
+ s/\001(\d+)\{\\[A-Za-z]+\001(\d+)\{([^\001]*)\001\2\}\001\1\}/$3/g;
+
+ # Macro names may be meaningful, so keep them and don't run them together.
+ s/\\([A-Za-z]+)/ $1 /g;
+
+ # Remove an empty <a href=...></a> tag that bad cross-referencing
+ # in the BibTeX file may have left us with.
+ s+In <a href=\"[^\"]*\"></a>++;
+
+ &doPaperLinks;
+
+ # Get rid of { } ids, and put protected { } back.
+ s/\001\d+[\{\}]//g;
+ tr/\002\003\004/{}$/;
+
+ print HTMLFILE $_;
+}
+
+close(BBLFILE);
+
+print HTMLFILE "<$list_end>\n\n$endstring\n";
+
+if ($updating) {
+ while (<OHTMLFILE>) {
+ print HTMLFILE;
+ }
+ close (OHTMLFILE);
+} else {
+ print HTMLFILE "</body></html>\n";
+}
+
+close(HTMLFILE);
+
+if (defined ($htmlfile)) {
+ #$mode &= 0777;
+ #print "setting $htmlfile$$ to $mode\n";
+ #printf("mode = %lo\n", $mode);
+
+ chmod($mode, "$htmlfile$$");
+ rename("$htmlfile$$", $htmlfile);
+}
+
+unlink(@tmpfiles);
+
+exit(0);
diff --git a/Carpet/CarpetWeb/publications/carpet-publications.aux b/Carpet/CarpetWeb/publications/carpet-publications.aux
new file mode 100644
index 000000000..e030aacba
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/carpet-publications.aux
@@ -0,0 +1,7 @@
+\relax
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\bibstyle{apsrev}
+\newlabel{LastPage}{{}{10}}
diff --git a/Carpet/CarpetWeb/publications/carpet-publications.bib b/Carpet/CarpetWeb/publications/carpet-publications.bib
new file mode 100644
index 000000000..7821f5734
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/carpet-publications.bib
@@ -0,0 +1,2040 @@
+status (refereed, preparing, theses, book, report, invited, contributed, internal, webpage)
+
+receiveddate
+OLDfulltexturl
+doi
+urn
+
+Resolve DOI's with http://dx.doi.org/
+
+
+
+********************************************************************************
+MISSING:
+********************************************************************************
+
+add DOI for Carpet-Aylott2009a
+
+add invited talk: Florida mesh refinement
+
+add Seattle2008 (September 17, 2008)
+
+add 2008 Alpaca talk
+
+maybe:
+\item E. Schnetter, \emph{Kranc: Automatic Code Generation for the
+ Cactus Framework}. Talk given at the Workshop on Automating the
+ Development of Scientific Computing Software, Baton Rouge, LA, March
+ 2008.
+
+maybe:
+\item E. Schnetter, \emph{Modelling black hole binary mergers}. Talk
+ given at Department of Physics \& Astronomy, LSU, Baton Rouge, LA,
+ April 2008.
+
+
+
+********************************************************************************
+BACKGROUND:
+********************************************************************************
+
+@InProceedings{Carpet-Goodale2002a,
+ status = {background},
+ author = {Tom Goodale and Gabrielle Allen and Gerd Lanfermann
+ and Joan Mass{\'o} and Thomas Radke and Edward
+ Seidel and John Shalf},
+ title = {The {Cactus} Framework and Toolkit: Design and
+ Applications},
+ booktitle = {Vector and Parallel Processing -- VECPAR'2002, 5th
+ International Conference, Lecture Notes in Computer
+ Science},
+ year = 2003,
+ address = {Berlin},
+ publisher = {Springer},
+ url = {http://edoc.mpg.de/3341},
+}
+
+
+
+********************************************************************************
+REFEREED:
+********************************************************************************
+
+% Schnetter-etal-03b
+@Article{Carpet-Schnetter2003a,
+ status = {refereed background},
+ author = {Erik Schnetter and Scott H. Hawley and Ian Hawke},
+ title = {Evolutions in 3D numerical relativity using fixed
+ mesh refinement},
+ journal = {Class. Quantum Grav.},
+ year = 2004,
+ volume = 21,
+ pages = {1465-1488},
+ eprint = {arXiv:gr-qc/0310042},
+ url = {http://arxiv.org/abs/gr-qc/0310042},
+ receiveddate = {2003-10-07},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/21/1465},
+ doi = {10.1088/0264-9381/21/6/014},
+}
+
+% Baiotti04b
+@Article{Carpet-Baiotti2004a,
+ status = {refereed},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla and
+ Erik Schnetter},
+ title = {Gravitational-Wave Emission from Rotating
+ Gravitational Collapse in three Dimensions},
+ journal = {Phys. Rev. Lett.},
+ year = 2005,
+ volume = 95,
+ pages = 131101,
+ eprint = {arXiv:gr-qc/0503016},
+ url = {http://arxiv.org/abs/gr-qc/0503016},
+ receiveddate = {2004-10-12},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v96/e161101},
+ doi = {10.1103/PhysRevLett.94.131101},
+}
+
+% Zink2005a
+@Article{Carpet-Zink2005a,
+ status = {refereed},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke
+ and Christian D. Ott and Erik Schnetter and Ewald
+ M{\"u}ller},
+ title = {Formation of Supermassive Black Holes through
+ Fragmentation of Torodial Supermassive Stars},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 96,
+ pages = 161101,
+ eprint = {arXiv:gr-qc/0501080},
+ url = {http://arxiv.org/abs/gr-qc/0501080},
+ receiveddate = {2005-02-11},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v96/e161101},
+ doi = {10.1103/PhysRevLett.96.161101},
+}
+
+% Sperhake2005a
+@Article{Carpet-Sperhake2005a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Bernard Kelly and Pablo Laguna
+ and Kenneth L. Smith and Erik Schnetter},
+ title = {Black hole head-on collisions and gravitational
+ waves with fixed mesh-refinement and dynamic
+ singularity excision},
+ journal = {Phys. Rev. D},
+ year = 2005,
+ volume = 71,
+ pages = 124042,
+ eprint = {arXiv:gr-qc/0503071},
+ url = {http://arxiv.org/abs/gr-qc/0503071},
+ receiveddate = {2005-03-16},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v71/e124042},
+ doi = {10.1103/PhysRevD.71.124042},
+}
+
+% Diener-etal-2006a
+@Article{Carpet-Diener2005a,
+ status = {refereed},
+ author = {Peter Diener and Frank Herrmann and Denis Pollney
+ and Erik Schnetter and Edward Seidel and Ryoji
+ Takahashi and Jonathan Thornburg and Jason
+ Ventrella},
+ title = {Accurate Evolution of Orbiting Binary Black Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 96,
+ pages = 121101,
+ eprint = {arXiv:gr-qc/0512108},
+ url = {http://arxiv.org/abs/gr-qc/0512108},
+ receiveddate = {2005-12-21},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v96/e121101},
+ doi = {10.1103/PhysRevLett.96.121101},
+}
+
+% Diener05b
+@Article{Carpet-Diener2005b,
+ status = {refereed},
+ author = {Peter Diener and Ernst Nils Dorband and Erik
+ Schnetter and Manuel Tiglio},
+ title = {Optimized high-order derivative and dissipation
+ operators satisfying summation by parts, and
+ applications in three-dimensional multi-block
+ evolutions},
+ journal = {J. Sci. Comput.},
+ year = 2007,
+ volume = 32,
+ pages = {109-145},
+ eprint = {arXiv:gr-qc/0512001},
+ url = {http://arxiv.org/abs/gr-qc/0512001},
+ receiveddate = {2005-12-22},
+ OLDfulltexturl = {http://www.springerlink.com/content/l724hr0846n2/},
+ doi = {10.1007/s10915-006-9123-7},
+}
+
+% Schnetter06a
+@Article{Carpet-Schnetter2006a,
+ status = {refereed background},
+ author = {Erik Schnetter and Peter Diener and Ernst Nils
+ Dorband and Manuel Tiglio},
+ title = {A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity},
+ journal = {Class. Quantum Grav.},
+ year = 2006,
+ volume = 23,
+ pages = {S553-S578},
+ eprint = {arXiv:gr-qc/0602104},
+ url = {http://arxiv.org/abs/gr-qc/0602104},
+ receiveddate = {2006-02-20},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/23/S553},
+ doi = {10.1088/0264-9381/23/16/S14},
+}
+
+% Sopuerta:2006bw
+@Article{Carpet-Sopuerta2006a,
+ status = {refereed},
+ author = {Carlos F. Sopuerta and Ulrich Sperhake and Pablo
+ Laguna},
+ title = {Hydro-without-Hydro Framework for Simulations of
+ Black Hole-Neutron Star Binaries},
+ journal = {Class. Quantum Grav.},
+ year = 2006,
+ volume = 23,
+ pages = {S579-S598},
+ eprint = {arXiv:gr-qc/0605018},
+ url = {http://arxiv.org/abs/gr-qc/0605018},
+ receiveddate = {2006-03-20},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/23/S579},
+ doi = {10.1088/0264-9381/23/16/S15},
+}
+
+% Schnetter-Krishnan-Beyer-2006
+@Article{Carpet-Schnetter2006b,
+ status = {refereed},
+ author = {Erik Schnetter and Badri Krishnan and Florian Beyer},
+ title = {Introduction to dynamical horizons in numerical
+ relativity},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 024028,
+ eprint = {arXiv:gr-qc/0604015},
+ url = {http://arxiv.org/abs/gr-qc/0604015},
+ receiveddate = {2006-04-11},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v74/e024028},
+ doi = {10.1103/PhysRevD.74.024028},
+}
+
+% Loeffler06a
+@Article{Carpet-Loeffler2006a,
+ status = {refereed},
+ author = {Frank L{\"o}ffler and Luciano Rezzolla and Marcus
+ Ansorg},
+ title = {Numerical evolutions of a black hole-neutron star
+ system in full General Relativity: Head-on
+ collision},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 104018,
+ eprint = {arXiv:gr-qc/0606104},
+ url = {http://arxiv.org/abs/gr-qc/0606104},
+ receiveddate = {2006-06-23},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v74/e104018},
+ doi = {10.1103/PhysRevD.74.104018},
+}
+
+% Sperhake:2006cy
+@Article{Carpet-Sperhake2006a,
+ status = {refereed},
+ author = {Ulrich Sperhake},
+ title = {Binary black-hole evolutions of excision and
+ puncture data},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 104015,
+ eprint = {arXiv:gr-qc/0606079},
+ url = {http://arxiv.org/abs/gr-qc/0606079},
+ receiveddate = {2006-06-18},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e104015},
+ doi = {10.1103/PhysRevD.76.104015},
+}
+
+@Article{Carpet-Dorband2006a,
+ status = {refereed},
+ author = {Ernst Nils Dorband and Emanuele Berti and Peter
+ Diener and Erik Schnetter and Manuel Tiglio},
+ title = {A numerical study of the quasinormal mode excitation
+ of Kerr black holes},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 084028,
+ eprint = {arXiv:gr-qc/0608091},
+ url = {http://arxiv.org/abs/gr-qc/0608091},
+ receiveddate = {2006-08-22},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v74/e084028},
+ doi = {10.1103/PhysRevD.74.084028},
+}
+
+@Article{Carpet-Baiotti2006a,
+ status = {refereed},
+ author = {Luca Baiotti and Luciano Rezzolla},
+ title = {Challenging the paradigm of singularity excision in
+ gravitational collapse},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 97,
+ pages = 141101,
+ eprint = {arXiv:gr-qc/0608113},
+ url = {http://arxiv.org/abs/gr-qc/0608113},
+ receiveddate = {2006-08-26},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v97/e141101},
+ doi = {10.1103/PhysRevLett.97.141101},
+}
+
+@Article{Carpet-Ott2006a,
+ status = {refereed},
+ author = {Christian D. Ott and Harald Dimmelmeier and Andreas
+ Marek and Hans-Thomas Janka and Ian Hawke and
+ Burkhard Zink and Erik Schnetter},
+ title = {{3D} Collapse of Rotating Stellar Iron Cores in
+ General Relativity Including Deleptonization and a
+ Nuclear Equation of State},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 261101,
+ eprint = {arXiv:astro-ph/0609819},
+ url = {http://arxiv.org/abs/astro-ph/0609819},
+ receiveddate = {2006-09-29},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v98/e261101},
+ doi = {10.1103/PhysRevLett.98.261101},
+}
+
+@Article{Carpet-Reisswig2006a,
+ status = {refereed},
+ author = {Christian Reisswig and Nigel T. Bishop and Chi Wai
+ Lai and Jonathan Thornburg and B{\'e}la
+ Szil{\'a}gyi},
+ title = {Characteristic evolutions in numerical relativity
+ using six angular patches},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S327-S339},
+ eprint = {arXiv:gr-qc/0610019},
+ url = {http://arxiv.org/abs/gr-qc/0610019},
+ receiveddate = {2006-10-05},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S327},
+ doi = {10.1088/0264-9381/24/12/S21},
+}
+
+@Article{Carpet-Bruegmann2006a,
+ status = {refereed},
+ author = {Bernd Br{\"u}gmann and Jos{\'e} A. Gonz{\'a}lez and
+ Mark Hannam and Sascha Husa and Ulrich Sperhake and
+ Wolfgang Tichy},
+ title = {Calibration of Moving Puncture Simulations},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 024027,
+ eprint = {arXiv:gr-qc/0610128},
+ url = {http://arxiv.org/abs/gr-qc/0610128},
+ receiveddate = {2006-11-03},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e024027},
+ doi = {10.1103/PhysRevD.77.024027},
+}
+
+@Article{Carpet-Zink2006a,
+ status = {refereed},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke
+ and Christian D. Ott and Erik Schnetter and Ewald
+ M{\"u}ller},
+ title = {Non-axisymmetric instability and fragmentation of
+ general relativistic quasitoroidal stars},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 024019,
+ eprint = {arXiv:astro-ph/0611601},
+ url = {http://arxiv.org/abs/astro-ph/0611601},
+ receiveddate = {2006-11-19},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e024019},
+ doi = {10.1103/PhysRevD.76.024019},
+}
+
+@Article{Carpet-Ott2006b,
+ status = {refereed},
+ author = {Christian D. Ott and Harald Dimmelmeier and Andreas
+ Marek and Hans-Thomas Janka and Burkhard Zink and
+ Ian Hawke and Erik Schnetter},
+ title = {Rotating collapse of stellar iron cores in general
+ relativity},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S139-S154},
+ eprint = {arXiv:astro-ph/0612638},
+ url = {http://arxiv.org/abs/astro-ph/0612638},
+ receiveddate = {2006-12-20},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S139},
+ doi = {10.1088/0264-9381/24/12/S10},
+}
+
+@Article{Carpet-Baiotti2006b,
+ status = {refereed},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla},
+ title = {On the gravitational radiation from the collapse of
+ neutron stars to rotating black holes},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S187-S206},
+ eprint = {arXiv:gr-qc/0701043},
+ url = {http://arxiv.org/abs/gr-qc/0701043},
+ receiveddate = {2006-12-21},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S187},
+ doi = {10.1088/0264-9381/24/12/S13},
+}
+
+@Article{Carept-Pazos2006a,
+ status = {refereed},
+ author = {Enrique Pazos and Ernst Nils Dorband and Alessandro
+ Nagar and Carlos Palenzuela and Erik Schnetter and
+ Manuel Tiglio},
+ title = {How far away is far enough for extracting numerical
+ waveforms, and how much do they depend on the
+ extraction method?},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S341-S368},
+ eprint = {arXiv:gr-qc/0612149},
+ url = {http://arxiv.org/abs/gr-qc/0612149},
+ receiveddate = {2006-12-22},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S341},
+ doi = {10.1088/0264-9381/24/12/S22},
+}
+
+@Article{Carpet-Szilagyi2006a,
+ status = {refereed},
+ author = {B{\'e}la Szil{\'a}gyi and Denis Pollney and Luciano
+ Rezzolla and Jonathan Thornburg and Jeffrey
+ Winicour},
+ title = {An explicit harmonic code for black-hole evolution
+ using excision},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S275-S293},
+ eprint = {arXiv:gr-qc/0612150},
+ url = {http://arxiv.org/abs/gr-qc/0612150},
+ receiveddate = {2006-12-22},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S275},
+ doi = {10.1088/0264-9381/24/12/S18},
+}
+
+@Article{Carpet-Baker2006a,
+ status = {refereed},
+ author = {John G. Baker and Manuela Campanelli and Frans
+ Pretorius and Yosef Zlochower},
+ title = {Comparisons of binary black hole merger waveforms},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S25-S31},
+ eprint = {arXiv:gr-qc/0701016},
+ url = {http://arxiv.org/abs/gr-qc/0701016},
+ receiveddate = {2006-12-26},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S25},
+ doi = {10.1088/0264-9381/24/12/S03},
+}
+
+% Herrmann:2006ks
+@Article{Carpet-Herrmann2007a,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre
+ M. Shoemaker and Pablo Laguna},
+ title = {Unequal mass binary black hole plunges and
+ gravitational recoil},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S33-S42},
+ eprint = {arXiv:gr-qc/0601026},
+ url = {http://arxiv.org/abs/gr-qc/0601026},
+ receiveddate = {2007-01-04},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S33},
+ doi = {10.1088/0264-9381/24/12/S04},
+}
+
+@Article{Carpet-Giacomazzo2007a,
+ status = {refereed},
+ author = {Bruno Giacomazzo and Luciano Rezzolla},
+ title = {{WhiskyMHD}: a new numerical code for general
+ relativistic magnetohydrodynamics},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S235-S258},
+ eprint = {arXiv:gr-qc/0701109},
+ url = {http://arxiv.org/abs/gr-qc/0701109},
+ receiveddate = {2007-01-20},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S235},
+ doi = {10.1088/0264-9381/24/12/S16},
+}
+
+@Article{Carpet-Marronetti2007a,
+ status = {refereed},
+ author = {Pedro Marronetti and Wolfgang Tichy and Bernd
+ Br{\"u}gmann and Jos{\'e} Gonz{\'a}lez and Mark
+ Hannam and Sascha Husa and Ulrich Sperhake},
+ title = {Binary black holes on a budget: simulations using
+ workstations},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S45-S58},
+ eprint = {arXiv:gr-qc/0701123},
+ url = {http://arxiv.org/abs/gr-qc/0701123},
+ receiveddate = {2007-01-22},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S45},
+ doi = {10.1088/0264-9381/24/12/S05},
+}
+
+@Article{Carpet-Herrmann2007b,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre
+ M. Shoemaker and Pablo Laguna and Richard
+ A. Matzner},
+ title = {Gravitational Recoil from Spinning Binary Black Hole
+ Mergers},
+ journal = {Astrophys. J.},
+ year = 2007,
+ volume = 661,
+ pages = {430-436},
+ eprint = {arXiv:gr-qc/0701143},
+ url = {http://arxiv.org/abs/gr-qc/0701143},
+ receiveddate = {2007-01-29},
+ OLDfulltexturl =
+ {http://www.journals.uchicago.edu/doi/abs/10.1086/513603},
+ doi = {10.1086/513603},
+}
+
+@Article{Carpet-Koppitz2007a,
+ status = {refereed},
+ author = {Michael Koppitz and Denis Pollney and Christian
+ Reisswig and Luciano Rezzolla and Jonathan Thornburg
+ and Peter Diener and Erik Schnetter},
+ title = {Recoil Velocities from Equal-Mass Binary-Black-Hole
+ Mergers},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 99,
+ pages = 041102,
+ eprint = {arXiv:gr-qc/0701163},
+ url = {http://arxiv.org/abs/gr-qc/0701163},
+ receiveddate = {2007-01-29},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v99/e041102},
+ doi = {10.1103/PhysRevLett.99.041102},
+}
+
+@Article{Carpet-Campanelli2007a,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower and David Merritt},
+ title = {Large Merger Recoils and Spin Flips From Generic
+ Black-Hole Binaries},
+ journal = {Astrophys. J. Lett.},
+ year = 2007,
+ volume = 659,
+ pages = {L5-L8},
+ eprint = {arXiv:gr-qc/0701164},
+ doi = {http://arxiv.org/abs/gr-qc/0701164},
+ receiveddate = {2007-02-08},
+ OLDfulltexturl =
+ {http://www.journals.uchicago.edu/doi/abs/10.1086/516712},
+}
+
+@Article{Carpet-Gonzalez2007a,
+ status = {refereed},
+ author = {Jos{\'e} A. Gonz{\'a}lez and Mark D. Hannam and
+ Ulrich Sperhake and Bernd Br{\"u}gmann and Sascha
+ Husa},
+ title = {Supermassive recoil velocities for binary black-hole
+ mergers with antialigned spins},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 231101,
+ eprint = {arXiv:gr-qc/0702052},
+ url = {http://arxiv.org/abs/gr-qc/0702052},
+ receiveddate = {2007-02-26},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v98/e231101},
+ doi = {10.1103/PhysRevLett.98.231101},
+}
+
+@Article{Carpet-Campanelli2007b,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower and David Merritt},
+ title = {Maximum gravitational recoil},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 231102,
+ eprint = {arXiv:gr-qc/0702133},
+ url = {http://arxiv.org/abs/gr-qc/0702133},
+ receiveddate = {2007-02-26},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v98/e231102},
+ doi = {10.1103/PhysRevLett.98.231102},
+}
+
+@Article{Carpet-Thornburg2007a,
+ status = {refereed},
+ author = {Jonathan Thornburg and Peter Diener and Denis
+ Pollney and Luciano Rezzolla and Erik Schnetter and
+ Ed Seidel and Ryoji Takahashi},
+ title = {Are moving punctures equivalent to moving black
+ holes?},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {3911-3918},
+ eprint = {arXiv:gr-qc/0701038},
+ url = {http://arxiv.org/abs/gr-qc/0701038},
+ receiveddate = {2007-03-22},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/3911},
+ doi = {10.1088/0264-9381/24/15/009}
+}
+
+@Article{Carpet-Ajith2007a,
+ status = {refereed},
+ author = {Parameswaran Ajith and Stanislav Babak and Yanbei
+ Chen and Martin Hewitson and Badri Krishnan and John
+ T. Whelan and Bernd Br{\"u}gmann and Peter Diener
+ and Jos{\'e} González and Mark Hannam and Sascha
+ Husa and Michael Koppitz and Denis Pollney and
+ Luciano Rezzolla and Luc{\'i}a Santamar{\'i}a and
+ Alicia M. Sintes and Ulrich Sperhake and Jonathan
+ Thornburg},
+ title = {Phenomenological template family for black-hole
+ coalescence waveforms},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S689-S699},
+ eprint = {arXiv:0704.3764 [gr-qc]},
+ url = {http://arxiv.org/abs/0704.3764},
+ receiveddate = {2007-04-30},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/24/S689},
+ doi = {10.1088/0264-9381/24/19/S31},
+}
+
+@Article{Carpet-Vaishnav2007a,
+ status = {refereed},
+ author = {Birjoo Vaishnav and Ian Hinder and Frank Herrmann
+ and Deirdre M. Shoemaker},
+ title = {Matched Filtering of Numerical Relativity Templates
+ of Spinning Binary Black Holes},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 084020,
+ eprint = {arXiv:0705.3829 [gr-qc]},
+ url = {http://arxiv.org/abs/0705.3829},
+ receiveddate = {2007-06-13},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e084020},
+ doi = {10.1103/PhysRevD.76.084020},
+}
+
+Article{CarpetResult-Grandclement2007a,
+ status = {refereed},
+ author = {Philippe Grandcl{\'e}ment and J{\'e}r{\^o}me Novak},
+ title = {Spectral Methods for Numerical Relativity},
+ journal = {Living Rev. Relativity},
+ year = 2009,
+ volume = 12,
+ eprint = {arXiv:0706.2286 [gr-qc]},
+ receiveddate = {2007-06-15},
+ fulltexturl = {http://www.livingreviews.org/lrr-2009-1},
+}
+
+@Article{Carpet-Herrmann2007c,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre
+ M. Shoemaker and Pablo Laguna and Richard
+ A. Matzner},
+ title = {Binary Black Holes: Spin Dynamics and Gravitational
+ Recoil},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 084032,
+ eprint = {arXiv:0706.2541 [gr-qc]},
+ url = {http://arxiv.org/abs/0706.2541},
+ receiveddate = {2007-06-18},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e084032},
+ doi = {10.1103/PhysRevD.76.084032},
+}
+
+@Article{Carpet-Krishnan2007a,
+ status = {refereed},
+ author = {Badri Krishnan and Carlos O. Lousto and Yosef
+ Zlochower},
+ title = {Quasi-Local Linear Momentum in Black-Hole Binaries},
+ journal = {Phys. Rev. D },
+ year = 2007,
+ volume = 76,
+ pages = {081501(R)},
+ eprint = {arXiv:0707.0876 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.0876},
+ receiveddate = {2007-07-06},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e081501},
+ doi = {10.1103/PhysRevD.76.081501},
+}
+
+@Article{Carpet-Brown2007a,
+ status = {refereed},
+ author = {David Brown and Olivier Sarbach and Erik Schnetter
+ and Manuel Tiglio and Peter Diener and Ian Hawke and
+ Denis Pollney},
+ title = {Excision without excision},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = {081503(R)},
+ eprint = {arXiv:0707.3101 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.3101},
+ receiveddate = {2007-07-20},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e081503},
+ doi = {10.1103/PhysRevD.76.081503},
+}
+
+@Article{Carpet-Bruegmann2007a,
+ status = {refereed},
+ author = {Bernd Br{\"u}gmann and Jos{\'e} A. Gonz{\'a}lez and
+ Mark Hannam and Sascha Husa and Ulrich Sperhake},
+ title = {Exploring black hole superkicks},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 124047,
+ eprint = {arXiv:0707.0135 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.0135},
+ receiveddate = {2007-08-07},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e124047},
+ doi = {10.1103/PhysRevD.77.124047},
+}
+
+% Rezzolla2007a
+@Article{Carpet-Rezzolla2007a,
+ status = {refereed},
+ author = {Luciano Rezzolla and Ernst Nils Dorband and
+ Christian Reisswig and Peter Diener and Denis
+ Pollney and Erik Schnetter and B{\'e}la
+ Szil{\'s}gyi},
+ title = {Spin Diagrams for Equal-Mass Black-Hole Binaries
+ with Aligned Spins},
+ journal = {Astrophys. J.},
+ year = 2008,
+ volume = 679,
+ pages = {1422-1426},
+ eprint = {arXiv:0708.3999 [gr-qc]},
+ url = {http://arxiv.org/abs/0708.3999},
+ receiveddate = {2007-08-29},
+ OLDfulltexturl =
+ {http://www.journals.uchicago.edu/doi/abs/10.1086/587679},
+ doi = {10.1086/587679},
+}
+
+@Article{Carpet-Lousto2007a,
+ status = {refereed},
+ author = {Carlos O. Lousto and Yosef Zlochower},
+ title = {Further insight into gravitational recoil},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 044028,
+ eprint = {arXiv:0708.4048 [gr-qc]},
+ url = {http://arxiv.org/abs/0708.4048},
+ receiveddate = {2007-08-30},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e044028},
+ doi = {10.1103/PhysRevD.77.044028},
+}
+
+@Article{Carpet-Pollney207a,
+ status = {refereed},
+ author = {Denis Pollney and Christian Reisswig and Luciano
+ Rezzolla and B{\'e}la Szil{\'a}gyi and Marcus Ansorg
+ and Barrett Deris and Peter Diener and Ernst Nils
+ Dorband and Michael Koppitz and Alessandro Nagar and
+ Erik Schnetter},
+ title = {Recoil velocities from equal-mass binary black-hole
+ mergers: a systematic investigation of spin-orbit
+ aligned configurations},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 124002,
+ eprint = {arXiv:0707.2559 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.2559},
+ receiveddate = {2007-09-06},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v76/e124002},
+ doi = {10.1103/PhysRevD.76.124002},
+}
+
+@InProceedings{Carpet-Stark2007a,
+ status = {refereed},
+ author = {Dylan Stark and Gabrielle Allen and Tom Goodale and
+ Thomas Radke and Erik Schnetter},
+ title = {An Extensible Timing Infrastructure for Adaptive
+ Large-scale Applications},
+ booktitle = {Parallel Processing and Applied Mathematics},
+ pages = {1170-1179},
+ year = 2008,
+ editor = {Roman Wyrzykowski},
+ volume = 4967,
+ series = {Lecture Notes in Computer Science},
+ publisher = {Springer},
+ eprint = {arXiv:0705.3015 [cs.PF]},
+ url = {http://arxiv.org/abs/0705.3015},
+ receiveddate = {2007-09-09},
+ OLDfulltexturl = {http://www.springerlink.com/
+ content/p7n0gl4308p65864/
+ ?p=7a20e00c017c4c4f87c070073332888e&pi=0},
+ doi = {10.1007/978-3-540-68111-3},
+}
+
+@Article{CarpetResult-Buonanno2007a,
+ status = {refereed},
+ author = {Alessandra Buonanno and Lawrence E. Kidder and Luis
+ Lehner},
+ title = {Estimating the final spin of a binary black hole
+ coalescence},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 026004,
+ eprint = {arXiv:0709.3839 [astro-ph]},
+ url = {http://arxiv.org/abs/0709.3839},
+ receiveddate = {2007-09-25},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e026004},
+}
+
+@Article{Carpet-Campanelli2007c,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower},
+ title = {Close encounters of three black holes},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = {101501(5)},
+ eprint = {arXiv:0710.0879 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.0879},
+ receiveddate = {2007-10-03},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e101501},
+ doi = {10.1103/PhysRevD.77.101501},
+}
+
+@Article{Carpet-Ajith2007b,
+ status = {refereed},
+ author = {Parameswaran Ajith and Stanislav Babak and Yanbei
+ Chen and Martin Hewitson and Badri Krishnan and
+ Alicia M. Sintes and John T. Whelan and Bernd
+ Br{\"u}gmann and Peter Diener and Ernst Nils Dorband
+ and Jos{\'e} Gonz{\'a}lez and Mark Hannam and Sascha
+ Husa and Denis Pollney and Luciano Rezzolla and
+ Luc{\'i}a Santamar{\'i}a and Ulrich Sperhake and
+ Jonathan Thornburg},
+ title = {A template bank for gravitational waveforms from
+ coalescing binary black holes: {I.} non-spinning
+ binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 104017,
+ eprint = {arXiv:0710.2335 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.2335},
+ receiveddate = {2007-10-15},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e104017},
+ doi = {10.1103/PhysRevD.77.104017},
+}
+
+@Article{Carpet-Rezzolla2007b,
+ status = {refereed},
+ author = {Luciano Rezzolla and Peter Diener and Ernst Nils
+ Dorband and Denis Pollney and Christian Reisswig and
+ Erik Schnetter and Jennifer Seiler},
+ title = {The final spin from the coalescence of aligned-spin
+ black-hole binaries},
+ journal = {Astrophys. J. Lett.},
+ year = 2008,
+ volume = 674,
+ pages = {L29-L32},
+ eprint = {arXiv:0710.3345 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.3345},
+ receiveddate = {2007-10-18},
+ OLDfulltexturl =
+ {http://www.journals.uchicago.edu/doi/abs/10.1086/528935},
+ doi = {10.1086/528935},
+}
+
+@Article{CarpetResult-Boyle2007a,
+ status = {refereed},
+ author = {Latham Boyle and Michael Kesden and Samaya Nissanke},
+ title = {Binary black hole merger: symmetry and the spin
+ expansion},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 100,
+ pages = 151101,
+ eprint = {arXiv:0709.0299 [gr-qc]},
+ url = {http://arxiv.org/abs/0709.0299},
+ receiveddate = {2007-10-22},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRL/v100/e151101},
+ doi = {10.1103/PhysRevLett.100.151101},
+}
+
+@Article{Carpet-Sperhake2007a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Emanuele Berti and Vitor Cardoso
+ and Jos{\'e} A. Gonz{\'a}lez and Bernd Br{\"u}gmann
+ and Marcus Ansorg},
+ title = {Eccentric binary black-hole mergers: The transition
+ from inspiral to plunge in general relativity},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 064069,
+ eprint = {arXiv:0710.3823 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.3823},
+ receiveddate = {2007-10-22},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.78.064069},
+ doi = {10.1103/PhysRevD.78.064069},
+}
+
+@Article{Carpet-Hinder2007a,
+ status = {refereed},
+ author = {Ian Hinder and Birjoo Vaishnav and Frank Herrmann
+ and Deirdre M. Shoemaker and Pablo Laguna},
+ title = {Circularization and Final Spin in Eccentric Binary
+ Black Hole Inspirals},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = {081502(R)},
+ eprint = {arXiv:0710.5167 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.5167},
+ receiveddate = {2007-10-31},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.77.081502},
+ doi = {10.1103/PhysRevD.77.081502},
+}
+
+@Article{Carpet-Bode2007a,
+ status = {refereed},
+ author = {Tanja Bode and Deirdre Shoemaker and Frank Herrmann
+ and Ian Hinder},
+ title = {Robustness of binary black hole mergers in the
+ presence of spurious radiation},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044027,
+ eprint = {arXiv:0711.0669 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.0669},
+ receiveddate = {2007-11-06},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.77.044027},
+ doi = {10.1103/PhysRevD.77.044027},
+}
+
+@Article{Carpet-Berti2007a,
+ status = {refereed},
+ author = {Emanuele Berti and Vitor Cardoso and Jos{\'e}
+ A. Gonz{\'a}lez and Ulrich Sperhake and Bernd
+ Br{\"u}gmann},
+ title = {Multipolar analysis of spinning binaries},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 114035,
+ eprint = {arXiv:0711.1097 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.1097},
+ receiveddate = {2007-11-07},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/25/114035},
+ doi = {10.1088/0264-9381/25/11/114035},
+}
+
+@Article{Carpet-Zink2007a,
+ status = {refereed},
+ author = {Burkhard Zink and Erik Schnetter and Manuel Tiglio},
+ title = {Multi-patch methods in general relativistic
+ astrophysics - {I.} {Hydrodynamical} flows on fixed
+ backgrounds},
+ journal = {Phys. Rev. D },
+ year = 2008,
+ volume = 77,
+ pages = 103015,
+ eprint = {arXiv:0712.0353 [astro-ph]},
+ url = {http://arxiv.org/abs/0712.0353},
+ receiveddate = {2007-12-04},
+ OLDfulltexturl = {http://link.aps.org/abstract/PRD/v77/e103015},
+ doi = {10.1103/PhysRevD.77.103015},
+}
+
+@Article{Carpet-Shoemaker2007a,
+ status = {refereed},
+ author = {Deirdre M. Shoemaker and Birjoo Vaishnav and Ian
+ Hinder and Frank Herrmann},
+ title = {Numerical relativity meets data analysis: spinning
+ binary black hole case},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 114047,
+ eprint = {arXiv:0802.4427 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.4427},
+ receiveddate = {2007-12-14},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/25/114047},
+ doi = {10.1088/0264-9381/25/11/114047},
+}
+
+@Article{Carpet-Damour2007a,
+ status = {refereed},
+ author = {Thibault Damour and Alessandro Nagar and Ernst Nils
+ Dorband and Denis Pollney and Luciano Rezzolla},
+ title = {Faithful effective-one-body waveforms of equal-mass
+ coalescing black-hole binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 084017,
+ eprint = {arXiv:0712.3003 [gr-qc]},
+ url = {http://arxiv.org/abs/0712.3003},
+ receiveddate = {2007-12-18},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.77.084017},
+ doi = {10.1103/PhysRevD.77.084017},
+}
+
+@Article{Carpet-Rezzolla2007c,
+ status = {refereed},
+ author = {Luciano Rezzolla and Enrico Barausse and Ernst Nils
+ Dorband and Denis Pollney and Christian Reisswig and
+ Jennifer Seiler and Sascha Husa},
+ title = {Final spin from the coalescence of two black holes},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044002,
+ eprint = {arXiv:0712.3541 [gr-qc]},
+ url = {http://arxiv.org/abs/0712.3541},
+ receiveddate = {2007-12-22},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.78.044002},
+ doi = {10.1103/PhysRevD.78.044002},
+}
+
+@Article{Carpet-Bentivegna2008a,
+ status = {refereed},
+ author = {Eloisa Bentivegna and Deirdre M. Shoemaker and Ian
+ Hinder and and Frank Herrmann},
+ title = {Probing the binary black hole merger regime with
+ scalar perturbations},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 124016,
+ eprint = {arXiv:0801.3478 [gr-qc]},
+ url = {http://arxiv.org/abs/0801.3478},
+ receiveddate = {2008-01-24},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.77.124016},
+ doi = {10.1103/PhysRevD.77.124016},
+}
+
+@Article{Carpet-Washik2008a,
+ status = {refereed},
+ author = {Matthew C. Washik and James Healy and Frank Herrmann
+ and Ian Hinder and Deirdre M. Shoemaker and Pablo
+ Laguna and Richard A. Matzner},
+ title = {Binary-Black-Hole Encounters, Gravitational Bursts,
+ and Maximum Final Spin},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 101,
+ pages = 061102,
+ eprint = {arXiv:0802.2520 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.2520},
+ receiveddate = {2008-02-20},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/
+ PhysRevLett.101.061102},
+ doi = {10.1103/PhysRevLett.101.061102},
+}
+
+@Article{Carpet-Seiler2008a,
+ status = {refereed},
+ author = {Jennifer Seiler and B{\'e}la Szil{\'a}gyi and Denis
+ Pollney and Luciano Rezzolla},
+ title = {Constraint-preserving boundary treatment for a
+ harmonic formulation of the Einstein equations},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 175020,
+ eprint = {arXiv:0802.3341 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.3341},
+ receiveddate = {2008-02-22},
+ OLDfulltexturl = {http://stacks.iop.org/CQG/25/175020},
+ doi = {10.1088/0264-9381/25/17/175020},
+}
+
+@Article{Carpet-Dain2008a,
+ status = {refereed},
+ author = {Sergio Dain and Carlos O. Lousto and and Yosef
+ Zlochower},
+ title = {Extra-large remnant recoil velocities and spins from
+ near-extremal-{Bowen}-{York}-spin black-hole
+ binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 024039,
+ eprint = {arXiv:0803.0351 [gr-qc]},
+ url = {http://arxiv.org/abs/0803.0351},
+ receiveddate = {2008-03-03},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.78.024039},
+ doi = {10.1103/PhysRevD.78.024039},
+}
+
+@Article{Carpet-Baiotti2008a,
+ status = {refereed},
+ author = {Luca Baiotti and Bruno Giacomazzo and Luciano
+ Rezzolla},
+ title = {Accurate evolutions of inspiralling neutron-star
+ binaries: Prompt and delayed collapse to a black
+ hole},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 084033,
+ eprint = {arXiv:0804.0594 [gr-qc]},
+ url = {http://arxiv.org/abs/0804.0594},
+ receiveddate = {2008-04-03},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.78.084033},
+ doi = {10.1103/PhysRevD.78.084033},
+}
+
+@Article{CarpetResult-Benger2007a,
+ status = {refereed},
+ author = {Werner Benger},
+ title = {Colliding galaxies, rotating neutron stars and
+ merging black holes -- visualizing high dimensional
+ datasets on arbitrary meshes},
+ journal = {New J. Phys.},
+ year = 2008,
+ volume = 10,
+ pages = 125004,
+ receiveddate = {2008-04-14},
+ url = {http://www.iop.org/EJ/
+ abstract/1367-2630/10/12/125004},
+ doi = {10.1088/1367-2630/10/12/125004},
+}
+
+@Article{Carpet-Lousto2008a,
+ status = {refereed},
+ author = {Carlos O. Lousto and Yosef Zlochower},
+ title = {Modeling gravitational recoil from precessing
+ highly-spinning unequal-mass black-hole binaries},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 064018,
+ eprint = {arXiv:0805.0159 [gr-qc]},
+ url = {http://arxiv.org/abs/0805.0159},
+ receiveddate = {2008-05-01},
+ doi = {10.1103/PhysRevD.79.064018},
+}
+
+@Article{Carpet-Gualtieri2008a,
+ status = {refereed},
+ author = {Leonardo Gualtieri and Emanuele Berti and Vitor
+ Cardoso and Ulrich Sperhake},
+ title = {Transformation of the multipolar components of
+ gravitational radiation under rotations and boosts},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044024,
+ eprint = {arXiv:0805.1017 [gr-qc]},
+ url = {http://arxiv.org/abs/0805.1017},
+ receiveddate = {2008-05-08},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.78.044024},
+ doi = {10.1103/PhysRevD.78.044024},
+}
+
+@Article{Carpet-Sperhake2008a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Vitor Cardoso and Frans
+ Pretorius and Emanuele Berti and and Jos{\'e}
+ A. Gonz{\'a}lez},
+ title = {High-Energy Collision of Two Black Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 101,
+ pages = 161101,
+ eprint = {arXiv:0806.1738 [gr-qc]},
+ url = {http://arxiv.org/abs/0806.1738},
+ receiveddate = {2008-06-10},
+ OLDfulltexturl =
+ {http://link.aps.org/doi/10.1103/PhysRevLett.101.161101},
+ doi = {10.1103/PhysRevLett.101.161101},
+}
+
+@Article{Carpet-Healy2008a,
+ status = {refereed},
+ author = {James Healy and Frank Herrmann and Ian Hinder and
+ Deirdre M. Shoemaker and Pablo Laguna and and
+ Richard A. Matzner},
+ title = {Superkicks in Hyperbolic Encounters of Binary Black
+ Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2009,
+ volume = 102,
+ pages = 041101,
+ eprint = {arXiv:0807.3292 [gr-qc]},
+ url = {http://arxiv.org/abs/0807.3292},
+ receiveddate = {2008-07-22},
+ OLDfulltexturl =
+ {http://link.aps.org/doi/10.1103/PhysRevLett.102.041101},
+ doi = {10.1103/PhysRevLett.102.041101},
+}
+
+@Article{Carpet-Campanelli2008a,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Hiroyuki
+ Nakano and Yosef Zlochower},
+ title = {Comparison of Numerical and Post-{Newtonian}
+ Waveforms for Generic Precessing Black-Hole
+ Binaries},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084010,
+ eprint = {arXiv:0808.0713 [gr-qc]},
+ url = {http://arxiv.org/abs/0808.0713},
+ receiveddate = {2008-08-05},
+ doi = {10.1103/PhysRevD.79.084010},
+}
+
+@Article{Carpet-Baiotti2008b,
+ status = {refereed},
+ author = {Luca Baiotti and Sebastiano Bernuzzi and Giovanni
+ Corvino and Roberto De Pietri and Alessandro Nagar},
+ title = {Gravitational-wave extraction from neutron-star
+ oscillations: Comparing linear and nonlinear
+ techniques},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 024002,
+ eprint = {arXiv:0808.4002 [gr-qc]},
+ url = {http://arxiv.org/abs/0808.4002},
+ receiveddate = {2008-08-27},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.79.024002},
+ doi = {10.1103/PhysRevD.79.024002},
+}
+
+@Article{Carpet-Brown2007b,
+ status = {refereed},
+ author = {David Brown and Peter Diener and Olivier Sarbach and
+ Erik Schnetter and Manuel Tiglio},
+ title = {Turduckening black holes: an analytical and
+ computational study},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 044023,
+ eprint = {arXiv:0809.3533 [gr-qc]},
+ url = {http://arxiv.org/abs/0809.3533},
+ receiveddate = {2008-09-20},
+ OLDfulltexturl = {http://link.aps.org/doi/10.1103/PhysRevD.79.044023},
+ doi = {10.1103/PhysRevD.79.044023},
+}
+
+@Article{Carpet-Korobkin2008a,
+ status = {refereed},
+ author = {Oleg Korobkin and Burak Aksoylu and Michael Holst
+ and Enrique Pazos and Manuel Tiglio},
+ title = {Solving the Einstein constraint equations on
+ multi-block triangulations using finite element
+ methods},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 145007,
+ eprint = {arXiv:0801.1823 [gr-qc]},
+ url = {http://arxiv.org/abs/0801.1823},
+ receiveddate = {2008-11-05},
+ doi = {10.1088/0264-9381/26/14/145007},
+}
+
+@Article{Carpet-Campanelli2008b,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower},
+ title = {Algebraic Classification of Numerical Spacetimes and
+ Black-Hole-Binary Remnants},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084012,
+ eprint = {arXiv:0811.3006 [gr-qc]},
+ url = {http://arxiv.org/abs/0811.3006},
+ receiveddate = {2008-11-18},
+ doi = {10.1103/PhysRevD.79.084012},
+}
+
+@Article{Carpet-Etienne2008a,
+ status = {refereed},
+ author = {Zachariah B. Etienne and Yuk Tung Liu and Stuart
+ L. Shapiro and and Thomas W. Baumgarte},
+ title = {General relativistic simulations of
+ black-hole-neutron-star mergers: Effects of
+ black-hole spin},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 044024,
+ eprint = {arXiv:0812.2245 [astro-ph]},
+ url = {http://arxiv.org/abs/0812.2245},
+ receiveddate = {2008-12-09},
+ doi = {10.1103/PhysRevD.79.044024},
+}
+
+@Article{Carpet-Rezzolla2008a,
+ status = {refereed},
+ author = {Luciano Rezzolla},
+ title = {Modelling the final state from binary black-hole
+ coalescences},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 094023,
+ eprint = {arXiv:0812.2325 [gr-qc]},
+ url = {http://arxiv.org/abs/0812.2325},
+ receiveddate = {2008-12-10},
+ doi = {10.1088/0264-9381/26/9/094023},
+}
+
+@Article{CarpetResult-Hannam2008a,
+ status = {refereed},
+ author = {Mark Hannam and Sascha Husa and John G. Baker and
+ Michael Boyle and Bernd Br{\"u}gmann and Tony Chu
+ and Nils Dorband and Frank Herrmann and Ian Hinder
+ and Bernard J. Kelly and Lawrence E. Kidder and
+ Pablo Laguna and Keith D. Matthews and James R. {van
+ Meter} and Harald P. Pfeiffer and Denis Pollney and
+ Christian Reisswig and Mark A. Scheel and Deirdre
+ Shoemaker},
+ title = {The {Samurai} Project: verifying the consistency of
+ black-hole-binary waveforms for gravitational-wave
+ detection},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084025,
+ eprint = {arXiv:0901.2437 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.2437},
+ receiveddate = {2009-01-20},
+ doi = {10.1103/PhysRevD.79.084025},
+}
+
+@Article{Carpet-Aylott2009a,
+ status = {refereed},
+ author = {Benjamin Aylott and John G. Baker and William
+ D. Boggs and Michael Boyle and Patrick R. Brady and
+ Duncan A. Brown and Bernd Br{\"u}gmann and Luisa
+ T. Buchman and Alessandra Buonanno and Laura
+ Cadonati and Jordan Camp and Manuela Campanelli and
+ Joan Centrella and Shourov Chatterji and Nelson
+ Christensen and Tony Chu and Peter Diener and Nils
+ Dorband and Zachariah B. Etienne and Joshua Faber
+ and Stephen Fairhurst and Benjamin Farr and
+ Sebastian Fischetti and Gianluca Guidi and Lisa
+ M. Goggin and Mark Hannam and Frank Herrmann and Ian
+ Hinder and Sascha Husa and Vicky Kalogera and Drew
+ Keppel and Lawrence E. Kidder and Bernard J. Kelly
+ and Badri Krishnan and Pablo Laguna and Carlos
+ O. Lousto and Ilya Mandel and Pedro Marronetti and
+ Richard Matzner and Sean T. McWilliams and Keith
+ D. Matthews and R. Adam Mercer and Satyanarayan
+ R. P. Mohapatra and Abdul H. Mrou{\'e} and Hiroyuki
+ Nakano and Evan Ochsner and Yi Pan and Larne
+ Pekowsky and Harald P. Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian
+ Reisswig and Luciano Rezzolla and Oliver Rinne and
+ Craig Robinson and Christian R{\"o}ver and Luc{\'i}a
+ Santamar{\'i}a and Bangalore Sathyaprakash and Mark
+ A. Scheel and Erik Schnetter and Jennifer Seiler and
+ Stuart L. Shapiro and Deirdre Shoemaker and Ulrich
+ Sperhake and Alexander Stroeer and Riccardo Sturani
+ and Wolfgang Tichy and Yuk Tung Liu and Marc van der
+ Sluys and James R. van Meter and Ruslan Vaulin and
+ Alberto Vecchio and John Veitch and Andrea
+ Vicer{\'e} and John T. Whelan and Yosef Zlochower},
+ title = {Testing gravitational-wave searches with numerical
+ relativity waveforms: Results from the first
+ {Numerical} {INJection} {Analysis} ({NINJA})
+ project},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 165008,
+ eprint = {arXiv:0901.4399 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.4399},
+ receiveddate = {2009-01-29},
+ doi = {10.1088/0264-9381/26/16/165008},
+}
+
+@Article{Carpet-Baiotti2009a,
+ status = {refereed},
+ author = {Luca Baiotti and Bruno Giacomazzo and Luciano
+ Rezzolla},
+ title = {Accurate evolutions of inspiralling neutron-star
+ binaries: assessment of the truncation error},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 114005,
+ eprint = {arXiv:0901.4955 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.4955},
+ receiveddate = {2009-02-02},
+ doi = {10.1088/0264-9381/26/11/114005},
+}
+
+@Article{Carpet-Cadonati2009a,
+ status = {refereed},
+ author = {Benjamin Aylott and John G. Baker and William
+ D. Boggs and Michael Boyle and Patrick R. Brady and
+ Duncan A. Brown and Bernd Br{\"u}gmann and Luisa
+ T. Buchman and Alessandra Buonanno and Laura
+ Cadonati and Jordan Camp and Manuela Campanelli and
+ Joan Centrella and Shourov Chatterji and Nelson
+ Christensen and Tony Chu and Peter Diener and Nils
+ Dorband and Zachariah B. Etienne and Joshua Faber
+ and Stephen Fairhurst and Benjamin Farr and
+ Sebastian Fischetti and Gianluca Guidi and Lisa
+ M. Goggin and Mark Hannam and Frank Herrmann and Ian
+ Hinder and Sascha Husa and Vicky Kalogera and Drew
+ Keppel and Lawrence E. Kidder and Bernard J. Kelly
+ and Badri Krishnan and Pablo Laguna and Carlos
+ O. Lousto and Ilya Mandel and Pedro Marronetti and
+ Richard Matzner and Sean T. McWilliams and Keith
+ D. Matthews and R. Adam Mercer and Satyanarayan
+ R. P. Mohapatra and Abdul H. Mrou{\'e} and Hiroyuki
+ Nakano and Evan Ochsner and Yi Pan and Larne
+ Pekowsky and Harald P. Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian
+ Reisswig and Luciano Rezzolla and Oliver Rinne and
+ Craig Robinson and Christian R{\"o}ver and Luc{\'i}a
+ Santamar{\'i}a and Bangalore Sathyaprakash and Mark
+ A. Scheel and Erik Schnetter and Jennifer Seiler and
+ Stuart L. Shapiro and Deirdre Shoemaker and Ulrich
+ Sperhake and Alexander Stroeer and Riccardo Sturani
+ and Wolfgang Tichy and Yuk Tung Liu and Marc van der
+ Sluys and James R. van Meter and Ruslan Vaulin and
+ Alberto Vecchio and John Veitch and Andrea
+ Vicer{\'e} and John T. Whelan and Yosef Zlochower},
+ title = {Status of {NINJA}: the {Numerical} {INJection}
+ {Analysis} project},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 114008,
+ eprint = {arXiv:0901.4399 [gr-qc]},
+ url = {http://arxiv.org/abs/0905.4227},
+ receiveddate = {2009-03-10},
+ fulltexturl = {http://stacks.iop.org/CQG/26/114008},
+ doi = {10.1088/0264-9381/26/11/114008}
+}
+
+@Article{Carpet-Saijo2009a,
+ author = {Motoyuki Saijo and Ian Hawke},
+ title = {Collapse of differentially rotating supermassive
+ stars: Post black hole formation},
+ journal = {Phys. Rev. D (accepted)},
+ year = 2009,
+ eprint = {arXiv:0908.3002 [gr-qc]},
+ url = {http://arxiv.org/abs/0908.3002},
+ receiveddate = {2009-08-21}
+}
+
+
+
+********************************************************************************
+SUBMITTED:
+********************************************************************************
+
+
+
+********************************************************************************
+PREPARING:
+********************************************************************************
+
+
+
+********************************************************************************
+THESIS:
+********************************************************************************
+
+@PhdThesis{Carpet-Koppitz2004a,
+ status = {thesis},
+ author = {Michael Koppitz},
+ title = {Numerical Studies Of Black Hole Initial Data},
+ school = {Universit{\"a}t Potsdam},
+ year = 2004,
+ url = {http://opus.kobv.de/ubp/volltexte/2005/134/},
+ receiveddate = 2004,
+}
+
+% Herrmann2005:PhD
+@PhdThesis{Carpet-Herrmann2005a,
+ status = {thesis},
+ author = {Frank Herrmann},
+ title = {Evolution and analysis of binary black hole
+ spacetimes},
+ school = {Universit{\"a}t Potsdam},
+ year = 2005,
+ receiveddate = 2005,
+}
+
+% Loeffler05
+@PhdThesis{Carpet-Loeffler2005a,
+ status = {thesis},
+ author = {Frank L{\"o}ffler},
+ title = {Numerical Simulations of Neutron Star-Black Hole
+ Mergers},
+ school = {Universit{\"a}t Potsdam},
+ year = 2006,
+ url = {http://opus.kobv.de/ubp/volltexte/2006/774/},
+ receiveddate = 2006,
+}
+
+@MastersThesis{Carpet-Madiraju2006a,
+ status = {thesis},
+ author = {Sasanka Madiraju},
+ title = {Performance Profiling with {Cactus} Benchmarks},
+ school = {Louisiana State University},
+ year = 2006,
+ url = {http://www.cactuscode.org/
+ Articles/Cactus_Madiraju06.pdf},
+ receiveddate = 2006,
+}
+
+@PhdThesis{Carpet-Zink2006d,
+ status = {thesis},
+ author = {Burkhard Zink},
+ title = {Black hole formation from non-axisymmetric
+ instabilities in quasi-toroidal stars},
+ school = {Technische Universit{\"a}t M{\"u}nchen},
+ year = 2006,
+ url = {http://nbn-resolving.de/urn/resolver.pl
+ ?urn=urn:nbn:de:bvb:91-diss20060623-1915123970},
+ receiveddate = 2006,
+}
+
+@PhdThesis{Carpet-Dorband2007a,
+ status = {thesis},
+ author = {Ernst Nils Dorband},
+ title = {Computing and Analyzing Gravitational Radiation in
+ Black Hole Simulations Using a New Multi-Block
+ Approach to Numerical Relativity},
+ school = {Louisiana State University},
+ year = 2007,
+ url = {http://www.cct.lsu.edu/~dorband/thesis.pdf},
+ receiveddate = 2007,
+}
+
+@PhdThesis{Carpet-Kastaun2007a,
+ status = {thesis},
+ author = {Wolfgang Kastaun},
+ title = {Developing a code for general relativistic
+ hydrodynamics with application to neutron star
+ oscillations},
+ school = {Universit{\"a}t T{\"u}bingen},
+ year = 2007,
+ url = {http://tobias-lib.ub.uni-tuebingen.de/
+ volltexte/2007/2803/},
+ receiveddate = 2007,
+}
+
+@PhdThesis{Carpet-Manca2007a,
+ status = {thesis},
+ author = {Gian Mario Manca},
+ title = {Dynamical instabilities in rapidly rotating neutron
+ star models},
+ school = {Universit{\`a} di Parma},
+ year = 2007,
+ receiveddate = 2007,
+}
+
+@PhdThesis{Carpet-Ott2007a,
+ status = {thesis},
+ author = {Christian D. Ott},
+ title = {Stellar Iron Core Collapse in \{3+1\} General
+ Relativity and The Gravitational Wave Signature of
+ Core-Collapse Supernovae},
+ school = {Universit{\"a}t Potsdam},
+ year = 2007,
+ url = {http://stellarcollapse.org/papers/thesis_final.pdf},
+ receiveddate = 2007,
+}
+
+@PhdThesis{Carpet-2007a,
+ status = {thesis},
+ author = {An{\i}l Zengino{\u{g}}lu},
+ title = {A conformal approach to numerical calculations of
+ asymptotically flat spacetimes},
+ school = {Universit{\"a}t Potsdam},
+ year = 2007,
+ eprint = {arXiv:0711.0873 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.0873},
+ receiveddate = 2007,
+}
+
+@PhdThesis{Carpet-Bentivegna2008b,
+ status = {thesis},
+ author = {Eloisa Bentivegna},
+ title = {Ringing in unison: exploring black hole coalescence
+ with quasinormal modes},
+ school = {Pennsylvania State University},
+ year = 2008,
+ url = {http://etda.libraries.psu.edu/
+ theses/approved/WorldWideIndex/ETD-2570/index.html},
+ receiveddate = 2008,
+}
+
+@MastersThesis{Carpet-Jasiulek2008a,
+ status = {thesis},
+ author = {Michael Jasiulek},
+ title = {Spin Measures on Isolated and Dynamical Horizons in
+ Numerical Relativity},
+ school = {Humboldt-Universit{\"a}t zu Berlin},
+ year = 2008,
+ receiveddate = 2008,
+}
+
+% Luca Baiotti,
+% Numerical relativity simulations of non-vacuum spacetimes in three
+% dimensions,
+% PhD thesis, SISSA, 2004.
+% [does not use Carpet]
+%
+% Bernard Kelly,
+% The Next Generation of Binary Black Hole Head-On Collisions, and their
+% Aftermath,
+% PhD thesis, Penn State University, 2004.
+% [does not use Carpet]
+%
+% Kenneth Smith,
+% Dynamic Singularity Excision in Numerical Relativity,
+% PhD thesis, Penn State University, 2004.
+% [does not use Carpet]
+%
+% Bruno Giacomazzo,
+% General Relativistic Magnetohydrodynamics: fundamental aspects and applications,
+% PhD thesis, SISSA, 2006.
+% [does not use Carpet]
+
+
+
+********************************************************************************
+BOOK:
+********************************************************************************
+
+@InCollection{Carpet-Schnetter2007a,
+ status = {book},
+ author = {Erik Schnetter and Christian D. Ott and Gabrielle
+ Allen and Peter Diener and Tom Goodale and Thomas
+ Radke and Edward Seidel and John Shalf},
+ title = {{Cactus} {Framework}: Black Holes to Gamma Ray
+ Bursts},
+ booktitle = {Petascale Computing: Algorithms and Applications},
+ pages = {507-528},
+ publisher = {Chapman \& Hall/CRC},
+ year = 2007,
+ editor = {David A. Bader},
+ series = {Computational Science Series},
+ chapter = 24,
+ eprint = {arXiv:0707.1607 [cs.DC]},
+ url = {http://arxiv.org/abs/0707.1607},
+ receiveddate = {2007-07-11},
+ isbn = 9781584889090,
+}
+
+
+
+********************************************************************************
+REPORT:
+********************************************************************************
+
+@InProceedings{Carpet-Zink2005b,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke
+ and Christian D. Ott and Erik Schnetter and Ewald
+ M{\"u}ller},
+ title = {Rotational instabilities in supermassive stars: a
+ new way to form supermassive black holes},
+ booktitle = {International Scientific Workshop on Cosmology and
+ Gravitational Physics, Thessaloniki, December 15-16,
+ 2005},
+ pages = {155-160},
+ year = 2006,
+ editor = {N. K. Spyrou and N. Stergioulas and C. Tsagas},
+ publisher = {ZITI}
+}
+
+@InProceedings{Carpet-Sperhake2006b,
+ status = {report},
+ author = {Ulrich Sperhake and Bernd Br{\"u}gmann and Jos{\'e}
+ Gonz{\'a}lez and Mark Hannam and Sascha Husa},
+ title = {Head-On collisions of different initial data},
+ booktitle = {Proceedings of the 11th Marcel Grossmann Meeting
+ (MG11) in Berlin, Germany, July 23-29, 2006},
+ year = 2007,
+ eprint = {arXiv:0705.2035 [gr-qc]},
+ url = {http://arxiv.org/abs/0705.2035},
+ receiveddate = {2006-07-23},
+}
+
+@InProceedings{Carpet-Zink2006b,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke
+ and Christian D. Ott and Erik Schnetter and Ewald
+ M{\"u}ller},
+ title = {Fragmentation of general relativistic quasi-toroidal
+ polytropes},
+ booktitle = {Proceedings of the 11th Marcel Grossmann Meeting
+ (MG11) in Berlin, Germany, July 23-29, 2006},
+ year = 2007,
+ eprint = {arXiv:0704.0431 [gr-qc]},
+ url = {http://arxiv.org/abs/0704.0431},
+ receiveddate = {2006-07-23},
+}
+
+@InProceedings{Carpet-Zink2006c,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke
+ and Christian D. Ott and Erik Schnetter and Ewald
+ M{\"u}ller},
+ title = {Supermassive Black Hole Formation through Rotational
+ Instabilities},
+ booktitle = {12th Conference on Recent Developments in Gravity
+ (NEB XII)},
+ pages = 012050,
+ year = 2007,
+ volume = 68,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-06-29},
+ url = {http://stacks.iop.org/JPConf/68/012050},
+ doi = {10.1088/1742-6596/68/1/012050},
+}
+
+@InProceedings{Carpet-Baiotti2006c,
+ status = {report},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla and
+ Erik Schnetter},
+ title = {Details on the gravitational-wave emission from
+ rotating gravitational collapse in {3D}},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012045,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012045},
+ doi = {10.1088/1742-6596/66/1/012045},
+}
+
+@InProceedings{Carpet-Sperhake2006c,
+ status = {report},
+ author = {Ulrich Sperhake},
+ title = {Black-hole binary evolutions with the {LEAN} code},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012049,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012049},
+ doi = {10.1088/1742-6596/66/1/012049},
+}
+
+@InProceedings{CarpetResult-Font2006a,
+ status = {report},
+ author = {Jos{\'e} A. Font},
+ title = {Current status of relativistic core collapse
+ simulations},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012063,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012063},
+ doi = {10.1088/1742-6596/66/1/012063},
+}
+
+@InProceedings{CarpetResult-Baker2007a,
+ status = {report},
+ author = {John G. Baker and William D. Boggs and Joan
+ M. Centrella and Bernard J. Kelly and Sean
+ T. McWilliams and James R. van Meter},
+ title = {Gravitational waves from black-hole mergers},
+ booktitle = {Proceedings of the 2007 Spring Symposium of the
+ Space Telescope Science Institute (Baltimore, MD)},
+ year = 2007,
+ pages = {(to be published)},
+ eprint = {arXiv:0708.4202 [astro-ph]},
+ url = {http://arxiv.org/abs/0708.4202},
+ receiveddate = {2007-04-23},
+}
+
+@Unpublished{Carpet-Hinder2008a,
+ status = {report},
+ author = {Ian Hinder and Frank Herrmann and Pablo Laguna and
+ Deirdre Shoemaker},
+ title = {Comparisons of eccentric binary black hole
+ simulations with post-{Newtonian} models},
+ note = {arXiv:0806.1037 [gr-qc]},
+ year = 2008,
+ receiveddate = {2008-06-05},
+ url = {http://arxiv.org/abs/0806.1037},
+}
+
+@TechReport{Carpet-Tao2008a,
+ status = {report},
+ author = {Jian Tao and Gabrielle Allen and Ian Hinder and Erik
+ Schnetter and Yosef Zlochower},
+ title = {{XiRel}: Standard Benchmarks for Numerical
+ Relativity Codes Using {Cactus} and {Carpet}},
+ institution = {Center for Computation \& Technology, Louisiana
+ State University},
+ year = 2008,
+ number = 5,
+ receiveddate = {2008-07-01},
+ url = {http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5},
+}
+
+@Unpublished{Carpet-Giacomazzo2009a,
+ status = {report},
+ author = {Bruno Giacomazzo and Luciano Rezzolla and Luca
+ Baiotti},
+ title = {The influence of magnetic fields on the
+ gravitational-wave emission from binary neutron
+ stars},
+ note = {arXiv:0901.2722v1 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-01-18},
+ url = {http://arxiv.org/abs/0901.2722},
+}
+
+@Unpublished{CarpetResult-Nakano2008a,
+ status = {report},
+ author = {Hiroyuki Nakano and Manuela Campanelli and Carlos
+ O. Lousto and Yosef Zlochower},
+ title = {Comparison of Post-{Newtonian} and Numerical
+ Evolutions of Black-Hole Binaries},
+ note = {arXiv:0901.3861 [gr-qc]},
+ year = 2009,
+ url = {http://arxiv.org/abs/0901.3861},
+ receiveddate = {2009-01-24},
+}
+
+@Unpublished{Carpet-Bode2009a,
+ status = {report},
+ author = {Tanja Bode and Pablo Laguna and Deirdre M. Shoemaker
+ and Ian Hinder and Frank Herrmann and Jirjoo
+ Vishnav},
+ title = {Binary black hole evolutions of approximate puncture
+ initial data},
+ note = {arXiv:0902.1127 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-02-06},
+ url = {http://arxiv.org/abs/0902.1127},
+}
+
+@Unpublished{Carpet-Bernuzzi2009a,
+ status = {report},
+ author = {Sebastiano Bernuzzi and Lucao Baiotti and Giovanni
+ Corvino and Roberto De Pietri and Alessandro Nagar},
+ title = {Gravitational-wave extraction from neutron-star
+ oscillations},
+ note = {arXiv:0902.2720 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-02-16},
+ url = {http://arxiv.org/abs/0902.2720},
+}
+
+@Unpublished{Carpet-Barausse2009a,
+ status = {report},
+ author = {Enrico Barausse and Luciano Rezzolla},
+ title = {Predicting the direction of the final spin from the
+ coalescence of two black holes},
+ note = {arXiv:0904.2577 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-04-16},
+ url = {http://arxiv.org/abs/0904.2577},
+}
+
+@Unpublished{Carpet-Lousto2009a,
+ status = {report},
+ author = {Carlos O. Lousto and Manuela Campanelli and Yosef
+ Zlochower},
+ title = {Remnant Masses, Spins and Recoils from the Merger of
+ Generic Black-Hole Binaries},
+ note = {arXiv:0904.3541 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-04-22},
+ url = {http://arxiv.org/abs/0904.3541},
+}
+
+@Unpublished{Carpet-Ott2009a,
+ status = {report},
+ author = {Christian D. Ott},
+ title = {Probing the Core-Collapse Supernova Mechanism with
+ Gravitational Waves},
+ note = {arXiv:0905.2797 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-05-18},
+ url = {http://arxiv.org/abs/0905.2797},
+}
+
+@Unpublished{Carpet-Healy2009b,
+ status = {report},
+ author = {James Healy and Pablo Laguna and Richard A. Matzner
+ and Deirdre M. Shoemaker},
+ title = {Final Mass and Spin of Merged Black Holes and the
+ Golden Black Hole},
+ note = {arXiv:0905.3914 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-05-24},
+ url = {http://arxiv.org/abs/0905.3914},
+}
+
+@Unpublished{Carpet-Reisswig2009a,
+ status = {report},
+ author = {Christian Reisswig and Sascha Husa and Luciano
+ Rezzolla and Ernst Nils Dorband and Denis Pollney
+ and Jennifer Seiler},
+ title = {Gravitational-wave detectability of equal-mass
+ black-hole binaries with aligned spins},
+ note = {arXiv:0907.0462 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-02},
+ url = {http://arxiv.org/abs/0907.0462},
+}
+
+@Unpublished{Carpet-Healy2009a,
+ status = {report},
+ author = {James Healy and Janna Levin and Deirdre Shoemaker},
+ title = {Zoom-Whirl Orbits in Black Hole Binaries},
+ note = {arXiv:0907.0671 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-03},
+ url = {http://arxiv.org/abs/0907.0671},
+}
+
+@Unpublished{Carpet-Lovelace2009a,
+ status = {report},
+ author = {Geoffrey Lovelace and Yanbei Chen and Michael Cohen
+ and Jeffrey D. Kaplan and Drew Keppel and Keith
+ D. Matthews and David A. Nichols and Mark A. Scheel
+ and Ulrich Sperhake},
+ title = {Momentum flow in black-hole binaries: {II.}
+ {Numerical} simulations of equal-mass, head-on
+ mergers with antiparallel spins},
+ note = {arXiv:0907.0869 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-05},
+ url = {http://arxiv.org/abs/0907.0869},
+}
+
+@Unpublished{Carpet-Sperhake2009a,
+ status = {report},
+ author = {Ulrich Sperhake and Vitor Cardoso and Frans
+ Pretorius and Emanuele Berti and Tanja Hinderer and
+ Nicolas Yunes},
+ title = {Cross section, final spin and zoom-whirl behavior in
+ high-energy black hole collisions},
+ note = {arXiv:0907.1252 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-07},
+ url = {http://arxiv.org/abs/0907.1252},
+}
+
+@Unpublished{Carpet-Reisswig2009b,
+ status = {report},
+ author = {Christian Reisswig and Nigel T. Bishop and Denis
+ Pollney and B{\'e}la Szil{\'a}gyi},
+ title = {Unambiguous determination of gravitational waveforms
+ from binary black hole mergers},
+ note = {arXiv:0907.2637 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-15},
+ url = {http://arxiv.org/abs/0907.2637},
+}
+
+@Unpublished{Carpet-Vega2009a,
+ status = {report},
+ author = {Ian Vega and Peter Diener and Wolfgang Tichy and
+ Steven Detweiler},
+ title = {Self-force with (3+1) codes: a primer for numerical
+ relativists},
+ note = {arXiv:0908.2138 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-08-13},
+ url = {http://arxiv.org/abs/0908.2138},
+}
+
+
+
+********************************************************************************
+INVITED:
+********************************************************************************
+
+
+
+********************************************************************************
+CONTRIBUTED:
+********************************************************************************
+
+
+
+********************************************************************************
+INTERNAL:
+********************************************************************************
+
+
+
+********************************************************************************
+WEBPAGE:
+********************************************************************************
+
+@Misc{Carpet-cactusweb,
+ status = {webpage},
+ title = {{Cactus} {Computational} {Toolkit}},
+ url = {http://www.cactuscode.org/},
+}
+
+@Misc{Carpet-carpetweb,
+ status = {webpage},
+ title = {Mesh Refinement with {Carpet}},
+ url = {http://www.carpetcode.org/},
+}
+
+
+
+********************************************************************************
diff --git a/Carpet/CarpetWeb/publications/carpet-publications.log b/Carpet/CarpetWeb/publications/carpet-publications.log
new file mode 100644
index 000000000..3a17dfc3b
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/carpet-publications.log
@@ -0,0 +1,214 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/carpet-publications.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/carpet-publication
+s.tex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/11pt.rtx
+File: 11pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/carpet-publication
+s.aux)
+\openout1 = `carpet-publications.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 24.
+LaTeX Font Info: ... okay on input line 24.
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 24.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 24.
+Class revtex4 Info: cite was not loaded (OK!) on input line 24.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 24.
+\big@size=\dimen103
+LaTeX Font Info: Font shape `OT1/ppl/bx/n' in size <17.28> not available
+(Font) Font shape `OT1/ppl/b/n' tried instead on input line 26.
+LaTeX Font Info: Font shape `OT1/ppl/bx/n' in size <12> not available
+(Font) Font shape `OT1/ppl/b/n' tried instead on input line 32.
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-backgrou
+nd.bibitems
+LaTeX Font Info: Try loading font information for OML+zplm on input line 27.
+
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 27.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 27.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 27.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)
+LaTeX Font Info: Font shape `OT1/ppl/bx/n' in size <10.95> not available
+(Font) Font shape `OT1/ppl/b/n' tried instead on input line 37.
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-webpage.
+bibitems)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-refereed
+.bibitems [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+[2]
+Underfull \hbox (badness 1577) in paragraph at lines 403--412
+\OT1/ppl/m/it/10.95 from near-extremal-Bowen-York-spin black-hole bi-na-ries\OT
+1/ppl/m/n/10.95 , Phys. Rev. D \OT1/ppl/b/n/10.95 78\OT1/ppl/m/n/10.95 , 024039
+ (2008),
+ []
+
+[3] [4] [5] [6])
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-book.bib
+items)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-thesis.b
+ibitems [7]
+LaTeX Font Info: Try loading font information for OMS+ppl on input line 53.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/omsppl.fd
+File: omsppl.fd
+)
+LaTeX Font Info: Font shape `OMS/ppl/m/it' in size <10.95> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 53.
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-report.b
+ibitems [8]
+Underfull \hbox (badness 1194) in paragraph at lines 77--83
+[]\OT1/ppl/m/n/10.95 J. Healy, J. Levin, and D. Shoe-maker, \OT1/ppl/m/it/10.95
+ Zoom-whirl or-bits in black hole bi-na-ries \OT1/ppl/m/n/10.95 (2009),
+ []
+
+[9]) [10]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/carpet-publication
+s.aux) )
+Here is how much of TeX's memory you used:
+ 2247 strings out of 94073
+ 29343 string characters out of 1164798
+ 92868 words of memory out of 1500000
+ 5528 multiletter control sequences out of 10000+50000
+ 16601 words of font info for 45 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,290b,245s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/sh
+are/texmf-dist/fonts/type1/bluesky/cm/cmsy10.pfb></opt/local/share/texmf-dist/f
+onts/type1/urw/palatino/uplb8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw
+/palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/palatino/uplr
+i8a.pfb>
+Output written on carpet-publications.pdf (10 pages, 99221 bytes).
+PDF statistics:
+ 52 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/carpet-publications.pdf b/Carpet/CarpetWeb/publications/carpet-publications.pdf
new file mode 100644
index 000000000..216cc5bac
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/carpet-publications.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/carpet-publications.tex b/Carpet/CarpetWeb/publications/carpet-publications.tex
new file mode 100644
index 000000000..f1211bdf4
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/carpet-publications.tex
@@ -0,0 +1,81 @@
+\documentclass[11pt, tightenlines]{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+\usepackage{url}
+\urlstyle{rm}
+
+% \textwidth = 6.5 in
+% \textheight = 9.1 in
+% \oddsidemargin = 0.0 in
+% \evensidemargin = 0.0 in
+% \topmargin = 0.0 in
+% \headheight = 0.0 in
+% \headsep = 0.0 in
+% \parskip = 0.1in
+% \parindent = 0.0in
+
+% Included bibliographies
+\newcommand{\blurb}[2][]{\frenchspacing\item}
+
+\pagestyle{empty}
+
+\begin{document}
+
+{\LARGE\bf Carpet Publications}
+
+
+
+\hrulefill
+
+{\large\bf Background Publications and Web Pages}
+
+\begin{enumerate}
+ \input{citations-background.bibitems}
+ \input{citations-webpage.bibitems}
+\end{enumerate}
+
+
+
+\hrulefill
+
+{\large\bf Publications in Refereed Journals}
+
+\begin{enumerate}
+ \input{citations-refereed.bibitems}
+\end{enumerate}
+
+
+
+\hrulefill
+
+{\large\bf Book Chapters}
+
+\begin{enumerate}
+ \input{citations-book.bibitems}
+\end{enumerate}
+
+
+
+\hrulefill
+
+{\large\bf Theses}
+
+\begin{enumerate}
+ \input{citations-thesis.bibitems}
+\end{enumerate}
+
+
+
+\hrulefill
+
+{\large\bf Conference Proceedings and Technical Reports}
+
+\begin{enumerate}
+ \input{citations-report.bibitems}
+\end{enumerate}
+
+
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-background.aux b/Carpet/CarpetWeb/publications/citations-background.aux
new file mode 100644
index 000000000..277d60c6b
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.aux
@@ -0,0 +1,15 @@
+\relax
+\citation{*}
+\bibdata{citations-background}
+\bibcite{carpet-goodale2002a}{{1}{2003}{{Goodale et~al.}}{{Goodale, Allen, Lanfermann, Mass{\'o}, Radke, Seidel, and Shalf}}}
+\bibcite{carpet-schnetter2006a}{{2}{2006}{{Schnetter et~al.}}{{Schnetter, Diener, Dorband, and Tiglio}}}
+\bibcite{carpet-schnetter2003a}{{3}{2004}{{Schnetter et~al.}}{{Schnetter, Hawley, and Hawke}}}
+\global \chardef \firstnote@num3\relax
+\bibstyle{apsrev-titles-manyauthors}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\newlabel{LastBibItem}{{3}{1}{}{}{}}
+\newlabel{LastPage}{{}{1}}
diff --git a/Carpet/CarpetWeb/publications/citations-background.bbl b/Carpet/CarpetWeb/publications/citations-background.bbl
new file mode 100644
index 000000000..3d946f071
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.bbl
@@ -0,0 +1,53 @@
+\begin{thebibliography}{3}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{\citenamefont{Goodale et~al.}(2003)\citenamefont{Goodale, Allen,
+ Lanfermann, Mass{\'o}, Radke, Seidel, and Shalf}}]{carpet-goodale2002a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Lanfermann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Mass{\'o}}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Shalf}},
+ \emph{\bibinfo{title}{The {Cactus} framework and toolkit: Design and
+ applications}}, in \emph{\bibinfo{booktitle}{Vector and Parallel Processing
+ -- VECPAR'2002, 5th International Conference, Lecture Notes in Computer
+ Science}} (\bibinfo{publisher}{Springer}, \bibinfo{address}{Berlin},
+ \bibinfo{year}{2003}), \urlprefix\url{http://edoc.mpg.de/3341}.
+
+\bibitem[{\citenamefont{Schnetter et~al.}(2006)\citenamefont{Schnetter, Diener,
+ Dorband, and Tiglio}}]{carpet-schnetter2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S553}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0602104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0602104}.
+
+\bibitem[{\citenamefont{Schnetter et~al.}(2004)\citenamefont{Schnetter, Hawley,
+ and Hawke}}]{carpet-schnetter2003a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{S.~H.} \bibnamefont{Hawley}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \emph{\bibinfo{title}{Evolutions in 3d numerical relativity using fixed mesh
+ refinement}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{1465} (\bibinfo{year}{2004}),
+ \eprint{arXiv:gr-qc/0310042},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0310042}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-background.bib b/Carpet/CarpetWeb/publications/citations-background.bib
new file mode 100644
index 000000000..2b5e78ee4
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.bib
@@ -0,0 +1,49 @@
+
+@InProceedings{ carpet-goodale2002a,
+ status = {background},
+ author = {Tom Goodale and Gabrielle Allen and Gerd Lanfermann and
+ Joan Mass{\'o} and Thomas Radke and Edward Seidel and John
+ Shalf},
+ title = {The {Cactus} Framework and Toolkit: Design and
+ Applications},
+ booktitle = {Vector and Parallel Processing -- VECPAR'2002, 5th
+ International Conference, Lecture Notes in Computer
+ Science},
+ year = 2003,
+ address = {Berlin},
+ publisher = {Springer},
+ url = {http://edoc.mpg.de/3341}
+}
+
+@Article{ carpet-schnetter2006a,
+ status = {refereed background},
+ author = {Erik Schnetter and Peter Diener and Ernst Nils Dorband and
+ Manuel Tiglio},
+ title = {A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity},
+ journal = {Class. Quantum Grav.},
+ year = 2006,
+ volume = 23,
+ pages = {S553-S578},
+ eprint = {arXiv:gr-qc/0602104},
+ url = {http://arxiv.org/abs/gr-qc/0602104},
+ receiveddate = {2006-02-20},
+ oldfulltexturl= {http://stacks.iop.org/CQG/23/S553},
+ doi = {10.1088/0264-9381/23/16/S14}
+}
+
+@Article{ carpet-schnetter2003a,
+ status = {refereed background},
+ author = {Erik Schnetter and Scott H. Hawley and Ian Hawke},
+ title = {Evolutions in 3D numerical relativity using fixed mesh
+ refinement},
+ journal = {Class. Quantum Grav.},
+ year = 2004,
+ volume = 21,
+ pages = {1465-1488},
+ eprint = {arXiv:gr-qc/0310042},
+ url = {http://arxiv.org/abs/gr-qc/0310042},
+ receiveddate = {2003-10-07},
+ oldfulltexturl= {http://stacks.iop.org/CQG/21/1465},
+ doi = {10.1088/0264-9381/21/6/014}
+}
diff --git a/Carpet/CarpetWeb/publications/citations-background.bibitems b/Carpet/CarpetWeb/publications/citations-background.bibitems
new file mode 100644
index 000000000..5cbc6373a
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.bibitems
@@ -0,0 +1,51 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{\citenamefont{Goodale et~al.}(2003)\citenamefont{Goodale, Allen,
+ Lanfermann, Mass{\'o}, Radke, Seidel, and Shalf}}]{carpet-goodale2002a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Lanfermann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Mass{\'o}}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Shalf}},
+ \emph{\bibinfo{title}{The {Cactus} framework and toolkit: Design and
+ applications}}, in \emph{\bibinfo{booktitle}{Vector and Parallel Processing
+ -- VECPAR'2002, 5th International Conference, Lecture Notes in Computer
+ Science}} (\bibinfo{publisher}{Springer}, \bibinfo{address}{Berlin},
+ \bibinfo{year}{2003}), \urlprefix\url{http://edoc.mpg.de/3341}.
+
+\blurb[{\citenamefont{Schnetter et~al.}(2006)\citenamefont{Schnetter, Diener,
+ Dorband, and Tiglio}}]{carpet-schnetter2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S553}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0602104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0602104}.
+
+\blurb[{\citenamefont{Schnetter et~al.}(2004)\citenamefont{Schnetter, Hawley,
+ and Hawke}}]{carpet-schnetter2003a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{S.~H.} \bibnamefont{Hawley}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \emph{\bibinfo{title}{Evolutions in 3d numerical relativity using fixed mesh
+ refinement}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{1465} (\bibinfo{year}{2004}),
+ \eprint{arXiv:gr-qc/0310042},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0310042}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-background.blg b/Carpet/CarpetWeb/publications/citations-background.blg
new file mode 100644
index 000000000..d9f08e695
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-background.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-background.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 3 entries,
+ 3482 wiz_defined-function locations,
+ 1182 strings with 10913 characters,
+and the built_in function-call counts, 2785 in all, are:
+= -- 133
+> -- 115
+< -- 14
++ -- 104
+- -- 28
+* -- 415
+:= -- 271
+add.period$ -- 3
+call.type$ -- 3
+change.case$ -- 15
+chr.to.int$ -- 3
+cite$ -- 3
+duplicate$ -- 255
+empty$ -- 230
+format.name$ -- 65
+if$ -- 508
+int.to.chr$ -- 1
+int.to.str$ -- 4
+missing$ -- 40
+newline$ -- 24
+num.names$ -- 9
+pop$ -- 70
+preamble$ -- 1
+purify$ -- 12
+quote$ -- 0
+skip$ -- 91
+stack$ -- 0
+substring$ -- 63
+swap$ -- 214
+text.length$ -- 14
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 18
+warning$ -- 0
+while$ -- 8
+width$ -- 0
+write$ -- 51
diff --git a/Carpet/CarpetWeb/publications/citations-background.html-updated b/Carpet/CarpetWeb/publications/citations-background.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-background.log b/Carpet/CarpetWeb/publications/citations-background.log
new file mode 100644
index 000000000..cf3aa7a98
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.log
@@ -0,0 +1,197 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-background.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-backgrou
+nd.tex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-backgrou
+nd.aux)
+\openout1 = `citations-background.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-backgrou
+nd.bbl
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 28.
+ (/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 28.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 28.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 28.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 28.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 28.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)
+LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <9> not available
+(Font) Font shape `T1/ppl/b/n' tried instead on input line 38.
+) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-backgrou
+nd.aux) )
+Here is how much of TeX's memory you used:
+ 2449 strings out of 94073
+ 30383 string characters out of 1164798
+ 86906 words of memory out of 1500000
+ 5739 multiletter control sequences out of 10000+50000
+ 16600 words of font info for 39 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,334b,263s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}{/opt/local/s
+hare/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}</opt/local/share/texm
+f-dist/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/fo
+nts/type1/urw/palatino/uplb8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/
+palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/palatino/uplri
+8a.pfb>
+Output written on citations-background.pdf (1 page, 81385 bytes).
+PDF statistics:
+ 24 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-background.pdf b/Carpet/CarpetWeb/publications/citations-background.pdf
new file mode 100644
index 000000000..9dee86b29
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-background.tex b/Carpet/CarpetWeb/publications/citations-background.tex
new file mode 100644
index 000000000..bfc18cba4
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-background.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-background}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-book.aux b/Carpet/CarpetWeb/publications/citations-book.aux
new file mode 100644
index 000000000..1b47498d6
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.aux
@@ -0,0 +1,13 @@
+\relax
+\citation{*}
+\bibdata{citations-book}
+\bibcite{carpet-schnetter2007a}{{1}{2007}{{Schnetter et~al.}}{{Schnetter, Ott, Allen, Diener, Goodale, Radke, Seidel, and Shalf}}}
+\global \chardef \firstnote@num1\relax
+\bibstyle{apsrev-titles-manyauthors}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\newlabel{LastBibItem}{{1}{1}{}{}{}}
+\newlabel{LastPage}{{}{1}}
diff --git a/Carpet/CarpetWeb/publications/citations-book.bbl b/Carpet/CarpetWeb/publications/citations-book.bbl
new file mode 100644
index 000000000..6c885f04f
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.bbl
@@ -0,0 +1,34 @@
+\begin{thebibliography}{1}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{\citenamefont{Schnetter et~al.}(2007)\citenamefont{Schnetter, Ott,
+ Allen, Diener, Goodale, Radke, Seidel, and Shalf}}]{carpet-schnetter2007a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Shalf}},
+ \emph{\bibinfo{title}{{Cactus} {Framework}: Black holes to gamma ray
+ bursts}}, in \emph{\bibinfo{booktitle}{Petascale Computing: Algorithms and
+ Applications}}, edited by \bibinfo{editor}{\bibfnamefont{D.~A.}
+ \bibnamefont{Bader}} (\bibinfo{publisher}{Chapman \& Hall/CRC},
+ \bibinfo{year}{2007}), Computational Science Series,
+ chap.~\bibinfo{chapter}{24}, pp. \bibinfo{pages}{507--528}, ISBN
+ \bibinfo{isbn}{9781584889090}, \eprint{arXiv:0707.1607 [cs.DC]},
+ \urlprefix\url{http://arxiv.org/abs/0707.1607}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-book.bib b/Carpet/CarpetWeb/publications/citations-book.bib
new file mode 100644
index 000000000..f29fc0c4f
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.bib
@@ -0,0 +1,19 @@
+
+@InCollection{ carpet-schnetter2007a,
+ status = {book},
+ author = {Erik Schnetter and Christian D. Ott and Gabrielle Allen
+ and Peter Diener and Tom Goodale and Thomas Radke and
+ Edward Seidel and John Shalf},
+ title = {{Cactus} {Framework}: Black Holes to Gamma Ray Bursts},
+ booktitle = {Petascale Computing: Algorithms and Applications},
+ pages = {507-528},
+ publisher = {Chapman \& Hall/CRC},
+ year = 2007,
+ editor = {David A. Bader},
+ series = {Computational Science Series},
+ chapter = 24,
+ eprint = {arXiv:0707.1607 [cs.DC]},
+ url = {http://arxiv.org/abs/0707.1607},
+ receiveddate = {2007-07-11},
+ isbn = 9781584889090
+}
diff --git a/Carpet/CarpetWeb/publications/citations-book.bibitems b/Carpet/CarpetWeb/publications/citations-book.bibitems
new file mode 100644
index 000000000..b8c37e24a
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.bibitems
@@ -0,0 +1,32 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{\citenamefont{Schnetter et~al.}(2007)\citenamefont{Schnetter, Ott,
+ Allen, Diener, Goodale, Radke, Seidel, and Shalf}}]{carpet-schnetter2007a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Shalf}},
+ \emph{\bibinfo{title}{{Cactus} {Framework}: Black holes to gamma ray
+ bursts}}, in \emph{\bibinfo{booktitle}{Petascale Computing: Algorithms and
+ Applications}}, edited by \bibinfo{editor}{\bibfnamefont{D.~A.}
+ \bibnamefont{Bader}} (\bibinfo{publisher}{Chapman \& Hall/CRC},
+ \bibinfo{year}{2007}), Computational Science Series,
+ chap.~\bibinfo{chapter}{24}, pp. \bibinfo{pages}{507--528}, ISBN
+ \bibinfo{isbn}{9781584889090}, \eprint{arXiv:0707.1607 [cs.DC]},
+ \urlprefix\url{http://arxiv.org/abs/0707.1607}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-book.blg b/Carpet/CarpetWeb/publications/citations-book.blg
new file mode 100644
index 000000000..1b141dfaf
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-book.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-book.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 1 entry,
+ 3482 wiz_defined-function locations,
+ 1170 strings with 10483 characters,
+and the built_in function-call counts, 1511 in all, are:
+= -- 69
+> -- 68
+< -- 11
++ -- 61
+- -- 17
+* -- 230
+:= -- 137
+add.period$ -- 1
+call.type$ -- 1
+change.case$ -- 5
+chr.to.int$ -- 1
+cite$ -- 1
+duplicate$ -- 131
+empty$ -- 120
+format.name$ -- 38
+if$ -- 278
+int.to.chr$ -- 1
+int.to.str$ -- 2
+missing$ -- 18
+newline$ -- 18
+num.names$ -- 4
+pop$ -- 24
+preamble$ -- 1
+purify$ -- 4
+quote$ -- 0
+skip$ -- 53
+stack$ -- 0
+substring$ -- 39
+swap$ -- 127
+text.length$ -- 11
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 6
+warning$ -- 0
+while$ -- 5
+width$ -- 0
+write$ -- 29
diff --git a/Carpet/CarpetWeb/publications/citations-book.html-updated b/Carpet/CarpetWeb/publications/citations-book.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-book.log b/Carpet/CarpetWeb/publications/citations-book.log
new file mode 100644
index 000000000..45c61692f
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.log
@@ -0,0 +1,192 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-book.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-book.tex
+(/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-book.aux
+)
+\openout1 = `citations-book.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-book.bbl
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 32.
+(/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 32.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 32.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 32.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 32.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 32.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-book.aux
+) )
+Here is how much of TeX's memory you used:
+ 2443 strings out of 94073
+ 30236 string characters out of 1164798
+ 85894 words of memory out of 1500000
+ 5735 multiletter control sequences out of 10000+50000
+ 15151 words of font info for 37 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,306b,259s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/opt/
+local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/share/texmf-dist
+/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/fonts/ty
+pe1/urw/palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/palati
+no/uplri8a.pfb>
+Output written on citations-book.pdf (1 page, 65000 bytes).
+PDF statistics:
+ 20 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-book.pdf b/Carpet/CarpetWeb/publications/citations-book.pdf
new file mode 100644
index 000000000..c7c9a8f72
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-book.tex b/Carpet/CarpetWeb/publications/citations-book.tex
new file mode 100644
index 000000000..818709ccd
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-book.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-book}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.aux b/Carpet/CarpetWeb/publications/citations-refereed.aux
new file mode 100644
index 000000000..02df98353
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.aux
@@ -0,0 +1,87 @@
+\relax
+\citation{*}
+\bibdata{citations-refereed}
+\bibcite{carpet-cadonati2009a}{{1}{2009{}}{{Aylott et~al.}}{{Aylott, Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati, Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband, Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann, Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto, Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra, Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius, Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a, Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake, Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio, Veitch, Vicer{\'e}, Whelan, and Zlochower}}}
+\bibcite{carpet-baiotti2009a}{{2}{2009{}}{{Baiotti et~al.}}{{Baiotti, Giacomazzo, and Rezzolla}}}
+\bibcite{carpet-aylott2009a}{{3}{2009{}}{{Aylott et~al.}}{{Aylott, Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati, Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband, Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann, Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto, Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra, Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius, Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a, Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake, Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio, Veitch, Vicer{\'e}, Whelan, and Zlochower}}}
+\bibcite{carpetresult-hannam2008a}{{4}{2009}{{Hannam et~al.}}{{Hannam, Husa, Baker, Boyle, Br{\"u}gmann, Chu, Dorband, Herrmann, Hinder, Kelly, Kidder, Laguna, Matthews, {van Meter}, Pfeiffer, Pollney, Reisswig, Scheel, and Shoemaker}}}
+\bibcite{carpet-rezzolla2008a}{{5}{2009}{{Rezzolla}}{{}}}
+\bibcite{carpet-etienne2008a}{{6}{2009}{{Etienne et~al.}}{{Etienne, Liu, Shapiro, , and Baumgarte}}}
+\bibcite{carpet-campanelli2008b}{{7}{2009{}}{{Campanelli et~al.}}{{Campanelli, Lousto, and Zlochower}}}
+\bibcite{carpet-korobkin2008a}{{8}{2009}{{Korobkin et~al.}}{{Korobkin, Aksoylu, Holst, Pazos, and Tiglio}}}
+\bibcite{carpet-brown2007b}{{9}{2009}{{Brown et~al.}}{{Brown, Diener, Sarbach, Schnetter, and Tiglio}}}
+\bibcite{carpet-baiotti2008b}{{10}{2009{}}{{Baiotti et~al.}}{{Baiotti, Bernuzzi, Corvino, Pietri, and Nagar}}}
+\bibcite{carpet-campanelli2008a}{{11}{2009{}}{{Campanelli et~al.}}{{Campanelli, Lousto, Nakano, and Zlochower}}}
+\bibcite{carpet-healy2008a}{{12}{2009}{{Healy et~al.}}{{Healy, Herrmann, Hinder, Shoemaker, Laguna, , and Matzner}}}
+\bibcite{carpet-sperhake2008a}{{13}{2008{}}{{Sperhake et~al.}}{{Sperhake, Cardoso, Pretorius, Berti, , and Gonz{\'a}lez}}}
+\bibcite{carpet-gualtieri2008a}{{14}{2008}{{Gualtieri et~al.}}{{Gualtieri, Berti, Cardoso, and Sperhake}}}
+\bibcite{carpet-lousto2008a}{{15}{2009}{{Lousto and Zlochower}}{{}}}
+\bibcite{carpetresult-benger2007a}{{16}{2008}{{Benger}}{{}}}
+\bibcite{carpet-baiotti2008a}{{17}{2008}{{Baiotti et~al.}}{{Baiotti, Giacomazzo, and Rezzolla}}}
+\bibcite{carpet-dain2008a}{{18}{2008}{{Dain et~al.}}{{Dain, Lousto, , and Zlochower}}}
+\bibcite{carpet-seiler2008a}{{19}{2008}{{Seiler et~al.}}{{Seiler, Szil{\'a}gyi, Pollney, and Rezzolla}}}
+\bibcite{carpet-washik2008a}{{20}{2008}{{Washik et~al.}}{{Washik, Healy, Herrmann, Hinder, Shoemaker, Laguna, and Matzner}}}
+\bibcite{carpet-bentivegna2008a}{{21}{2008}{{Bentivegna et~al.}}{{Bentivegna, Shoemaker, Hinder, , and Herrmann}}}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\bibcite{carpet-rezzolla2007c}{{22}{2008{}}{{Rezzolla et~al.}}{{Rezzolla, Barausse, Dorband, Pollney, Reisswig, Seiler, and Husa}}}
+\bibcite{carpet-damour2007a}{{23}{2008}{{Damour et~al.}}{{Damour, Nagar, Dorband, Pollney, and Rezzolla}}}
+\bibcite{carpet-shoemaker2007a}{{24}{2008}{{Shoemaker et~al.}}{{Shoemaker, Vaishnav, Hinder, and Herrmann}}}
+\bibcite{carpet-zink2007a}{{25}{2008}{{Zink et~al.}}{{Zink, Schnetter, and Tiglio}}}
+\bibcite{carpet-berti2007a}{{26}{2008}{{Berti et~al.}}{{Berti, Cardoso, Gonz{\'a}lez, Sperhake, and Br{\"u}gmann}}}
+\bibcite{carpet-bode2007a}{{27}{2008}{{Bode et~al.}}{{Bode, Shoemaker, Herrmann, and Hinder}}}
+\bibcite{carpet-hinder2007a}{{28}{2008}{{Hinder et~al.}}{{Hinder, Vaishnav, Herrmann, Shoemaker, and Laguna}}}
+\bibcite{carpetresult-boyle2007a}{{29}{2008}{{Boyle et~al.}}{{Boyle, Kesden, and Nissanke}}}
+\bibcite{carpet-sperhake2007a}{{30}{2008{}}{{Sperhake et~al.}}{{Sperhake, Berti, Cardoso, Gonz{\'a}lez, Br{\"u}gmann, and Ansorg}}}
+\bibcite{carpet-rezzolla2007b}{{31}{2008{}}{{Rezzolla et~al.}}{{Rezzolla, Diener, Dorband, Pollney, Reisswig, Schnetter, and Seiler}}}
+\bibcite{carpet-ajith2007b}{{32}{2008}{{Ajith et~al.}}{{Ajith, Babak, Chen, Hewitson, Krishnan, Sintes, Whelan, Br{\"u}gmann, Diener, Dorband, Gonz{\'a}lez, Hannam, Husa, Pollney, Rezzolla, Santamar{\'i}a, Sperhake, and Thornburg}}}
+\bibcite{carpet-campanelli2007c}{{33}{2008}{{Campanelli et~al.}}{{Campanelli, Lousto, and Zlochower}}}
+\bibcite{carpetresult-buonanno2007a}{{34}{2008}{{Buonanno et~al.}}{{Buonanno, Kidder, and Lehner}}}
+\bibcite{carpet-stark2007a}{{35}{2008}{{Stark et~al.}}{{Stark, Allen, Goodale, Radke, and Schnetter}}}
+\bibcite{carpet-pollney207a}{{36}{2007}{{Pollney et~al.}}{{Pollney, Reisswig, Rezzolla, Szil{\'a}gyi, Ansorg, Deris, Diener, Dorband, Koppitz, Nagar, and Schnetter}}}
+\bibcite{carpet-lousto2007a}{{37}{2008}{{Lousto and Zlochower}}{{}}}
+\bibcite{carpet-rezzolla2007a}{{38}{2008{}}{{Rezzolla et~al.}}{{Rezzolla, Dorband, Reisswig, Diener, Pollney, Schnetter, and Szil{\'s}gyi}}}
+\bibcite{carpet-bruegmann2007a}{{39}{2008{}}{{Br{\"u}gmann et~al.}}{{Br{\"u}gmann, Gonz{\'a}lez, Hannam, Husa, and Sperhake}}}
+\bibcite{carpet-brown2007a}{{40}{2007}{{Brown et~al.}}{{Brown, Sarbach, Schnetter, Tiglio, Diener, Hawke, and Pollney}}}
+\bibcite{carpet-krishnan2007a}{{41}{2007}{{Krishnan et~al.}}{{Krishnan, Lousto, and Zlochower}}}
+\bibcite{carpet-herrmann2007c}{{42}{2007{}}{{Herrmann et~al.}}{{Herrmann, Hinder, Shoemaker, Laguna, and Matzner}}}
+\bibcite{carpet-vaishnav2007a}{{43}{2007}{{Vaishnav et~al.}}{{Vaishnav, Hinder, Herrmann, and Shoemaker}}}
+\bibcite{carpet-ajith2007a}{{44}{2007}{{Ajith et~al.}}{{Ajith, Babak, Chen, Hewitson, Krishnan, Whelan, Br{\"u}gmann, Diener, Gonz\~A\IeC {\textexclamdown }lez, Hannam, Husa, Koppitz, Pollney, Rezzolla, Santamar{\'i}a, Sintes, Sperhake, and Thornburg}}}
+\bibcite{carpet-thornburg2007a}{{45}{2007}{{Thornburg et~al.}}{{Thornburg, Diener, Pollney, Rezzolla, Schnetter, Seidel, and Takahashi}}}
+\bibcite{carpet-gonzalez2007a}{{46}{2007}{{Gonz{\'a}lez et~al.}}{{Gonz{\'a}lez, Hannam, Sperhake, Br{\"u}gmann, and Husa}}}
+\bibcite{carpet-campanelli2007b}{{47}{2007{}}{{Campanelli et~al.}}{{Campanelli, Lousto, Zlochower, and Merritt}}}
+\bibcite{carpet-campanelli2007a}{{48}{2007{}}{{Campanelli et~al.}}{{Campanelli, Lousto, Zlochower, and Merritt}}}
+\bibcite{carpet-herrmann2007b}{{49}{2007{}}{{Herrmann et~al.}}{{Herrmann, Hinder, Shoemaker, Laguna, and Matzner}}}
+\bibcite{carpet-koppitz2007a}{{50}{2007}{{Koppitz et~al.}}{{Koppitz, Pollney, Reisswig, Rezzolla, Thornburg, Diener, and Schnetter}}}
+\bibcite{carpet-marronetti2007a}{{51}{2007}{{Marronetti et~al.}}{{Marronetti, Tichy, Br{\"u}gmann, Gonz{\'a}lez, Hannam, Husa, and Sperhake}}}
+\bibcite{carpet-giacomazzo2007a}{{52}{2007}{{Giacomazzo and Rezzolla}}{{}}}
+\bibcite{carpet-herrmann2007a}{{53}{2007{}}{{Herrmann et~al.}}{{Herrmann, Hinder, Shoemaker, and Laguna}}}
+\bibcite{carpet-baker2006a}{{54}{2007}{{Baker et~al.}}{{Baker, Campanelli, Pretorius, and Zlochower}}}
+\bibcite{carept-pazos2006a}{{55}{2007}{{Pazos et~al.}}{{Pazos, Dorband, Nagar, Palenzuela, Schnetter, and Tiglio}}}
+\bibcite{carpet-szilagyi2006a}{{56}{2007}{{Szil{\'a}gyi et~al.}}{{Szil{\'a}gyi, Pollney, Rezzolla, Thornburg, and Winicour}}}
+\bibcite{carpet-baiotti2006b}{{57}{2007}{{Baiotti et~al.}}{{Baiotti, Hawke, and Rezzolla}}}
+\bibcite{carpet-ott2006b}{{58}{2007{}}{{Ott et~al.}}{{Ott, Dimmelmeier, Marek, Janka, Zink, Hawke, and Schnetter}}}
+\bibcite{carpet-zink2006a}{{59}{2007}{{Zink et~al.}}{{Zink, Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}}
+\bibcite{carpet-bruegmann2006a}{{60}{2008{}}{{Br{\"u}gmann et~al.}}{{Br{\"u}gmann, Gonz{\'a}lez, Hannam, Husa, Sperhake, and Tichy}}}
+\bibcite{carpet-reisswig2006a}{{61}{2007}{{Reisswig et~al.}}{{Reisswig, Bishop, Lai, Thornburg, and Szil{\'a}gyi}}}
+\bibcite{carpet-ott2006a}{{62}{2007{}}{{Ott et~al.}}{{Ott, Dimmelmeier, Marek, Janka, Hawke, Zink, and Schnetter}}}
+\bibcite{carpet-baiotti2006a}{{63}{2006}{{Baiotti and Rezzolla}}{{}}}
+\bibcite{carpet-dorband2006a}{{64}{2006}{{Dorband et~al.}}{{Dorband, Berti, Diener, Schnetter, and Tiglio}}}
+\bibcite{carpet-loeffler2006a}{{65}{2006}{{L{\"o}ffler et~al.}}{{L{\"o}ffler, Rezzolla, and Ansorg}}}
+\bibcite{carpet-sperhake2006a}{{66}{2007}{{Sperhake}}{{}}}
+\bibcite{carpet-schnetter2006b}{{67}{2006{}}{{Schnetter et~al.}}{{Schnetter, Krishnan, and Beyer}}}
+\bibcite{carpet-sopuerta2006a}{{68}{2006}{{Sopuerta et~al.}}{{Sopuerta, Sperhake, and Laguna}}}
+\bibcite{carpet-schnetter2006a}{{69}{2006{}}{{Schnetter et~al.}}{{Schnetter, Diener, Dorband, and Tiglio}}}
+\bibcite{carpet-diener2005b}{{70}{2007}{{Diener et~al.}}{{Diener, Dorband, Schnetter, and Tiglio}}}
+\bibcite{carpet-diener2005a}{{71}{2006}{{Diener et~al.}}{{Diener, Herrmann, Pollney, Schnetter, Seidel, Takahashi, Thornburg, and Ventrella}}}
+\bibcite{carpet-sperhake2005a}{{72}{2005}{{Sperhake et~al.}}{{Sperhake, Kelly, Laguna, Smith, and Schnetter}}}
+\bibcite{carpet-zink2005a}{{73}{2006}{{Zink et~al.}}{{Zink, Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}}
+\bibcite{carpet-baiotti2004a}{{74}{2005}{{Baiotti et~al.}}{{Baiotti, Hawke, Rezzolla, and Schnetter}}}
+\bibcite{carpet-schnetter2003a}{{75}{2004}{{Schnetter et~al.}}{{Schnetter, Hawley, and Hawke}}}
+\global \chardef \firstnote@num75\relax
+\bibstyle{apsrev-titles-manyauthors}
+\newlabel{LastBibItem}{{75}{4}{}{}{}}
+\newlabel{LastPage}{{}{4}}
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.bbl b/Carpet/CarpetWeb/publications/citations-refereed.bbl
new file mode 100644
index 000000000..8ab9766b9
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.bbl
@@ -0,0 +1,1188 @@
+\begin{thebibliography}{75}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{\citenamefont{Aylott et~al.}(2009{\natexlab{a}})\citenamefont{Aylott,
+ Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati,
+ Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband,
+ Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann,
+ Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto,
+ Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra,
+ Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius,
+ Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a,
+ Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake,
+ Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio,
+ Veitch, Vicer{\'e}, Whelan, and Zlochower}}]{carpet-cadonati2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aylott}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{P.~R.} \bibnamefont{Brady}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{L.~T.} \bibnamefont{Buchman}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Cadonati}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Camp}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Chatterji}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Christensen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Faber}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fairhurst}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Farr}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fischetti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Guidi}},
+ \bibinfo{author}{\bibfnamefont{L.~M.} \bibnamefont{Goggin}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Kalogera}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Mandel}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Matzner}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Mercer}},
+ \bibinfo{author}{\bibfnamefont{S.~R.~P.} \bibnamefont{Mohapatra}},
+ \bibinfo{author}{\bibfnamefont{A.~H.} \bibnamefont{Mrou{\'e}}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Ochsner}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Pan}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Pekowsky}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Raymond}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Rinne}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Robinson}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{R{\"o}ver}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Sathyaprakash}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Stroeer}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Sturani}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{van~der Sluys}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van Meter}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Vaulin}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vecchio}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Veitch}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vicer{\'e}}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Status of {NINJA}: the {Numerical} {INJection}
+ {Analysis} project}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{114008}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0901.4399 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0905.4227}.
+
+\bibitem[{\citenamefont{Baiotti
+ et~al.}(2009{\natexlab{a}})\citenamefont{Baiotti, Giacomazzo, and
+ Rezzolla}}]{carpet-baiotti2009a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Accurate evolutions of inspiralling neutron-star
+ binaries: assessment of the truncation error}}, \bibinfo{journal}{Class.
+ Quantum Grav.} \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{114005}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0901.4955 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.4955}.
+
+\bibitem[{\citenamefont{Aylott et~al.}(2009{\natexlab{b}})\citenamefont{Aylott,
+ Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati,
+ Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband,
+ Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann,
+ Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto,
+ Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra,
+ Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius,
+ Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a,
+ Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake,
+ Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio,
+ Veitch, Vicer{\'e}, Whelan, and Zlochower}}]{carpet-aylott2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aylott}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{P.~R.} \bibnamefont{Brady}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{L.~T.} \bibnamefont{Buchman}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Cadonati}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Camp}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Chatterji}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Christensen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Faber}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fairhurst}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Farr}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fischetti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Guidi}},
+ \bibinfo{author}{\bibfnamefont{L.~M.} \bibnamefont{Goggin}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Kalogera}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Mandel}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Matzner}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Mercer}},
+ \bibinfo{author}{\bibfnamefont{S.~R.~P.} \bibnamefont{Mohapatra}},
+ \bibinfo{author}{\bibfnamefont{A.~H.} \bibnamefont{Mrou{\'e}}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Ochsner}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Pan}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Pekowsky}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Raymond}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Rinne}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Robinson}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{R{\"o}ver}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Sathyaprakash}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Stroeer}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Sturani}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{van~der Sluys}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van Meter}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Vaulin}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vecchio}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Veitch}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vicer{\'e}}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Testing gravitational-wave searches with numerical
+ relativity waveforms: Results from the first {Numerical} {INJection}
+ {Analysis} ({NINJA}) project}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{165008}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \eprint{arXiv:0901.4399 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.4399}.
+
+\bibitem[{\citenamefont{Hannam et~al.}(2009)\citenamefont{Hannam, Husa, Baker,
+ Boyle, Br{\"u}gmann, Chu, Dorband, Herrmann, Hinder, Kelly, Kidder, Laguna,
+ Matthews, {van Meter}, Pfeiffer, Pollney, Reisswig, Scheel, and
+ Shoemaker}}]{carpetresult-hannam2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{{van Meter}}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{The {Samurai} project: verifying the consistency of
+ black-hole-binary waveforms for gravitational-wave detection}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{084025} (\bibinfo{year}{2009}), \eprint{arXiv:0901.2437
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0901.2437}.
+
+\bibitem[{\citenamefont{Rezzolla}(2009)}]{carpet-rezzolla2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Modelling the final state from binary black-hole
+ coalescences}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{094023}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0812.2325 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0812.2325}.
+
+\bibitem[{\citenamefont{Etienne et~al.}(2009)\citenamefont{Etienne, Liu,
+ Shapiro, , and Baumgarte}}]{carpet-etienne2008a}
+\bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}}, ,
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{T.~W.}
+ \bibnamefont{Baumgarte}}, \emph{\bibinfo{title}{General relativistic
+ simulations of black-hole-neutron-star mergers: Effects of black-hole spin}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{044024} (\bibinfo{year}{2009}), \eprint{arXiv:0812.2245
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0812.2245}.
+
+\bibitem[{\citenamefont{Campanelli
+ et~al.}(2009{\natexlab{a}})\citenamefont{Campanelli, Lousto, and
+ Zlochower}}]{carpet-campanelli2008b}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Algebraic classification of numerical spacetimes and
+ black-hole-binary remnants}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{084012}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0811.3006 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0811.3006}.
+
+\bibitem[{\citenamefont{Korobkin et~al.}(2009)\citenamefont{Korobkin, Aksoylu,
+ Holst, Pazos, and Tiglio}}]{carpet-korobkin2008a}
+\bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Korobkin}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aksoylu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Holst}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Pazos}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Solving the einstein constraint equations on
+ multi-block triangulations using finite element methods}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{26}},
+ \bibinfo{pages}{145007} (\bibinfo{year}{2009}), \eprint{arXiv:0801.1823
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0801.1823}.
+
+\bibitem[{\citenamefont{Brown et~al.}(2009)\citenamefont{Brown, Diener,
+ Sarbach, Schnetter, and Tiglio}}]{carpet-brown2007b}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Sarbach}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Turduckening black holes: an analytical and
+ computational study}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{044023}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0809.3533 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0809.3533}.
+
+\bibitem[{\citenamefont{Baiotti
+ et~al.}(2009{\natexlab{b}})\citenamefont{Baiotti, Bernuzzi, Corvino, Pietri,
+ and Nagar}}]{carpet-baiotti2008b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Bernuzzi}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Corvino}},
+ \bibinfo{author}{\bibfnamefont{R.~D.} \bibnamefont{Pietri}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \emph{\bibinfo{title}{Gravitational-wave extraction from neutron-star
+ oscillations: Comparing linear and nonlinear techniques}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{024002} (\bibinfo{year}{2009}{\natexlab{b}}),
+ \eprint{arXiv:0808.4002 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0808.4002}.
+
+\bibitem[{\citenamefont{Campanelli
+ et~al.}(2009{\natexlab{b}})\citenamefont{Campanelli, Lousto, Nakano, and
+ Zlochower}}]{carpet-campanelli2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparison of numerical and post-{Newtonian} waveforms
+ for generic precessing black-hole binaries}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{084010}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \eprint{arXiv:0808.0713 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0808.0713}.
+
+\bibitem[{\citenamefont{Healy et~al.}(2009)\citenamefont{Healy, Herrmann,
+ Hinder, Shoemaker, Laguna, , and Matzner}}]{carpet-healy2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Superkicks in hyperbolic encounters of binary black
+ holes}}, \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{102}},
+ \bibinfo{pages}{041101} (\bibinfo{year}{2009}), \eprint{arXiv:0807.3292
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0807.3292}.
+
+\bibitem[{\citenamefont{Sperhake
+ et~al.}(2008{\natexlab{a}})\citenamefont{Sperhake, Cardoso, Pretorius, Berti,
+ , and Gonz{\'a}lez}}]{carpet-sperhake2008a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \emph{\bibinfo{title}{High-energy collision of two black holes}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{101}},
+ \bibinfo{pages}{161101} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0806.1738 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0806.1738}.
+
+\bibitem[{\citenamefont{Gualtieri et~al.}(2008)\citenamefont{Gualtieri, Berti,
+ Cardoso, and Sperhake}}]{carpet-gualtieri2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Gualtieri}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Transformation of the multipolar components of
+ gravitational radiation under rotations and boosts}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{044024}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0805.1017 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0805.1017}.
+
+\bibitem[{\citenamefont{Lousto and Zlochower}(2009)}]{carpet-lousto2008a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Modeling gravitational recoil from precessing
+ highly-spinning unequal-mass black-hole binaries}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{064018}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0805.0159 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0805.0159}.
+
+\bibitem[{\citenamefont{Benger}(2008)}]{carpetresult-benger2007a}
+\bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Benger}},
+ \emph{\bibinfo{title}{Colliding galaxies, rotating neutron stars and merging
+ black holes -- visualizing high dimensional datasets on arbitrary meshes}},
+ \bibinfo{journal}{New J. Phys.} \textbf{\bibinfo{volume}{10}},
+ \bibinfo{pages}{125004} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://www.iop.org/EJ/ abstract/1367-2630/10/12/125004}.
+
+\bibitem[{\citenamefont{Baiotti et~al.}(2008)\citenamefont{Baiotti, Giacomazzo,
+ and Rezzolla}}]{carpet-baiotti2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Accurate evolutions of inspiralling neutron-star
+ binaries: Prompt and delayed collapse to a black hole}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{084033} (\bibinfo{year}{2008}), \eprint{arXiv:0804.0594
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0804.0594}.
+
+\bibitem[{\citenamefont{Dain et~al.}(2008)\citenamefont{Dain, Lousto, , and
+ Zlochower}}]{carpet-dain2008a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Dain}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}}, ,
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Extra-large remnant recoil velocities and spins from
+ near-extremal-{Bowen}-{York}-spin black-hole binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{024039} (\bibinfo{year}{2008}), \eprint{arXiv:0803.0351
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0803.0351}.
+
+\bibitem[{\citenamefont{Seiler et~al.}(2008)\citenamefont{Seiler, Szil{\'a}gyi,
+ Pollney, and Rezzolla}}]{carpet-seiler2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Constraint-preserving boundary treatment for a harmonic
+ formulation of the einstein equations}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{175020}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.3341 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.3341}.
+
+\bibitem[{\citenamefont{Washik et~al.}(2008)\citenamefont{Washik, Healy,
+ Herrmann, Hinder, Shoemaker, Laguna, and Matzner}}]{carpet-washik2008a}
+\bibinfo{author}{\bibfnamefont{M.~C.} \bibnamefont{Washik}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Binary-black-hole encounters, gravitational bursts, and
+ maximum final spin}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{101}}, \bibinfo{pages}{061102}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.2520 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.2520}.
+
+\bibitem[{\citenamefont{Bentivegna et~al.}(2008)\citenamefont{Bentivegna,
+ Shoemaker, Hinder, , and Herrmann}}]{carpet-bentivegna2008a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Bentivegna}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Probing the binary black hole merger regime with scalar
+ perturbations}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{124016}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0801.3478 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0801.3478}.
+
+\bibitem[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{a}})\citenamefont{Rezzolla, Barausse, Dorband,
+ Pollney, Reisswig, Seiler, and Husa}}]{carpet-rezzolla2007c}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Barausse}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Final spin from the coalescence of two black holes}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{044002} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0712.3541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0712.3541}.
+
+\bibitem[{\citenamefont{Damour et~al.}(2008)\citenamefont{Damour, Nagar,
+ Dorband, Pollney, and Rezzolla}}]{carpet-damour2007a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Damour}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Faithful effective-one-body waveforms of equal-mass
+ coalescing black-hole binaries}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{084017}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0712.3003 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0712.3003}.
+
+\bibitem[{\citenamefont{Shoemaker et~al.}(2008)\citenamefont{Shoemaker,
+ Vaishnav, Hinder, and Herrmann}}]{carpet-shoemaker2007a}
+\bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Numerical relativity meets data analysis: spinning
+ binary black hole case}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{114047}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.4427 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.4427}.
+
+\bibitem[{\citenamefont{Zink et~al.}(2008)\citenamefont{Zink, Schnetter, and
+ Tiglio}}]{carpet-zink2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Multi-patch methods in general relativistic
+ astrophysics - {I.} {Hydrodynamical} flows on fixed backgrounds}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{103015} (\bibinfo{year}{2008}), \eprint{arXiv:0712.0353
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0712.0353}.
+
+\bibitem[{\citenamefont{Berti et~al.}(2008)\citenamefont{Berti, Cardoso,
+ Gonz{\'a}lez, Sperhake, and Br{\"u}gmann}}]{carpet-berti2007a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \emph{\bibinfo{title}{Multipolar analysis of spinning binaries}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{25}},
+ \bibinfo{pages}{114035} (\bibinfo{year}{2008}), \eprint{arXiv:0711.1097
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0711.1097}.
+
+\bibitem[{\citenamefont{Bode et~al.}(2008)\citenamefont{Bode, Shoemaker,
+ Herrmann, and Hinder}}]{carpet-bode2007a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Bode}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \emph{\bibinfo{title}{Robustness of binary black hole mergers in the presence
+ of spurious radiation}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{044027}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0711.0669 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0711.0669}.
+
+\bibitem[{\citenamefont{Hinder et~al.}(2008)\citenamefont{Hinder, Vaishnav,
+ Herrmann, Shoemaker, and Laguna}}]{carpet-hinder2007a}
+\bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Circularization and final spin in eccentric binary
+ black hole inspirals}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{081502(R)}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0710.5167 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.5167}.
+
+\bibitem[{\citenamefont{Boyle et~al.}(2008)\citenamefont{Boyle, Kesden, and
+ Nissanke}}]{carpetresult-boyle2007a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Kesden}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Nissanke}},
+ \emph{\bibinfo{title}{Binary black hole merger: symmetry and the spin
+ expansion}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{100}}, \bibinfo{pages}{151101}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0709.0299 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0709.0299}.
+
+\bibitem[{\citenamefont{Sperhake
+ et~al.}(2008{\natexlab{b}})\citenamefont{Sperhake, Berti, Cardoso,
+ Gonz{\'a}lez, Br{\"u}gmann, and Ansorg}}]{carpet-sperhake2007a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \emph{\bibinfo{title}{Eccentric binary black-hole mergers: The transition
+ from inspiral to plunge in general relativity}}, \bibinfo{journal}{Phys. Rev.
+ D} \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{064069}
+ (\bibinfo{year}{2008}{\natexlab{b}}), \eprint{arXiv:0710.3823 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.3823}.
+
+\bibitem[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{b}})\citenamefont{Rezzolla, Diener, Dorband, Pollney,
+ Reisswig, Schnetter, and Seiler}}]{carpet-rezzolla2007b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \emph{\bibinfo{title}{The final spin from the coalescence of aligned-spin
+ black-hole binaries}}, \bibinfo{journal}{Astrophys. J. Lett.}
+ \textbf{\bibinfo{volume}{674}}, \bibinfo{pages}{L29}
+ (\bibinfo{year}{2008}{\natexlab{b}}), \eprint{arXiv:0710.3345 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.3345}.
+
+\bibitem[{\citenamefont{Ajith et~al.}(2008)\citenamefont{Ajith, Babak, Chen,
+ Hewitson, Krishnan, Sintes, Whelan, Br{\"u}gmann, Diener, Dorband,
+ Gonz{\'a}lez, Hannam, Husa, Pollney, Rezzolla, Santamar{\'i}a, Sperhake, and
+ Thornburg}}]{carpet-ajith2007b}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Ajith}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Babak}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hewitson}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{A.~M.} \bibnamefont{Sintes}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \emph{\bibinfo{title}{A template bank for gravitational waveforms from
+ coalescing binary black holes: {I.} non-spinning binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{104017} (\bibinfo{year}{2008}), \eprint{arXiv:0710.2335
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0710.2335}.
+
+\bibitem[{\citenamefont{Campanelli et~al.}(2008)\citenamefont{Campanelli,
+ Lousto, and Zlochower}}]{carpet-campanelli2007c}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Close encounters of three black holes}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{101501(5)} (\bibinfo{year}{2008}), \eprint{arXiv:0710.0879
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0710.0879}.
+
+\bibitem[{\citenamefont{Buonanno et~al.}(2008)\citenamefont{Buonanno, Kidder,
+ and Lehner}}]{carpetresult-buonanno2007a}
+\bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Lehner}},
+ \emph{\bibinfo{title}{Estimating the final spin of a binary black hole
+ coalescence}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{026004} (\bibinfo{year}{2008}), \eprint{arXiv:0709.3839
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0709.3839}.
+
+\bibitem[{\citenamefont{Stark et~al.}(2008)\citenamefont{Stark, Allen, Goodale,
+ Radke, and Schnetter}}]{carpet-stark2007a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Stark}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{An extensible timing infrastructure for adaptive
+ large-scale applications}}, in \emph{\bibinfo{booktitle}{Parallel Processing
+ and Applied Mathematics}}, edited by
+ \bibinfo{editor}{\bibfnamefont{R.}~\bibnamefont{Wyrzykowski}}
+ (\bibinfo{publisher}{Springer}, \bibinfo{year}{2008}), vol.
+ \bibinfo{volume}{4967} of \emph{\bibinfo{series}{Lecture Notes in Computer
+ Science}}, pp. \bibinfo{pages}{1170--1179}, \eprint{arXiv:0705.3015 [cs.PF]},
+ \urlprefix\url{http://arxiv.org/abs/0705.3015}.
+
+\bibitem[{\citenamefont{Pollney et~al.}(2007)\citenamefont{Pollney, Reisswig,
+ Rezzolla, Szil{\'a}gyi, Ansorg, Deris, Diener, Dorband, Koppitz, Nagar, and
+ Schnetter}}]{carpet-pollney207a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Deris}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Recoil velocities from equal-mass binary black-hole
+ mergers: a systematic investigation of spin-orbit aligned configurations}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{124002} (\bibinfo{year}{2007}), \eprint{arXiv:0707.2559
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0707.2559}.
+
+\bibitem[{\citenamefont{Lousto and Zlochower}(2008)}]{carpet-lousto2007a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Further insight into gravitational recoil}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{044028} (\bibinfo{year}{2008}), \eprint{arXiv:0708.4048
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0708.4048}.
+
+\bibitem[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{c}})\citenamefont{Rezzolla, Dorband, Reisswig, Diener,
+ Pollney, Schnetter, and Szil{\'s}gyi}}]{carpet-rezzolla2007a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'s}gyi}},
+ \emph{\bibinfo{title}{Spin diagrams for equal-mass black-hole binaries with
+ aligned spins}}, \bibinfo{journal}{Astrophys. J.}
+ \textbf{\bibinfo{volume}{679}}, \bibinfo{pages}{1422}
+ (\bibinfo{year}{2008}{\natexlab{c}}), \eprint{arXiv:0708.3999 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0708.3999}.
+
+\bibitem[{\citenamefont{Br{\"u}gmann
+ et~al.}(2008{\natexlab{a}})\citenamefont{Br{\"u}gmann, Gonz{\'a}lez, Hannam,
+ Husa, and Sperhake}}]{carpet-bruegmann2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Exploring black hole superkicks}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{124047} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0707.0135 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0707.0135}.
+
+\bibitem[{\citenamefont{Brown et~al.}(2007)\citenamefont{Brown, Sarbach,
+ Schnetter, Tiglio, Diener, Hawke, and Pollney}}]{carpet-brown2007a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Sarbach}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \emph{\bibinfo{title}{Excision without excision}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{081503(R)}
+ (\bibinfo{year}{2007}), \eprint{arXiv:0707.3101 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0707.3101}.
+
+\bibitem[{\citenamefont{Krishnan et~al.}(2007)\citenamefont{Krishnan, Lousto,
+ and Zlochower}}]{carpet-krishnan2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Quasi-local linear momentum in black-hole binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{081501(R)} (\bibinfo{year}{2007}), \eprint{arXiv:0707.0876
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0707.0876}.
+
+\bibitem[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{a}})\citenamefont{Herrmann, Hinder, Shoemaker, Laguna,
+ and Matzner}}]{carpet-herrmann2007c}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Binary black holes: Spin dynamics and gravitational
+ recoil}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{084032} (\bibinfo{year}{2007}{\natexlab{a}}),
+ \eprint{arXiv:0706.2541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0706.2541}.
+
+\bibitem[{\citenamefont{Vaishnav et~al.}(2007)\citenamefont{Vaishnav, Hinder,
+ Herrmann, and Shoemaker}}]{carpet-vaishnav2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Matched filtering of numerical relativity templates of
+ spinning binary black holes}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{084020}
+ (\bibinfo{year}{2007}), \eprint{arXiv:0705.3829 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0705.3829}.
+
+\bibitem[{\citenamefont{Ajith et~al.}(2007)\citenamefont{Ajith, Babak, Chen,
+ Hewitson, Krishnan, Whelan, Br{\"u}gmann, Diener, González, Hannam, Husa,
+ Koppitz, Pollney, Rezzolla, Santamar{\'i}a, Sintes, Sperhake, and
+ Thornburg}}]{carpet-ajith2007a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Ajith}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Babak}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hewitson}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{González}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{A.~M.} \bibnamefont{Sintes}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \emph{\bibinfo{title}{Phenomenological template family for black-hole
+ coalescence waveforms}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S689} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0704.3764 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0704.3764}.
+
+\bibitem[{\citenamefont{Thornburg et~al.}(2007)\citenamefont{Thornburg, Diener,
+ Pollney, Rezzolla, Schnetter, Seidel, and Takahashi}}]{carpet-thornburg2007a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Takahashi}},
+ \emph{\bibinfo{title}{Are moving punctures equivalent to moving black
+ holes?}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{3911} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701038},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701038}.
+
+\bibitem[{\citenamefont{Gonz{\'a}lez et~al.}(2007)\citenamefont{Gonz{\'a}lez,
+ Hannam, Sperhake, Br{\"u}gmann, and Husa}}]{carpet-gonzalez2007a}
+\bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.~D.} \bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Supermassive recoil velocities for binary black-hole
+ mergers with antialigned spins}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{98}}, \bibinfo{pages}{231101}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0702052},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0702052}.
+
+\bibitem[{\citenamefont{Campanelli
+ et~al.}(2007{\natexlab{a}})\citenamefont{Campanelli, Lousto, Zlochower, and
+ Merritt}}]{carpet-campanelli2007b}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Merritt}},
+ \emph{\bibinfo{title}{Maximum gravitational recoil}}, \bibinfo{journal}{Phys.
+ Rev. Lett.} \textbf{\bibinfo{volume}{98}}, \bibinfo{pages}{231102}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:gr-qc/0702133},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0702133}.
+
+\bibitem[{\citenamefont{Campanelli
+ et~al.}(2007{\natexlab{b}})\citenamefont{Campanelli, Lousto, Zlochower, and
+ Merritt}}]{carpet-campanelli2007a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Merritt}},
+ \emph{\bibinfo{title}{Large merger recoils and spin flips from generic
+ black-hole binaries}}, \bibinfo{journal}{Astrophys. J. Lett.}
+ \textbf{\bibinfo{volume}{659}}, \bibinfo{pages}{L5}
+ (\bibinfo{year}{2007}{\natexlab{b}}), \eprint{arXiv:gr-qc/0701164}.
+
+\bibitem[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{b}})\citenamefont{Herrmann, Hinder, Shoemaker, Laguna,
+ and Matzner}}]{carpet-herrmann2007b}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Gravitational recoil from spinning binary black hole
+ mergers}}, \bibinfo{journal}{Astrophys. J.} \textbf{\bibinfo{volume}{661}},
+ \bibinfo{pages}{430} (\bibinfo{year}{2007}{\natexlab{b}}),
+ \eprint{arXiv:gr-qc/0701143},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701143}.
+
+\bibitem[{\citenamefont{Koppitz et~al.}(2007)\citenamefont{Koppitz, Pollney,
+ Reisswig, Rezzolla, Thornburg, Diener, and Schnetter}}]{carpet-koppitz2007a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Recoil velocities from equal-mass binary-black-hole
+ mergers}}, \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{99}},
+ \bibinfo{pages}{041102} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701163},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701163}.
+
+\bibitem[{\citenamefont{Marronetti et~al.}(2007)\citenamefont{Marronetti,
+ Tichy, Br{\"u}gmann, Gonz{\'a}lez, Hannam, Husa, and
+ Sperhake}}]{carpet-marronetti2007a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Binary black holes on a budget: simulations using
+ workstations}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S45} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701123},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701123}.
+
+\bibitem[{\citenamefont{Giacomazzo and
+ Rezzolla}(2007)}]{carpet-giacomazzo2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{{WhiskyMHD}: a new numerical code for general
+ relativistic magnetohydrodynamics}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S235} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701109},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701109}.
+
+\bibitem[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{c}})\citenamefont{Herrmann, Hinder, Shoemaker, and
+ Laguna}}]{carpet-herrmann2007a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Unequal mass binary black hole plunges and
+ gravitational recoil}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S33}
+ (\bibinfo{year}{2007}{\natexlab{c}}), \eprint{arXiv:gr-qc/0601026},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0601026}.
+
+\bibitem[{\citenamefont{Baker et~al.}(2007)\citenamefont{Baker, Campanelli,
+ Pretorius, and Zlochower}}]{carpet-baker2006a}
+\bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparisons of binary black hole merger waveforms}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{24}},
+ \bibinfo{pages}{S25} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701016},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701016}.
+
+\bibitem[{\citenamefont{Pazos et~al.}(2007)\citenamefont{Pazos, Dorband, Nagar,
+ Palenzuela, Schnetter, and Tiglio}}]{carept-pazos2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Pazos}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Palenzuela}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{How far away is far enough for extracting numerical
+ waveforms, and how much do they depend on the extraction method?}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{24}},
+ \bibinfo{pages}{S341} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0612149},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0612149}.
+
+\bibitem[{\citenamefont{Szil{\'a}gyi et~al.}(2007)\citenamefont{Szil{\'a}gyi,
+ Pollney, Rezzolla, Thornburg, and Winicour}}]{carpet-szilagyi2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Winicour}},
+ \emph{\bibinfo{title}{An explicit harmonic code for black-hole evolution
+ using excision}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S275} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0612150},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0612150}.
+
+\bibitem[{\citenamefont{Baiotti et~al.}(2007)\citenamefont{Baiotti, Hawke, and
+ Rezzolla}}]{carpet-baiotti2006b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{On the gravitational radiation from the collapse of
+ neutron stars to rotating black holes}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S187}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701043},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701043}.
+
+\bibitem[{\citenamefont{Ott et~al.}(2007{\natexlab{a}})\citenamefont{Ott,
+ Dimmelmeier, Marek, Janka, Zink, Hawke, and Schnetter}}]{carpet-ott2006b}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Dimmelmeier}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Marek}},
+ \bibinfo{author}{\bibfnamefont{H.-T.} \bibnamefont{Janka}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Rotating collapse of stellar iron cores in general
+ relativity}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S139}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:astro-ph/0612638},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0612638}.
+
+\bibitem[{\citenamefont{Zink et~al.}(2007)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Non-axisymmetric instability and fragmentation of
+ general relativistic quasitoroidal stars}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{024019}
+ (\bibinfo{year}{2007}), \eprint{arXiv:astro-ph/0611601},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0611601}.
+
+\bibitem[{\citenamefont{Br{\"u}gmann
+ et~al.}(2008{\natexlab{b}})\citenamefont{Br{\"u}gmann, Gonz{\'a}lez, Hannam,
+ Husa, Sperhake, and Tichy}}]{carpet-bruegmann2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \emph{\bibinfo{title}{Calibration of moving puncture simulations}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{024027} (\bibinfo{year}{2008}{\natexlab{b}}),
+ \eprint{arXiv:gr-qc/0610128},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0610128}.
+
+\bibitem[{\citenamefont{Reisswig et~al.}(2007)\citenamefont{Reisswig, Bishop,
+ Lai, Thornburg, and Szil{\'a}gyi}}]{carpet-reisswig2006a}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{N.~T.} \bibnamefont{Bishop}},
+ \bibinfo{author}{\bibfnamefont{C.~W.} \bibnamefont{Lai}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \emph{\bibinfo{title}{Characteristic evolutions in numerical relativity using
+ six angular patches}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S327} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0610019},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0610019}.
+
+\bibitem[{\citenamefont{Ott et~al.}(2007{\natexlab{b}})\citenamefont{Ott,
+ Dimmelmeier, Marek, Janka, Hawke, Zink, and Schnetter}}]{carpet-ott2006a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Dimmelmeier}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Marek}},
+ \bibinfo{author}{\bibfnamefont{H.-T.} \bibnamefont{Janka}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{{3D} collapse of rotating stellar iron cores in general
+ relativity including deleptonization and a nuclear equation of state}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{98}},
+ \bibinfo{pages}{261101} (\bibinfo{year}{2007}{\natexlab{b}}),
+ \eprint{arXiv:astro-ph/0609819},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0609819}.
+
+\bibitem[{\citenamefont{Baiotti and Rezzolla}(2006)}]{carpet-baiotti2006a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Challenging the paradigm of singularity excision in
+ gravitational collapse}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{97}}, \bibinfo{pages}{141101}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0608113},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0608113}.
+
+\bibitem[{\citenamefont{Dorband et~al.}(2006)\citenamefont{Dorband, Berti,
+ Diener, Schnetter, and Tiglio}}]{carpet-dorband2006a}
+\bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A numerical study of the quasinormal mode excitation of
+ kerr black holes}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{74}}, \bibinfo{pages}{084028}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0608091},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0608091}.
+
+\bibitem[{\citenamefont{L{\"o}ffler et~al.}(2006)\citenamefont{L{\"o}ffler,
+ Rezzolla, and Ansorg}}]{carpet-loeffler2006a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{L{\"o}ffler}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \emph{\bibinfo{title}{Numerical evolutions of a black hole-neutron star
+ system in full general relativity: Head-on collision}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{74}},
+ \bibinfo{pages}{104018} (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0606104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0606104}.
+
+\bibitem[{\citenamefont{Sperhake}(2007)}]{carpet-sperhake2006a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Binary black-hole evolutions of excision and puncture
+ data}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{104015} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0606079},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0606079}.
+
+\bibitem[{\citenamefont{Schnetter
+ et~al.}(2006{\natexlab{a}})\citenamefont{Schnetter, Krishnan, and
+ Beyer}}]{carpet-schnetter2006b}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Beyer}},
+ \emph{\bibinfo{title}{Introduction to dynamical horizons in numerical
+ relativity}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{74}},
+ \bibinfo{pages}{024028} (\bibinfo{year}{2006}{\natexlab{a}}),
+ \eprint{arXiv:gr-qc/0604015},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0604015}.
+
+\bibitem[{\citenamefont{Sopuerta et~al.}(2006)\citenamefont{Sopuerta, Sperhake,
+ and Laguna}}]{carpet-sopuerta2006a}
+\bibinfo{author}{\bibfnamefont{C.~F.} \bibnamefont{Sopuerta}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Hydro-without-hydro framework for simulations of black
+ hole-neutron star binaries}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S579} (\bibinfo{year}{2006}),
+ \eprint{arXiv:gr-qc/0605018},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0605018}.
+
+\bibitem[{\citenamefont{Schnetter
+ et~al.}(2006{\natexlab{b}})\citenamefont{Schnetter, Diener, Dorband, and
+ Tiglio}}]{carpet-schnetter2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S553}
+ (\bibinfo{year}{2006}{\natexlab{b}}), \eprint{arXiv:gr-qc/0602104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0602104}.
+
+\bibitem[{\citenamefont{Diener et~al.}(2007)\citenamefont{Diener, Dorband,
+ Schnetter, and Tiglio}}]{carpet-diener2005b}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Optimized high-order derivative and dissipation
+ operators satisfying summation by parts, and applications in
+ three-dimensional multi-block evolutions}}, \bibinfo{journal}{J. Sci.
+ Comput.} \textbf{\bibinfo{volume}{32}}, \bibinfo{pages}{109}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0512001},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0512001}.
+
+\bibitem[{\citenamefont{Diener et~al.}(2006)\citenamefont{Diener, Herrmann,
+ Pollney, Schnetter, Seidel, Takahashi, Thornburg, and
+ Ventrella}}]{carpet-diener2005a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Takahashi}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Ventrella}},
+ \emph{\bibinfo{title}{Accurate evolution of orbiting binary black holes}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{96}},
+ \bibinfo{pages}{121101} (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0512108},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0512108}.
+
+\bibitem[{\citenamefont{Sperhake et~al.}(2005)\citenamefont{Sperhake, Kelly,
+ Laguna, Smith, and Schnetter}}]{carpet-sperhake2005a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{K.~L.} \bibnamefont{Smith}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Black hole head-on collisions and gravitational waves
+ with fixed mesh-refinement and dynamic singularity excision}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{71}},
+ \bibinfo{pages}{124042} (\bibinfo{year}{2005}), \eprint{arXiv:gr-qc/0503071},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0503071}.
+
+\bibitem[{\citenamefont{Zink et~al.}(2006)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2005a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Formation of supermassive black holes through
+ fragmentation of torodial supermassive stars}}, \bibinfo{journal}{Phys. Rev.
+ Lett.} \textbf{\bibinfo{volume}{96}}, \bibinfo{pages}{161101}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0501080},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0501080}.
+
+\bibitem[{\citenamefont{Baiotti et~al.}(2005)\citenamefont{Baiotti, Hawke,
+ Rezzolla, and Schnetter}}]{carpet-baiotti2004a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Gravitational-wave emission from rotating gravitational
+ collapse in three dimensions}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{95}}, \bibinfo{pages}{131101}
+ (\bibinfo{year}{2005}), \eprint{arXiv:gr-qc/0503016},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0503016}.
+
+\bibitem[{\citenamefont{Schnetter et~al.}(2004)\citenamefont{Schnetter, Hawley,
+ and Hawke}}]{carpet-schnetter2003a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{S.~H.} \bibnamefont{Hawley}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \emph{\bibinfo{title}{Evolutions in 3d numerical relativity using fixed mesh
+ refinement}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{1465} (\bibinfo{year}{2004}),
+ \eprint{arXiv:gr-qc/0310042},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0310042}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.bib b/Carpet/CarpetWeb/publications/citations-refereed.bib
new file mode 100644
index 000000000..fb2d5c8e9
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.bib
@@ -0,0 +1,1324 @@
+
+@Article{ carpet-cadonati2009a,
+ status = {refereed},
+ author = {Benjamin Aylott and John G. Baker and William D. Boggs and
+ Michael Boyle and Patrick R. Brady and Duncan A. Brown and
+ Bernd Br{\"u}gmann and Luisa T. Buchman and Alessandra
+ Buonanno and Laura Cadonati and Jordan Camp and Manuela
+ Campanelli and Joan Centrella and Shourov Chatterji and
+ Nelson Christensen and Tony Chu and Peter Diener and Nils
+ Dorband and Zachariah B. Etienne and Joshua Faber and
+ Stephen Fairhurst and Benjamin Farr and Sebastian Fischetti
+ and Gianluca Guidi and Lisa M. Goggin and Mark Hannam and
+ Frank Herrmann and Ian Hinder and Sascha Husa and Vicky
+ Kalogera and Drew Keppel and Lawrence E. Kidder and Bernard
+ J. Kelly and Badri Krishnan and Pablo Laguna and Carlos O.
+ Lousto and Ilya Mandel and Pedro Marronetti and Richard
+ Matzner and Sean T. McWilliams and Keith D. Matthews and R.
+ Adam Mercer and Satyanarayan R. P. Mohapatra and Abdul H.
+ Mrou{\'e} and Hiroyuki Nakano and Evan Ochsner and Yi Pan
+ and Larne Pekowsky and Harald P. Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian
+ Reisswig and Luciano Rezzolla and Oliver Rinne and Craig
+ Robinson and Christian R{\"o}ver and Luc{\'i}a
+ Santamar{\'i}a and Bangalore Sathyaprakash and Mark A.
+ Scheel and Erik Schnetter and Jennifer Seiler and Stuart L.
+ Shapiro and Deirdre Shoemaker and Ulrich Sperhake and
+ Alexander Stroeer and Riccardo Sturani and Wolfgang Tichy
+ and Yuk Tung Liu and Marc van der Sluys and James R. van
+ Meter and Ruslan Vaulin and Alberto Vecchio and John Veitch
+ and Andrea Vicer{\'e} and John T. Whelan and Yosef Zlochower},
+ title = {Status of {NINJA}: the {Numerical} {INJection} {Analysis}
+ project},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 114008,
+ eprint = {arXiv:0901.4399 [gr-qc]},
+ url = {http://arxiv.org/abs/0905.4227},
+ receiveddate = {2009-03-10},
+ fulltexturl = {http://stacks.iop.org/CQG/26/114008},
+ doi = {10.1088/0264-9381/26/11/114008}
+}
+
+@Article{ carpet-baiotti2009a,
+ status = {refereed},
+ author = {Luca Baiotti and Bruno Giacomazzo and Luciano Rezzolla},
+ title = {Accurate evolutions of inspiralling neutron-star binaries:
+ assessment of the truncation error},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 114005,
+ eprint = {arXiv:0901.4955 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.4955},
+ receiveddate = {2009-02-02},
+ doi = {10.1088/0264-9381/26/11/114005}
+}
+
+@Article{ carpet-aylott2009a,
+ status = {refereed},
+ author = {Benjamin Aylott and John G. Baker and William D. Boggs and
+ Michael Boyle and Patrick R. Brady and Duncan A. Brown and
+ Bernd Br{\"u}gmann and Luisa T. Buchman and Alessandra
+ Buonanno and Laura Cadonati and Jordan Camp and Manuela
+ Campanelli and Joan Centrella and Shourov Chatterji and
+ Nelson Christensen and Tony Chu and Peter Diener and Nils
+ Dorband and Zachariah B. Etienne and Joshua Faber and
+ Stephen Fairhurst and Benjamin Farr and Sebastian Fischetti
+ and Gianluca Guidi and Lisa M. Goggin and Mark Hannam and
+ Frank Herrmann and Ian Hinder and Sascha Husa and Vicky
+ Kalogera and Drew Keppel and Lawrence E. Kidder and Bernard
+ J. Kelly and Badri Krishnan and Pablo Laguna and Carlos O.
+ Lousto and Ilya Mandel and Pedro Marronetti and Richard
+ Matzner and Sean T. McWilliams and Keith D. Matthews and R.
+ Adam Mercer and Satyanarayan R. P. Mohapatra and Abdul H.
+ Mrou{\'e} and Hiroyuki Nakano and Evan Ochsner and Yi Pan
+ and Larne Pekowsky and Harald P. Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian
+ Reisswig and Luciano Rezzolla and Oliver Rinne and Craig
+ Robinson and Christian R{\"o}ver and Luc{\'i}a
+ Santamar{\'i}a and Bangalore Sathyaprakash and Mark A.
+ Scheel and Erik Schnetter and Jennifer Seiler and Stuart L.
+ Shapiro and Deirdre Shoemaker and Ulrich Sperhake and
+ Alexander Stroeer and Riccardo Sturani and Wolfgang Tichy
+ and Yuk Tung Liu and Marc van der Sluys and James R. van
+ Meter and Ruslan Vaulin and Alberto Vecchio and John Veitch
+ and Andrea Vicer{\'e} and John T. Whelan and Yosef Zlochower},
+ title = {Testing gravitational-wave searches with numerical
+ relativity waveforms: Results from the first {Numerical}
+ {INJection} {Analysis} ({NINJA}) project},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 165008,
+ eprint = {arXiv:0901.4399 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.4399},
+ receiveddate = {2009-01-29},
+ doi = {10.1088/0264-9381/26/16/165008}
+}
+
+@Article{ carpetresult-hannam2008a,
+ status = {refereed},
+ author = {Mark Hannam and Sascha Husa and John G. Baker and Michael
+ Boyle and Bernd Br{\"u}gmann and Tony Chu and Nils Dorband
+ and Frank Herrmann and Ian Hinder and Bernard J. Kelly and
+ Lawrence E. Kidder and Pablo Laguna and Keith D. Matthews
+ and James R. {van Meter} and Harald P. Pfeiffer and Denis
+ Pollney and Christian Reisswig and Mark A. Scheel and
+ Deirdre Shoemaker},
+ title = {The {Samurai} Project: verifying the consistency of
+ black-hole-binary waveforms for gravitational-wave
+ detection},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084025,
+ eprint = {arXiv:0901.2437 [gr-qc]},
+ url = {http://arxiv.org/abs/0901.2437},
+ receiveddate = {2009-01-20},
+ doi = {10.1103/PhysRevD.79.084025}
+}
+
+@Article{ carpet-rezzolla2008a,
+ status = {refereed},
+ author = {Luciano Rezzolla},
+ title = {Modelling the final state from binary black-hole
+ coalescences},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 094023,
+ eprint = {arXiv:0812.2325 [gr-qc]},
+ url = {http://arxiv.org/abs/0812.2325},
+ receiveddate = {2008-12-10},
+ doi = {10.1088/0264-9381/26/9/094023}
+}
+
+@Article{ carpet-etienne2008a,
+ status = {refereed},
+ author = {Zachariah B. Etienne and Yuk Tung Liu and Stuart L.
+ Shapiro and and Thomas W. Baumgarte},
+ title = {General relativistic simulations of
+ black-hole-neutron-star mergers: Effects of black-hole
+ spin},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 044024,
+ eprint = {arXiv:0812.2245 [astro-ph]},
+ url = {http://arxiv.org/abs/0812.2245},
+ receiveddate = {2008-12-09},
+ doi = {10.1103/PhysRevD.79.044024}
+}
+
+@Article{ carpet-campanelli2008b,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower},
+ title = {Algebraic Classification of Numerical Spacetimes and
+ Black-Hole-Binary Remnants},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084012,
+ eprint = {arXiv:0811.3006 [gr-qc]},
+ url = {http://arxiv.org/abs/0811.3006},
+ receiveddate = {2008-11-18},
+ doi = {10.1103/PhysRevD.79.084012}
+}
+
+@Article{ carpet-korobkin2008a,
+ status = {refereed},
+ author = {Oleg Korobkin and Burak Aksoylu and Michael Holst and
+ Enrique Pazos and Manuel Tiglio},
+ title = {Solving the Einstein constraint equations on multi-block
+ triangulations using finite element methods},
+ journal = {Class. Quantum Grav.},
+ year = 2009,
+ volume = 26,
+ pages = 145007,
+ eprint = {arXiv:0801.1823 [gr-qc]},
+ url = {http://arxiv.org/abs/0801.1823},
+ receiveddate = {2008-11-05},
+ doi = {10.1088/0264-9381/26/14/145007}
+}
+
+@Article{ carpet-brown2007b,
+ status = {refereed},
+ author = {David Brown and Peter Diener and Olivier Sarbach and Erik
+ Schnetter and Manuel Tiglio},
+ title = {Turduckening black holes: an analytical and computational
+ study},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 044023,
+ eprint = {arXiv:0809.3533 [gr-qc]},
+ url = {http://arxiv.org/abs/0809.3533},
+ receiveddate = {2008-09-20},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.79.044023},
+ doi = {10.1103/PhysRevD.79.044023}
+}
+
+@Article{ carpet-baiotti2008b,
+ status = {refereed},
+ author = {Luca Baiotti and Sebastiano Bernuzzi and Giovanni Corvino
+ and Roberto De Pietri and Alessandro Nagar},
+ title = {Gravitational-wave extraction from neutron-star
+ oscillations: Comparing linear and nonlinear techniques},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 024002,
+ eprint = {arXiv:0808.4002 [gr-qc]},
+ url = {http://arxiv.org/abs/0808.4002},
+ receiveddate = {2008-08-27},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.79.024002},
+ doi = {10.1103/PhysRevD.79.024002}
+}
+
+@Article{ carpet-campanelli2008a,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Hiroyuki
+ Nakano and Yosef Zlochower},
+ title = {Comparison of Numerical and Post-{Newtonian} Waveforms for
+ Generic Precessing Black-Hole Binaries},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 084010,
+ eprint = {arXiv:0808.0713 [gr-qc]},
+ url = {http://arxiv.org/abs/0808.0713},
+ receiveddate = {2008-08-05},
+ doi = {10.1103/PhysRevD.79.084010}
+}
+
+@Article{ carpet-healy2008a,
+ status = {refereed},
+ author = {James Healy and Frank Herrmann and Ian Hinder and Deirdre
+ M. Shoemaker and Pablo Laguna and and Richard A. Matzner},
+ title = {Superkicks in Hyperbolic Encounters of Binary Black
+ Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2009,
+ volume = 102,
+ pages = 041101,
+ eprint = {arXiv:0807.3292 [gr-qc]},
+ url = {http://arxiv.org/abs/0807.3292},
+ receiveddate = {2008-07-22},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevLett.102.041101},
+ doi = {10.1103/PhysRevLett.102.041101}
+}
+
+@Article{ carpet-sperhake2008a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Vitor Cardoso and Frans Pretorius and
+ Emanuele Berti and and Jos{\'e} A. Gonz{\'a}lez},
+ title = {High-Energy Collision of Two Black Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 101,
+ pages = 161101,
+ eprint = {arXiv:0806.1738 [gr-qc]},
+ url = {http://arxiv.org/abs/0806.1738},
+ receiveddate = {2008-06-10},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevLett.101.161101},
+ doi = {10.1103/PhysRevLett.101.161101}
+}
+
+@Article{ carpet-gualtieri2008a,
+ status = {refereed},
+ author = {Leonardo Gualtieri and Emanuele Berti and Vitor Cardoso
+ and Ulrich Sperhake},
+ title = {Transformation of the multipolar components of
+ gravitational radiation under rotations and boosts},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044024,
+ eprint = {arXiv:0805.1017 [gr-qc]},
+ url = {http://arxiv.org/abs/0805.1017},
+ receiveddate = {2008-05-08},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.78.044024},
+ doi = {10.1103/PhysRevD.78.044024}
+}
+
+@Article{ carpet-lousto2008a,
+ status = {refereed},
+ author = {Carlos O. Lousto and Yosef Zlochower},
+ title = {Modeling gravitational recoil from precessing
+ highly-spinning unequal-mass black-hole binaries},
+ journal = {Phys. Rev. D},
+ year = 2009,
+ volume = 79,
+ pages = 064018,
+ eprint = {arXiv:0805.0159 [gr-qc]},
+ url = {http://arxiv.org/abs/0805.0159},
+ receiveddate = {2008-05-01},
+ doi = {10.1103/PhysRevD.79.064018}
+}
+
+@Article{ carpetresult-benger2007a,
+ status = {refereed},
+ author = {Werner Benger},
+ title = {Colliding galaxies, rotating neutron stars and merging
+ black holes -- visualizing high dimensional datasets on
+ arbitrary meshes},
+ journal = {New J. Phys.},
+ year = 2008,
+ volume = 10,
+ pages = 125004,
+ receiveddate = {2008-04-14},
+ url = {http://www.iop.org/EJ/ abstract/1367-2630/10/12/125004},
+ doi = {10.1088/1367-2630/10/12/125004}
+}
+
+@Article{ carpet-baiotti2008a,
+ status = {refereed},
+ author = {Luca Baiotti and Bruno Giacomazzo and Luciano Rezzolla},
+ title = {Accurate evolutions of inspiralling neutron-star binaries:
+ Prompt and delayed collapse to a black hole},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 084033,
+ eprint = {arXiv:0804.0594 [gr-qc]},
+ url = {http://arxiv.org/abs/0804.0594},
+ receiveddate = {2008-04-03},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.78.084033},
+ doi = {10.1103/PhysRevD.78.084033}
+}
+
+@Article{ carpet-dain2008a,
+ status = {refereed},
+ author = {Sergio Dain and Carlos O. Lousto and and Yosef Zlochower},
+ title = {Extra-large remnant recoil velocities and spins from
+ near-extremal-{Bowen}-{York}-spin black-hole binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 024039,
+ eprint = {arXiv:0803.0351 [gr-qc]},
+ url = {http://arxiv.org/abs/0803.0351},
+ receiveddate = {2008-03-03},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.78.024039},
+ doi = {10.1103/PhysRevD.78.024039}
+}
+
+@Article{ carpet-seiler2008a,
+ status = {refereed},
+ author = {Jennifer Seiler and B{\'e}la Szil{\'a}gyi and Denis
+ Pollney and Luciano Rezzolla},
+ title = {Constraint-preserving boundary treatment for a harmonic
+ formulation of the Einstein equations},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 175020,
+ eprint = {arXiv:0802.3341 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.3341},
+ receiveddate = {2008-02-22},
+ oldfulltexturl= {http://stacks.iop.org/CQG/25/175020},
+ doi = {10.1088/0264-9381/25/17/175020}
+}
+
+@Article{ carpet-washik2008a,
+ status = {refereed},
+ author = {Matthew C. Washik and James Healy and Frank Herrmann and
+ Ian Hinder and Deirdre M. Shoemaker and Pablo Laguna and
+ Richard A. Matzner},
+ title = {Binary-Black-Hole Encounters, Gravitational Bursts, and
+ Maximum Final Spin},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 101,
+ pages = 061102,
+ eprint = {arXiv:0802.2520 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.2520},
+ receiveddate = {2008-02-20},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/ PhysRevLett.101.061102},
+ doi = {10.1103/PhysRevLett.101.061102}
+}
+
+@Article{ carpet-bentivegna2008a,
+ status = {refereed},
+ author = {Eloisa Bentivegna and Deirdre M. Shoemaker and Ian Hinder
+ and and Frank Herrmann},
+ title = {Probing the binary black hole merger regime with scalar
+ perturbations},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 124016,
+ eprint = {arXiv:0801.3478 [gr-qc]},
+ url = {http://arxiv.org/abs/0801.3478},
+ receiveddate = {2008-01-24},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.77.124016},
+ doi = {10.1103/PhysRevD.77.124016}
+}
+
+@Article{ carpet-rezzolla2007c,
+ status = {refereed},
+ author = {Luciano Rezzolla and Enrico Barausse and Ernst Nils
+ Dorband and Denis Pollney and Christian Reisswig and
+ Jennifer Seiler and Sascha Husa},
+ title = {Final spin from the coalescence of two black holes},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044002,
+ eprint = {arXiv:0712.3541 [gr-qc]},
+ url = {http://arxiv.org/abs/0712.3541},
+ receiveddate = {2007-12-22},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.78.044002},
+ doi = {10.1103/PhysRevD.78.044002}
+}
+
+@Article{ carpet-damour2007a,
+ status = {refereed},
+ author = {Thibault Damour and Alessandro Nagar and Ernst Nils
+ Dorband and Denis Pollney and Luciano Rezzolla},
+ title = {Faithful effective-one-body waveforms of equal-mass
+ coalescing black-hole binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 084017,
+ eprint = {arXiv:0712.3003 [gr-qc]},
+ url = {http://arxiv.org/abs/0712.3003},
+ receiveddate = {2007-12-18},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.77.084017},
+ doi = {10.1103/PhysRevD.77.084017}
+}
+
+@Article{ carpet-shoemaker2007a,
+ status = {refereed},
+ author = {Deirdre M. Shoemaker and Birjoo Vaishnav and Ian Hinder
+ and Frank Herrmann},
+ title = {Numerical relativity meets data analysis: spinning binary
+ black hole case},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 114047,
+ eprint = {arXiv:0802.4427 [gr-qc]},
+ url = {http://arxiv.org/abs/0802.4427},
+ receiveddate = {2007-12-14},
+ oldfulltexturl= {http://stacks.iop.org/CQG/25/114047},
+ doi = {10.1088/0264-9381/25/11/114047}
+}
+
+@Article{ carpet-zink2007a,
+ status = {refereed},
+ author = {Burkhard Zink and Erik Schnetter and Manuel Tiglio},
+ title = {Multi-patch methods in general relativistic astrophysics -
+ {I.} {Hydrodynamical} flows on fixed backgrounds},
+ journal = {Phys. Rev. D },
+ year = 2008,
+ volume = 77,
+ pages = 103015,
+ eprint = {arXiv:0712.0353 [astro-ph]},
+ url = {http://arxiv.org/abs/0712.0353},
+ receiveddate = {2007-12-04},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e103015},
+ doi = {10.1103/PhysRevD.77.103015}
+}
+
+@Article{ carpet-berti2007a,
+ status = {refereed},
+ author = {Emanuele Berti and Vitor Cardoso and Jos{\'e} A.
+ Gonz{\'a}lez and Ulrich Sperhake and Bernd Br{\"u}gmann},
+ title = {Multipolar analysis of spinning binaries},
+ journal = {Class. Quantum Grav.},
+ year = 2008,
+ volume = 25,
+ pages = 114035,
+ eprint = {arXiv:0711.1097 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.1097},
+ receiveddate = {2007-11-07},
+ oldfulltexturl= {http://stacks.iop.org/CQG/25/114035},
+ doi = {10.1088/0264-9381/25/11/114035}
+}
+
+@Article{ carpet-bode2007a,
+ status = {refereed},
+ author = {Tanja Bode and Deirdre Shoemaker and Frank Herrmann and
+ Ian Hinder},
+ title = {Robustness of binary black hole mergers in the presence of
+ spurious radiation},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 044027,
+ eprint = {arXiv:0711.0669 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.0669},
+ receiveddate = {2007-11-06},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.77.044027},
+ doi = {10.1103/PhysRevD.77.044027}
+}
+
+@Article{ carpet-hinder2007a,
+ status = {refereed},
+ author = {Ian Hinder and Birjoo Vaishnav and Frank Herrmann and
+ Deirdre M. Shoemaker and Pablo Laguna},
+ title = {Circularization and Final Spin in Eccentric Binary Black
+ Hole Inspirals},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = {081502(R)},
+ eprint = {arXiv:0710.5167 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.5167},
+ receiveddate = {2007-10-31},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.77.081502},
+ doi = {10.1103/PhysRevD.77.081502}
+}
+
+@Article{ carpetresult-boyle2007a,
+ status = {refereed},
+ author = {Latham Boyle and Michael Kesden and Samaya Nissanke},
+ title = {Binary black hole merger: symmetry and the spin
+ expansion},
+ journal = {Phys. Rev. Lett.},
+ year = 2008,
+ volume = 100,
+ pages = 151101,
+ eprint = {arXiv:0709.0299 [gr-qc]},
+ url = {http://arxiv.org/abs/0709.0299},
+ receiveddate = {2007-10-22},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v100/e151101},
+ doi = {10.1103/PhysRevLett.100.151101}
+}
+
+@Article{ carpet-sperhake2007a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Emanuele Berti and Vitor Cardoso and
+ Jos{\'e} A. Gonz{\'a}lez and Bernd Br{\"u}gmann and Marcus
+ Ansorg},
+ title = {Eccentric binary black-hole mergers: The transition from
+ inspiral to plunge in general relativity},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 78,
+ pages = 064069,
+ eprint = {arXiv:0710.3823 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.3823},
+ receiveddate = {2007-10-22},
+ oldfulltexturl= {http://link.aps.org/doi/10.1103/PhysRevD.78.064069},
+ doi = {10.1103/PhysRevD.78.064069}
+}
+
+@Article{ carpet-rezzolla2007b,
+ status = {refereed},
+ author = {Luciano Rezzolla and Peter Diener and Ernst Nils Dorband
+ and Denis Pollney and Christian Reisswig and Erik Schnetter
+ and Jennifer Seiler},
+ title = {The final spin from the coalescence of aligned-spin
+ black-hole binaries},
+ journal = {Astrophys. J. Lett.},
+ year = 2008,
+ volume = 674,
+ pages = {L29-L32},
+ eprint = {arXiv:0710.3345 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.3345},
+ receiveddate = {2007-10-18},
+ oldfulltexturl= {http://www.journals.uchicago.edu/doi/abs/10.1086/528935},
+ doi = {10.1086/528935}
+}
+
+@Article{ carpet-ajith2007b,
+ status = {refereed},
+ author = {Parameswaran Ajith and Stanislav Babak and Yanbei Chen and
+ Martin Hewitson and Badri Krishnan and Alicia M. Sintes and
+ John T. Whelan and Bernd Br{\"u}gmann and Peter Diener and
+ Ernst Nils Dorband and Jos{\'e} Gonz{\'a}lez and Mark
+ Hannam and Sascha Husa and Denis Pollney and Luciano
+ Rezzolla and Luc{\'i}a Santamar{\'i}a and Ulrich Sperhake
+ and Jonathan Thornburg},
+ title = {A template bank for gravitational waveforms from
+ coalescing binary black holes: {I.} non-spinning binaries},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 104017,
+ eprint = {arXiv:0710.2335 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.2335},
+ receiveddate = {2007-10-15},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e104017},
+ doi = {10.1103/PhysRevD.77.104017}
+}
+
+@Article{ carpet-campanelli2007c,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower},
+ title = {Close encounters of three black holes},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = {101501(5)},
+ eprint = {arXiv:0710.0879 [gr-qc]},
+ url = {http://arxiv.org/abs/0710.0879},
+ receiveddate = {2007-10-03},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e101501},
+ doi = {10.1103/PhysRevD.77.101501}
+}
+
+@Article{ carpetresult-buonanno2007a,
+ status = {refereed},
+ author = {Alessandra Buonanno and Lawrence E. Kidder and Luis
+ Lehner},
+ title = {Estimating the final spin of a binary black hole
+ coalescence},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 026004,
+ eprint = {arXiv:0709.3839 [astro-ph]},
+ url = {http://arxiv.org/abs/0709.3839},
+ receiveddate = {2007-09-25},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e026004}
+}
+
+@InProceedings{ carpet-stark2007a,
+ status = {refereed},
+ author = {Dylan Stark and Gabrielle Allen and Tom Goodale and Thomas
+ Radke and Erik Schnetter},
+ title = {An Extensible Timing Infrastructure for Adaptive
+ Large-scale Applications},
+ booktitle = {Parallel Processing and Applied Mathematics},
+ pages = {1170-1179},
+ year = 2008,
+ editor = {Roman Wyrzykowski},
+ volume = 4967,
+ series = {Lecture Notes in Computer Science},
+ publisher = {Springer},
+ eprint = {arXiv:0705.3015 [cs.PF]},
+ url = {http://arxiv.org/abs/0705.3015},
+ receiveddate = {2007-09-09},
+ oldfulltexturl= {http://www.springerlink.com/ content/p7n0gl4308p65864/
+ ?p=7a20e00c017c4c4f87c070073332888e&pi=0},
+ doi = {10.1007/978-3-540-68111-3}
+}
+
+@Article{ carpet-pollney207a,
+ status = {refereed},
+ author = {Denis Pollney and Christian Reisswig and Luciano Rezzolla
+ and B{\'e}la Szil{\'a}gyi and Marcus Ansorg and Barrett
+ Deris and Peter Diener and Ernst Nils Dorband and Michael
+ Koppitz and Alessandro Nagar and Erik Schnetter},
+ title = {Recoil velocities from equal-mass binary black-hole
+ mergers: a systematic investigation of spin-orbit aligned
+ configurations},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 124002,
+ eprint = {arXiv:0707.2559 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.2559},
+ receiveddate = {2007-09-06},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e124002},
+ doi = {10.1103/PhysRevD.76.124002}
+}
+
+@Article{ carpet-lousto2007a,
+ status = {refereed},
+ author = {Carlos O. Lousto and Yosef Zlochower},
+ title = {Further insight into gravitational recoil},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 044028,
+ eprint = {arXiv:0708.4048 [gr-qc]},
+ url = {http://arxiv.org/abs/0708.4048},
+ receiveddate = {2007-08-30},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e044028},
+ doi = {10.1103/PhysRevD.77.044028}
+}
+
+@Article{ carpet-rezzolla2007a,
+ status = {refereed},
+ author = {Luciano Rezzolla and Ernst Nils Dorband and Christian
+ Reisswig and Peter Diener and Denis Pollney and Erik
+ Schnetter and B{\'e}la Szil{\'s}gyi},
+ title = {Spin Diagrams for Equal-Mass Black-Hole Binaries with
+ Aligned Spins},
+ journal = {Astrophys. J.},
+ year = 2008,
+ volume = 679,
+ pages = {1422-1426},
+ eprint = {arXiv:0708.3999 [gr-qc]},
+ url = {http://arxiv.org/abs/0708.3999},
+ receiveddate = {2007-08-29},
+ oldfulltexturl= {http://www.journals.uchicago.edu/doi/abs/10.1086/587679},
+ doi = {10.1086/587679}
+}
+
+@Article{ carpet-bruegmann2007a,
+ status = {refereed},
+ author = {Bernd Br{\"u}gmann and Jos{\'e} A. Gonz{\'a}lez and Mark
+ Hannam and Sascha Husa and Ulrich Sperhake},
+ title = {Exploring black hole superkicks},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 124047,
+ eprint = {arXiv:0707.0135 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.0135},
+ receiveddate = {2007-08-07},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e124047},
+ doi = {10.1103/PhysRevD.77.124047}
+}
+
+@Article{ carpet-brown2007a,
+ status = {refereed},
+ author = {David Brown and Olivier Sarbach and Erik Schnetter and
+ Manuel Tiglio and Peter Diener and Ian Hawke and Denis
+ Pollney},
+ title = {Excision without excision},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = {081503(R)},
+ eprint = {arXiv:0707.3101 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.3101},
+ receiveddate = {2007-07-20},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e081503},
+ doi = {10.1103/PhysRevD.76.081503}
+}
+
+@Article{ carpet-krishnan2007a,
+ status = {refereed},
+ author = {Badri Krishnan and Carlos O. Lousto and Yosef Zlochower},
+ title = {Quasi-Local Linear Momentum in Black-Hole Binaries},
+ journal = {Phys. Rev. D },
+ year = 2007,
+ volume = 76,
+ pages = {081501(R)},
+ eprint = {arXiv:0707.0876 [gr-qc]},
+ url = {http://arxiv.org/abs/0707.0876},
+ receiveddate = {2007-07-06},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e081501},
+ doi = {10.1103/PhysRevD.76.081501}
+}
+
+@Article{ carpet-herrmann2007c,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre M. Shoemaker and
+ Pablo Laguna and Richard A. Matzner},
+ title = {Binary Black Holes: Spin Dynamics and Gravitational
+ Recoil},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 084032,
+ eprint = {arXiv:0706.2541 [gr-qc]},
+ url = {http://arxiv.org/abs/0706.2541},
+ receiveddate = {2007-06-18},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e084032},
+ doi = {10.1103/PhysRevD.76.084032}
+}
+
+@Article{ carpet-vaishnav2007a,
+ status = {refereed},
+ author = {Birjoo Vaishnav and Ian Hinder and Frank Herrmann and
+ Deirdre M. Shoemaker},
+ title = {Matched Filtering of Numerical Relativity Templates of
+ Spinning Binary Black Holes},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 084020,
+ eprint = {arXiv:0705.3829 [gr-qc]},
+ url = {http://arxiv.org/abs/0705.3829},
+ receiveddate = {2007-06-13},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e084020},
+ doi = {10.1103/PhysRevD.76.084020}
+}
+
+@Article{ carpet-ajith2007a,
+ status = {refereed},
+ author = {Parameswaran Ajith and Stanislav Babak and Yanbei Chen and
+ Martin Hewitson and Badri Krishnan and John T. Whelan and
+ Bernd Br{\"u}gmann and Peter Diener and Jos{\'e} González
+ and Mark Hannam and Sascha Husa and Michael Koppitz and
+ Denis Pollney and Luciano Rezzolla and Luc{\'i}a
+ Santamar{\'i}a and Alicia M. Sintes and Ulrich Sperhake and
+ Jonathan Thornburg},
+ title = {Phenomenological template family for black-hole
+ coalescence waveforms},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S689-S699},
+ eprint = {arXiv:0704.3764 [gr-qc]},
+ url = {http://arxiv.org/abs/0704.3764},
+ receiveddate = {2007-04-30},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S689},
+ doi = {10.1088/0264-9381/24/19/S31}
+}
+
+@Article{ carpet-thornburg2007a,
+ status = {refereed},
+ author = {Jonathan Thornburg and Peter Diener and Denis Pollney and
+ Luciano Rezzolla and Erik Schnetter and Ed Seidel and Ryoji
+ Takahashi},
+ title = {Are moving punctures equivalent to moving black holes?},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {3911-3918},
+ eprint = {arXiv:gr-qc/0701038},
+ url = {http://arxiv.org/abs/gr-qc/0701038},
+ receiveddate = {2007-03-22},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/3911},
+ doi = {10.1088/0264-9381/24/15/009}
+}
+
+@Article{ carpet-gonzalez2007a,
+ status = {refereed},
+ author = {Jos{\'e} A. Gonz{\'a}lez and Mark D. Hannam and Ulrich
+ Sperhake and Bernd Br{\"u}gmann and Sascha Husa},
+ title = {Supermassive recoil velocities for binary black-hole
+ mergers with antialigned spins},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 231101,
+ eprint = {arXiv:gr-qc/0702052},
+ url = {http://arxiv.org/abs/gr-qc/0702052},
+ receiveddate = {2007-02-26},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v98/e231101},
+ doi = {10.1103/PhysRevLett.98.231101}
+}
+
+@Article{ carpet-campanelli2007b,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower and David Merritt},
+ title = {Maximum gravitational recoil},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 231102,
+ eprint = {arXiv:gr-qc/0702133},
+ url = {http://arxiv.org/abs/gr-qc/0702133},
+ receiveddate = {2007-02-26},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v98/e231102},
+ doi = {10.1103/PhysRevLett.98.231102}
+}
+
+@Article{ carpet-campanelli2007a,
+ status = {refereed},
+ author = {Manuela Campanelli and Carlos O. Lousto and Yosef
+ Zlochower and David Merritt},
+ title = {Large Merger Recoils and Spin Flips From Generic
+ Black-Hole Binaries},
+ journal = {Astrophys. J. Lett.},
+ year = 2007,
+ volume = 659,
+ pages = {L5-L8},
+ eprint = {arXiv:gr-qc/0701164},
+ doi = {http://arxiv.org/abs/gr-qc/0701164},
+ receiveddate = {2007-02-08},
+ oldfulltexturl= {http://www.journals.uchicago.edu/doi/abs/10.1086/516712}
+}
+
+@Article{ carpet-herrmann2007b,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre M. Shoemaker and
+ Pablo Laguna and Richard A. Matzner},
+ title = {Gravitational Recoil from Spinning Binary Black Hole
+ Mergers},
+ journal = {Astrophys. J.},
+ year = 2007,
+ volume = 661,
+ pages = {430-436},
+ eprint = {arXiv:gr-qc/0701143},
+ url = {http://arxiv.org/abs/gr-qc/0701143},
+ receiveddate = {2007-01-29},
+ oldfulltexturl= {http://www.journals.uchicago.edu/doi/abs/10.1086/513603},
+ doi = {10.1086/513603}
+}
+
+@Article{ carpet-koppitz2007a,
+ status = {refereed},
+ author = {Michael Koppitz and Denis Pollney and Christian Reisswig
+ and Luciano Rezzolla and Jonathan Thornburg and Peter
+ Diener and Erik Schnetter},
+ title = {Recoil Velocities from Equal-Mass Binary-Black-Hole
+ Mergers},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 99,
+ pages = 041102,
+ eprint = {arXiv:gr-qc/0701163},
+ url = {http://arxiv.org/abs/gr-qc/0701163},
+ receiveddate = {2007-01-29},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v99/e041102},
+ doi = {10.1103/PhysRevLett.99.041102}
+}
+
+@Article{ carpet-marronetti2007a,
+ status = {refereed},
+ author = {Pedro Marronetti and Wolfgang Tichy and Bernd Br{\"u}gmann
+ and Jos{\'e} Gonz{\'a}lez and Mark Hannam and Sascha Husa
+ and Ulrich Sperhake},
+ title = {Binary black holes on a budget: simulations using
+ workstations},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S45-S58},
+ eprint = {arXiv:gr-qc/0701123},
+ url = {http://arxiv.org/abs/gr-qc/0701123},
+ receiveddate = {2007-01-22},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S45},
+ doi = {10.1088/0264-9381/24/12/S05}
+}
+
+@Article{ carpet-giacomazzo2007a,
+ status = {refereed},
+ author = {Bruno Giacomazzo and Luciano Rezzolla},
+ title = {{WhiskyMHD}: a new numerical code for general relativistic
+ magnetohydrodynamics},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S235-S258},
+ eprint = {arXiv:gr-qc/0701109},
+ url = {http://arxiv.org/abs/gr-qc/0701109},
+ receiveddate = {2007-01-20},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S235},
+ doi = {10.1088/0264-9381/24/12/S16}
+}
+
+@Article{ carpet-herrmann2007a,
+ status = {refereed},
+ author = {Frank Herrmann and Ian Hinder and Deirdre M. Shoemaker and
+ Pablo Laguna},
+ title = {Unequal mass binary black hole plunges and gravitational
+ recoil},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S33-S42},
+ eprint = {arXiv:gr-qc/0601026},
+ url = {http://arxiv.org/abs/gr-qc/0601026},
+ receiveddate = {2007-01-04},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S33},
+ doi = {10.1088/0264-9381/24/12/S04}
+}
+
+@Article{ carpet-baker2006a,
+ status = {refereed},
+ author = {John G. Baker and Manuela Campanelli and Frans Pretorius
+ and Yosef Zlochower},
+ title = {Comparisons of binary black hole merger waveforms},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S25-S31},
+ eprint = {arXiv:gr-qc/0701016},
+ url = {http://arxiv.org/abs/gr-qc/0701016},
+ receiveddate = {2006-12-26},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S25},
+ doi = {10.1088/0264-9381/24/12/S03}
+}
+
+@Article{ carept-pazos2006a,
+ status = {refereed},
+ author = {Enrique Pazos and Ernst Nils Dorband and Alessandro Nagar
+ and Carlos Palenzuela and Erik Schnetter and Manuel
+ Tiglio},
+ title = {How far away is far enough for extracting numerical
+ waveforms, and how much do they depend on the extraction
+ method?},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S341-S368},
+ eprint = {arXiv:gr-qc/0612149},
+ url = {http://arxiv.org/abs/gr-qc/0612149},
+ receiveddate = {2006-12-22},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S341},
+ doi = {10.1088/0264-9381/24/12/S22}
+}
+
+@Article{ carpet-szilagyi2006a,
+ status = {refereed},
+ author = {B{\'e}la Szil{\'a}gyi and Denis Pollney and Luciano
+ Rezzolla and Jonathan Thornburg and Jeffrey Winicour},
+ title = {An explicit harmonic code for black-hole evolution using
+ excision},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S275-S293},
+ eprint = {arXiv:gr-qc/0612150},
+ url = {http://arxiv.org/abs/gr-qc/0612150},
+ receiveddate = {2006-12-22},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S275},
+ doi = {10.1088/0264-9381/24/12/S18}
+}
+
+@Article{ carpet-baiotti2006b,
+ status = {refereed},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla},
+ title = {On the gravitational radiation from the collapse of
+ neutron stars to rotating black holes},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S187-S206},
+ eprint = {arXiv:gr-qc/0701043},
+ url = {http://arxiv.org/abs/gr-qc/0701043},
+ receiveddate = {2006-12-21},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S187},
+ doi = {10.1088/0264-9381/24/12/S13}
+}
+
+@Article{ carpet-ott2006b,
+ status = {refereed},
+ author = {Christian D. Ott and Harald Dimmelmeier and Andreas Marek
+ and Hans-Thomas Janka and Burkhard Zink and Ian Hawke and
+ Erik Schnetter},
+ title = {Rotating collapse of stellar iron cores in general
+ relativity},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S139-S154},
+ eprint = {arXiv:astro-ph/0612638},
+ url = {http://arxiv.org/abs/astro-ph/0612638},
+ receiveddate = {2006-12-20},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S139},
+ doi = {10.1088/0264-9381/24/12/S10}
+}
+
+@Article{ carpet-zink2006a,
+ status = {refereed},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D. Ott and Erik Schnetter and Ewald M{\"u}ller},
+ title = {Non-axisymmetric instability and fragmentation of general
+ relativistic quasitoroidal stars},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 024019,
+ eprint = {arXiv:astro-ph/0611601},
+ url = {http://arxiv.org/abs/astro-ph/0611601},
+ receiveddate = {2006-11-19},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e024019},
+ doi = {10.1103/PhysRevD.76.024019}
+}
+
+@Article{ carpet-bruegmann2006a,
+ status = {refereed},
+ author = {Bernd Br{\"u}gmann and Jos{\'e} A. Gonz{\'a}lez and Mark
+ Hannam and Sascha Husa and Ulrich Sperhake and Wolfgang
+ Tichy},
+ title = {Calibration of Moving Puncture Simulations},
+ journal = {Phys. Rev. D},
+ year = 2008,
+ volume = 77,
+ pages = 024027,
+ eprint = {arXiv:gr-qc/0610128},
+ url = {http://arxiv.org/abs/gr-qc/0610128},
+ receiveddate = {2006-11-03},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v77/e024027},
+ doi = {10.1103/PhysRevD.77.024027}
+}
+
+@Article{ carpet-reisswig2006a,
+ status = {refereed},
+ author = {Christian Reisswig and Nigel T. Bishop and Chi Wai Lai and
+ Jonathan Thornburg and B{\'e}la Szil{\'a}gyi},
+ title = {Characteristic evolutions in numerical relativity using
+ six angular patches},
+ journal = {Class. Quantum Grav.},
+ year = 2007,
+ volume = 24,
+ pages = {S327-S339},
+ eprint = {arXiv:gr-qc/0610019},
+ url = {http://arxiv.org/abs/gr-qc/0610019},
+ receiveddate = {2006-10-05},
+ oldfulltexturl= {http://stacks.iop.org/CQG/24/S327},
+ doi = {10.1088/0264-9381/24/12/S21}
+}
+
+@Article{ carpet-ott2006a,
+ status = {refereed},
+ author = {Christian D. Ott and Harald Dimmelmeier and Andreas Marek
+ and Hans-Thomas Janka and Ian Hawke and Burkhard Zink and
+ Erik Schnetter},
+ title = {{3D} Collapse of Rotating Stellar Iron Cores in General
+ Relativity Including Deleptonization and a Nuclear Equation
+ of State},
+ journal = {Phys. Rev. Lett.},
+ year = 2007,
+ volume = 98,
+ pages = 261101,
+ eprint = {arXiv:astro-ph/0609819},
+ url = {http://arxiv.org/abs/astro-ph/0609819},
+ receiveddate = {2006-09-29},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v98/e261101},
+ doi = {10.1103/PhysRevLett.98.261101}
+}
+
+@Article{ carpet-baiotti2006a,
+ status = {refereed},
+ author = {Luca Baiotti and Luciano Rezzolla},
+ title = {Challenging the paradigm of singularity excision in
+ gravitational collapse},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 97,
+ pages = 141101,
+ eprint = {arXiv:gr-qc/0608113},
+ url = {http://arxiv.org/abs/gr-qc/0608113},
+ receiveddate = {2006-08-26},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v97/e141101},
+ doi = {10.1103/PhysRevLett.97.141101}
+}
+
+@Article{ carpet-dorband2006a,
+ status = {refereed},
+ author = {Ernst Nils Dorband and Emanuele Berti and Peter Diener and
+ Erik Schnetter and Manuel Tiglio},
+ title = {A numerical study of the quasinormal mode excitation of
+ Kerr black holes},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 084028,
+ eprint = {arXiv:gr-qc/0608091},
+ url = {http://arxiv.org/abs/gr-qc/0608091},
+ receiveddate = {2006-08-22},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v74/e084028},
+ doi = {10.1103/PhysRevD.74.084028}
+}
+
+@Article{ carpet-loeffler2006a,
+ status = {refereed},
+ author = {Frank L{\"o}ffler and Luciano Rezzolla and Marcus Ansorg},
+ title = {Numerical evolutions of a black hole-neutron star system
+ in full General Relativity: Head-on collision},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 104018,
+ eprint = {arXiv:gr-qc/0606104},
+ url = {http://arxiv.org/abs/gr-qc/0606104},
+ receiveddate = {2006-06-23},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v74/e104018},
+ doi = {10.1103/PhysRevD.74.104018}
+}
+
+@Article{ carpet-sperhake2006a,
+ status = {refereed},
+ author = {Ulrich Sperhake},
+ title = {Binary black-hole evolutions of excision and puncture
+ data},
+ journal = {Phys. Rev. D},
+ year = 2007,
+ volume = 76,
+ pages = 104015,
+ eprint = {arXiv:gr-qc/0606079},
+ url = {http://arxiv.org/abs/gr-qc/0606079},
+ receiveddate = {2006-06-18},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v76/e104015},
+ doi = {10.1103/PhysRevD.76.104015}
+}
+
+@Article{ carpet-schnetter2006b,
+ status = {refereed},
+ author = {Erik Schnetter and Badri Krishnan and Florian Beyer},
+ title = {Introduction to dynamical horizons in numerical
+ relativity},
+ journal = {Phys. Rev. D},
+ year = 2006,
+ volume = 74,
+ pages = 024028,
+ eprint = {arXiv:gr-qc/0604015},
+ url = {http://arxiv.org/abs/gr-qc/0604015},
+ receiveddate = {2006-04-11},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v74/e024028},
+ doi = {10.1103/PhysRevD.74.024028}
+}
+
+@Article{ carpet-sopuerta2006a,
+ status = {refereed},
+ author = {Carlos F. Sopuerta and Ulrich Sperhake and Pablo Laguna},
+ title = {Hydro-without-Hydro Framework for Simulations of Black
+ Hole-Neutron Star Binaries},
+ journal = {Class. Quantum Grav.},
+ year = 2006,
+ volume = 23,
+ pages = {S579-S598},
+ eprint = {arXiv:gr-qc/0605018},
+ url = {http://arxiv.org/abs/gr-qc/0605018},
+ receiveddate = {2006-03-20},
+ oldfulltexturl= {http://stacks.iop.org/CQG/23/S579},
+ doi = {10.1088/0264-9381/23/16/S15}
+}
+
+@Article{ carpet-schnetter2006a,
+ status = {refereed background},
+ author = {Erik Schnetter and Peter Diener and Ernst Nils Dorband and
+ Manuel Tiglio},
+ title = {A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity},
+ journal = {Class. Quantum Grav.},
+ year = 2006,
+ volume = 23,
+ pages = {S553-S578},
+ eprint = {arXiv:gr-qc/0602104},
+ url = {http://arxiv.org/abs/gr-qc/0602104},
+ receiveddate = {2006-02-20},
+ oldfulltexturl= {http://stacks.iop.org/CQG/23/S553},
+ doi = {10.1088/0264-9381/23/16/S14}
+}
+
+@Article{ carpet-diener2005b,
+ status = {refereed},
+ author = {Peter Diener and Ernst Nils Dorband and Erik Schnetter and
+ Manuel Tiglio},
+ title = {Optimized high-order derivative and dissipation operators
+ satisfying summation by parts, and applications in
+ three-dimensional multi-block evolutions},
+ journal = {J. Sci. Comput.},
+ year = 2007,
+ volume = 32,
+ pages = {109-145},
+ eprint = {arXiv:gr-qc/0512001},
+ url = {http://arxiv.org/abs/gr-qc/0512001},
+ receiveddate = {2005-12-22},
+ oldfulltexturl= {http://www.springerlink.com/content/l724hr0846n2/},
+ doi = {10.1007/s10915-006-9123-7}
+}
+
+@Article{ carpet-diener2005a,
+ status = {refereed},
+ author = {Peter Diener and Frank Herrmann and Denis Pollney and Erik
+ Schnetter and Edward Seidel and Ryoji Takahashi and
+ Jonathan Thornburg and Jason Ventrella},
+ title = {Accurate Evolution of Orbiting Binary Black Holes},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 96,
+ pages = 121101,
+ eprint = {arXiv:gr-qc/0512108},
+ url = {http://arxiv.org/abs/gr-qc/0512108},
+ receiveddate = {2005-12-21},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v96/e121101},
+ doi = {10.1103/PhysRevLett.96.121101}
+}
+
+@Article{ carpet-sperhake2005a,
+ status = {refereed},
+ author = {Ulrich Sperhake and Bernard Kelly and Pablo Laguna and
+ Kenneth L. Smith and Erik Schnetter},
+ title = {Black hole head-on collisions and gravitational waves with
+ fixed mesh-refinement and dynamic singularity excision},
+ journal = {Phys. Rev. D},
+ year = 2005,
+ volume = 71,
+ pages = 124042,
+ eprint = {arXiv:gr-qc/0503071},
+ url = {http://arxiv.org/abs/gr-qc/0503071},
+ receiveddate = {2005-03-16},
+ oldfulltexturl= {http://link.aps.org/abstract/PRD/v71/e124042},
+ doi = {10.1103/PhysRevD.71.124042}
+}
+
+@Article{ carpet-zink2005a,
+ status = {refereed},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D. Ott and Erik Schnetter and Ewald M{\"u}ller},
+ title = {Formation of Supermassive Black Holes through
+ Fragmentation of Torodial Supermassive Stars},
+ journal = {Phys. Rev. Lett.},
+ year = 2006,
+ volume = 96,
+ pages = 161101,
+ eprint = {arXiv:gr-qc/0501080},
+ url = {http://arxiv.org/abs/gr-qc/0501080},
+ receiveddate = {2005-02-11},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v96/e161101},
+ doi = {10.1103/PhysRevLett.96.161101}
+}
+
+@Article{ carpet-baiotti2004a,
+ status = {refereed},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla and Erik
+ Schnetter},
+ title = {Gravitational-Wave Emission from Rotating Gravitational
+ Collapse in three Dimensions},
+ journal = {Phys. Rev. Lett.},
+ year = 2005,
+ volume = 95,
+ pages = 131101,
+ eprint = {arXiv:gr-qc/0503016},
+ url = {http://arxiv.org/abs/gr-qc/0503016},
+ receiveddate = {2004-10-12},
+ oldfulltexturl= {http://link.aps.org/abstract/PRL/v96/e161101},
+ doi = {10.1103/PhysRevLett.94.131101}
+}
+
+@Article{ carpet-schnetter2003a,
+ status = {refereed background},
+ author = {Erik Schnetter and Scott H. Hawley and Ian Hawke},
+ title = {Evolutions in 3D numerical relativity using fixed mesh
+ refinement},
+ journal = {Class. Quantum Grav.},
+ year = 2004,
+ volume = 21,
+ pages = {1465-1488},
+ eprint = {arXiv:gr-qc/0310042},
+ url = {http://arxiv.org/abs/gr-qc/0310042},
+ receiveddate = {2003-10-07},
+ oldfulltexturl= {http://stacks.iop.org/CQG/21/1465},
+ doi = {10.1088/0264-9381/21/6/014}
+}
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.bibitems b/Carpet/CarpetWeb/publications/citations-refereed.bibitems
new file mode 100644
index 000000000..bbc630a94
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.bibitems
@@ -0,0 +1,1186 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{\citenamefont{Aylott et~al.}(2009{\natexlab{a}})\citenamefont{Aylott,
+ Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati,
+ Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband,
+ Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann,
+ Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto,
+ Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra,
+ Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius,
+ Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a,
+ Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake,
+ Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio,
+ Veitch, Vicer{\'e}, Whelan, and Zlochower}}]{carpet-cadonati2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aylott}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{P.~R.} \bibnamefont{Brady}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{L.~T.} \bibnamefont{Buchman}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Cadonati}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Camp}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Chatterji}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Christensen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Faber}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fairhurst}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Farr}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fischetti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Guidi}},
+ \bibinfo{author}{\bibfnamefont{L.~M.} \bibnamefont{Goggin}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Kalogera}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Mandel}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Matzner}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Mercer}},
+ \bibinfo{author}{\bibfnamefont{S.~R.~P.} \bibnamefont{Mohapatra}},
+ \bibinfo{author}{\bibfnamefont{A.~H.} \bibnamefont{Mrou{\'e}}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Ochsner}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Pan}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Pekowsky}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Raymond}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Rinne}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Robinson}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{R{\"o}ver}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Sathyaprakash}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Stroeer}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Sturani}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{van~der Sluys}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van Meter}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Vaulin}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vecchio}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Veitch}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vicer{\'e}}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Status of {NINJA}: the {Numerical} {INJection}
+ {Analysis} project}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{114008}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0901.4399 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0905.4227}.
+
+\blurb[{\citenamefont{Baiotti
+ et~al.}(2009{\natexlab{a}})\citenamefont{Baiotti, Giacomazzo, and
+ Rezzolla}}]{carpet-baiotti2009a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Accurate evolutions of inspiralling neutron-star
+ binaries: assessment of the truncation error}}, \bibinfo{journal}{Class.
+ Quantum Grav.} \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{114005}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0901.4955 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.4955}.
+
+\blurb[{\citenamefont{Aylott et~al.}(2009{\natexlab{b}})\citenamefont{Aylott,
+ Baker, Boggs, Boyle, Brady, Brown, Br{\"u}gmann, Buchman, Buonanno, Cadonati,
+ Camp, Campanelli, Centrella, Chatterji, Christensen, Chu, Diener, Dorband,
+ Etienne, Faber, Fairhurst, Farr, Fischetti, Guidi, Goggin, Hannam, Herrmann,
+ Hinder, Husa, Kalogera, Keppel, Kidder, Kelly, Krishnan, Laguna, Lousto,
+ Mandel, Marronetti, Matzner, McWilliams, Matthews, Mercer, Mohapatra,
+ Mrou{\'e}, Nakano, Ochsner, Pan, Pekowsky, Pfeiffer, Pollney, Pretorius,
+ Raymond, Reisswig, Rezzolla, Rinne, Robinson, R{\"o}ver, Santamar{\'i}a,
+ Sathyaprakash, Scheel, Schnetter, Seiler, Shapiro, Shoemaker, Sperhake,
+ Stroeer, Sturani, Tichy, Liu, van~der Sluys, van Meter, Vaulin, Vecchio,
+ Veitch, Vicer{\'e}, Whelan, and Zlochower}}]{carpet-aylott2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aylott}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{P.~R.} \bibnamefont{Brady}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{L.~T.} \bibnamefont{Buchman}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Cadonati}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Camp}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Chatterji}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Christensen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Faber}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fairhurst}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Farr}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Fischetti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Guidi}},
+ \bibinfo{author}{\bibfnamefont{L.~M.} \bibnamefont{Goggin}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Kalogera}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Mandel}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Matzner}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Mercer}},
+ \bibinfo{author}{\bibfnamefont{S.~R.~P.} \bibnamefont{Mohapatra}},
+ \bibinfo{author}{\bibfnamefont{A.~H.} \bibnamefont{Mrou{\'e}}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Ochsner}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Pan}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Pekowsky}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Raymond}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Rinne}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Robinson}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{R{\"o}ver}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Sathyaprakash}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Stroeer}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Sturani}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{van~der Sluys}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van Meter}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Vaulin}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vecchio}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Veitch}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Vicer{\'e}}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Testing gravitational-wave searches with numerical
+ relativity waveforms: Results from the first {Numerical} {INJection}
+ {Analysis} ({NINJA}) project}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{165008}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \eprint{arXiv:0901.4399 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.4399}.
+
+\blurb[{\citenamefont{Hannam et~al.}(2009)\citenamefont{Hannam, Husa, Baker,
+ Boyle, Br{\"u}gmann, Chu, Dorband, Herrmann, Hinder, Kelly, Kidder, Laguna,
+ Matthews, {van Meter}, Pfeiffer, Pollney, Reisswig, Scheel, and
+ Shoemaker}}]{carpetresult-hannam2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Chu}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{{van Meter}}},
+ \bibinfo{author}{\bibfnamefont{H.~P.} \bibnamefont{Pfeiffer}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{The {Samurai} project: verifying the consistency of
+ black-hole-binary waveforms for gravitational-wave detection}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{084025} (\bibinfo{year}{2009}), \eprint{arXiv:0901.2437
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0901.2437}.
+
+\blurb[{\citenamefont{Rezzolla}(2009)}]{carpet-rezzolla2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Modelling the final state from binary black-hole
+ coalescences}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{26}}, \bibinfo{pages}{094023}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0812.2325 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0812.2325}.
+
+\blurb[{\citenamefont{Etienne et~al.}(2009)\citenamefont{Etienne, Liu,
+ Shapiro, , and Baumgarte}}]{carpet-etienne2008a}
+\bibinfo{author}{\bibfnamefont{Z.~B.} \bibnamefont{Etienne}},
+ \bibinfo{author}{\bibfnamefont{Y.~T.} \bibnamefont{Liu}},
+ \bibinfo{author}{\bibfnamefont{S.~L.} \bibnamefont{Shapiro}}, ,
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{T.~W.}
+ \bibnamefont{Baumgarte}}, \emph{\bibinfo{title}{General relativistic
+ simulations of black-hole-neutron-star mergers: Effects of black-hole spin}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{044024} (\bibinfo{year}{2009}), \eprint{arXiv:0812.2245
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0812.2245}.
+
+\blurb[{\citenamefont{Campanelli
+ et~al.}(2009{\natexlab{a}})\citenamefont{Campanelli, Lousto, and
+ Zlochower}}]{carpet-campanelli2008b}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Algebraic classification of numerical spacetimes and
+ black-hole-binary remnants}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{084012}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \eprint{arXiv:0811.3006 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0811.3006}.
+
+\blurb[{\citenamefont{Korobkin et~al.}(2009)\citenamefont{Korobkin, Aksoylu,
+ Holst, Pazos, and Tiglio}}]{carpet-korobkin2008a}
+\bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Korobkin}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Aksoylu}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Holst}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Pazos}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Solving the einstein constraint equations on
+ multi-block triangulations using finite element methods}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{26}},
+ \bibinfo{pages}{145007} (\bibinfo{year}{2009}), \eprint{arXiv:0801.1823
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0801.1823}.
+
+\blurb[{\citenamefont{Brown et~al.}(2009)\citenamefont{Brown, Diener,
+ Sarbach, Schnetter, and Tiglio}}]{carpet-brown2007b}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Sarbach}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Turduckening black holes: an analytical and
+ computational study}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{044023}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0809.3533 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0809.3533}.
+
+\blurb[{\citenamefont{Baiotti
+ et~al.}(2009{\natexlab{b}})\citenamefont{Baiotti, Bernuzzi, Corvino, Pietri,
+ and Nagar}}]{carpet-baiotti2008b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Bernuzzi}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Corvino}},
+ \bibinfo{author}{\bibfnamefont{R.~D.} \bibnamefont{Pietri}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \emph{\bibinfo{title}{Gravitational-wave extraction from neutron-star
+ oscillations: Comparing linear and nonlinear techniques}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{79}},
+ \bibinfo{pages}{024002} (\bibinfo{year}{2009}{\natexlab{b}}),
+ \eprint{arXiv:0808.4002 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0808.4002}.
+
+\blurb[{\citenamefont{Campanelli
+ et~al.}(2009{\natexlab{b}})\citenamefont{Campanelli, Lousto, Nakano, and
+ Zlochower}}]{carpet-campanelli2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparison of numerical and post-{Newtonian} waveforms
+ for generic precessing black-hole binaries}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{084010}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \eprint{arXiv:0808.0713 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0808.0713}.
+
+\blurb[{\citenamefont{Healy et~al.}(2009)\citenamefont{Healy, Herrmann,
+ Hinder, Shoemaker, Laguna, , and Matzner}}]{carpet-healy2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Superkicks in hyperbolic encounters of binary black
+ holes}}, \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{102}},
+ \bibinfo{pages}{041101} (\bibinfo{year}{2009}), \eprint{arXiv:0807.3292
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0807.3292}.
+
+\blurb[{\citenamefont{Sperhake
+ et~al.}(2008{\natexlab{a}})\citenamefont{Sperhake, Cardoso, Pretorius, Berti,
+ , and Gonz{\'a}lez}}]{carpet-sperhake2008a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \emph{\bibinfo{title}{High-energy collision of two black holes}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{101}},
+ \bibinfo{pages}{161101} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0806.1738 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0806.1738}.
+
+\blurb[{\citenamefont{Gualtieri et~al.}(2008)\citenamefont{Gualtieri, Berti,
+ Cardoso, and Sperhake}}]{carpet-gualtieri2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Gualtieri}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Transformation of the multipolar components of
+ gravitational radiation under rotations and boosts}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{044024}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0805.1017 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0805.1017}.
+
+\blurb[{\citenamefont{Lousto and Zlochower}(2009)}]{carpet-lousto2008a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Modeling gravitational recoil from precessing
+ highly-spinning unequal-mass black-hole binaries}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{79}}, \bibinfo{pages}{064018}
+ (\bibinfo{year}{2009}), \eprint{arXiv:0805.0159 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0805.0159}.
+
+\blurb[{\citenamefont{Benger}(2008)}]{carpetresult-benger2007a}
+\bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Benger}},
+ \emph{\bibinfo{title}{Colliding galaxies, rotating neutron stars and merging
+ black holes -- visualizing high dimensional datasets on arbitrary meshes}},
+ \bibinfo{journal}{New J. Phys.} \textbf{\bibinfo{volume}{10}},
+ \bibinfo{pages}{125004} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://www.iop.org/EJ/ abstract/1367-2630/10/12/125004}.
+
+\blurb[{\citenamefont{Baiotti et~al.}(2008)\citenamefont{Baiotti, Giacomazzo,
+ and Rezzolla}}]{carpet-baiotti2008a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Accurate evolutions of inspiralling neutron-star
+ binaries: Prompt and delayed collapse to a black hole}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{084033} (\bibinfo{year}{2008}), \eprint{arXiv:0804.0594
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0804.0594}.
+
+\blurb[{\citenamefont{Dain et~al.}(2008)\citenamefont{Dain, Lousto, , and
+ Zlochower}}]{carpet-dain2008a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Dain}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}}, ,
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Extra-large remnant recoil velocities and spins from
+ near-extremal-{Bowen}-{York}-spin black-hole binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{024039} (\bibinfo{year}{2008}), \eprint{arXiv:0803.0351
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0803.0351}.
+
+\blurb[{\citenamefont{Seiler et~al.}(2008)\citenamefont{Seiler, Szil{\'a}gyi,
+ Pollney, and Rezzolla}}]{carpet-seiler2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Constraint-preserving boundary treatment for a harmonic
+ formulation of the einstein equations}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{175020}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.3341 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.3341}.
+
+\blurb[{\citenamefont{Washik et~al.}(2008)\citenamefont{Washik, Healy,
+ Herrmann, Hinder, Shoemaker, Laguna, and Matzner}}]{carpet-washik2008a}
+\bibinfo{author}{\bibfnamefont{M.~C.} \bibnamefont{Washik}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Binary-black-hole encounters, gravitational bursts, and
+ maximum final spin}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{101}}, \bibinfo{pages}{061102}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.2520 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.2520}.
+
+\blurb[{\citenamefont{Bentivegna et~al.}(2008)\citenamefont{Bentivegna,
+ Shoemaker, Hinder, , and Herrmann}}]{carpet-bentivegna2008a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Bentivegna}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}}, , \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Probing the binary black hole merger regime with scalar
+ perturbations}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{124016}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0801.3478 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0801.3478}.
+
+\blurb[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{a}})\citenamefont{Rezzolla, Barausse, Dorband,
+ Pollney, Reisswig, Seiler, and Husa}}]{carpet-rezzolla2007c}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Barausse}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Final spin from the coalescence of two black holes}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{78}},
+ \bibinfo{pages}{044002} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0712.3541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0712.3541}.
+
+\blurb[{\citenamefont{Damour et~al.}(2008)\citenamefont{Damour, Nagar,
+ Dorband, Pollney, and Rezzolla}}]{carpet-damour2007a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Damour}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Faithful effective-one-body waveforms of equal-mass
+ coalescing black-hole binaries}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{084017}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0712.3003 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0712.3003}.
+
+\blurb[{\citenamefont{Shoemaker et~al.}(2008)\citenamefont{Shoemaker,
+ Vaishnav, Hinder, and Herrmann}}]{carpet-shoemaker2007a}
+\bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Numerical relativity meets data analysis: spinning
+ binary black hole case}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{25}}, \bibinfo{pages}{114047}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0802.4427 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0802.4427}.
+
+\blurb[{\citenamefont{Zink et~al.}(2008)\citenamefont{Zink, Schnetter, and
+ Tiglio}}]{carpet-zink2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Multi-patch methods in general relativistic
+ astrophysics - {I.} {Hydrodynamical} flows on fixed backgrounds}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{103015} (\bibinfo{year}{2008}), \eprint{arXiv:0712.0353
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0712.0353}.
+
+\blurb[{\citenamefont{Berti et~al.}(2008)\citenamefont{Berti, Cardoso,
+ Gonz{\'a}lez, Sperhake, and Br{\"u}gmann}}]{carpet-berti2007a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \emph{\bibinfo{title}{Multipolar analysis of spinning binaries}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{25}},
+ \bibinfo{pages}{114035} (\bibinfo{year}{2008}), \eprint{arXiv:0711.1097
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0711.1097}.
+
+\blurb[{\citenamefont{Bode et~al.}(2008)\citenamefont{Bode, Shoemaker,
+ Herrmann, and Hinder}}]{carpet-bode2007a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Bode}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \emph{\bibinfo{title}{Robustness of binary black hole mergers in the presence
+ of spurious radiation}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{044027}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0711.0669 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0711.0669}.
+
+\blurb[{\citenamefont{Hinder et~al.}(2008)\citenamefont{Hinder, Vaishnav,
+ Herrmann, Shoemaker, and Laguna}}]{carpet-hinder2007a}
+\bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Circularization and final spin in eccentric binary
+ black hole inspirals}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{77}}, \bibinfo{pages}{081502(R)}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0710.5167 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.5167}.
+
+\blurb[{\citenamefont{Boyle et~al.}(2008)\citenamefont{Boyle, Kesden, and
+ Nissanke}}]{carpetresult-boyle2007a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Boyle}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Kesden}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Nissanke}},
+ \emph{\bibinfo{title}{Binary black hole merger: symmetry and the spin
+ expansion}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{100}}, \bibinfo{pages}{151101}
+ (\bibinfo{year}{2008}), \eprint{arXiv:0709.0299 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0709.0299}.
+
+\blurb[{\citenamefont{Sperhake
+ et~al.}(2008{\natexlab{b}})\citenamefont{Sperhake, Berti, Cardoso,
+ Gonz{\'a}lez, Br{\"u}gmann, and Ansorg}}]{carpet-sperhake2007a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \emph{\bibinfo{title}{Eccentric binary black-hole mergers: The transition
+ from inspiral to plunge in general relativity}}, \bibinfo{journal}{Phys. Rev.
+ D} \textbf{\bibinfo{volume}{78}}, \bibinfo{pages}{064069}
+ (\bibinfo{year}{2008}{\natexlab{b}}), \eprint{arXiv:0710.3823 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.3823}.
+
+\blurb[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{b}})\citenamefont{Rezzolla, Diener, Dorband, Pollney,
+ Reisswig, Schnetter, and Seiler}}]{carpet-rezzolla2007b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \emph{\bibinfo{title}{The final spin from the coalescence of aligned-spin
+ black-hole binaries}}, \bibinfo{journal}{Astrophys. J. Lett.}
+ \textbf{\bibinfo{volume}{674}}, \bibinfo{pages}{L29}
+ (\bibinfo{year}{2008}{\natexlab{b}}), \eprint{arXiv:0710.3345 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0710.3345}.
+
+\blurb[{\citenamefont{Ajith et~al.}(2008)\citenamefont{Ajith, Babak, Chen,
+ Hewitson, Krishnan, Sintes, Whelan, Br{\"u}gmann, Diener, Dorband,
+ Gonz{\'a}lez, Hannam, Husa, Pollney, Rezzolla, Santamar{\'i}a, Sperhake, and
+ Thornburg}}]{carpet-ajith2007b}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Ajith}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Babak}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hewitson}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{A.~M.} \bibnamefont{Sintes}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \emph{\bibinfo{title}{A template bank for gravitational waveforms from
+ coalescing binary black holes: {I.} non-spinning binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{104017} (\bibinfo{year}{2008}), \eprint{arXiv:0710.2335
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0710.2335}.
+
+\blurb[{\citenamefont{Campanelli et~al.}(2008)\citenamefont{Campanelli,
+ Lousto, and Zlochower}}]{carpet-campanelli2007c}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Close encounters of three black holes}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{101501(5)} (\bibinfo{year}{2008}), \eprint{arXiv:0710.0879
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0710.0879}.
+
+\blurb[{\citenamefont{Buonanno et~al.}(2008)\citenamefont{Buonanno, Kidder,
+ and Lehner}}]{carpetresult-buonanno2007a}
+\bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Buonanno}},
+ \bibinfo{author}{\bibfnamefont{L.~E.} \bibnamefont{Kidder}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Lehner}},
+ \emph{\bibinfo{title}{Estimating the final spin of a binary black hole
+ coalescence}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{026004} (\bibinfo{year}{2008}), \eprint{arXiv:0709.3839
+ [astro-ph]}, \urlprefix\url{http://arxiv.org/abs/0709.3839}.
+
+\blurb[{\citenamefont{Stark et~al.}(2008)\citenamefont{Stark, Allen, Goodale,
+ Radke, and Schnetter}}]{carpet-stark2007a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Stark}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Goodale}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Radke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{An extensible timing infrastructure for adaptive
+ large-scale applications}}, in \emph{\bibinfo{booktitle}{Parallel Processing
+ and Applied Mathematics}}, edited by
+ \bibinfo{editor}{\bibfnamefont{R.}~\bibnamefont{Wyrzykowski}}
+ (\bibinfo{publisher}{Springer}, \bibinfo{year}{2008}), vol.
+ \bibinfo{volume}{4967} of \emph{\bibinfo{series}{Lecture Notes in Computer
+ Science}}, pp. \bibinfo{pages}{1170--1179}, \eprint{arXiv:0705.3015 [cs.PF]},
+ \urlprefix\url{http://arxiv.org/abs/0705.3015}.
+
+\blurb[{\citenamefont{Pollney et~al.}(2007)\citenamefont{Pollney, Reisswig,
+ Rezzolla, Szil{\'a}gyi, Ansorg, Deris, Diener, Dorband, Koppitz, Nagar, and
+ Schnetter}}]{carpet-pollney207a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Deris}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Recoil velocities from equal-mass binary black-hole
+ mergers: a systematic investigation of spin-orbit aligned configurations}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{124002} (\bibinfo{year}{2007}), \eprint{arXiv:0707.2559
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0707.2559}.
+
+\blurb[{\citenamefont{Lousto and Zlochower}(2008)}]{carpet-lousto2007a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Further insight into gravitational recoil}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{044028} (\bibinfo{year}{2008}), \eprint{arXiv:0708.4048
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0708.4048}.
+
+\blurb[{\citenamefont{Rezzolla
+ et~al.}(2008{\natexlab{c}})\citenamefont{Rezzolla, Dorband, Reisswig, Diener,
+ Pollney, Schnetter, and Szil{\'s}gyi}}]{carpet-rezzolla2007a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'s}gyi}},
+ \emph{\bibinfo{title}{Spin diagrams for equal-mass black-hole binaries with
+ aligned spins}}, \bibinfo{journal}{Astrophys. J.}
+ \textbf{\bibinfo{volume}{679}}, \bibinfo{pages}{1422}
+ (\bibinfo{year}{2008}{\natexlab{c}}), \eprint{arXiv:0708.3999 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0708.3999}.
+
+\blurb[{\citenamefont{Br{\"u}gmann
+ et~al.}(2008{\natexlab{a}})\citenamefont{Br{\"u}gmann, Gonz{\'a}lez, Hannam,
+ Husa, and Sperhake}}]{carpet-bruegmann2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Exploring black hole superkicks}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{124047} (\bibinfo{year}{2008}{\natexlab{a}}),
+ \eprint{arXiv:0707.0135 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0707.0135}.
+
+\blurb[{\citenamefont{Brown et~al.}(2007)\citenamefont{Brown, Sarbach,
+ Schnetter, Tiglio, Diener, Hawke, and Pollney}}]{carpet-brown2007a}
+\bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Brown}},
+ \bibinfo{author}{\bibfnamefont{O.}~\bibnamefont{Sarbach}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \emph{\bibinfo{title}{Excision without excision}}, \bibinfo{journal}{Phys.
+ Rev. D} \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{081503(R)}
+ (\bibinfo{year}{2007}), \eprint{arXiv:0707.3101 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0707.3101}.
+
+\blurb[{\citenamefont{Krishnan et~al.}(2007)\citenamefont{Krishnan, Lousto,
+ and Zlochower}}]{carpet-krishnan2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Quasi-local linear momentum in black-hole binaries}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{081501(R)} (\bibinfo{year}{2007}), \eprint{arXiv:0707.0876
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0707.0876}.
+
+\blurb[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{a}})\citenamefont{Herrmann, Hinder, Shoemaker, Laguna,
+ and Matzner}}]{carpet-herrmann2007c}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Binary black holes: Spin dynamics and gravitational
+ recoil}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{084032} (\bibinfo{year}{2007}{\natexlab{a}}),
+ \eprint{arXiv:0706.2541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0706.2541}.
+
+\blurb[{\citenamefont{Vaishnav et~al.}(2007)\citenamefont{Vaishnav, Hinder,
+ Herrmann, and Shoemaker}}]{carpet-vaishnav2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Vaishnav}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Matched filtering of numerical relativity templates of
+ spinning binary black holes}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{084020}
+ (\bibinfo{year}{2007}), \eprint{arXiv:0705.3829 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0705.3829}.
+
+\blurb[{\citenamefont{Ajith et~al.}(2007)\citenamefont{Ajith, Babak, Chen,
+ Hewitson, Krishnan, Whelan, Br{\"u}gmann, Diener, González, Hannam, Husa,
+ Koppitz, Pollney, Rezzolla, Santamar{\'i}a, Sintes, Sperhake, and
+ Thornburg}}]{carpet-ajith2007a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Ajith}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Babak}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hewitson}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}},
+ \bibinfo{author}{\bibfnamefont{J.~T.} \bibnamefont{Whelan}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{González}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Santamar{\'i}a}},
+ \bibinfo{author}{\bibfnamefont{A.~M.} \bibnamefont{Sintes}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \emph{\bibinfo{title}{Phenomenological template family for black-hole
+ coalescence waveforms}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S689} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0704.3764 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0704.3764}.
+
+\blurb[{\citenamefont{Thornburg et~al.}(2007)\citenamefont{Thornburg, Diener,
+ Pollney, Rezzolla, Schnetter, Seidel, and Takahashi}}]{carpet-thornburg2007a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Takahashi}},
+ \emph{\bibinfo{title}{Are moving punctures equivalent to moving black
+ holes?}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{3911} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701038},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701038}.
+
+\blurb[{\citenamefont{Gonz{\'a}lez et~al.}(2007)\citenamefont{Gonz{\'a}lez,
+ Hannam, Sperhake, Br{\"u}gmann, and Husa}}]{carpet-gonzalez2007a}
+\bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.~D.} \bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Supermassive recoil velocities for binary black-hole
+ mergers with antialigned spins}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{98}}, \bibinfo{pages}{231101}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0702052},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0702052}.
+
+\blurb[{\citenamefont{Campanelli
+ et~al.}(2007{\natexlab{a}})\citenamefont{Campanelli, Lousto, Zlochower, and
+ Merritt}}]{carpet-campanelli2007b}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Merritt}},
+ \emph{\bibinfo{title}{Maximum gravitational recoil}}, \bibinfo{journal}{Phys.
+ Rev. Lett.} \textbf{\bibinfo{volume}{98}}, \bibinfo{pages}{231102}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:gr-qc/0702133},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0702133}.
+
+\blurb[{\citenamefont{Campanelli
+ et~al.}(2007{\natexlab{b}})\citenamefont{Campanelli, Lousto, Zlochower, and
+ Merritt}}]{carpet-campanelli2007a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Merritt}},
+ \emph{\bibinfo{title}{Large merger recoils and spin flips from generic
+ black-hole binaries}}, \bibinfo{journal}{Astrophys. J. Lett.}
+ \textbf{\bibinfo{volume}{659}}, \bibinfo{pages}{L5}
+ (\bibinfo{year}{2007}{\natexlab{b}}), \eprint{arXiv:gr-qc/0701164}.
+
+\blurb[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{b}})\citenamefont{Herrmann, Hinder, Shoemaker, Laguna,
+ and Matzner}}]{carpet-herrmann2007b}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \emph{\bibinfo{title}{Gravitational recoil from spinning binary black hole
+ mergers}}, \bibinfo{journal}{Astrophys. J.} \textbf{\bibinfo{volume}{661}},
+ \bibinfo{pages}{430} (\bibinfo{year}{2007}{\natexlab{b}}),
+ \eprint{arXiv:gr-qc/0701143},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701143}.
+
+\blurb[{\citenamefont{Koppitz et~al.}(2007)\citenamefont{Koppitz, Pollney,
+ Reisswig, Rezzolla, Thornburg, Diener, and Schnetter}}]{carpet-koppitz2007a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Recoil velocities from equal-mass binary-black-hole
+ mergers}}, \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{99}},
+ \bibinfo{pages}{041102} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701163},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701163}.
+
+\blurb[{\citenamefont{Marronetti et~al.}(2007)\citenamefont{Marronetti,
+ Tichy, Br{\"u}gmann, Gonz{\'a}lez, Hannam, Husa, and
+ Sperhake}}]{carpet-marronetti2007a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Marronetti}},
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Binary black holes on a budget: simulations using
+ workstations}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S45} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701123},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701123}.
+
+\blurb[{\citenamefont{Giacomazzo and
+ Rezzolla}(2007)}]{carpet-giacomazzo2007a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{{WhiskyMHD}: a new numerical code for general
+ relativistic magnetohydrodynamics}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S235} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0701109},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701109}.
+
+\blurb[{\citenamefont{Herrmann
+ et~al.}(2007{\natexlab{c}})\citenamefont{Herrmann, Hinder, Shoemaker, and
+ Laguna}}]{carpet-herrmann2007a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Unequal mass binary black hole plunges and
+ gravitational recoil}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S33}
+ (\bibinfo{year}{2007}{\natexlab{c}}), \eprint{arXiv:gr-qc/0601026},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0601026}.
+
+\blurb[{\citenamefont{Baker et~al.}(2007)\citenamefont{Baker, Campanelli,
+ Pretorius, and Zlochower}}]{carpet-baker2006a}
+\bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparisons of binary black hole merger waveforms}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{24}},
+ \bibinfo{pages}{S25} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701016},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701016}.
+
+\blurb[{\citenamefont{Pazos et~al.}(2007)\citenamefont{Pazos, Dorband, Nagar,
+ Palenzuela, Schnetter, and Tiglio}}]{carept-pazos2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Pazos}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Palenzuela}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{How far away is far enough for extracting numerical
+ waveforms, and how much do they depend on the extraction method?}},
+ \bibinfo{journal}{Class. Quantum Grav.} \textbf{\bibinfo{volume}{24}},
+ \bibinfo{pages}{S341} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0612149},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0612149}.
+
+\blurb[{\citenamefont{Szil{\'a}gyi et~al.}(2007)\citenamefont{Szil{\'a}gyi,
+ Pollney, Rezzolla, Thornburg, and Winicour}}]{carpet-szilagyi2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Winicour}},
+ \emph{\bibinfo{title}{An explicit harmonic code for black-hole evolution
+ using excision}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S275} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0612150},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0612150}.
+
+\blurb[{\citenamefont{Baiotti et~al.}(2007)\citenamefont{Baiotti, Hawke, and
+ Rezzolla}}]{carpet-baiotti2006b}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{On the gravitational radiation from the collapse of
+ neutron stars to rotating black holes}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S187}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0701043},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0701043}.
+
+\blurb[{\citenamefont{Ott et~al.}(2007{\natexlab{a}})\citenamefont{Ott,
+ Dimmelmeier, Marek, Janka, Zink, Hawke, and Schnetter}}]{carpet-ott2006b}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Dimmelmeier}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Marek}},
+ \bibinfo{author}{\bibfnamefont{H.-T.} \bibnamefont{Janka}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Rotating collapse of stellar iron cores in general
+ relativity}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S139}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:astro-ph/0612638},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0612638}.
+
+\blurb[{\citenamefont{Zink et~al.}(2007)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Non-axisymmetric instability and fragmentation of
+ general relativistic quasitoroidal stars}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{76}}, \bibinfo{pages}{024019}
+ (\bibinfo{year}{2007}), \eprint{arXiv:astro-ph/0611601},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0611601}.
+
+\blurb[{\citenamefont{Br{\"u}gmann
+ et~al.}(2008{\natexlab{b}})\citenamefont{Br{\"u}gmann, Gonz{\'a}lez, Hannam,
+ Husa, Sperhake, and Tichy}}]{carpet-bruegmann2006a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Tichy}},
+ \emph{\bibinfo{title}{Calibration of moving puncture simulations}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{77}},
+ \bibinfo{pages}{024027} (\bibinfo{year}{2008}{\natexlab{b}}),
+ \eprint{arXiv:gr-qc/0610128},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0610128}.
+
+\blurb[{\citenamefont{Reisswig et~al.}(2007)\citenamefont{Reisswig, Bishop,
+ Lai, Thornburg, and Szil{\'a}gyi}}]{carpet-reisswig2006a}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{N.~T.} \bibnamefont{Bishop}},
+ \bibinfo{author}{\bibfnamefont{C.~W.} \bibnamefont{Lai}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \emph{\bibinfo{title}{Characteristic evolutions in numerical relativity using
+ six angular patches}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{24}}, \bibinfo{pages}{S327} (\bibinfo{year}{2007}),
+ \eprint{arXiv:gr-qc/0610019},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0610019}.
+
+\blurb[{\citenamefont{Ott et~al.}(2007{\natexlab{b}})\citenamefont{Ott,
+ Dimmelmeier, Marek, Janka, Hawke, Zink, and Schnetter}}]{carpet-ott2006a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Dimmelmeier}},
+ \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Marek}},
+ \bibinfo{author}{\bibfnamefont{H.-T.} \bibnamefont{Janka}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{{3D} collapse of rotating stellar iron cores in general
+ relativity including deleptonization and a nuclear equation of state}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{98}},
+ \bibinfo{pages}{261101} (\bibinfo{year}{2007}{\natexlab{b}}),
+ \eprint{arXiv:astro-ph/0609819},
+ \urlprefix\url{http://arxiv.org/abs/astro-ph/0609819}.
+
+\blurb[{\citenamefont{Baiotti and Rezzolla}(2006)}]{carpet-baiotti2006a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Challenging the paradigm of singularity excision in
+ gravitational collapse}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{97}}, \bibinfo{pages}{141101}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0608113},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0608113}.
+
+\blurb[{\citenamefont{Dorband et~al.}(2006)\citenamefont{Dorband, Berti,
+ Diener, Schnetter, and Tiglio}}]{carpet-dorband2006a}
+\bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A numerical study of the quasinormal mode excitation of
+ kerr black holes}}, \bibinfo{journal}{Phys. Rev. D}
+ \textbf{\bibinfo{volume}{74}}, \bibinfo{pages}{084028}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0608091},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0608091}.
+
+\blurb[{\citenamefont{L{\"o}ffler et~al.}(2006)\citenamefont{L{\"o}ffler,
+ Rezzolla, and Ansorg}}]{carpet-loeffler2006a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{L{\"o}ffler}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Ansorg}},
+ \emph{\bibinfo{title}{Numerical evolutions of a black hole-neutron star
+ system in full general relativity: Head-on collision}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{74}},
+ \bibinfo{pages}{104018} (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0606104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0606104}.
+
+\blurb[{\citenamefont{Sperhake}(2007)}]{carpet-sperhake2006a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Binary black-hole evolutions of excision and puncture
+ data}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{76}},
+ \bibinfo{pages}{104015} (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0606079},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0606079}.
+
+\blurb[{\citenamefont{Schnetter
+ et~al.}(2006{\natexlab{a}})\citenamefont{Schnetter, Krishnan, and
+ Beyer}}]{carpet-schnetter2006b}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Krishnan}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Beyer}},
+ \emph{\bibinfo{title}{Introduction to dynamical horizons in numerical
+ relativity}}, \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{74}},
+ \bibinfo{pages}{024028} (\bibinfo{year}{2006}{\natexlab{a}}),
+ \eprint{arXiv:gr-qc/0604015},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0604015}.
+
+\blurb[{\citenamefont{Sopuerta et~al.}(2006)\citenamefont{Sopuerta, Sperhake,
+ and Laguna}}]{carpet-sopuerta2006a}
+\bibinfo{author}{\bibfnamefont{C.~F.} \bibnamefont{Sopuerta}},
+ \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \emph{\bibinfo{title}{Hydro-without-hydro framework for simulations of black
+ hole-neutron star binaries}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S579} (\bibinfo{year}{2006}),
+ \eprint{arXiv:gr-qc/0605018},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0605018}.
+
+\blurb[{\citenamefont{Schnetter
+ et~al.}(2006{\natexlab{b}})\citenamefont{Schnetter, Diener, Dorband, and
+ Tiglio}}]{carpet-schnetter2006a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{A multi-block infrastructure for three-dimensional
+ time-dependent numerical relativity}}, \bibinfo{journal}{Class. Quantum
+ Grav.} \textbf{\bibinfo{volume}{23}}, \bibinfo{pages}{S553}
+ (\bibinfo{year}{2006}{\natexlab{b}}), \eprint{arXiv:gr-qc/0602104},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0602104}.
+
+\blurb[{\citenamefont{Diener et~al.}(2007)\citenamefont{Diener, Dorband,
+ Schnetter, and Tiglio}}]{carpet-diener2005b}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Tiglio}},
+ \emph{\bibinfo{title}{Optimized high-order derivative and dissipation
+ operators satisfying summation by parts, and applications in
+ three-dimensional multi-block evolutions}}, \bibinfo{journal}{J. Sci.
+ Comput.} \textbf{\bibinfo{volume}{32}}, \bibinfo{pages}{109}
+ (\bibinfo{year}{2007}), \eprint{arXiv:gr-qc/0512001},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0512001}.
+
+\blurb[{\citenamefont{Diener et~al.}(2006)\citenamefont{Diener, Herrmann,
+ Pollney, Schnetter, Seidel, Takahashi, Thornburg, and
+ Ventrella}}]{carpet-diener2005a}
+\bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Diener}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Seidel}},
+ \bibinfo{author}{\bibfnamefont{R.}~\bibnamefont{Takahashi}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Thornburg}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Ventrella}},
+ \emph{\bibinfo{title}{Accurate evolution of orbiting binary black holes}},
+ \bibinfo{journal}{Phys. Rev. Lett.} \textbf{\bibinfo{volume}{96}},
+ \bibinfo{pages}{121101} (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0512108},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0512108}.
+
+\blurb[{\citenamefont{Sperhake et~al.}(2005)\citenamefont{Sperhake, Kelly,
+ Laguna, Smith, and Schnetter}}]{carpet-sperhake2005a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{K.~L.} \bibnamefont{Smith}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Black hole head-on collisions and gravitational waves
+ with fixed mesh-refinement and dynamic singularity excision}},
+ \bibinfo{journal}{Phys. Rev. D} \textbf{\bibinfo{volume}{71}},
+ \bibinfo{pages}{124042} (\bibinfo{year}{2005}), \eprint{arXiv:gr-qc/0503071},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0503071}.
+
+\blurb[{\citenamefont{Zink et~al.}(2006)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2005a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Formation of supermassive black holes through
+ fragmentation of torodial supermassive stars}}, \bibinfo{journal}{Phys. Rev.
+ Lett.} \textbf{\bibinfo{volume}{96}}, \bibinfo{pages}{161101}
+ (\bibinfo{year}{2006}), \eprint{arXiv:gr-qc/0501080},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0501080}.
+
+\blurb[{\citenamefont{Baiotti et~al.}(2005)\citenamefont{Baiotti, Hawke,
+ Rezzolla, and Schnetter}}]{carpet-baiotti2004a}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Gravitational-wave emission from rotating gravitational
+ collapse in three dimensions}}, \bibinfo{journal}{Phys. Rev. Lett.}
+ \textbf{\bibinfo{volume}{95}}, \bibinfo{pages}{131101}
+ (\bibinfo{year}{2005}), \eprint{arXiv:gr-qc/0503016},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0503016}.
+
+\blurb[{\citenamefont{Schnetter et~al.}(2004)\citenamefont{Schnetter, Hawley,
+ and Hawke}}]{carpet-schnetter2003a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibinfo{author}{\bibfnamefont{S.~H.} \bibnamefont{Hawley}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \emph{\bibinfo{title}{Evolutions in 3d numerical relativity using fixed mesh
+ refinement}}, \bibinfo{journal}{Class. Quantum Grav.}
+ \textbf{\bibinfo{volume}{21}}, \bibinfo{pages}{1465} (\bibinfo{year}{2004}),
+ \eprint{arXiv:gr-qc/0310042},
+ \urlprefix\url{http://arxiv.org/abs/gr-qc/0310042}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.blg b/Carpet/CarpetWeb/publications/citations-refereed.blg
new file mode 100644
index 000000000..84cd33c49
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-refereed.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-refereed.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 75 entries,
+ 3482 wiz_defined-function locations,
+ 1633 strings with 30180 characters,
+and the built_in function-call counts, 86266 in all, are:
+= -- 4037
+> -- 4328
+< -- 537
++ -- 3983
+- -- 1065
+* -- 13269
+:= -- 7974
+add.period$ -- 75
+call.type$ -- 75
+change.case$ -- 375
+chr.to.int$ -- 63
+cite$ -- 75
+duplicate$ -- 7487
+empty$ -- 6622
+format.name$ -- 2358
+if$ -- 15943
+int.to.chr$ -- 13
+int.to.str$ -- 76
+missing$ -- 1137
+newline$ -- 240
+num.names$ -- 226
+pop$ -- 1772
+preamble$ -- 1
+purify$ -- 300
+quote$ -- 0
+skip$ -- 3032
+stack$ -- 0
+substring$ -- 2179
+swap$ -- 6829
+text.length$ -- 530
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 450
+warning$ -- 0
+while$ -- 227
+width$ -- 0
+write$ -- 988
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.html-updated b/Carpet/CarpetWeb/publications/citations-refereed.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.log b/Carpet/CarpetWeb/publications/citations-refereed.log
new file mode 100644
index 000000000..baeb02cf6
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.log
@@ -0,0 +1,198 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-refereed.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-refereed
+.tex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-refereed
+.aux)
+\openout1 = `citations-refereed.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-refereed
+.bbl
+LaTeX Font Info: Font shape `T1/ppl/bx/n' in size <9> not available
+(Font) Font shape `T1/ppl/b/n' tried instead on input line 106.
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 108.
+
+ (/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 108.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 108
+.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 108
+.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 108
+.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 108
+.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2] [3]) [4]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-refereed
+.aux) )
+Here is how much of TeX's memory you used:
+ 2524 strings out of 94073
+ 31931 string characters out of 1164798
+ 111498 words of memory out of 1500000
+ 5814 multiletter control sequences out of 10000+50000
+ 16600 words of font info for 39 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,923b,407s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/
+opt/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/share/texmf-
+dist/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/font
+s/type1/urw/palatino/uplb8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/pa
+latino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/palatino/uplri8a
+.pfb>
+Output written on citations-refereed.pdf (4 pages, 106463 bytes).
+PDF statistics:
+ 33 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.pdf b/Carpet/CarpetWeb/publications/citations-refereed.pdf
new file mode 100644
index 000000000..a297011d6
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-refereed.tex b/Carpet/CarpetWeb/publications/citations-refereed.tex
new file mode 100644
index 000000000..f667172a3
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-refereed.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-refereed}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-report.aux b/Carpet/CarpetWeb/publications/citations-report.aux
new file mode 100644
index 000000000..87c079724
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.aux
@@ -0,0 +1,35 @@
+\relax
+\citation{*}
+\bibdata{citations-report}
+\bibcite{carpet-zink2005b}{{1}{2006}{{Zink et~al.}}{{Zink, Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}}
+\bibcite{carpet-reisswig2009b}{{2}{2009{}}{{Reisswig et~al.}}{{Reisswig, Bishop, Pollney, and Szil{\'a}gyi}}}
+\bibcite{carpet-sperhake2009a}{{3}{2009}{{Sperhake et~al.}}{{Sperhake, Cardoso, Pretorius, Berti, Hinderer, and Yunes}}}
+\bibcite{carpet-lovelace2009a}{{4}{2009}{{Lovelace et~al.}}{{Lovelace, Chen, Cohen, Kaplan, Keppel, Matthews, Nichols, Scheel, and Sperhake}}}
+\bibcite{carpet-healy2009a}{{5}{2009{}}{{Healy et~al.}}{{Healy, Levin, and Shoemaker}}}
+\bibcite{carpet-reisswig2009a}{{6}{2009{}}{{Reisswig et~al.}}{{Reisswig, Husa, Rezzolla, Dorband, Pollney, and Seiler}}}
+\bibcite{carpet-healy2009b}{{7}{2009{}}{{Healy et~al.}}{{Healy, Laguna, Matzner, and Shoemaker}}}
+\bibcite{carpet-ott2009a}{{8}{2009}{{Ott}}{{}}}
+\bibcite{carpet-lousto2009a}{{9}{2009}{{Lousto et~al.}}{{Lousto, Campanelli, and Zlochower}}}
+\bibcite{carpet-barausse2009a}{{10}{2009}{{Barausse and Rezzolla}}{{}}}
+\bibcite{carpet-bernuzzi2009a}{{11}{2009}{{Bernuzzi et~al.}}{{Bernuzzi, Baiotti, Corvino, Pietri, and Nagar}}}
+\bibcite{carpet-bode2009a}{{12}{2009}{{Bode et~al.}}{{Bode, Laguna, Shoemaker, Hinder, Herrmann, and Vishnav}}}
+\bibcite{carpetresult-nakano2008a}{{13}{2009}{{Nakano et~al.}}{{Nakano, Campanelli, Lousto, and Zlochower}}}
+\bibcite{carpet-giacomazzo2009a}{{14}{2009}{{Giacomazzo et~al.}}{{Giacomazzo, Rezzolla, and Baiotti}}}
+\bibcite{carpet-tao2008a}{{15}{2008}{{Tao et~al.}}{{Tao, Allen, Hinder, Schnetter, and Zlochower}}}
+\bibcite{carpet-hinder2008a}{{16}{2008}{{Hinder et~al.}}{{Hinder, Herrmann, Laguna, and Shoemaker}}}
+\bibcite{carpetresult-baker2007a}{{17}{2007}{{Baker et~al.}}{{Baker, Boggs, Centrella, Kelly, McWilliams, and van Meter}}}
+\bibcite{carpet-baiotti2006c}{{18}{2007}{{Baiotti et~al.}}{{Baiotti, Hawke, Rezzolla, and Schnetter}}}
+\bibcite{carpet-sperhake2006c}{{19}{2007}{{Sperhake}}{{}}}
+\bibcite{carpetresult-font2006a}{{20}{2007}{{Font}}{{}}}
+\bibcite{carpet-sperhake2006b}{{21}{2007}{{Sperhake et~al.}}{{Sperhake, Br{\"u}gmann, Gonz{\'a}lez, Hannam, and Husa}}}
+\bibcite{carpet-zink2006b}{{22}{2007{}}{{Zink et~al.}}{{Zink, Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}}
+\bibcite{carpet-zink2006c}{{23}{2007{}}{{Zink et~al.}}{{Zink, Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}}
+\global \chardef \firstnote@num23\relax
+\bibstyle{apsrev-titles-manyauthors}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\newlabel{LastBibItem}{{23}{1}{}{}{}}
+\newlabel{LastPage}{{}{1}}
diff --git a/Carpet/CarpetWeb/publications/citations-report.bbl b/Carpet/CarpetWeb/publications/citations-report.bbl
new file mode 100644
index 000000000..f020e907e
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.bbl
@@ -0,0 +1,292 @@
+\begin{thebibliography}{23}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{\citenamefont{Zink et~al.}(2006)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2005b}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Rotational instabilities in supermassive stars: a new
+ way to form supermassive black holes}}, in
+ \emph{\bibinfo{booktitle}{International Scientific Workshop on Cosmology and
+ Gravitational Physics, Thessaloniki, December 15-16, 2005}}, edited by
+ \bibinfo{editor}{\bibfnamefont{N.~K.} \bibnamefont{Spyrou}},
+ \bibinfo{editor}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibnamefont{and} \bibinfo{editor}{\bibfnamefont{C.}~\bibnamefont{Tsagas}}
+ (\bibinfo{publisher}{ZITI}, \bibinfo{year}{2006}), pp.
+ \bibinfo{pages}{155--160}.
+
+\bibitem[{\citenamefont{Reisswig
+ et~al.}(2009{\natexlab{a}})\citenamefont{Reisswig, Bishop, Pollney, and
+ Szil{\'a}gyi}}]{carpet-reisswig2009b}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{N.~T.} \bibnamefont{Bishop}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \emph{\bibinfo{title}{Unambiguous determination of gravitational waveforms
+ from binary black hole mergers}} (\bibinfo{year}{2009}{\natexlab{a}}),
+ \bibinfo{note}{arXiv:0907.2637 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.2637}.
+
+\bibitem[{\citenamefont{Sperhake et~al.}(2009)\citenamefont{Sperhake, Cardoso,
+ Pretorius, Berti, Hinderer, and Yunes}}]{carpet-sperhake2009a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Hinderer}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Yunes}},
+ \emph{\bibinfo{title}{Cross section, final spin and zoom-whirl behavior in
+ high-energy black hole collisions}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0907.1252 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.1252}.
+
+\bibitem[{\citenamefont{Lovelace et~al.}(2009)\citenamefont{Lovelace, Chen,
+ Cohen, Kaplan, Keppel, Matthews, Nichols, Scheel, and
+ Sperhake}}]{carpet-lovelace2009a}
+\bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Lovelace}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Cohen}},
+ \bibinfo{author}{\bibfnamefont{J.~D.} \bibnamefont{Kaplan}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Nichols}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Momentum flow in black-hole binaries: {II.} {Numerical}
+ simulations of equal-mass, head-on mergers with antiparallel spins}}
+ (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0907.0869 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.0869}.
+
+\bibitem[{\citenamefont{Healy et~al.}(2009{\natexlab{a}})\citenamefont{Healy,
+ Levin, and Shoemaker}}]{carpet-healy2009a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Levin}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Zoom-whirl orbits in black hole binaries}}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \bibinfo{note}{arXiv:0907.0671
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0907.0671}.
+
+\bibitem[{\citenamefont{Reisswig
+ et~al.}(2009{\natexlab{b}})\citenamefont{Reisswig, Husa, Rezzolla, Dorband,
+ Pollney, and Seiler}}]{carpet-reisswig2009a}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \emph{\bibinfo{title}{Gravitational-wave detectability of equal-mass
+ black-hole binaries with aligned spins}}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \bibinfo{note}{arXiv:0907.0462
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0907.0462}.
+
+\bibitem[{\citenamefont{Healy et~al.}(2009{\natexlab{b}})\citenamefont{Healy,
+ Laguna, Matzner, and Shoemaker}}]{carpet-healy2009b}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.~M.}
+ \bibnamefont{Shoemaker}}, \emph{\bibinfo{title}{Final mass and spin of merged
+ black holes and the golden black hole}} (\bibinfo{year}{2009}{\natexlab{b}}),
+ \bibinfo{note}{arXiv:0905.3914 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0905.3914}.
+
+\bibitem[{\citenamefont{Ott}(2009)}]{carpet-ott2009a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \emph{\bibinfo{title}{Probing the core-collapse supernova mechanism with
+ gravitational waves}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0905.2797
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0905.2797}.
+
+\bibitem[{\citenamefont{Lousto et~al.}(2009)\citenamefont{Lousto, Campanelli,
+ and Zlochower}}]{carpet-lousto2009a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Remnant masses, spins and recoils from the merger of
+ generic black-hole binaries}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0904.3541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0904.3541}.
+
+\bibitem[{\citenamefont{Barausse and Rezzolla}(2009)}]{carpet-barausse2009a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Barausse}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Predicting the direction of the final spin from the
+ coalescence of two black holes}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0904.2577 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0904.2577}.
+
+\bibitem[{\citenamefont{Bernuzzi et~al.}(2009)\citenamefont{Bernuzzi, Baiotti,
+ Corvino, Pietri, and Nagar}}]{carpet-bernuzzi2009a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Bernuzzi}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Corvino}},
+ \bibinfo{author}{\bibfnamefont{R.~D.} \bibnamefont{Pietri}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \emph{\bibinfo{title}{Gravitational-wave extraction from neutron-star
+ oscillations}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0902.2720
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0902.2720}.
+
+\bibitem[{\citenamefont{Bode et~al.}(2009)\citenamefont{Bode, Laguna,
+ Shoemaker, Hinder, Herrmann, and Vishnav}}]{carpet-bode2009a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Bode}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Vishnav}},
+ \emph{\bibinfo{title}{Binary black hole evolutions of approximate puncture
+ initial data}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0902.1127
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0902.1127}.
+
+\bibitem[{\citenamefont{Nakano et~al.}(2009)\citenamefont{Nakano, Campanelli,
+ Lousto, and Zlochower}}]{carpetresult-nakano2008a}
+\bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparison of post-{Newtonian} and numerical evolutions
+ of black-hole binaries}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0901.3861 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.3861}.
+
+\bibitem[{\citenamefont{Giacomazzo et~al.}(2009)\citenamefont{Giacomazzo,
+ Rezzolla, and Baiotti}}]{carpet-giacomazzo2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \emph{\bibinfo{title}{The influence of magnetic fields on the
+ gravitational-wave emission from binary neutron stars}}
+ (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0901.2722v1 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.2722}.
+
+\bibitem[{\citenamefont{Tao et~al.}(2008)\citenamefont{Tao, Allen, Hinder,
+ Schnetter, and Zlochower}}]{carpet-tao2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Tao}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{{XiRel}: Standard benchmarks for numerical relativity
+ codes using {Cactus} and {Carpet}}}, \bibinfo{type}{Tech. Rep.}
+ \bibinfo{number}{5}, \bibinfo{institution}{Center for Computation \&
+ Technology, Louisiana State University} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5}.
+
+\bibitem[{\citenamefont{Hinder et~al.}(2008)\citenamefont{Hinder, Herrmann,
+ Laguna, and Shoemaker}}]{carpet-hinder2008a}
+\bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Comparisons of eccentric binary black hole simulations
+ with post-{Newtonian} models}} (\bibinfo{year}{2008}),
+ \bibinfo{note}{arXiv:0806.1037 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0806.1037}.
+
+\bibitem[{\citenamefont{Baker et~al.}(2007)\citenamefont{Baker, Boggs,
+ Centrella, Kelly, McWilliams, and van Meter}}]{carpetresult-baker2007a}
+\bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{J.~M.} \bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van
+ Meter}}, \emph{\bibinfo{title}{Gravitational waves from black-hole mergers}},
+ in \emph{\bibinfo{booktitle}{Proceedings of the 2007 Spring Symposium of the
+ Space Telescope Science Institute (Baltimore, MD)}} (\bibinfo{year}{2007}),
+ p. \bibinfo{pages}{(to be published)}, \eprint{arXiv:0708.4202 [astro-ph]},
+ \urlprefix\url{http://arxiv.org/abs/0708.4202}.
+
+\bibitem[{\citenamefont{Baiotti et~al.}(2007)\citenamefont{Baiotti, Hawke,
+ Rezzolla, and Schnetter}}]{carpet-baiotti2006c}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Details on the gravitational-wave emission from
+ rotating gravitational collapse in {3D}}}, in
+ \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting (E.R.E. 2006)}}
+ (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012045},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012045}.
+
+\bibitem[{\citenamefont{Sperhake}(2007)}]{carpet-sperhake2006c}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Black-hole binary evolutions with the {LEAN} code}}, in
+ \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting (E.R.E. 2006)}}
+ (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012049},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012049}.
+
+\bibitem[{\citenamefont{Font}(2007)}]{carpetresult-font2006a}
+\bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Font}},
+ \emph{\bibinfo{title}{Current status of relativistic core collapse
+ simulations}}, in \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting
+ (E.R.E. 2006)}} (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012063},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012063}.
+
+\bibitem[{\citenamefont{Sperhake et~al.}(2007)\citenamefont{Sperhake,
+ Br{\"u}gmann, Gonz{\'a}lez, Hannam, and Husa}}]{carpet-sperhake2006b}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Head-on collisions of different initial data}}, in
+ \emph{\bibinfo{booktitle}{Proceedings of the 11th Marcel Grossmann Meeting
+ (MG11) in Berlin, Germany, July 23-29, 2006}} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0705.2035 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0705.2035}.
+
+\bibitem[{\citenamefont{Zink et~al.}(2007{\natexlab{a}})\citenamefont{Zink,
+ Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006b}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Fragmentation of general relativistic quasi-toroidal
+ polytropes}}, in \emph{\bibinfo{booktitle}{Proceedings of the 11th Marcel
+ Grossmann Meeting (MG11) in Berlin, Germany, July 23-29, 2006}}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:0704.0431 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0704.0431}.
+
+\bibitem[{\citenamefont{Zink et~al.}(2007{\natexlab{b}})\citenamefont{Zink,
+ Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006c}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Supermassive black hole formation through rotational
+ instabilities}}, in \emph{\bibinfo{booktitle}{12th Conference on Recent
+ Developments in Gravity (NEB XII)}} (\bibinfo{year}{2007}{\natexlab{b}}),
+ vol.~\bibinfo{volume}{68} of \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}},
+ p. \bibinfo{pages}{012050},
+ \urlprefix\url{http://stacks.iop.org/JPConf/68/012050}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-report.bib b/Carpet/CarpetWeb/publications/citations-report.bib
new file mode 100644
index 000000000..bb02083ed
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.bib
@@ -0,0 +1,296 @@
+
+@InProceedings{ carpet-zink2005b,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D. Ott and Erik Schnetter and Ewald M{\"u}ller},
+ title = {Rotational instabilities in supermassive stars: a new way
+ to form supermassive black holes},
+ booktitle = {International Scientific Workshop on Cosmology and
+ Gravitational Physics, Thessaloniki, December 15-16, 2005},
+ pages = {155-160},
+ year = 2006,
+ editor = {N. K. Spyrou and N. Stergioulas and C. Tsagas},
+ publisher = {ZITI}
+}
+
+@Unpublished{ carpet-reisswig2009b,
+ status = {report},
+ author = {Christian Reisswig and Nigel T. Bishop and Denis Pollney
+ and B{\'e}la Szil{\'a}gyi},
+ title = {Unambiguous determination of gravitational waveforms from
+ binary black hole mergers},
+ note = {arXiv:0907.2637 [gr-qc]},
+ year = 2009,
+ url = {http://arxiv.org/abs/0907.2637}
+}
+
+@Unpublished{ carpet-sperhake2009a,
+ status = {report},
+ author = {Ulrich Sperhake and Vitor Cardoso and Frans Pretorius and
+ Emanuele Berti and Tanja Hinderer and Nicolas Yunes},
+ title = {Cross section, final spin and zoom-whirl behavior in
+ high-energy black hole collisions},
+ note = {arXiv:0907.1252 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-07},
+ url = {http://arxiv.org/abs/0907.1252}
+}
+
+@Unpublished{ carpet-lovelace2009a,
+ status = {report},
+ author = {Geoffrey Lovelace and Yanbei Chen and Michael Cohen and
+ Jeffrey D. Kaplan and Drew Keppel and Keith D. Matthews and
+ David A. Nichols and Mark A. Scheel and Ulrich Sperhake},
+ title = {Momentum flow in black-hole binaries: {II.} {Numerical}
+ simulations of equal-mass, head-on mergers with
+ antiparallel spins},
+ note = {arXiv:0907.0869 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-05},
+ url = {http://arxiv.org/abs/0907.0869}
+}
+
+@Unpublished{ carpet-healy2009a,
+ status = {report},
+ author = {James Healy and Janna Levin and Deirdre Shoemaker},
+ title = {Zoom-Whirl Orbits in Black Hole Binaries},
+ note = {arXiv:0907.0671 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-03},
+ url = {http://arxiv.org/abs/0907.0671}
+}
+
+@Unpublished{ carpet-reisswig2009a,
+ status = {report},
+ author = {Christian Reisswig and Sascha Husa and Luciano Rezzolla
+ and Ernst Nils Dorband and Denis Pollney and Jennifer
+ Seiler},
+ title = {Gravitational-wave detectability of equal-mass black-hole
+ binaries with aligned spins},
+ note = {arXiv:0907.0462 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-07-02},
+ url = {http://arxiv.org/abs/0907.0462}
+}
+
+@Unpublished{ carpet-healy2009b,
+ status = {report},
+ author = {James Healy and Pablo Laguna and Richard A. Matzner and
+ Deirdre M. Shoemaker},
+ title = {Final Mass and Spin of Merged Black Holes and the Golden
+ Black Hole},
+ note = {arXiv:0905.3914 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-05-24},
+ url = {http://arxiv.org/abs/0905.3914}
+}
+
+@Unpublished{ carpet-ott2009a,
+ status = {report},
+ author = {Christian D. Ott},
+ title = {Probing the Core-Collapse Supernova Mechanism with
+ Gravitational Waves},
+ note = {arXiv:0905.2797 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-05-18},
+ url = {http://arxiv.org/abs/0905.2797}
+}
+
+@Unpublished{ carpet-lousto2009a,
+ status = {report},
+ author = {Carlos O. Lousto and Manuela Campanelli and Yosef
+ Zlochower},
+ title = {Remnant Masses, Spins and Recoils from the Merger of
+ Generic Black-Hole Binaries},
+ note = {arXiv:0904.3541 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-04-22},
+ url = {http://arxiv.org/abs/0904.3541}
+}
+
+@Unpublished{ carpet-barausse2009a,
+ status = {report},
+ author = {Enrico Barausse and Luciano Rezzolla},
+ title = {Predicting the direction of the final spin from the
+ coalescence of two black holes},
+ note = {arXiv:0904.2577 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-04-16},
+ url = {http://arxiv.org/abs/0904.2577}
+}
+
+@Unpublished{ carpet-bernuzzi2009a,
+ status = {report},
+ author = {Sebastiano Bernuzzi and Lucao Baiotti and Giovanni Corvino
+ and Roberto De Pietri and Alessandro Nagar},
+ title = {Gravitational-wave extraction from neutron-star
+ oscillations},
+ note = {arXiv:0902.2720 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-02-16},
+ url = {http://arxiv.org/abs/0902.2720}
+}
+
+@Unpublished{ carpet-bode2009a,
+ status = {report},
+ author = {Tanja Bode and Pablo Laguna and Deirdre M. Shoemaker and
+ Ian Hinder and Frank Herrmann and Jirjoo Vishnav},
+ title = {Binary black hole evolutions of approximate puncture
+ initial data},
+ note = {arXiv:0902.1127 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-02-06},
+ url = {http://arxiv.org/abs/0902.1127}
+}
+
+@Unpublished{ carpetresult-nakano2008a,
+ status = {report},
+ author = {Hiroyuki Nakano and Manuela Campanelli and Carlos O.
+ Lousto and Yosef Zlochower},
+ title = {Comparison of Post-{Newtonian} and Numerical Evolutions of
+ Black-Hole Binaries},
+ note = {arXiv:0901.3861 [gr-qc]},
+ year = 2009,
+ url = {http://arxiv.org/abs/0901.3861},
+ receiveddate = {2009-01-24}
+}
+
+@Unpublished{ carpet-giacomazzo2009a,
+ status = {report},
+ author = {Bruno Giacomazzo and Luciano Rezzolla and Luca Baiotti},
+ title = {The influence of magnetic fields on the gravitational-wave
+ emission from binary neutron stars},
+ note = {arXiv:0901.2722v1 [gr-qc]},
+ year = 2009,
+ receiveddate = {2009-01-18},
+ url = {http://arxiv.org/abs/0901.2722}
+}
+
+@TechReport{ carpet-tao2008a,
+ status = {report},
+ author = {Jian Tao and Gabrielle Allen and Ian Hinder and Erik
+ Schnetter and Yosef Zlochower},
+ title = {{XiRel}: Standard Benchmarks for Numerical Relativity
+ Codes Using {Cactus} and {Carpet}},
+ institution = {Center for Computation \& Technology, Louisiana State
+ University},
+ year = 2008,
+ number = 5,
+ receiveddate = {2008-07-01},
+ url = {http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5}
+}
+
+@Unpublished{ carpet-hinder2008a,
+ status = {report},
+ author = {Ian Hinder and Frank Herrmann and Pablo Laguna and Deirdre
+ Shoemaker},
+ title = {Comparisons of eccentric binary black hole simulations
+ with post-{Newtonian} models},
+ note = {arXiv:0806.1037 [gr-qc]},
+ year = 2008,
+ receiveddate = {2008-06-05},
+ url = {http://arxiv.org/abs/0806.1037}
+}
+
+@InProceedings{ carpetresult-baker2007a,
+ status = {report},
+ author = {John G. Baker and William D. Boggs and Joan M. Centrella
+ and Bernard J. Kelly and Sean T. McWilliams and James R.
+ van Meter},
+ title = {Gravitational waves from black-hole mergers},
+ booktitle = {Proceedings of the 2007 Spring Symposium of the Space
+ Telescope Science Institute (Baltimore, MD)},
+ year = 2007,
+ pages = {(to be published)},
+ eprint = {arXiv:0708.4202 [astro-ph]},
+ url = {http://arxiv.org/abs/0708.4202},
+ receiveddate = {2007-04-23}
+}
+
+@InProceedings{ carpet-baiotti2006c,
+ status = {report},
+ author = {Luca Baiotti and Ian Hawke and Luciano Rezzolla and Erik
+ Schnetter},
+ title = {Details on the gravitational-wave emission from rotating
+ gravitational collapse in {3D}},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012045,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012045},
+ doi = {10.1088/1742-6596/66/1/012045}
+}
+
+@InProceedings{ carpet-sperhake2006c,
+ status = {report},
+ author = {Ulrich Sperhake},
+ title = {Black-hole binary evolutions with the {LEAN} code},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012049,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012049},
+ doi = {10.1088/1742-6596/66/1/012049}
+}
+
+@InProceedings{ carpetresult-font2006a,
+ status = {report},
+ author = {Jos{\'e} A. Font},
+ title = {Current status of relativistic core collapse simulations},
+ booktitle = {XXIXth Spanish Relativity Meeting (E.R.E. 2006)},
+ pages = 012063,
+ year = 2007,
+ volume = 66,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-09-04},
+ url = {http://stacks.iop.org/JPConf/66/012063},
+ doi = {10.1088/1742-6596/66/1/012063}
+}
+
+@InProceedings{ carpet-sperhake2006b,
+ status = {report},
+ author = {Ulrich Sperhake and Bernd Br{\"u}gmann and Jos{\'e}
+ Gonz{\'a}lez and Mark Hannam and Sascha Husa},
+ title = {Head-On collisions of different initial data},
+ booktitle = {Proceedings of the 11th Marcel Grossmann Meeting (MG11) in
+ Berlin, Germany, July 23-29, 2006},
+ year = 2007,
+ eprint = {arXiv:0705.2035 [gr-qc]},
+ url = {http://arxiv.org/abs/0705.2035},
+ receiveddate = {2006-07-23}
+}
+
+@InProceedings{ carpet-zink2006b,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D. Ott and Erik Schnetter and Ewald M{\"u}ller},
+ title = {Fragmentation of general relativistic quasi-toroidal
+ polytropes},
+ booktitle = {Proceedings of the 11th Marcel Grossmann Meeting (MG11) in
+ Berlin, Germany, July 23-29, 2006},
+ year = 2007,
+ eprint = {arXiv:0704.0431 [gr-qc]},
+ url = {http://arxiv.org/abs/0704.0431},
+ receiveddate = {2006-07-23}
+}
+
+@InProceedings{ carpet-zink2006c,
+ status = {report},
+ author = {Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D. Ott and Erik Schnetter and Ewald M{\"u}ller},
+ title = {Supermassive Black Hole Formation through Rotational
+ Instabilities},
+ booktitle = {12th Conference on Recent Developments in Gravity (NEB
+ XII)},
+ pages = 012050,
+ year = 2007,
+ volume = 68,
+ series = {J. Phys.: Conf. Ser.},
+ receiveddate = {2006-06-29},
+ url = {http://stacks.iop.org/JPConf/68/012050},
+ doi = {10.1088/1742-6596/68/1/012050}
+}
diff --git a/Carpet/CarpetWeb/publications/citations-report.bibitems b/Carpet/CarpetWeb/publications/citations-report.bibitems
new file mode 100644
index 000000000..21554a20e
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.bibitems
@@ -0,0 +1,290 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{\citenamefont{Zink et~al.}(2006)\citenamefont{Zink, Stergioulas,
+ Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2005b}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Rotational instabilities in supermassive stars: a new
+ way to form supermassive black holes}}, in
+ \emph{\bibinfo{booktitle}{International Scientific Workshop on Cosmology and
+ Gravitational Physics, Thessaloniki, December 15-16, 2005}}, edited by
+ \bibinfo{editor}{\bibfnamefont{N.~K.} \bibnamefont{Spyrou}},
+ \bibinfo{editor}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibnamefont{and} \bibinfo{editor}{\bibfnamefont{C.}~\bibnamefont{Tsagas}}
+ (\bibinfo{publisher}{ZITI}, \bibinfo{year}{2006}), pp.
+ \bibinfo{pages}{155--160}.
+
+\blurb[{\citenamefont{Reisswig
+ et~al.}(2009{\natexlab{a}})\citenamefont{Reisswig, Bishop, Pollney, and
+ Szil{\'a}gyi}}]{carpet-reisswig2009b}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{N.~T.} \bibnamefont{Bishop}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Szil{\'a}gyi}},
+ \emph{\bibinfo{title}{Unambiguous determination of gravitational waveforms
+ from binary black hole mergers}} (\bibinfo{year}{2009}{\natexlab{a}}),
+ \bibinfo{note}{arXiv:0907.2637 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.2637}.
+
+\blurb[{\citenamefont{Sperhake et~al.}(2009)\citenamefont{Sperhake, Cardoso,
+ Pretorius, Berti, Hinderer, and Yunes}}]{carpet-sperhake2009a}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{V.}~\bibnamefont{Cardoso}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Pretorius}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Berti}},
+ \bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Hinderer}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Yunes}},
+ \emph{\bibinfo{title}{Cross section, final spin and zoom-whirl behavior in
+ high-energy black hole collisions}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0907.1252 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.1252}.
+
+\blurb[{\citenamefont{Lovelace et~al.}(2009)\citenamefont{Lovelace, Chen,
+ Cohen, Kaplan, Keppel, Matthews, Nichols, Scheel, and
+ Sperhake}}]{carpet-lovelace2009a}
+\bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Lovelace}},
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Chen}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Cohen}},
+ \bibinfo{author}{\bibfnamefont{J.~D.} \bibnamefont{Kaplan}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Keppel}},
+ \bibinfo{author}{\bibfnamefont{K.~D.} \bibnamefont{Matthews}},
+ \bibinfo{author}{\bibfnamefont{D.~A.} \bibnamefont{Nichols}},
+ \bibinfo{author}{\bibfnamefont{M.~A.} \bibnamefont{Scheel}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Momentum flow in black-hole binaries: {II.} {Numerical}
+ simulations of equal-mass, head-on mergers with antiparallel spins}}
+ (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0907.0869 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0907.0869}.
+
+\blurb[{\citenamefont{Healy et~al.}(2009{\natexlab{a}})\citenamefont{Healy,
+ Levin, and Shoemaker}}]{carpet-healy2009a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Levin}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Zoom-whirl orbits in black hole binaries}}
+ (\bibinfo{year}{2009}{\natexlab{a}}), \bibinfo{note}{arXiv:0907.0671
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0907.0671}.
+
+\blurb[{\citenamefont{Reisswig
+ et~al.}(2009{\natexlab{b}})\citenamefont{Reisswig, Husa, Rezzolla, Dorband,
+ Pollney, and Seiler}}]{carpet-reisswig2009a}
+\bibinfo{author}{\bibfnamefont{C.}~\bibnamefont{Reisswig}},
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Pollney}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Seiler}},
+ \emph{\bibinfo{title}{Gravitational-wave detectability of equal-mass
+ black-hole binaries with aligned spins}}
+ (\bibinfo{year}{2009}{\natexlab{b}}), \bibinfo{note}{arXiv:0907.0462
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0907.0462}.
+
+\blurb[{\citenamefont{Healy et~al.}(2009{\natexlab{b}})\citenamefont{Healy,
+ Laguna, Matzner, and Shoemaker}}]{carpet-healy2009b}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Healy}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{R.~A.} \bibnamefont{Matzner}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{D.~M.}
+ \bibnamefont{Shoemaker}}, \emph{\bibinfo{title}{Final mass and spin of merged
+ black holes and the golden black hole}} (\bibinfo{year}{2009}{\natexlab{b}}),
+ \bibinfo{note}{arXiv:0905.3914 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0905.3914}.
+
+\blurb[{\citenamefont{Ott}(2009)}]{carpet-ott2009a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \emph{\bibinfo{title}{Probing the core-collapse supernova mechanism with
+ gravitational waves}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0905.2797
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0905.2797}.
+
+\blurb[{\citenamefont{Lousto et~al.}(2009)\citenamefont{Lousto, Campanelli,
+ and Zlochower}}]{carpet-lousto2009a}
+\bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Remnant masses, spins and recoils from the merger of
+ generic black-hole binaries}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0904.3541 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0904.3541}.
+
+\blurb[{\citenamefont{Barausse and Rezzolla}(2009)}]{carpet-barausse2009a}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Barausse}} \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}},
+ \emph{\bibinfo{title}{Predicting the direction of the final spin from the
+ coalescence of two black holes}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0904.2577 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0904.2577}.
+
+\blurb[{\citenamefont{Bernuzzi et~al.}(2009)\citenamefont{Bernuzzi, Baiotti,
+ Corvino, Pietri, and Nagar}}]{carpet-bernuzzi2009a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Bernuzzi}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Corvino}},
+ \bibinfo{author}{\bibfnamefont{R.~D.} \bibnamefont{Pietri}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Nagar}},
+ \emph{\bibinfo{title}{Gravitational-wave extraction from neutron-star
+ oscillations}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0902.2720
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0902.2720}.
+
+\blurb[{\citenamefont{Bode et~al.}(2009)\citenamefont{Bode, Laguna,
+ Shoemaker, Hinder, Herrmann, and Vishnav}}]{carpet-bode2009a}
+\bibinfo{author}{\bibfnamefont{T.}~\bibnamefont{Bode}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}},
+ \bibinfo{author}{\bibfnamefont{D.~M.} \bibnamefont{Shoemaker}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Vishnav}},
+ \emph{\bibinfo{title}{Binary black hole evolutions of approximate puncture
+ initial data}} (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0902.1127
+ [gr-qc]}, \urlprefix\url{http://arxiv.org/abs/0902.1127}.
+
+\blurb[{\citenamefont{Nakano et~al.}(2009)\citenamefont{Nakano, Campanelli,
+ Lousto, and Zlochower}}]{carpetresult-nakano2008a}
+\bibinfo{author}{\bibfnamefont{H.}~\bibnamefont{Nakano}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Campanelli}},
+ \bibinfo{author}{\bibfnamefont{C.~O.} \bibnamefont{Lousto}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{Comparison of post-{Newtonian} and numerical evolutions
+ of black-hole binaries}} (\bibinfo{year}{2009}),
+ \bibinfo{note}{arXiv:0901.3861 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.3861}.
+
+\blurb[{\citenamefont{Giacomazzo et~al.}(2009)\citenamefont{Giacomazzo,
+ Rezzolla, and Baiotti}}]{carpet-giacomazzo2009a}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Giacomazzo}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \emph{\bibinfo{title}{The influence of magnetic fields on the
+ gravitational-wave emission from binary neutron stars}}
+ (\bibinfo{year}{2009}), \bibinfo{note}{arXiv:0901.2722v1 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0901.2722}.
+
+\blurb[{\citenamefont{Tao et~al.}(2008)\citenamefont{Tao, Allen, Hinder,
+ Schnetter, and Zlochower}}]{carpet-tao2008a}
+\bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Tao}},
+ \bibinfo{author}{\bibfnamefont{G.}~\bibnamefont{Allen}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{Y.}~\bibnamefont{Zlochower}},
+ \emph{\bibinfo{title}{{XiRel}: Standard benchmarks for numerical relativity
+ codes using {Cactus} and {Carpet}}}, \bibinfo{type}{Tech. Rep.}
+ \bibinfo{number}{5}, \bibinfo{institution}{Center for Computation \&
+ Technology, Louisiana State University} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5}.
+
+\blurb[{\citenamefont{Hinder et~al.}(2008)\citenamefont{Hinder, Herrmann,
+ Laguna, and Shoemaker}}]{carpet-hinder2008a}
+\bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hinder}},
+ \bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \bibinfo{author}{\bibfnamefont{P.}~\bibnamefont{Laguna}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{D.}~\bibnamefont{Shoemaker}},
+ \emph{\bibinfo{title}{Comparisons of eccentric binary black hole simulations
+ with post-{Newtonian} models}} (\bibinfo{year}{2008}),
+ \bibinfo{note}{arXiv:0806.1037 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0806.1037}.
+
+\blurb[{\citenamefont{Baker et~al.}(2007)\citenamefont{Baker, Boggs,
+ Centrella, Kelly, McWilliams, and van Meter}}]{carpetresult-baker2007a}
+\bibinfo{author}{\bibfnamefont{J.~G.} \bibnamefont{Baker}},
+ \bibinfo{author}{\bibfnamefont{W.~D.} \bibnamefont{Boggs}},
+ \bibinfo{author}{\bibfnamefont{J.~M.} \bibnamefont{Centrella}},
+ \bibinfo{author}{\bibfnamefont{B.~J.} \bibnamefont{Kelly}},
+ \bibinfo{author}{\bibfnamefont{S.~T.} \bibnamefont{McWilliams}},
+ \bibnamefont{and} \bibinfo{author}{\bibfnamefont{J.~R.} \bibnamefont{van
+ Meter}}, \emph{\bibinfo{title}{Gravitational waves from black-hole mergers}},
+ in \emph{\bibinfo{booktitle}{Proceedings of the 2007 Spring Symposium of the
+ Space Telescope Science Institute (Baltimore, MD)}} (\bibinfo{year}{2007}),
+ p. \bibinfo{pages}{(to be published)}, \eprint{arXiv:0708.4202 [astro-ph]},
+ \urlprefix\url{http://arxiv.org/abs/0708.4202}.
+
+\blurb[{\citenamefont{Baiotti et~al.}(2007)\citenamefont{Baiotti, Hawke,
+ Rezzolla, and Schnetter}}]{carpet-baiotti2006c}
+\bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Baiotti}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{L.}~\bibnamefont{Rezzolla}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \emph{\bibinfo{title}{Details on the gravitational-wave emission from
+ rotating gravitational collapse in {3D}}}, in
+ \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting (E.R.E. 2006)}}
+ (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012045},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012045}.
+
+\blurb[{\citenamefont{Sperhake}(2007)}]{carpet-sperhake2006c}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \emph{\bibinfo{title}{Black-hole binary evolutions with the {LEAN} code}}, in
+ \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting (E.R.E. 2006)}}
+ (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012049},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012049}.
+
+\blurb[{\citenamefont{Font}(2007)}]{carpetresult-font2006a}
+\bibinfo{author}{\bibfnamefont{J.~A.} \bibnamefont{Font}},
+ \emph{\bibinfo{title}{Current status of relativistic core collapse
+ simulations}}, in \emph{\bibinfo{booktitle}{XXIXth Spanish Relativity Meeting
+ (E.R.E. 2006)}} (\bibinfo{year}{2007}), vol.~\bibinfo{volume}{66} of
+ \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}}, p. \bibinfo{pages}{012063},
+ \urlprefix\url{http://stacks.iop.org/JPConf/66/012063}.
+
+\blurb[{\citenamefont{Sperhake et~al.}(2007)\citenamefont{Sperhake,
+ Br{\"u}gmann, Gonz{\'a}lez, Hannam, and Husa}}]{carpet-sperhake2006b}
+\bibinfo{author}{\bibfnamefont{U.}~\bibnamefont{Sperhake}},
+ \bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Br{\"u}gmann}},
+ \bibinfo{author}{\bibfnamefont{J.}~\bibnamefont{Gonz{\'a}lez}},
+ \bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Hannam}}, \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Husa}},
+ \emph{\bibinfo{title}{Head-on collisions of different initial data}}, in
+ \emph{\bibinfo{booktitle}{Proceedings of the 11th Marcel Grossmann Meeting
+ (MG11) in Berlin, Germany, July 23-29, 2006}} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0705.2035 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0705.2035}.
+
+\blurb[{\citenamefont{Zink et~al.}(2007{\natexlab{a}})\citenamefont{Zink,
+ Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006b}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Fragmentation of general relativistic quasi-toroidal
+ polytropes}}, in \emph{\bibinfo{booktitle}{Proceedings of the 11th Marcel
+ Grossmann Meeting (MG11) in Berlin, Germany, July 23-29, 2006}}
+ (\bibinfo{year}{2007}{\natexlab{a}}), \eprint{arXiv:0704.0431 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0704.0431}.
+
+\blurb[{\citenamefont{Zink et~al.}(2007{\natexlab{b}})\citenamefont{Zink,
+ Stergioulas, Hawke, Ott, Schnetter, and M{\"u}ller}}]{carpet-zink2006c}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \bibinfo{author}{\bibfnamefont{N.}~\bibnamefont{Stergioulas}},
+ \bibinfo{author}{\bibfnamefont{I.}~\bibnamefont{Hawke}},
+ \bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Schnetter}},
+ \bibnamefont{and}
+ \bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{M{\"u}ller}},
+ \emph{\bibinfo{title}{Supermassive black hole formation through rotational
+ instabilities}}, in \emph{\bibinfo{booktitle}{12th Conference on Recent
+ Developments in Gravity (NEB XII)}} (\bibinfo{year}{2007}{\natexlab{b}}),
+ vol.~\bibinfo{volume}{68} of \emph{\bibinfo{series}{J. Phys.: Conf. Ser.}},
+ p. \bibinfo{pages}{012050},
+ \urlprefix\url{http://stacks.iop.org/JPConf/68/012050}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-report.blg b/Carpet/CarpetWeb/publications/citations-report.blg
new file mode 100644
index 000000000..de6d2bae5
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-report.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-report.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 23 entries,
+ 3482 wiz_defined-function locations,
+ 1284 strings with 15537 characters,
+and the built_in function-call counts, 19701 in all, are:
+= -- 1044
+> -- 829
+< -- 118
++ -- 722
+- -- 203
+* -- 2834
+:= -- 1923
+add.period$ -- 23
+call.type$ -- 23
+change.case$ -- 129
+chr.to.int$ -- 20
+cite$ -- 23
+duplicate$ -- 1855
+empty$ -- 1535
+format.name$ -- 475
+if$ -- 3651
+int.to.chr$ -- 4
+int.to.str$ -- 24
+missing$ -- 266
+newline$ -- 84
+num.names$ -- 70
+pop$ -- 487
+preamble$ -- 1
+purify$ -- 92
+quote$ -- 0
+skip$ -- 727
+stack$ -- 0
+substring$ -- 393
+swap$ -- 1560
+text.length$ -- 114
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 138
+warning$ -- 0
+while$ -- 54
+width$ -- 0
+write$ -- 280
diff --git a/Carpet/CarpetWeb/publications/citations-report.html-updated b/Carpet/CarpetWeb/publications/citations-report.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-report.log b/Carpet/CarpetWeb/publications/citations-report.log
new file mode 100644
index 000000000..41ed746d2
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.log
@@ -0,0 +1,193 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-report.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-report.t
+ex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-report.a
+ux)
+\openout1 = `citations-report.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-report.b
+bl
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 44.
+ (/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 44.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 44.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 44.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 44.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 44.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-report.a
+ux) )
+Here is how much of TeX's memory you used:
+ 2465 strings out of 94073
+ 30715 string characters out of 1164798
+ 96898 words of memory out of 1500000
+ 5757 multiletter control sequences out of 10000+50000
+ 15151 words of font info for 37 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,310b,302s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/op
+t/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/share/texmf-di
+st/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/fonts/
+type1/urw/palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/pala
+tino/uplri8a.pfb>
+Output written on citations-report.pdf (1 page, 84284 bytes).
+PDF statistics:
+ 20 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-report.pdf b/Carpet/CarpetWeb/publications/citations-report.pdf
new file mode 100644
index 000000000..a95535951
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-report.tex b/Carpet/CarpetWeb/publications/citations-report.tex
new file mode 100644
index 000000000..652cd9ac3
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-report.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-report}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.aux b/Carpet/CarpetWeb/publications/citations-thesis.aux
new file mode 100644
index 000000000..850432530
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.aux
@@ -0,0 +1,24 @@
+\relax
+\citation{*}
+\bibdata{citations-thesis}
+\bibcite{carpet-bentivegna2008b}{{1}{2008}{{Bentivegna}}{{}}}
+\bibcite{carpet-jasiulek2008a}{{2}{2008}{{Jasiulek}}{{}}}
+\bibcite{carpet-dorband2007a}{{3}{2007}{{Dorband}}{{}}}
+\bibcite{carpet-kastaun2007a}{{4}{2007}{{Kastaun}}{{}}}
+\bibcite{carpet-manca2007a}{{5}{2007}{{Manca}}{{}}}
+\bibcite{carpet-ott2007a}{{6}{2007}{{Ott}}{{}}}
+\bibcite{carpet-2007a}{{7}{2007}{{Zengino{\u {g}}lu}}{{}}}
+\bibcite{carpet-loeffler2005a}{{8}{2006}{{L{\"o}ffler}}{{}}}
+\bibcite{carpet-madiraju2006a}{{9}{2006}{{Madiraju}}{{}}}
+\bibcite{carpet-zink2006d}{{10}{2006}{{Zink}}{{}}}
+\bibcite{carpet-herrmann2005a}{{11}{2005}{{Herrmann}}{{}}}
+\bibcite{carpet-koppitz2004a}{{12}{2004}{{Koppitz}}{{}}}
+\global \chardef \firstnote@num12\relax
+\bibstyle{apsrev-titles-manyauthors}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\newlabel{LastBibItem}{{12}{1}{}{}{}}
+\newlabel{LastPage}{{}{1}}
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.bbl b/Carpet/CarpetWeb/publications/citations-thesis.bbl
new file mode 100644
index 000000000..fd55fd51e
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.bbl
@@ -0,0 +1,101 @@
+\begin{thebibliography}{12}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{\citenamefont{Bentivegna}(2008)}]{carpet-bentivegna2008b}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Bentivegna}},
+ \emph{\bibinfo{title}{Ringing in unison: exploring black hole coalescence
+ with quasinormal modes}}, Ph.D. thesis, \bibinfo{school}{Pennsylvania State
+ University} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://etda.libraries.psu.edu/
+ theses/approved/WorldWideIndex/ETD-2570/index.html}.
+
+\bibitem[{\citenamefont{Jasiulek}(2008)}]{carpet-jasiulek2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Jasiulek}},
+ \emph{\bibinfo{title}{Spin measures on isolated and dynamical horizons in
+ numerical relativity}}, Master's thesis,
+ \bibinfo{school}{Humboldt-Universit{\"a}t zu Berlin} (\bibinfo{year}{2008}).
+
+\bibitem[{\citenamefont{Dorband}(2007)}]{carpet-dorband2007a}
+\bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \emph{\bibinfo{title}{Computing and analyzing gravitational radiation in
+ black hole simulations using a new multi-block approach to numerical
+ relativity}}, Ph.D. thesis, \bibinfo{school}{Louisiana State University}
+ (\bibinfo{year}{2007}),
+ \urlprefix\url{http://www.cct.lsu.edu/~dorband/thesis.pdf}.
+
+\bibitem[{\citenamefont{Kastaun}(2007)}]{carpet-kastaun2007a}
+\bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Kastaun}},
+ \emph{\bibinfo{title}{Developing a code for general relativistic
+ hydrodynamics with application to neutron star oscillations}}, Ph.D. thesis,
+ \bibinfo{school}{Universit{\"a}t T{\"u}bingen} (\bibinfo{year}{2007}),
+ \urlprefix\url{http://tobias-lib.ub.uni-tuebingen.de/ volltexte/2007/2803/}.
+
+\bibitem[{\citenamefont{Manca}(2007)}]{carpet-manca2007a}
+\bibinfo{author}{\bibfnamefont{G.~M.} \bibnamefont{Manca}},
+ \emph{\bibinfo{title}{Dynamical instabilities in rapidly rotating neutron
+ star models}}, Ph.D. thesis, \bibinfo{school}{Universit{\`a} di Parma}
+ (\bibinfo{year}{2007}).
+
+\bibitem[{\citenamefont{Ott}(2007)}]{carpet-ott2007a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \emph{\bibinfo{title}{Stellar iron core collapse in \{3+1\} general
+ relativity and the gravitational wave signature of core-collapse
+ supernovae}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2007}),
+ \urlprefix\url{http://stellarcollapse.org/papers/thesis_final.pdf}.
+
+\bibitem[{\citenamefont{Zengino{\u{g}}lu}(2007)}]{carpet-2007a}
+\bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Zengino{\u{g}}lu}},
+ \emph{\bibinfo{title}{A conformal approach to numerical calculations of
+ asymptotically flat spacetimes}}, Ph.D. thesis,
+ \bibinfo{school}{Universit{\"a}t Potsdam} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0711.0873 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0711.0873}.
+
+\bibitem[{\citenamefont{L{\"o}ffler}(2006)}]{carpet-loeffler2005a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{L{\"o}ffler}},
+ \emph{\bibinfo{title}{Numerical simulations of neutron star-black hole
+ mergers}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2006}),
+ \urlprefix\url{http://opus.kobv.de/ubp/volltexte/2006/774/}.
+
+\bibitem[{\citenamefont{Madiraju}(2006)}]{carpet-madiraju2006a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Madiraju}},
+ \emph{\bibinfo{title}{Performance profiling with {Cactus} benchmarks}},
+ Master's thesis, \bibinfo{school}{Louisiana State University}
+ (\bibinfo{year}{2006}), \urlprefix\url{http://www.cactuscode.org/
+ Articles/Cactus_Madiraju06.pdf}.
+
+\bibitem[{\citenamefont{Zink}(2006)}]{carpet-zink2006d}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \emph{\bibinfo{title}{Black hole formation from non-axisymmetric
+ instabilities in quasi-toroidal stars}}, Ph.D. thesis,
+ \bibinfo{school}{Technische Universit{\"a}t M{\"u}nchen}
+ (\bibinfo{year}{2006}),
+ \urlprefix\url{http://nbn-resolving.de/urn/resolver.pl
+ ?urn=urn:nbn:de:bvb:91-diss20060623-1915123970}.
+
+\bibitem[{\citenamefont{Herrmann}(2005)}]{carpet-herrmann2005a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Evolution and analysis of binary black hole
+ spacetimes}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2005}).
+
+\bibitem[{\citenamefont{Koppitz}(2004)}]{carpet-koppitz2004a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \emph{\bibinfo{title}{Numerical studies of black hole initial data}}, Ph.D.
+ thesis, \bibinfo{school}{Universit{\"a}t Potsdam} (\bibinfo{year}{2004}),
+ \urlprefix\url{http://opus.kobv.de/ubp/volltexte/2005/134/}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.bib b/Carpet/CarpetWeb/publications/citations-thesis.bib
new file mode 100644
index 000000000..340c75234
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.bib
@@ -0,0 +1,132 @@
+
+@PhDThesis{ carpet-bentivegna2008b,
+ status = {thesis},
+ author = {Eloisa Bentivegna},
+ title = {Ringing in unison: exploring black hole coalescence with
+ quasinormal modes},
+ school = {Pennsylvania State University},
+ year = 2008,
+ url = {http://etda.libraries.psu.edu/
+ theses/approved/WorldWideIndex/ETD-2570/index.html},
+ receiveddate = 2008
+}
+
+@MastersThesis{ carpet-jasiulek2008a,
+ status = {thesis},
+ author = {Michael Jasiulek},
+ title = {Spin Measures on Isolated and Dynamical Horizons in
+ Numerical Relativity},
+ school = {Humboldt-Universit{\"a}t zu Berlin},
+ year = 2008,
+ receiveddate = 2008
+}
+
+@PhDThesis{ carpet-dorband2007a,
+ status = {thesis},
+ author = {Ernst Nils Dorband},
+ title = {Computing and Analyzing Gravitational Radiation in Black
+ Hole Simulations Using a New Multi-Block Approach to
+ Numerical Relativity},
+ school = {Louisiana State University},
+ year = 2007,
+ url = {http://www.cct.lsu.edu/~dorband/thesis.pdf},
+ receiveddate = 2007
+}
+
+@PhDThesis{ carpet-kastaun2007a,
+ status = {thesis},
+ author = {Wolfgang Kastaun},
+ title = {Developing a code for general relativistic hydrodynamics
+ with application to neutron star oscillations},
+ school = {Universit{\"a}t T{\"u}bingen},
+ year = 2007,
+ url = {http://tobias-lib.ub.uni-tuebingen.de/
+ volltexte/2007/2803/},
+ receiveddate = 2007
+}
+
+@PhDThesis{ carpet-manca2007a,
+ status = {thesis},
+ author = {Gian Mario Manca},
+ title = {Dynamical instabilities in rapidly rotating neutron star
+ models},
+ school = {Universit{\`a} di Parma},
+ year = 2007,
+ receiveddate = 2007
+}
+
+@PhDThesis{ carpet-ott2007a,
+ status = {thesis},
+ author = {Christian D. Ott},
+ title = {Stellar Iron Core Collapse in \{3+1\} General Relativity
+ and The Gravitational Wave Signature of Core-Collapse
+ Supernovae},
+ school = {Universit{\"a}t Potsdam},
+ year = 2007,
+ url = {http://stellarcollapse.org/papers/thesis_final.pdf},
+ receiveddate = 2007
+}
+
+@PhDThesis{ carpet-2007a,
+ status = {thesis},
+ author = {An{\i}l Zengino{\u{g}}lu},
+ title = {A conformal approach to numerical calculations of
+ asymptotically flat spacetimes},
+ school = {Universit{\"a}t Potsdam},
+ year = 2007,
+ eprint = {arXiv:0711.0873 [gr-qc]},
+ url = {http://arxiv.org/abs/0711.0873},
+ receiveddate = 2007
+}
+
+@PhDThesis{ carpet-loeffler2005a,
+ status = {thesis},
+ author = {Frank L{\"o}ffler},
+ title = {Numerical Simulations of Neutron Star-Black Hole Mergers},
+ school = {Universit{\"a}t Potsdam},
+ year = 2006,
+ url = {http://opus.kobv.de/ubp/volltexte/2006/774/},
+ receiveddate = 2006
+}
+
+@MastersThesis{ carpet-madiraju2006a,
+ status = {thesis},
+ author = {Sasanka Madiraju},
+ title = {Performance Profiling with {Cactus} Benchmarks},
+ school = {Louisiana State University},
+ year = 2006,
+ url = {http://www.cactuscode.org/
+ Articles/Cactus_Madiraju06.pdf},
+ receiveddate = 2006
+}
+
+@PhDThesis{ carpet-zink2006d,
+ status = {thesis},
+ author = {Burkhard Zink},
+ title = {Black hole formation from non-axisymmetric instabilities
+ in quasi-toroidal stars},
+ school = {Technische Universit{\"a}t M{\"u}nchen},
+ year = 2006,
+ url = {http://nbn-resolving.de/urn/resolver.pl
+ ?urn=urn:nbn:de:bvb:91-diss20060623-1915123970},
+ receiveddate = 2006
+}
+
+@PhDThesis{ carpet-herrmann2005a,
+ status = {thesis},
+ author = {Frank Herrmann},
+ title = {Evolution and analysis of binary black hole spacetimes},
+ school = {Universit{\"a}t Potsdam},
+ year = 2005,
+ receiveddate = 2005
+}
+
+@PhDThesis{ carpet-koppitz2004a,
+ status = {thesis},
+ author = {Michael Koppitz},
+ title = {Numerical Studies Of Black Hole Initial Data},
+ school = {Universit{\"a}t Potsdam},
+ year = 2004,
+ url = {http://opus.kobv.de/ubp/volltexte/2005/134/},
+ receiveddate = 2004
+}
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.bibitems b/Carpet/CarpetWeb/publications/citations-thesis.bibitems
new file mode 100644
index 000000000..b32dd4aed
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.bibitems
@@ -0,0 +1,99 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{\citenamefont{Bentivegna}(2008)}]{carpet-bentivegna2008b}
+\bibinfo{author}{\bibfnamefont{E.}~\bibnamefont{Bentivegna}},
+ \emph{\bibinfo{title}{Ringing in unison: exploring black hole coalescence
+ with quasinormal modes}}, Ph.D. thesis, \bibinfo{school}{Pennsylvania State
+ University} (\bibinfo{year}{2008}),
+ \urlprefix\url{http://etda.libraries.psu.edu/
+ theses/approved/WorldWideIndex/ETD-2570/index.html}.
+
+\blurb[{\citenamefont{Jasiulek}(2008)}]{carpet-jasiulek2008a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Jasiulek}},
+ \emph{\bibinfo{title}{Spin measures on isolated and dynamical horizons in
+ numerical relativity}}, Master's thesis,
+ \bibinfo{school}{Humboldt-Universit{\"a}t zu Berlin} (\bibinfo{year}{2008}).
+
+\blurb[{\citenamefont{Dorband}(2007)}]{carpet-dorband2007a}
+\bibinfo{author}{\bibfnamefont{E.~N.} \bibnamefont{Dorband}},
+ \emph{\bibinfo{title}{Computing and analyzing gravitational radiation in
+ black hole simulations using a new multi-block approach to numerical
+ relativity}}, Ph.D. thesis, \bibinfo{school}{Louisiana State University}
+ (\bibinfo{year}{2007}),
+ \urlprefix\url{http://www.cct.lsu.edu/~dorband/thesis.pdf}.
+
+\blurb[{\citenamefont{Kastaun}(2007)}]{carpet-kastaun2007a}
+\bibinfo{author}{\bibfnamefont{W.}~\bibnamefont{Kastaun}},
+ \emph{\bibinfo{title}{Developing a code for general relativistic
+ hydrodynamics with application to neutron star oscillations}}, Ph.D. thesis,
+ \bibinfo{school}{Universit{\"a}t T{\"u}bingen} (\bibinfo{year}{2007}),
+ \urlprefix\url{http://tobias-lib.ub.uni-tuebingen.de/ volltexte/2007/2803/}.
+
+\blurb[{\citenamefont{Manca}(2007)}]{carpet-manca2007a}
+\bibinfo{author}{\bibfnamefont{G.~M.} \bibnamefont{Manca}},
+ \emph{\bibinfo{title}{Dynamical instabilities in rapidly rotating neutron
+ star models}}, Ph.D. thesis, \bibinfo{school}{Universit{\`a} di Parma}
+ (\bibinfo{year}{2007}).
+
+\blurb[{\citenamefont{Ott}(2007)}]{carpet-ott2007a}
+\bibinfo{author}{\bibfnamefont{C.~D.} \bibnamefont{Ott}},
+ \emph{\bibinfo{title}{Stellar iron core collapse in \{3+1\} general
+ relativity and the gravitational wave signature of core-collapse
+ supernovae}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2007}),
+ \urlprefix\url{http://stellarcollapse.org/papers/thesis_final.pdf}.
+
+\blurb[{\citenamefont{Zengino{\u{g}}lu}(2007)}]{carpet-2007a}
+\bibinfo{author}{\bibfnamefont{A.}~\bibnamefont{Zengino{\u{g}}lu}},
+ \emph{\bibinfo{title}{A conformal approach to numerical calculations of
+ asymptotically flat spacetimes}}, Ph.D. thesis,
+ \bibinfo{school}{Universit{\"a}t Potsdam} (\bibinfo{year}{2007}),
+ \eprint{arXiv:0711.0873 [gr-qc]},
+ \urlprefix\url{http://arxiv.org/abs/0711.0873}.
+
+\blurb[{\citenamefont{L{\"o}ffler}(2006)}]{carpet-loeffler2005a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{L{\"o}ffler}},
+ \emph{\bibinfo{title}{Numerical simulations of neutron star-black hole
+ mergers}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2006}),
+ \urlprefix\url{http://opus.kobv.de/ubp/volltexte/2006/774/}.
+
+\blurb[{\citenamefont{Madiraju}(2006)}]{carpet-madiraju2006a}
+\bibinfo{author}{\bibfnamefont{S.}~\bibnamefont{Madiraju}},
+ \emph{\bibinfo{title}{Performance profiling with {Cactus} benchmarks}},
+ Master's thesis, \bibinfo{school}{Louisiana State University}
+ (\bibinfo{year}{2006}), \urlprefix\url{http://www.cactuscode.org/
+ Articles/Cactus_Madiraju06.pdf}.
+
+\blurb[{\citenamefont{Zink}(2006)}]{carpet-zink2006d}
+\bibinfo{author}{\bibfnamefont{B.}~\bibnamefont{Zink}},
+ \emph{\bibinfo{title}{Black hole formation from non-axisymmetric
+ instabilities in quasi-toroidal stars}}, Ph.D. thesis,
+ \bibinfo{school}{Technische Universit{\"a}t M{\"u}nchen}
+ (\bibinfo{year}{2006}),
+ \urlprefix\url{http://nbn-resolving.de/urn/resolver.pl
+ ?urn=urn:nbn:de:bvb:91-diss20060623-1915123970}.
+
+\blurb[{\citenamefont{Herrmann}(2005)}]{carpet-herrmann2005a}
+\bibinfo{author}{\bibfnamefont{F.}~\bibnamefont{Herrmann}},
+ \emph{\bibinfo{title}{Evolution and analysis of binary black hole
+ spacetimes}}, Ph.D. thesis, \bibinfo{school}{Universit{\"a}t Potsdam}
+ (\bibinfo{year}{2005}).
+
+\blurb[{\citenamefont{Koppitz}(2004)}]{carpet-koppitz2004a}
+\bibinfo{author}{\bibfnamefont{M.}~\bibnamefont{Koppitz}},
+ \emph{\bibinfo{title}{Numerical studies of black hole initial data}}, Ph.D.
+ thesis, \bibinfo{school}{Universit{\"a}t Potsdam} (\bibinfo{year}{2004}),
+ \urlprefix\url{http://opus.kobv.de/ubp/volltexte/2005/134/}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.blg b/Carpet/CarpetWeb/publications/citations-thesis.blg
new file mode 100644
index 000000000..c2ec896d7
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-thesis.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-thesis.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 12 entries,
+ 3482 wiz_defined-function locations,
+ 1215 strings with 12161 characters,
+and the built_in function-call counts, 5178 in all, are:
+= -- 334
+> -- 84
+< -- 24
++ -- 50
+- -- 24
+* -- 621
+:= -- 703
+add.period$ -- 12
+call.type$ -- 12
+change.case$ -- 60
+chr.to.int$ -- 12
+cite$ -- 12
+duplicate$ -- 516
+empty$ -- 470
+format.name$ -- 60
+if$ -- 936
+int.to.chr$ -- 1
+int.to.str$ -- 13
+missing$ -- 72
+newline$ -- 51
+num.names$ -- 36
+pop$ -- 134
+preamble$ -- 1
+purify$ -- 48
+quote$ -- 0
+skip$ -- 169
+stack$ -- 0
+substring$ -- 134
+swap$ -- 325
+text.length$ -- 12
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 72
+warning$ -- 0
+while$ -- 24
+width$ -- 0
+write$ -- 156
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.html-updated b/Carpet/CarpetWeb/publications/citations-thesis.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.log b/Carpet/CarpetWeb/publications/citations-thesis.log
new file mode 100644
index 000000000..0fdd5acee
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.log
@@ -0,0 +1,206 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-thesis.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-thesis.t
+ex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-thesis.a
+ux)
+\openout1 = `citations-thesis.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-thesis.b
+bl
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 20.
+ (/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 20.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 20.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 20.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 20.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 20.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)
+Underfull \hbox (badness 10000) in paragraph at lines 81--88
+[]\T1/ppl/m/n/9 B. Zink, \T1/ppl/m/it/9 Black hole for-ma-tion from non-axisymm
+etric in-sta-bil-i-ties in quasi-toroidal stars\T1/ppl/m/n/9 , Ph.D. the-sis, T
+ech-nis-
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 81--88
+\T1/ppl/m/n/9 che Uni-ver-sität München (2006), URL $\T1/cmtt/m/n/9 http : / /
+nbn-[]resolving . de / urn / resolver . pl ? urn = urn : nbn : de : bvb :
+ []
+
+) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-thesis.a
+ux) )
+Here is how much of TeX's memory you used:
+ 2454 strings out of 94073
+ 30478 string characters out of 1164798
+ 89898 words of memory out of 1500000
+ 5746 multiletter control sequences out of 10000+50000
+ 15151 words of font info for 37 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,308b,280s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/op
+t/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/share/texmf-di
+st/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/fonts/
+type1/urw/palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/pala
+tino/uplri8a.pfb>
+Output written on citations-thesis.pdf (1 page, 80328 bytes).
+PDF statistics:
+ 20 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.pdf b/Carpet/CarpetWeb/publications/citations-thesis.pdf
new file mode 100644
index 000000000..828a70216
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-thesis.tex b/Carpet/CarpetWeb/publications/citations-thesis.tex
new file mode 100644
index 000000000..7edab39cb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-thesis.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-thesis}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.aux b/Carpet/CarpetWeb/publications/citations-webpage.aux
new file mode 100644
index 000000000..213d6fb3d
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.aux
@@ -0,0 +1,14 @@
+\relax
+\citation{*}
+\bibdata{citations-webpage}
+\bibcite{carpet-carpetweb}{{1}{}{{car}}{{}}}
+\bibcite{carpet-cactusweb}{{2}{}{{car}}{{}}}
+\global \chardef \firstnote@num2\relax
+\bibstyle{apsrev-titles-manyauthors}
+\select@language{english}
+\@writefile{toc}{\select@language{english}}
+\@writefile{lof}{\select@language{english}}
+\@writefile{lot}{\select@language{english}}
+\@writefile{toc}{\contentsline {section}{\numberline {}References}{1}{}}
+\newlabel{LastBibItem}{{2}{1}{}{}{}}
+\newlabel{LastPage}{{}{1}}
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.bbl b/Carpet/CarpetWeb/publications/citations-webpage.bbl
new file mode 100644
index 000000000..e249cb868
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.bbl
@@ -0,0 +1,23 @@
+\begin{thebibliography}{2}
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\bibitem[{car({\natexlab{a}})}]{carpet-carpetweb}
+\emph{\bibinfo{title}{Mesh refinement with {Carpet}}},
+ \urlprefix\url{http://www.carpetcode.org/}.
+
+\bibitem[{car({\natexlab{b}})}]{carpet-cactusweb}
+\emph{\bibinfo{title}{{Cactus} {Computational} {Toolkit}}},
+ \urlprefix\url{http://www.cactuscode.org/}.
+
+\end{thebibliography}
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.bib b/Carpet/CarpetWeb/publications/citations-webpage.bib
new file mode 100644
index 000000000..daa32d7a5
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.bib
@@ -0,0 +1,12 @@
+
+@Misc{ carpet-carpetweb,
+ status = {webpage},
+ title = {Mesh Refinement with {Carpet}},
+ url = {http://www.carpetcode.org/}
+}
+
+@Misc{ carpet-cactusweb,
+ status = {webpage},
+ title = {{Cactus} {Computational} {Toolkit}},
+ url = {http://www.cactuscode.org/}
+}
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.bibitems b/Carpet/CarpetWeb/publications/citations-webpage.bibitems
new file mode 100644
index 000000000..0ddaec695
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.bibitems
@@ -0,0 +1,21 @@
+\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi
+\expandafter\ifx\csname bibnamefont\endcsname\relax
+ \def\bibnamefont#1{#1}\fi
+\expandafter\ifx\csname bibfnamefont\endcsname\relax
+ \def\bibfnamefont#1{#1}\fi
+\expandafter\ifx\csname citenamefont\endcsname\relax
+ \def\citenamefont#1{#1}\fi
+\expandafter\ifx\csname url\endcsname\relax
+ \def\url#1{\texttt{#1}}\fi
+\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+\providecommand{\bibinfo}[2]{#2}
+\providecommand{\eprint}[2][]{\url{#2}}
+
+\blurb[{car({\natexlab{a}})}]{carpet-carpetweb}
+\emph{\bibinfo{title}{Mesh refinement with {Carpet}}},
+ \urlprefix\url{http://www.carpetcode.org/}.
+
+\blurb[{car({\natexlab{b}})}]{carpet-cactusweb}
+\emph{\bibinfo{title}{{Cactus} {Computational} {Toolkit}}},
+ \urlprefix\url{http://www.cactuscode.org/}.
+
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.blg b/Carpet/CarpetWeb/publications/citations-webpage.blg
new file mode 100644
index 000000000..38a2abdee
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.blg
@@ -0,0 +1,46 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: citations-webpage.aux
+The style file: apsrev-titles-manyauthors.bst
+Database file #1: citations-webpage.bib
+Reallocated wiz_functions (elt_size=4) to 6000 items from 3000.
+You've used 2 entries,
+ 3482 wiz_defined-function locations,
+ 1163 strings with 10236 characters,
+and the built_in function-call counts, 566 in all, are:
+= -- 40
+> -- 0
+< -- 0
++ -- 5
+- -- 0
+* -- 50
+:= -- 73
+add.period$ -- 2
+call.type$ -- 2
+change.case$ -- 10
+chr.to.int$ -- 1
+cite$ -- 6
+duplicate$ -- 48
+empty$ -- 59
+format.name$ -- 0
+if$ -- 103
+int.to.chr$ -- 2
+int.to.str$ -- 3
+missing$ -- 4
+newline$ -- 21
+num.names$ -- 0
+pop$ -- 24
+preamble$ -- 1
+purify$ -- 8
+quote$ -- 0
+skip$ -- 20
+stack$ -- 0
+substring$ -- 26
+swap$ -- 16
+text.length$ -- 0
+text.prefix$ -- 0
+top$ -- 0
+type$ -- 12
+warning$ -- 0
+while$ -- 0
+width$ -- 0
+write$ -- 30
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.html-updated b/Carpet/CarpetWeb/publications/citations-webpage.html-updated
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.html-updated
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.log b/Carpet/CarpetWeb/publications/citations-webpage.log
new file mode 100644
index 000000000..157fd7840
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.log
@@ -0,0 +1,193 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2009.7.3) 3 AUG 2009 22:08
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publicatio
+ns/citations-webpage.tex}
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-webpage.
+tex (/opt/local/share/texmf-dist/tex/latex/revtex/revtex4.cls
+Document Class: revtex4 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for do
+cumentation)
+ Copyright (c) 2001 The American Physical Society.
+ mailto:revtex@aps.org
+ Licensed under the LPPL:
+http://www.ctan.org/tex-archive/macros/latex/base/lppl.txt
+ Arthur Ogawa <ogawa@teleport.com>
+ Based on work by David Carlisle <david@dcarlisle.demon.co.uk>.
+ltxutil: portions licensed from W. E. Baxter (web@superscript.com)
+Class revtex4 Info: Repairing broken LateX \@sect on input line 596.
+\intertabularlinepenalty=\count79
+\@tbpen=\count80
+\@arstrutbox@hline=\box26
+Class revtex4 Info: Repairing broken LaTeX \@xbitor on input line 1610.
+ltxgrid: portions licensed from W. E. Baxter (web@superscript.com)
+\c@linecount=\count81
+\output=\toks14
+\@protection@box=\box27
+\@topmark@saved=\toks15
+\footins@saved=\box28
+\pagesofar=\box29
+\footbox=\box30
+\pagegrid@col=\count82
+Class revtex4 Info: Incorporating package {textcase} [1998/11/12 v0.06 Text on
+ly upper/lower case changing (DPC)]. on input line 3682.
+(/opt/local/share/texmf-local/tex/latex/html/url.sty
+Package: url 1999/03/02 ver 1.4 Verb mode for urls, email addresses, and file
+ names
+)
+\c@affil=\count83
+\absbox=\box31
+\c@part=\count84
+\c@section=\count85
+\c@subsection=\count86
+\c@subsubsection=\count87
+\c@paragraph=\count88
+\c@subparagraph=\count89
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\c@figure=\count90
+\c@table=\count91
+
+(/opt/local/share/texmf-dist/tex/latex/natbib/natbib.sty
+Package: natbib 2007/02/05 8.0 (PWD)
+\bibhang=\skip43
+\bibsep=\skip44
+LaTeX Info: Redefining \cite on input line 602.
+\c@NAT@ctr=\count92
+)
+\widetext@top=\box32
+\widetext@bot=\box33
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/revsymb.sty
+Package: revsymb 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documenta
+tion)
+LaTeX Info: Redefining \REV@mathfrak on input line 118.
+))
+
+Class revtex4 Warning: No Society specified, using generic APS style.
+
+(/opt/local/share/texmf-dist/tex/latex/revtex/aps.rtx
+File: aps.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentatio
+n)
+)
+(/opt/local/share/texmf-dist/tex/latex/revtex/10pt.rtx
+File: 10pt.rtx 2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentati
+on)
+)
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2005/11/23 v3.8h The Babel package
+
+(/opt/local/share/texmf-dist/tex/generic/babel/english.ldf
+Language: english 2005/03/30 v3.3o English support from the babel system
+
+(/opt/local/share/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2005/11/23 v3.8h Babel common definitions
+\babel@savecnt=\count93
+\U@D=\dimen102
+)
+\l@british = a dialect from \language\l@english
+\l@UKenglish = a dialect from \language\l@english
+\l@canadian = a dialect from \language\l@american
+\l@australian = a dialect from \language\l@british
+\l@newzealand = a dialect from \language\l@british
+))
+(/opt/local/share/texmf-dist/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/opt/local/share/texmf-dist/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/opt/local/share/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks16
+\inpenc@posthook=\toks17
+
+(/opt/local/share/texmf-local/tex/latex/html/latin9.def
+File: latin1.def 1998/03/05 v0.97 Input encoding file(test version: still liabl
+e to change)
+))
+(/opt/local/share/texmf-dist/tex/latex/psnfss/mathpazo.sty
+Package: mathpazo 2005/04/12 PSNFSS-v9.2a Palatino w/ Pazo Math (D.Puga, WaS)
+\symupright=\mathgroup4
+)
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-webpage.
+aux)
+\openout1 = `citations-webpage.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 8.
+LaTeX Font Info: ... okay on input line 8.
+LaTeX Font Info: Try loading font information for T1+ppl on input line 8.
+ (/opt/local/share/texmf-dist/tex/latex/psnfss/t1ppl.fd
+File: t1ppl.fd 2001/06/04 font definitions for T1/ppl.
+)
+Class revtex4 Info: Patching LaTeX tabular. on input line 8.
+Class revtex4 Info: cite was not loaded (OK!) on input line 8.
+Class revtex4 Info: multicol was not loaded (OK!) on input line 8.
+\big@size=\dimen103
+
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-webpage.
+bbl
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 17.
+ (/opt/local/share/texmf-dist/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Try loading font information for OT1+ppl on input line 17.
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1ppl.fd
+File: ot1ppl.fd 2001/06/04 font definitions for OT1/ppl.
+)
+LaTeX Font Info: Try loading font information for OML+zplm on input line 17.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omlzplm.fd
+File: omlzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OML/zplm.
+)
+LaTeX Font Info: Try loading font information for OMS+zplm on input line 17.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omszplm.fd
+File: omszplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMS/zplm.
+)
+LaTeX Font Info: Try loading font information for OMX+zplm on input line 17.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/omxzplm.fd
+File: omxzplm.fd 2002/09/08 Fontinst v1.914 font definitions for OMX/zplm.
+)
+LaTeX Font Info: Try loading font information for OT1+zplm on input line 17.
+
+
+(/opt/local/share/texmf-dist/tex/latex/psnfss/ot1zplm.fd
+File: ot1zplm.fd 2002/09/08 Fontinst v1.914 font definitions for OT1/zplm.
+)) [1{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+(/Users/eschnett/Calpha/carpet/Carpet/CarpetWeb/publications/citations-webpage.
+aux) )
+Here is how much of TeX's memory you used:
+ 2440 strings out of 94073
+ 30236 string characters out of 1164798
+ 85900 words of memory out of 1500000
+ 5732 multiletter control sequences out of 10000+50000
+ 15151 words of font info for 37 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 26i,4n,21p,308b,257s stack positions out of 5000i,500n,6000p,200000b,5000s
+{/opt/local/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}{/o
+pt/local/share/texmf-dist/fonts/enc/dvips/base/8r.enc}</opt/local/share/texmf-d
+ist/fonts/type1/public/cm-super/sftt0900.pfb></opt/local/share/texmf-dist/fonts
+/type1/urw/palatino/uplr8a.pfb></opt/local/share/texmf-dist/fonts/type1/urw/pal
+atino/uplri8a.pfb>
+Output written on citations-webpage.pdf (1 page, 47024 bytes).
+PDF statistics:
+ 20 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.pdf b/Carpet/CarpetWeb/publications/citations-webpage.pdf
new file mode 100644
index 000000000..46713763b
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/publications/citations-webpage.tex b/Carpet/CarpetWeb/publications/citations-webpage.tex
new file mode 100644
index 000000000..b476a9761
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations-webpage.tex
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-webpage}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/citations.template b/Carpet/CarpetWeb/publications/citations.template
new file mode 100644
index 000000000..ed7fa930b
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/citations.template
@@ -0,0 +1,15 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{*}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{citations-STATUS}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/html-n.bst b/Carpet/CarpetWeb/publications/html-n.bst
new file mode 100644
index 000000000..ec45d2e73
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/html-n.bst
@@ -0,0 +1,1312 @@
+ % $Id: html-btxbst.doc 1.4 2005/09/04 13:27:21 dds Exp $
+ %
+ % This file is either "html-btxbst.doc" or was derived from
+ % "html-btxbst.doc" using cpp. "html-btxbst.doc" itself was edited
+ % from "btxbst.doc" and "named.bst".
+ % The following copyright information is from btxbst.doc:
+ % version 0.99b for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1985, all rights reserved.
+ % Copying of this file is authorized only if either
+ % (1) you make absolutely no changes to your copy, including name, or
+ % (2) if you do make changes, you name it something other than
+ % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file btxbst.doc has the documentation for this style.
+ % "named" style (sorted keys of the form [name, year])
+ % Some code for this was taken from "named.bst".
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ dvi
+ html
+ keywords
+ pdf
+ postscript
+ url
+ doi
+ mailto
+ }
+ {}
+ { label extra.label sort.label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ author empty$
+ { editor empty$
+ { organization empty$
+ 'skip$
+ { "<!-- Authors: " organization purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " editor purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " author purify$ * " -->" * write$ newline$ }
+ if$
+ keywords empty$
+ 'skip$
+ { "<!-- Keywords: " keywords * " -->" * write$ newline$ }
+ if$
+ "<dt><a name=" quote$ * cite$ * quote$ * ">[" * label * "]</a></dt><dd>" * write$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ postscript empty$
+ 'skip$
+ { newline$ "<!-- PostScript: " postscript * " -->" * write$ }
+ if$
+ pdf empty$
+ 'skip$
+ { newline$ "<!-- PDF: " pdf * " -->" * write$ }
+ if$
+ dvi empty$
+ 'skip$
+ { newline$ "<!-- DVI: " dvi * " -->" * write$ }
+ if$
+ doi empty$
+ 'skip$
+ { newline$ "<!-- DOI: " doi * " -->" * write$ }
+ if$
+ "</dd>" write$
+ newline$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {str.to.int}
+{
+ 's :=
+ #0
+ { s empty$ not }
+ { % Multiply the number on the top of the stack by 10 = 1010 binary
+ duplicate$ + % x2
+ duplicate$ % x2 x2
+ duplicate$ + duplicate$ + % x2 x8
+ +
+ s #1 #1 substring$ chr.to.int$ #48 - + % #48 is ascii for '0'
+ s #2 global.max$ substring$ 's :=
+ }
+ while$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "<cite>" swap$ * "</cite>" * }
+ if$
+}
+
+FUNCTION {add.link} % title
+{
+ 't :=
+ t empty$
+ { "" }
+ { url empty$
+ { html empty$
+ { t }
+ { "<a href=" quote$ * html * quote$ * ">" * t * "</a>" * }
+ if$ }
+ { "<a href=" quote$ * url * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {add.mailto} % authors
+{
+ 't :=
+ t empty$
+ { "" }
+ { mailto empty$
+ { t }
+ { "<a href=" quote$ * "mailto:" * mailto * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+ add.mailto
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+ add.link
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month " " * year * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+ add.link
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "volume" volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ":" * pages n.dashify * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "chapter" }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ key empty$ not and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "<cite>" * journal * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "<a href=" * quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { "<cite>" * series * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ { "<cite>" * booktitle * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ new.block
+ format.title "title" output.check
+ howpublished address new.block.checkb
+ howpublished output
+ address output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ address empty$
+ { organization publisher new.sentence.checkb
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ organization output
+ publisher output
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ { address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ { organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { publisher new.sentence.checka }
+ { organization publisher new.sentence.checkb
+ organization output
+ }
+ if$
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ format.date output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+
+MACRO {acmcs} {"ACM Computing Surveys"}
+
+MACRO {acta} {"Acta Informatica"}
+
+MACRO {cacm} {"Communications of the ACM"}
+
+MACRO {ibmjrd} {"IBM Journal of Research and Development"}
+
+MACRO {ibmsj} {"IBM Systems Journal"}
+
+MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
+
+MACRO {ieeetc} {"IEEE Transactions on Computers"}
+
+MACRO {ieeetcad}
+ {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+
+MACRO {ipl} {"Information Processing Letters"}
+
+MACRO {jacm} {"Journal of the ACM"}
+
+MACRO {jcss} {"Journal of Computer and System Sciences"}
+
+MACRO {scp} {"Science of Computer Programming"}
+
+MACRO {sicomp} {"SIAM Journal on Computing"}
+
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+
+MACRO {tods} {"ACM Transactions on Database Systems"}
+
+MACRO {tog} {"ACM Transactions on Graphics"}
+
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+
+MACRO {tcs} {"Theoretical Computer Science"}
+
+READ
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 =
+ { s #1 "{vv }{ll}" format.name$ }
+ { numnames #2 =
+ { s #1 "{vv }{ll }and " format.name$ s #2 "{vv }{ll}" format.name$ * }
+ { s #1 "{vv }{ll }" format.name$ "et~al." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+ { cite$ #1 #3 substring$ }
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ if$
+ }
+ { key }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+ { cite$ #1 #3 substring$ }
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ if$
+ }
+ { key }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.organization.label
+ { type$ "manual" =
+ 'author.key.organization.label
+ 'author.key.label
+ if$
+ }
+ if$
+ }
+ if$
+ duplicate$
+ year empty$
+ 'skip$
+ { ", " * }
+ if$
+ year field.or.null purify$ * % CHANGED - pfps - 15 Feb 1989
+ 'label :=
+ year field.or.null purify$
+ * sortify 'sort.label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$
+ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
+ nameptr numnames = t "others" = and
+ { "et al." * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.organization.sort}
+{ author empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need author, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {editor.organization.sort}
+{ editor empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need editor, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION {presort}
+{ calc.label
+ sort.label
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+ *
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT
+
+STRINGS { longest.label last.sort.label next.extra }
+
+INTEGERS { longest.label.width last.extra.num }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #0 int.to.chr$ 'last.sort.label :=
+ "" 'next.extra :=
+ #0 'longest.label.width :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION {forward.pass}
+{ last.sort.label sort.label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ sort.label 'last.sort.label :=
+ }
+ if$
+}
+
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ label extra.label * 'label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {begin.bib}
+{
+ "# label-style: default" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/Carpet/CarpetWeb/publications/html-nr.bst b/Carpet/CarpetWeb/publications/html-nr.bst
new file mode 100644
index 000000000..2adebb502
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/html-nr.bst
@@ -0,0 +1,1313 @@
+ % $Id: html-btxbst.doc 1.4 2005/09/04 13:27:21 dds Exp $
+ %
+ % This file is either "html-btxbst.doc" or was derived from
+ % "html-btxbst.doc" using cpp. "html-btxbst.doc" itself was edited
+ % from "btxbst.doc" and "named.bst".
+ % The following copyright information is from btxbst.doc:
+ % version 0.99b for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1985, all rights reserved.
+ % Copying of this file is authorized only if either
+ % (1) you make absolutely no changes to your copy, including name, or
+ % (2) if you do make changes, you name it something other than
+ % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file btxbst.doc has the documentation for this style.
+ % "named" style (sorted keys of the form [name, year])
+ % Some code for this was taken from "named.bst".
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ dvi
+ html
+ keywords
+ pdf
+ postscript
+ url
+ doi
+ mailto
+ }
+ {}
+ { label extra.label sort.label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ author empty$
+ { editor empty$
+ { organization empty$
+ 'skip$
+ { "<!-- Authors: " organization purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " editor purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " author purify$ * " -->" * write$ newline$ }
+ if$
+ keywords empty$
+ 'skip$
+ { "<!-- Keywords: " keywords * " -->" * write$ newline$ }
+ if$
+ "<dt><a name=" quote$ * cite$ * quote$ * ">[" * label * "]</a></dt><dd>" * write$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ postscript empty$
+ 'skip$
+ { newline$ "<!-- PostScript: " postscript * " -->" * write$ }
+ if$
+ pdf empty$
+ 'skip$
+ { newline$ "<!-- PDF: " pdf * " -->" * write$ }
+ if$
+ dvi empty$
+ 'skip$
+ { newline$ "<!-- DVI: " dvi * " -->" * write$ }
+ if$
+ doi empty$
+ 'skip$
+ { newline$ "<!-- DOI: " doi * " -->" * write$ }
+ if$
+ "</dd>" write$
+ newline$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {str.to.int}
+{
+ 's :=
+ #0
+ { s empty$ not }
+ { % Multiply the number on the top of the stack by 10 = 1010 binary
+ duplicate$ + % x2
+ duplicate$ % x2 x2
+ duplicate$ + duplicate$ + % x2 x8
+ +
+ s #1 #1 substring$ chr.to.int$ #48 - + % #48 is ascii for '0'
+ s #2 global.max$ substring$ 's :=
+ }
+ while$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "<cite>" swap$ * "</cite>" * }
+ if$
+}
+
+FUNCTION {add.link} % title
+{
+ 't :=
+ t empty$
+ { "" }
+ { url empty$
+ { html empty$
+ { t }
+ { "<a href=" quote$ * html * quote$ * ">" * t * "</a>" * }
+ if$ }
+ { "<a href=" quote$ * url * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {add.mailto} % authors
+{
+ 't :=
+ t empty$
+ { "" }
+ { mailto empty$
+ { t }
+ { "<a href=" quote$ * "mailto:" * mailto * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+ add.mailto
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+ add.link
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month " " * year * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+ add.link
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "volume" volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ":" * pages n.dashify * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "chapter" }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ key empty$ not and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "<cite>" * journal * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "<a href=" * quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { "<cite>" * series * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ { "<cite>" * booktitle * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ new.block
+ format.title "title" output.check
+ howpublished address new.block.checkb
+ howpublished output
+ address output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ address empty$
+ { organization publisher new.sentence.checkb
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ organization output
+ publisher output
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ { address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ { organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { publisher new.sentence.checka }
+ { organization publisher new.sentence.checkb
+ organization output
+ }
+ if$
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ format.date output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+
+MACRO {acmcs} {"ACM Computing Surveys"}
+
+MACRO {acta} {"Acta Informatica"}
+
+MACRO {cacm} {"Communications of the ACM"}
+
+MACRO {ibmjrd} {"IBM Journal of Research and Development"}
+
+MACRO {ibmsj} {"IBM Systems Journal"}
+
+MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
+
+MACRO {ieeetc} {"IEEE Transactions on Computers"}
+
+MACRO {ieeetcad}
+ {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+
+MACRO {ipl} {"Information Processing Letters"}
+
+MACRO {jacm} {"Journal of the ACM"}
+
+MACRO {jcss} {"Journal of Computer and System Sciences"}
+
+MACRO {scp} {"Science of Computer Programming"}
+
+MACRO {sicomp} {"SIAM Journal on Computing"}
+
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+
+MACRO {tods} {"ACM Transactions on Database Systems"}
+
+MACRO {tog} {"ACM Transactions on Graphics"}
+
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+
+MACRO {tcs} {"Theoretical Computer Science"}
+
+READ
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 =
+ { s #1 "{vv }{ll}" format.name$ }
+ { numnames #2 =
+ { s #1 "{vv }{ll }and " format.name$ s #2 "{vv }{ll}" format.name$ * }
+ { s #1 "{vv }{ll }" format.name$ "et~al." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+ { cite$ #1 #3 substring$ }
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ if$
+ }
+ { key }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+ { cite$ #1 #3 substring$ }
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ if$
+ }
+ { key }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.organization.label
+ { type$ "manual" =
+ 'author.key.organization.label
+ 'author.key.label
+ if$
+ }
+ if$
+ }
+ if$
+ duplicate$
+ year empty$
+ 'skip$
+ { ", " * }
+ if$
+ year field.or.null purify$ * % CHANGED - pfps - 15 Feb 1989
+ 'label :=
+ year field.or.null purify$
+ str.to.int #9999 swap$ - int.to.str$
+ * sortify 'sort.label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$
+ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
+ nameptr numnames = t "others" = and
+ { "et al." * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.organization.sort}
+{ author empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need author, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {editor.organization.sort}
+{ editor empty$
+ { organization empty$
+ { key empty$
+ { "to sort, need editor, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { "The " #4 organization chop.word sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION {presort}
+{ calc.label
+ sort.label
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+ *
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT
+
+STRINGS { longest.label last.sort.label next.extra }
+
+INTEGERS { longest.label.width last.extra.num }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #0 int.to.chr$ 'last.sort.label :=
+ "" 'next.extra :=
+ #0 'longest.label.width :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION {forward.pass}
+{ last.sort.label sort.label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ sort.label 'last.sort.label :=
+ }
+ if$
+}
+
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ label extra.label * 'label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {begin.bib}
+{
+ "# label-style: default" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/Carpet/CarpetWeb/publications/html-u.bst b/Carpet/CarpetWeb/publications/html-u.bst
new file mode 100644
index 000000000..59934c81b
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/html-u.bst
@@ -0,0 +1,1043 @@
+ % $Id: html-btxbst.doc 1.4 2005/09/04 13:27:21 dds Exp $
+ %
+ % This file is either "html-btxbst.doc" or was derived from
+ % "html-btxbst.doc" using cpp. "html-btxbst.doc" itself was edited
+ % from "btxbst.doc" and "named.bst".
+ % The following copyright information is from btxbst.doc:
+ % version 0.99b for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1985, all rights reserved.
+ % Copying of this file is authorized only if either
+ % (1) you make absolutely no changes to your copy, including name, or
+ % (2) if you do make changes, you name it something other than
+ % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file btxbst.doc has the documentation for this style.
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ dvi
+ html
+ keywords
+ pdf
+ postscript
+ url
+ doi
+ mailto
+ }
+ {}
+ { label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ author empty$
+ { editor empty$
+ { organization empty$
+ 'skip$
+ { "<!-- Authors: " organization purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " editor purify$ * " -->" * write$ newline$ }
+ if$
+ }
+ { "<!-- Authors: " author purify$ * " -->" * write$ newline$ }
+ if$
+ keywords empty$
+ 'skip$
+ { "<!-- Keywords: " keywords * " -->" * write$ newline$ }
+ if$
+ "<dt><a name=" quote$ * cite$ * quote$ * ">[" * label * "]</a></dt><dd>" * write$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ postscript empty$
+ 'skip$
+ { newline$ "<!-- PostScript: " postscript * " -->" * write$ }
+ if$
+ pdf empty$
+ 'skip$
+ { newline$ "<!-- PDF: " pdf * " -->" * write$ }
+ if$
+ dvi empty$
+ 'skip$
+ { newline$ "<!-- DVI: " dvi * " -->" * write$ }
+ if$
+ doi empty$
+ 'skip$
+ { newline$ "<!-- DOI: " doi * " -->" * write$ }
+ if$
+ "</dd>" write$
+ newline$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {str.to.int}
+{
+ 's :=
+ #0
+ { s empty$ not }
+ { % Multiply the number on the top of the stack by 10 = 1010 binary
+ duplicate$ + % x2
+ duplicate$ % x2 x2
+ duplicate$ + duplicate$ + % x2 x8
+ +
+ s #1 #1 substring$ chr.to.int$ #48 - + % #48 is ascii for '0'
+ s #2 global.max$ substring$ 's :=
+ }
+ while$
+}
+
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "<cite>" swap$ * "</cite>" * }
+ if$
+}
+
+FUNCTION {add.link} % title
+{
+ 't :=
+ t empty$
+ { "" }
+ { url empty$
+ { html empty$
+ { t }
+ { "<a href=" quote$ * html * quote$ * ">" * t * "</a>" * }
+ if$ }
+ { "<a href=" quote$ * url * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {add.mailto} % authors
+{
+ 't :=
+ t empty$
+ { "" }
+ { mailto empty$
+ { t }
+ { "<a href=" quote$ * "mailto:" * mailto * quote$ * ">" * t * "</a>" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+ add.mailto
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+ add.link
+}
+
+FUNCTION {n.dashify}
+{ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {format.date}
+{ year empty$
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month " " * year * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ title emphasize
+ add.link
+}
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { "volume" volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { output.state mid.sentence =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ":" * pages n.dashify * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pages
+ { type empty$
+ { "chapter" }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "<cite>" * journal * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "<a href=" * quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { series empty$
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { "<cite>" * series * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ "In <a href=" quote$ * "#" * crossref * quote$ * ">" *
+ editor empty$
+ editor field.or.null author field.or.null =
+ or
+ { key empty$
+ { booktitle empty$
+ { "need editor, key, or booktitle for " cite$ * " to crossref " *
+ crossref * warning$
+ ""
+ }
+ { "<cite>" * booktitle * "</cite>" * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ "</a> \citelabel{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ new.block
+ format.title "title" output.check
+ howpublished address new.block.checkb
+ howpublished output
+ address output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ address empty$
+ { organization publisher new.sentence.checkb
+ organization output
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ organization output
+ publisher output
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ author empty$
+ { organization empty$
+ 'skip$
+ { organization output.nonnull
+ address output
+ }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ { address new.block.checka
+ address output
+ }
+ 'skip$
+ if$
+ }
+ { organization address new.block.checkb
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { publisher new.sentence.checka }
+ { organization publisher new.sentence.checkb
+ organization output
+ }
+ if$
+ publisher output
+ format.date "year" output.check
+ }
+ { address output.nonnull
+ format.date "year" output.check
+ new.sentence
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ format.date output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+
+MACRO {acmcs} {"ACM Computing Surveys"}
+
+MACRO {acta} {"Acta Informatica"}
+
+MACRO {cacm} {"Communications of the ACM"}
+
+MACRO {ibmjrd} {"IBM Journal of Research and Development"}
+
+MACRO {ibmsj} {"IBM Systems Journal"}
+
+MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
+
+MACRO {ieeetc} {"IEEE Transactions on Computers"}
+
+MACRO {ieeetcad}
+ {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+
+MACRO {ipl} {"Information Processing Letters"}
+
+MACRO {jacm} {"Journal of the ACM"}
+
+MACRO {jcss} {"Journal of Computer and System Sciences"}
+
+MACRO {scp} {"Science of Computer Programming"}
+
+MACRO {sicomp} {"SIAM Journal on Computing"}
+
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+
+MACRO {tods} {"ACM Transactions on Database Systems"}
+
+MACRO {tog} {"ACM Transactions on Graphics"}
+
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+
+MACRO {tcs} {"Theoretical Computer Science"}
+
+READ
+
+STRINGS { longest.label }
+
+INTEGERS { number.label longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #1 'number.label :=
+ #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ number.label int.to.str$ 'label :=
+ number.label #1 + 'number.label :=
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+FUNCTION {begin.bib}
+{
+ "# label-style: numbered" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/Carpet/CarpetWeb/publications/old/background.tex b/Carpet/CarpetWeb/publications/old/background.tex
new file mode 100644
index 000000000..764c6fb52
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/old/background.tex
@@ -0,0 +1,18 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+\nocite{Carpet-Goodale2002a}
+\nocite{Carpet-Schnetter2003a}
+\nocite{Carpet-cactusweb}
+\nocite{Carpet-carpetweb}
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{publications}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/old/refereed.tex b/Carpet/CarpetWeb/publications/old/refereed.tex
new file mode 100644
index 000000000..dbcee5757
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/old/refereed.tex
@@ -0,0 +1,78 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+% Refereed publications are sorted by their "received" date
+
+% 2003
+\nocite{Carpet-Schnetter2003a} % 2003-10-07
+
+% 2004
+\nocite{Carpet-Baiotti2004a} % 2004-10-12
+
+% 2005
+\nocite{Carpet-Zink2005a} % 2005-02-11
+\nocite{Carpet-Sperhake2005a} % 2005-03-16
+\nocite{Carpet-Diener2005a} % 2005-12-21
+\nocite{Carpet-Diener2005b} % 2005-12-22
+
+% 2006
+\nocite{Carpet-Schnetter2006a}
+\nocite{Carpet-Sopuerta2006a}
+\nocite{Carpet-Schnetter2006b}
+\nocite{Carpet-Loeffler2006a}
+\nocite{Carpet-Sperhake2006a}
+\nocite{Carpet-Dorband2006a}
+\nocite{Carpet-Baiotti2006a}
+\nocite{Carpet-Ott2006a}
+\nocite{Carpet-Reisswig2006a}
+\nocite{Carpet-Bruegmann2006a}
+\nocite{Carpet-Zink2006a}
+\nocite{Carpet-Ott2006b}
+\nocite{Carpet-Baiotti2006b}
+\nocite{Carept-Pazos2006a}
+\nocite{Carpet-Szilagyi2006a}
+\nocite{Carpet-Baker2006a}
+
+% 2007
+\nocite{Carpet-Herrmann2007a}
+\nocite{Carpet-Giacomazzo2007a}
+\nocite{Carpet-Marronetti2007a}
+\nocite{Carpet-Herrmann2007b}
+\nocite{Carpet-Koppitz2007a}
+\nocite{Carpet-Campanelli2007a}
+\nocite{Carpet-Gonzalez2007a}
+\nocite{Carpet-Campanelli2007b}
+\nocite{Carpet-Thornburg2007a}
+\nocite{Carpet-Ajith2007a}
+\nocite{Carpet-Vaishnav2007a}
+\nocite{Carpet-Herrmann2007c}
+\nocite{Carpet-Krishnan2007a}
+\nocite{Carpet-Brown2007a} % 2007-07-20
+\nocite{Carpet-Bruegmann2007a} % 2007-08-07
+\nocite{Carpet-Rezzolla2007a} % 2007-08-29
+\nocite{Carpet-Lousto2007a} % 2007-08-30
+\nocite{Carpet-Pollney207a} % 2007-09-06
+\nocite{CarpetResult-Buonanno2007a} % 2007-09-25
+\nocite{Carpet-Campanelli2007c} % 2007-10-03
+\nocite{Carpet-Ajith2007b} % 2007-10-15
+\nocite{Carpet-Rezzolla2007b}
+\nocite{CarpetResult-Boyle2007a}
+\nocite{Carpet-Berti2007a}
+\nocite{Carpet-Zink2007a}
+\nocite{Carpet-Shoemaker2007a}
+
+% 2008
+\nocite{CarpetResult-Benger2007a}
+
+
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{publications}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/old/reports.tex b/Carpet/CarpetWeb/publications/old/reports.tex
new file mode 100644
index 000000000..43efe7f70
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/old/reports.tex
@@ -0,0 +1,39 @@
+\documentclass{revtex4}
+
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[latin9]{inputenc}
+\usepackage{mathpazo}
+
+\begin{document}
+
+% Preprints are sorted by their date
+
+% 2005
+\nocite{Carpet-Zink2005b} % 2005-12-15
+
+% 2006
+\nocite{Carpet-Zink2006c} % 2006-06-29
+\nocite{Carpet-Sperhake2006b} % 2006-07-23
+\nocite{Carpet-Zink2006b} % 2006-07-23
+\nocite{Carpet-Baiotti2006c} % 2006-09-04
+\nocite{Carpet-Sperhake2006c} % 2006-09-04
+\nocite{CarpetResult-Font2006a} % 2006-09-04
+
+% 2007
+\nocite{CarpetResult-Baker2007a} % 2007-04-23
+\nocite{Carpet-Schnetter2007a} % 2007-07-11 (book chapter)
+\nocite{Carpet-Stark2007a} % 2007-09-09
+
+% 2008
+
+% 2009
+\nocite{CarpetResult-Hannam2008a} % 2009-01-20
+\nocite{CarpetResult-Nakano2008a} % 2009-01-24
+
+
+
+\bibliographystyle{apsrev-titles-manyauthors}
+\bibliography{publications}
+
+\end{document}
diff --git a/Carpet/CarpetWeb/publications/publications.html b/Carpet/CarpetWeb/publications/publications.html
new file mode 100644
index 000000000..6e9a9e2aa
--- /dev/null
+++ b/Carpet/CarpetWeb/publications/publications.html
@@ -0,0 +1,1251 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Publications using Carpet</title>
+ </head>
+
+ <body>
+
+ <h1 align="center">Publications using Carpet</h1>
+
+ <h2>How to cite Carpet</h2>
+
+ <p>
+ Thank you for using Carpet. When you write a publication using
+ data produced with the help of Cactus or Carpet, consider citing
+ the following if appropriate:
+ </p>
+
+<!-- BEGIN BIBLIOGRAPHY citations-background -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-background.aux publications.html -->
+<ol class="bib2xhtml">
+
+<!-- Authors: Tom Goodale and Gabrielle Allen and Gerd Lanfermann and Joan
+ Masso and Thomas Radke and Edward Seidel and John Shalf -->
+<li><a name="carpet-goodale2002a">Tom</a> Goodale, Gabrielle Allen,
+ Gerd Lanfermann, Joan Massó, Thomas Radke, Edward Seidel, and John Shalf.
+<a href="http://edoc.mpg.de/3341">The Cactus framework and toolkit: Design
+ and applications</a>.
+In <cite>Vector and Parallel Processing – VECPAR'2002, 5th International
+ Conference, Lecture Notes in Computer Science</cite>, Berlin, 2003.
+ Springer.</li>
+
+<!-- Authors: Erik Schnetter and Peter Diener and Ernst Nils Dorband and Manuel
+ Tiglio -->
+<li><a name="carpet-schnetter2006a">Erik</a> Schnetter, Peter
+ Diener, Ernst Nils Dorband, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/gr-qc/0602104">A multi-block infrastructure for
+ three-dimensional time-dependent numerical relativity</a>.
+<cite>Class. Quantum Grav.</cite>, 23:S553–S578, 2006.
+(<a href="http://dx.doi.org/10.1088/0264-9381/23/16/S14">doi:10.1088/0264-9381/23/16/S14</a>)</li>
+
+<!-- Authors: Erik Schnetter and Scott H Hawley and Ian Hawke -->
+<li><a name="carpet-schnetter2003a">Erik</a> Schnetter, Scott H.
+ Hawley, and Ian Hawke.
+<a href="http://arxiv.org/abs/gr-qc/0310042">Evolutions in 3d numerical
+ relativity using fixed mesh refinement</a>.
+<cite>Class. Quantum Grav.</cite>, 21:1465–1488, 2004.
+(<a href="http://dx.doi.org/10.1088/0264-9381/21/6/014">doi:10.1088/0264-9381/21/6/014</a>)</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-background -->
+<!-- BEGIN BIBLIOGRAPHY citations-webpage -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-webpage.aux publications.html -->
+<ol class="bib2xhtml">
+
+<li><a name="carpet-carpetweb"
+ href="http://www.carpetcode.org/">Mesh refinement with Carpet</a>.</li>
+
+<li><a name="carpet-cactusweb"
+ href="http://www.cactuscode.org/">Cactus Computational
+ Toolkit</a>.</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-webpage -->
+ <p>
+ <a href="http://www.citebase.org/">Citebase</a> collects
+ statistics about citations
+ of <a href="http:www.arXiv.org/">arXiv.org</a> eprints. Its
+ entry for the
+ original <a href="http://www.citebase.org/abstract?id=oai%3AarXiv.org%3Agr-qc%2F0310042">Carpet
+ paper</a> lists other eprints which refer to it or are co-cited
+ with it.
+ </p>
+
+ <p>
+ Please tell us if you have written a publication or a thesis
+ using Carpet. This list of publications is also available
+ as <a href="carpet-publications.pdf">pdf</a>
+ or <a href="carpet-publications.bib">bibtex file</a>.
+ </p>
+
+ <hr />
+
+ <h2>Publications in refereed journals</h2>
+
+<!-- BEGIN BIBLIOGRAPHY citations-refereed -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-refereed.aux publications.html -->
+<ol class="bib2xhtml">
+
+<!-- Authors: Benjamin Aylott and John G Baker and William D Boggs and Michael
+ Boyle and Patrick R Brady and Duncan A Brown and Bernd Brugmann and Luisa T
+ Buchman and Alessandra Buonanno and Laura Cadonati and Jordan Camp and
+ Manuela Campanelli and Joan Centrella and Shourov Chatterji and Nelson
+ Christensen and Tony Chu and Peter Diener and Nils Dorband and Zachariah B
+ Etienne and Joshua Faber and Stephen Fairhurst and Benjamin Farr and
+ Sebastian Fischetti and Gianluca Guidi and Lisa M Goggin and Mark Hannam and
+ Frank Herrmann and Ian Hinder and Sascha Husa and Vicky Kalogera and Drew
+ Keppel and Lawrence E Kidder and Bernard J Kelly and Badri Krishnan and Pablo
+ Laguna and Carlos O Lousto and Ilya Mandel and Pedro Marronetti and Richard
+ Matzner and Sean T McWilliams and Keith D Matthews and R Adam Mercer and
+ Satyanarayan R P Mohapatra and Abdul H Mroue and Hiroyuki Nakano and Evan
+ Ochsner and Yi Pan and Larne Pekowsky and Harald P Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian Reisswig and Luciano
+ Rezzolla and Oliver Rinne and Craig Robinson and Christian Rover and Lucia
+ Santamaria and Bangalore Sathyaprakash and Mark A Scheel and Erik Schnetter
+ and Jennifer Seiler and Stuart L Shapiro and Deirdre Shoemaker and Ulrich
+ Sperhake and Alexander Stroeer and Riccardo Sturani and Wolfgang Tichy and
+ Yuk Tung Liu and Marc van der Sluys and James R van Meter and Ruslan Vaulin
+ and Alberto Vecchio and John Veitch and Andrea Vicere and John T Whelan and
+ Yosef Zlochower -->
+<li><a name="carpet-cadonati2009a">Benjamin</a> Aylott, John G.
+ Baker, William D. Boggs, Michael Boyle, Patrick R. Brady, Duncan A. Brown,
+ Bernd Brügmann, Luisa T. Buchman, Alessandra Buonanno, Laura Cadonati,
+ Jordan Camp, Manuela Campanelli, Joan Centrella, Shourov Chatterji, Nelson
+ Christensen, Tony Chu, Peter Diener, Nils Dorband, Zachariah B. Etienne,
+ Joshua Faber, Stephen Fairhurst, Benjamin Farr, Sebastian Fischetti, Gianluca
+ Guidi, Lisa M. Goggin, Mark Hannam, Frank Herrmann, Ian Hinder, Sascha Husa,
+ Vicky Kalogera, Drew Keppel, Lawrence E. Kidder, Bernard J. Kelly, Badri
+ Krishnan, Pablo Laguna, Carlos O. Lousto, Ilya Mandel, Pedro Marronetti,
+ Richard Matzner, Sean T. McWilliams, Keith D. Matthews, R. Adam Mercer,
+ Satyanarayan R. P. Mohapatra, Abdul H. Mroué, Hiroyuki Nakano, Evan
+ Ochsner, Yi Pan, Larne Pekowsky, Harald P. Pfeiffer, Denis Pollney, Frans
+ Pretorius, Vivien Raymond, Christian Reisswig, Luciano Rezzolla, Oliver
+ Rinne, Craig Robinson, Christian Röver, Lucía Santamaría,
+ Bangalore Sathyaprakash, Mark A. Scheel, Erik Schnetter, Jennifer Seiler,
+ Stuart L. Shapiro, Deirdre Shoemaker, Ulrich Sperhake, Alexander Stroeer,
+ Riccardo Sturani, Wolfgang Tichy, Yuk Tung Liu, Marc van der Sluys, James R.
+ van Meter, Ruslan Vaulin, Alberto Vecchio, John Veitch, Andrea Viceré,
+ John T. Whelan, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0905.4227">Status of NINJA: the Numerical
+ INJection Analysis project</a>.
+<cite>Class. Quantum Grav.</cite>, 26:114008, 2009.
+(<a href="http://dx.doi.org/10.1088/0264-9381/26/11/114008">doi:10.1088/0264-9381/26/11/114008</a>)</li>
+
+<!-- Authors: Luca Baiotti and Bruno Giacomazzo and Luciano Rezzolla -->
+<li><a name="carpet-baiotti2009a">Luca</a> Baiotti, Bruno
+ Giacomazzo, and Luciano Rezzolla.
+<a href="http://arxiv.org/abs/0901.4955">Accurate evolutions of inspiralling
+ neutron-star binaries: assessment of the truncation error</a>.
+<cite>Class. Quantum Grav.</cite>, 26:114005, 2009.
+(<a href="http://dx.doi.org/10.1088/0264-9381/26/11/114005">doi:10.1088/0264-9381/26/11/114005</a>)</li>
+
+<!-- Authors: Benjamin Aylott and John G Baker and William D Boggs and Michael
+ Boyle and Patrick R Brady and Duncan A Brown and Bernd Brugmann and Luisa T
+ Buchman and Alessandra Buonanno and Laura Cadonati and Jordan Camp and
+ Manuela Campanelli and Joan Centrella and Shourov Chatterji and Nelson
+ Christensen and Tony Chu and Peter Diener and Nils Dorband and Zachariah B
+ Etienne and Joshua Faber and Stephen Fairhurst and Benjamin Farr and
+ Sebastian Fischetti and Gianluca Guidi and Lisa M Goggin and Mark Hannam and
+ Frank Herrmann and Ian Hinder and Sascha Husa and Vicky Kalogera and Drew
+ Keppel and Lawrence E Kidder and Bernard J Kelly and Badri Krishnan and Pablo
+ Laguna and Carlos O Lousto and Ilya Mandel and Pedro Marronetti and Richard
+ Matzner and Sean T McWilliams and Keith D Matthews and R Adam Mercer and
+ Satyanarayan R P Mohapatra and Abdul H Mroue and Hiroyuki Nakano and Evan
+ Ochsner and Yi Pan and Larne Pekowsky and Harald P Pfeiffer and Denis Pollney
+ and Frans Pretorius and Vivien Raymond and Christian Reisswig and Luciano
+ Rezzolla and Oliver Rinne and Craig Robinson and Christian Rover and Lucia
+ Santamaria and Bangalore Sathyaprakash and Mark A Scheel and Erik Schnetter
+ and Jennifer Seiler and Stuart L Shapiro and Deirdre Shoemaker and Ulrich
+ Sperhake and Alexander Stroeer and Riccardo Sturani and Wolfgang Tichy and
+ Yuk Tung Liu and Marc van der Sluys and James R van Meter and Ruslan Vaulin
+ and Alberto Vecchio and John Veitch and Andrea Vicere and John T Whelan and
+ Yosef Zlochower -->
+<li><a name="carpet-aylott2009a">Benjamin</a> Aylott, John G.
+ Baker, William D. Boggs, Michael Boyle, Patrick R. Brady, Duncan A. Brown,
+ Bernd Brügmann, Luisa T. Buchman, Alessandra Buonanno, Laura Cadonati,
+ Jordan Camp, Manuela Campanelli, Joan Centrella, Shourov Chatterji, Nelson
+ Christensen, Tony Chu, Peter Diener, Nils Dorband, Zachariah B. Etienne,
+ Joshua Faber, Stephen Fairhurst, Benjamin Farr, Sebastian Fischetti, Gianluca
+ Guidi, Lisa M. Goggin, Mark Hannam, Frank Herrmann, Ian Hinder, Sascha Husa,
+ Vicky Kalogera, Drew Keppel, Lawrence E. Kidder, Bernard J. Kelly, Badri
+ Krishnan, Pablo Laguna, Carlos O. Lousto, Ilya Mandel, Pedro Marronetti,
+ Richard Matzner, Sean T. McWilliams, Keith D. Matthews, R. Adam Mercer,
+ Satyanarayan R. P. Mohapatra, Abdul H. Mroué, Hiroyuki Nakano, Evan
+ Ochsner, Yi Pan, Larne Pekowsky, Harald P. Pfeiffer, Denis Pollney, Frans
+ Pretorius, Vivien Raymond, Christian Reisswig, Luciano Rezzolla, Oliver
+ Rinne, Craig Robinson, Christian Röver, Lucía Santamaría,
+ Bangalore Sathyaprakash, Mark A. Scheel, Erik Schnetter, Jennifer Seiler,
+ Stuart L. Shapiro, Deirdre Shoemaker, Ulrich Sperhake, Alexander Stroeer,
+ Riccardo Sturani, Wolfgang Tichy, Yuk Tung Liu, Marc van der Sluys, James R.
+ van Meter, Ruslan Vaulin, Alberto Vecchio, John Veitch, Andrea Viceré,
+ John T. Whelan, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0901.4399">Testing gravitational-wave searches
+ with numerical relativity waveforms: Results from the first Numerical
+ INJection Analysis (NINJA) project</a>.
+<cite>Class. Quantum Grav.</cite>, 26:165008, 2009.
+(<a href="http://dx.doi.org/10.1088/0264-9381/26/16/165008">doi:10.1088/0264-9381/26/16/165008</a>)</li>
+
+<!-- Authors: Mark Hannam and Sascha Husa and John G Baker and Michael Boyle
+ and Bernd Brugmann and Tony Chu and Nils Dorband and Frank Herrmann and Ian
+ Hinder and Bernard J Kelly and Lawrence E Kidder and Pablo Laguna and Keith D
+ Matthews and James R van Meter and Harald P Pfeiffer and Denis Pollney and
+ Christian Reisswig and Mark A Scheel and Deirdre Shoemaker -->
+<li><a name="carpetresult-hannam2008a">Mark</a> Hannam, Sascha
+ Husa, John G. Baker, Michael Boyle, Bernd Brügmann, Tony Chu, Nils
+ Dorband, Frank Herrmann, Ian Hinder, Bernard J. Kelly, Lawrence E. Kidder,
+ Pablo Laguna, Keith D. Matthews, James R. van Meter, Harald P. Pfeiffer,
+ Denis Pollney, Christian Reisswig, Mark A. Scheel, and Deirdre Shoemaker.
+<a href="http://arxiv.org/abs/0901.2437">The Samurai project: verifying the
+ consistency of black-hole-binary waveforms for gravitational-wave
+ detection</a>.
+<cite>Phys. Rev. D</cite>, 79:084025, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.084025">doi:10.1103/PhysRevD.79.084025</a>)</li>
+
+<!-- Authors: Luciano Rezzolla -->
+<li><a name="carpet-rezzolla2008a">Luciano</a> Rezzolla.
+<a href="http://arxiv.org/abs/0812.2325">Modelling the final state from binary
+ black-hole coalescences</a>.
+<cite>Class. Quantum Grav.</cite>, 26:094023, 2009.
+(<a href="http://dx.doi.org/10.1088/0264-9381/26/9/094023">doi:10.1088/0264-9381/26/9/094023</a>)</li>
+
+<!-- Authors: Zachariah B Etienne and Yuk Tung Liu and Stuart L Shapiro and and
+ Thomas W Baumgarte -->
+<li><a name="carpet-etienne2008a">Zachariah</a> B. Etienne,
+ Yuk Tung Liu, Stuart L. Shapiro, , and Thomas W. Baumgarte.
+<a href="http://arxiv.org/abs/0812.2245">General relativistic simulations of
+ black-hole-neutron-star mergers: Effects of black-hole spin</a>.
+<cite>Phys. Rev. D</cite>, 79:044024, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.044024">doi:10.1103/PhysRevD.79.044024</a>)</li>
+
+<!-- Authors: Manuela Campanelli and Carlos O Lousto and Yosef Zlochower -->
+<li><a name="carpet-campanelli2008b">Manuela</a> Campanelli,
+ Carlos O. Lousto, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0811.3006">Algebraic classification of numerical
+ spacetimes and black-hole-binary remnants</a>.
+<cite>Phys. Rev. D</cite>, 79:084012, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.084012">doi:10.1103/PhysRevD.79.084012</a>)</li>
+
+<!-- Authors: Oleg Korobkin and Burak Aksoylu and Michael Holst and Enrique
+ Pazos and Manuel Tiglio -->
+<li><a name="carpet-korobkin2008a">Oleg</a> Korobkin, Burak
+ Aksoylu, Michael Holst, Enrique Pazos, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/0801.1823">Solving the einstein constraint
+ equations on multi-block triangulations using finite element methods</a>.
+<cite>Class. Quantum Grav.</cite>, 26:145007, 2009.
+(<a href="http://dx.doi.org/10.1088/0264-9381/26/14/145007">doi:10.1088/0264-9381/26/14/145007</a>)</li>
+
+<!-- Authors: David Brown and Peter Diener and Olivier Sarbach and Erik
+ Schnetter and Manuel Tiglio -->
+<li><a name="carpet-brown2007b">David</a> Brown, Peter Diener,
+ Olivier Sarbach, Erik Schnetter, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/0809.3533">Turduckening black holes: an
+ analytical and computational study</a>.
+<cite>Phys. Rev. D</cite>, 79:044023, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.044023">doi:10.1103/PhysRevD.79.044023</a>)</li>
+
+<!-- Authors: Luca Baiotti and Sebastiano Bernuzzi and Giovanni Corvino and
+ Roberto De Pietri and Alessandro Nagar -->
+<li><a name="carpet-baiotti2008b">Luca</a> Baiotti, Sebastiano
+ Bernuzzi, Giovanni Corvino, Roberto De Pietri, and Alessandro Nagar.
+<a href="http://arxiv.org/abs/0808.4002">Gravitational-wave extraction from
+ neutron-star oscillations: Comparing linear and nonlinear techniques</a>.
+<cite>Phys. Rev. D</cite>, 79:024002, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.024002">doi:10.1103/PhysRevD.79.024002</a>)</li>
+
+<!-- Authors: Manuela Campanelli and Carlos O Lousto and Hiroyuki Nakano and
+ Yosef Zlochower -->
+<li><a name="carpet-campanelli2008a">Manuela</a> Campanelli,
+ Carlos O. Lousto, Hiroyuki Nakano, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0808.0713">Comparison of numerical and
+ post-Newtonian waveforms for generic precessing black-hole binaries</a>.
+<cite>Phys. Rev. D</cite>, 79:084010, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.084010">doi:10.1103/PhysRevD.79.084010</a>)</li>
+
+<!-- Authors: James Healy and Frank Herrmann and Ian Hinder and Deirdre M
+ Shoemaker and Pablo Laguna and and Richard A Matzner -->
+<li><a name="carpet-healy2008a">James</a> Healy, Frank Herrmann,
+ Ian Hinder, Deirdre M. Shoemaker, Pablo Laguna, , and Richard A. Matzner.
+<a href="http://arxiv.org/abs/0807.3292">Superkicks in hyperbolic encounters of
+ binary black holes</a>.
+<cite>Phys. Rev. Lett.</cite>, 102:041101, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.102.041101">doi:10.1103/PhysRevLett.102.041101</a>)</li>
+
+<!-- Authors: Ulrich Sperhake and Vitor Cardoso and Frans Pretorius and
+ Emanuele Berti and and Jose A Gonzalez -->
+<li><a name="carpet-sperhake2008a">Ulrich</a> Sperhake, Vitor
+ Cardoso, Frans Pretorius, Emanuele Berti, , and José A. González.
+<a href="http://arxiv.org/abs/0806.1738">High-energy collision of two black
+ holes</a>.
+<cite>Phys. Rev. Lett.</cite>, 101:161101, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.101.161101">doi:10.1103/PhysRevLett.101.161101</a>)</li>
+
+<!-- Authors: Leonardo Gualtieri and Emanuele Berti and Vitor Cardoso and
+ Ulrich Sperhake -->
+<li><a name="carpet-gualtieri2008a">Leonardo</a> Gualtieri,
+ Emanuele Berti, Vitor Cardoso, and Ulrich Sperhake.
+<a href="http://arxiv.org/abs/0805.1017">Transformation of the multipolar
+ components of gravitational radiation under rotations and boosts</a>.
+<cite>Phys. Rev. D</cite>, 78:044024, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.78.044024">doi:10.1103/PhysRevD.78.044024</a>)</li>
+
+<!-- Authors: Carlos O Lousto and Yosef Zlochower -->
+<li><a name="carpet-lousto2008a">Carlos</a> O. Lousto and Yosef
+ Zlochower.
+<a href="http://arxiv.org/abs/0805.0159">Modeling gravitational recoil from
+ precessing highly-spinning unequal-mass black-hole binaries</a>.
+<cite>Phys. Rev. D</cite>, 79:064018, 2009.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.79.064018">doi:10.1103/PhysRevD.79.064018</a>)</li>
+
+<!-- Authors: Werner Benger -->
+<li><a name="carpetresult-benger2007a">Werner</a> Benger.
+<a href="http://www.iop.org/EJ/abstract/1367-2630/10/12/125004">Colliding
+ galaxies, rotating neutron stars and merging black holes – visualizing high
+ dimensional datasets on arbitrary meshes</a>.
+<cite>New J. Phys.</cite>, 10:125004, 2008.
+(<a href="http://dx.doi.org/10.1088/1367-2630/10/12/125004">doi:10.1088/1367-2630/10/12/125004</a>)</li>
+
+<!-- Authors: Luca Baiotti and Bruno Giacomazzo and Luciano Rezzolla -->
+<li><a name="carpet-baiotti2008a">Luca</a> Baiotti, Bruno
+ Giacomazzo, and Luciano Rezzolla.
+<a href="http://arxiv.org/abs/0804.0594">Accurate evolutions of inspiralling
+ neutron-star binaries: Prompt and delayed collapse to a black hole</a>.
+<cite>Phys. Rev. D</cite>, 78:084033, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.78.084033">doi:10.1103/PhysRevD.78.084033</a>)</li>
+
+<!-- Authors: Sergio Dain and Carlos O Lousto and and Yosef Zlochower -->
+<li><a name="carpet-dain2008a">Sergio</a> Dain, Carlos O. Lousto,
+ , and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0803.0351">Extra-large remnant recoil velocities
+ and spins from near-extremal-Bowen-York-spin black-hole binaries</a>.
+<cite>Phys. Rev. D</cite>, 78:024039, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.78.024039">doi:10.1103/PhysRevD.78.024039</a>)</li>
+
+<!-- Authors: Jennifer Seiler and Bela Szilagyi and Denis Pollney and Luciano
+ Rezzolla -->
+<li><a name="carpet-seiler2008a">Jennifer</a> Seiler, Béla
+ Szilágyi, Denis Pollney, and Luciano Rezzolla.
+<a href="http://arxiv.org/abs/0802.3341">Constraint-preserving boundary
+ treatment for a harmonic formulation of the einstein equations</a>.
+<cite>Class. Quantum Grav.</cite>, 25:175020, 2008.
+(<a href="http://dx.doi.org/10.1088/0264-9381/25/17/175020">doi:10.1088/0264-9381/25/17/175020</a>)</li>
+
+<!-- Authors: Matthew C Washik and James Healy and Frank Herrmann and Ian
+ Hinder and Deirdre M Shoemaker and Pablo Laguna and Richard A Matzner -->
+<li><a name="carpet-washik2008a">Matthew</a> C. Washik, James
+ Healy, Frank Herrmann, Ian Hinder, Deirdre M. Shoemaker, Pablo Laguna, and
+ Richard A. Matzner.
+<a href="http://arxiv.org/abs/0802.2520">Binary-black-hole encounters,
+ gravitational bursts, and maximum final spin</a>.
+<cite>Phys. Rev. Lett.</cite>, 101:061102, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.101.061102">doi:10.1103/PhysRevLett.101.061102</a>)</li>
+
+<!-- Authors: Eloisa Bentivegna and Deirdre M Shoemaker and Ian Hinder and and
+ Frank Herrmann -->
+<li><a name="carpet-bentivegna2008a">Eloisa</a> Bentivegna,
+ Deirdre M. Shoemaker, Ian Hinder, , and Frank Herrmann.
+<a href="http://arxiv.org/abs/0801.3478">Probing the binary black hole merger
+ regime with scalar perturbations</a>.
+<cite>Phys. Rev. D</cite>, 77:124016, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.124016">doi:10.1103/PhysRevD.77.124016</a>)</li>
+
+<!-- Authors: Luciano Rezzolla and Enrico Barausse and Ernst Nils Dorband and
+ Denis Pollney and Christian Reisswig and Jennifer Seiler and Sascha Husa -->
+<li><a name="carpet-rezzolla2007c">Luciano</a> Rezzolla, Enrico
+ Barausse, Ernst Nils Dorband, Denis Pollney, Christian Reisswig, Jennifer
+ Seiler, and Sascha Husa.
+<a href="http://arxiv.org/abs/0712.3541">Final spin from the coalescence of two
+ black holes</a>.
+<cite>Phys. Rev. D</cite>, 78:044002, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.78.044002">doi:10.1103/PhysRevD.78.044002</a>)</li>
+
+<!-- Authors: Thibault Damour and Alessandro Nagar and Ernst Nils Dorband and
+ Denis Pollney and Luciano Rezzolla -->
+<li><a name="carpet-damour2007a">Thibault</a> Damour, Alessandro
+ Nagar, Ernst Nils Dorband, Denis Pollney, and Luciano Rezzolla.
+<a href="http://arxiv.org/abs/0712.3003">Faithful effective-one-body waveforms
+ of equal-mass coalescing black-hole binaries</a>.
+<cite>Phys. Rev. D</cite>, 77:084017, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.084017">doi:10.1103/PhysRevD.77.084017</a>)</li>
+
+<!-- Authors: Deirdre M Shoemaker and Birjoo Vaishnav and Ian Hinder and Frank
+ Herrmann -->
+<li><a name="carpet-shoemaker2007a">Deirdre</a> M. Shoemaker,
+ Birjoo Vaishnav, Ian Hinder, and Frank Herrmann.
+<a href="http://arxiv.org/abs/0802.4427">Numerical relativity meets data
+ analysis: spinning binary black hole case</a>.
+<cite>Class. Quantum Grav.</cite>, 25:114047, 2008.
+(<a href="http://dx.doi.org/10.1088/0264-9381/25/11/114047">doi:10.1088/0264-9381/25/11/114047</a>)</li>
+
+<!-- Authors: Burkhard Zink and Erik Schnetter and Manuel Tiglio -->
+<li><a name="carpet-zink2007a">Burkhard</a> Zink, Erik Schnetter,
+ and Manuel Tiglio.
+<a href="http://arxiv.org/abs/0712.0353">Multi-patch methods in general
+ relativistic astrophysics - I. Hydrodynamical flows on fixed
+ backgrounds</a>.
+<cite>Phys. Rev. D</cite>, 77:103015, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.103015">doi:10.1103/PhysRevD.77.103015</a>)</li>
+
+<!-- Authors: Emanuele Berti and Vitor Cardoso and Jose A Gonzalez and Ulrich
+ Sperhake and Bernd Brugmann -->
+<li><a name="carpet-berti2007a">Emanuele</a> Berti, Vitor Cardoso,
+ José A. González, Ulrich Sperhake, and Bernd Brügmann.
+<a href="http://arxiv.org/abs/0711.1097">Multipolar analysis of spinning
+ binaries</a>.
+<cite>Class. Quantum Grav.</cite>, 25:114035, 2008.
+(<a href="http://dx.doi.org/10.1088/0264-9381/25/11/114035">doi:10.1088/0264-9381/25/11/114035</a>)</li>
+
+<!-- Authors: Tanja Bode and Deirdre Shoemaker and Frank Herrmann and Ian
+ Hinder -->
+<li><a name="carpet-bode2007a">Tanja</a> Bode, Deirdre Shoemaker,
+ Frank Herrmann, and Ian Hinder.
+<a href="http://arxiv.org/abs/0711.0669">Robustness of binary black hole
+ mergers in the presence of spurious radiation</a>.
+<cite>Phys. Rev. D</cite>, 78:044027, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.044027">doi:10.1103/PhysRevD.77.044027</a>)</li>
+
+<!-- Authors: Ian Hinder and Birjoo Vaishnav and Frank Herrmann and Deirdre M
+ Shoemaker and Pablo Laguna -->
+<li><a name="carpet-hinder2007a">Ian</a> Hinder, Birjoo Vaishnav,
+ Frank Herrmann, Deirdre M. Shoemaker, and Pablo Laguna.
+<a href="http://arxiv.org/abs/0710.5167">Circularization and final spin in
+ eccentric binary black hole inspirals</a>.
+<cite>Phys. Rev. D</cite>, 77:081502(R), 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.081502">doi:10.1103/PhysRevD.77.081502</a>)</li>
+
+<!-- Authors: Latham Boyle and Michael Kesden and Samaya Nissanke -->
+<li><a name="carpetresult-boyle2007a">Latham</a> Boyle, Michael
+ Kesden, and Samaya Nissanke.
+<a href="http://arxiv.org/abs/0709.0299">Binary black hole merger: symmetry and
+ the spin expansion</a>.
+<cite>Phys. Rev. Lett.</cite>, 100:151101, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.100.151101">doi:10.1103/PhysRevLett.100.151101</a>)</li>
+
+<!-- Authors: Ulrich Sperhake and Emanuele Berti and Vitor Cardoso and Jose A
+ Gonzalez and Bernd Brugmann and Marcus Ansorg -->
+<li><a name="carpet-sperhake2007a">Ulrich</a> Sperhake, Emanuele
+ Berti, Vitor Cardoso, José A. González, Bernd Brügmann, and
+ Marcus Ansorg.
+<a href="http://arxiv.org/abs/0710.3823">Eccentric binary black-hole mergers:
+ The transition from inspiral to plunge in general relativity</a>.
+<cite>Phys. Rev. D</cite>, 78:064069, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.78.064069">doi:10.1103/PhysRevD.78.064069</a>)</li>
+
+<!-- Authors: Luciano Rezzolla and Peter Diener and Ernst Nils Dorband and
+ Denis Pollney and Christian Reisswig and Erik Schnetter and Jennifer Seiler
+ -->
+<li><a name="carpet-rezzolla2007b">Luciano</a> Rezzolla, Peter
+ Diener, Ernst Nils Dorband, Denis Pollney, Christian Reisswig, Erik
+ Schnetter, and Jennifer Seiler.
+<a href="http://arxiv.org/abs/0710.3345">The final spin from the coalescence of
+ aligned-spin black-hole binaries</a>.
+<cite>Astrophys. J. Lett.</cite>, 674:L29–L32, 2008.
+(<a href="http://dx.doi.org/10.1086/528935">doi:10.1086/528935</a>)</li>
+
+<!-- Authors: Parameswaran Ajith and Stanislav Babak and Yanbei Chen and Martin
+ Hewitson and Badri Krishnan and Alicia M Sintes and John T Whelan and Bernd
+ Brugmann and Peter Diener and Ernst Nils Dorband and Jose Gonzalez and Mark
+ Hannam and Sascha Husa and Denis Pollney and Luciano Rezzolla and Lucia
+ Santamaria and Ulrich Sperhake and Jonathan Thornburg -->
+<li><a name="carpet-ajith2007b">Parameswaran</a> Ajith, Stanislav
+ Babak, Yanbei Chen, Martin Hewitson, Badri Krishnan, Alicia M. Sintes,
+ John T. Whelan, Bernd Brügmann, Peter Diener, Ernst Nils Dorband,
+ José González, Mark Hannam, Sascha Husa, Denis Pollney, Luciano
+ Rezzolla, Lucía Santamaría, Ulrich Sperhake, and Jonathan Thornburg.
+<a href="http://arxiv.org/abs/0710.2335">A template bank for gravitational
+ waveforms from coalescing binary black holes: I. non-spinning binaries</a>.
+<cite>Phys. Rev. D</cite>, 77:104017, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.104017">doi:10.1103/PhysRevD.77.104017</a>)</li>
+
+<!-- Authors: Manuela Campanelli and Carlos O Lousto and Yosef Zlochower -->
+<li><a name="carpet-campanelli2007c">Manuela</a> Campanelli,
+ Carlos O. Lousto, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0710.0879">Close encounters of three black
+ holes</a>.
+<cite>Phys. Rev. D</cite>, 77:101501(5), 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.101501">doi:10.1103/PhysRevD.77.101501</a>)</li>
+
+<!-- Authors: Alessandra Buonanno and Lawrence E Kidder and Luis Lehner -->
+<li><a name="carpetresult-buonanno2007a">Alessandra</a> Buonanno,
+ Lawrence E. Kidder, and Luis Lehner.
+<a href="http://arxiv.org/abs/0709.3839">Estimating the final spin of a binary
+ black hole coalescence</a>.
+<cite>Phys. Rev. D</cite>, 77:026004, 2008.</li>
+
+<!-- Authors: Dylan Stark and Gabrielle Allen and Tom Goodale and Thomas Radke
+ and Erik Schnetter -->
+<li><a name="carpet-stark2007a">Dylan</a> Stark, Gabrielle Allen,
+ Tom Goodale, Thomas Radke, and Erik Schnetter.
+<a href="http://arxiv.org/abs/0705.3015">An extensible timing infrastructure
+ for adaptive large-scale applications</a>.
+In Roman Wyrzykowski, editor, <cite>Parallel Processing and Applied
+ Mathematics</cite>, volume 4967 of <cite>Lecture Notes in Computer
+ Science</cite>, pages 1170–1179. Springer, 2008.
+(<a href="http://dx.doi.org/10.1007/978-3-540-68111-3">doi:10.1007/978-3-540-68111-3</a>)</li>
+
+<!-- Authors: Denis Pollney and Christian Reisswig and Luciano Rezzolla and
+ Bela Szilagyi and Marcus Ansorg and Barrett Deris and Peter Diener and Ernst
+ Nils Dorband and Michael Koppitz and Alessandro Nagar and Erik Schnetter -->
+<li><a name="carpet-pollney207a">Denis</a> Pollney, Christian
+ Reisswig, Luciano Rezzolla, Béla Szilágyi, Marcus Ansorg, Barrett
+ Deris, Peter Diener, Ernst Nils Dorband, Michael Koppitz, Alessandro Nagar,
+ and Erik Schnetter.
+<a href="http://arxiv.org/abs/0707.2559">Recoil velocities from equal-mass
+ binary black-hole mergers: a systematic investigation of spin-orbit aligned
+ configurations</a>.
+<cite>Phys. Rev. D</cite>, 76:124002, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.124002">doi:10.1103/PhysRevD.76.124002</a>)</li>
+
+<!-- Authors: Carlos O Lousto and Yosef Zlochower -->
+<li><a name="carpet-lousto2007a">Carlos</a> O. Lousto and Yosef
+ Zlochower.
+<a href="http://arxiv.org/abs/0708.4048">Further insight into gravitational
+ recoil</a>.
+<cite>Phys. Rev. D</cite>, 77:044028, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.044028">doi:10.1103/PhysRevD.77.044028</a>)</li>
+
+<!-- Authors: Luciano Rezzolla and Ernst Nils Dorband and Christian Reisswig
+ and Peter Diener and Denis Pollney and Erik Schnetter and Bela Szilsgyi -->
+<li><a name="carpet-rezzolla2007a">Luciano</a> Rezzolla,
+ Ernst Nils Dorband, Christian Reisswig, Peter Diener, Denis Pollney, Erik
+ Schnetter, and Béla Szilśgyi.
+<a href="http://arxiv.org/abs/0708.3999">Spin diagrams for equal-mass
+ black-hole binaries with aligned spins</a>.
+<cite>Astrophys. J.</cite>, 679:1422–1426, 2008.
+(<a href="http://dx.doi.org/10.1086/587679">doi:10.1086/587679</a>)</li>
+
+<!-- Authors: Bernd Brugmann and Jose A Gonzalez and Mark Hannam and Sascha
+ Husa and Ulrich Sperhake -->
+<li><a name="carpet-bruegmann2007a">Bernd</a> Brügmann,
+ José A. González, Mark Hannam, Sascha Husa, and Ulrich Sperhake.
+<a href="http://arxiv.org/abs/0707.0135">Exploring black hole superkicks</a>.
+<cite>Phys. Rev. D</cite>, 77:124047, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.124047">doi:10.1103/PhysRevD.77.124047</a>)</li>
+
+<!-- Authors: David Brown and Olivier Sarbach and Erik Schnetter and Manuel
+ Tiglio and Peter Diener and Ian Hawke and Denis Pollney -->
+<li><a name="carpet-brown2007a">David</a> Brown, Olivier Sarbach,
+ Erik Schnetter, Manuel Tiglio, Peter Diener, Ian Hawke, and Denis Pollney.
+<a href="http://arxiv.org/abs/0707.3101">Excision without excision</a>.
+<cite>Phys. Rev. D</cite>, 76:081503(R), 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.081503">doi:10.1103/PhysRevD.76.081503</a>)</li>
+
+<!-- Authors: Badri Krishnan and Carlos O Lousto and Yosef Zlochower -->
+<li><a name="carpet-krishnan2007a">Badri</a> Krishnan, Carlos O.
+ Lousto, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0707.0876">Quasi-local linear momentum in
+ black-hole binaries</a>.
+<cite>Phys. Rev. D</cite>, 76:081501(R), 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.081501">doi:10.1103/PhysRevD.76.081501</a>)</li>
+
+<!-- Authors: Frank Herrmann and Ian Hinder and Deirdre M Shoemaker and Pablo
+ Laguna and Richard A Matzner -->
+<li><a name="carpet-herrmann2007c">Frank</a> Herrmann, Ian Hinder,
+ Deirdre M. Shoemaker, Pablo Laguna, and Richard A. Matzner.
+<a href="http://arxiv.org/abs/0706.2541">Binary black holes: Spin dynamics and
+ gravitational recoil</a>.
+<cite>Phys. Rev. D</cite>, 76:084032, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.084032">doi:10.1103/PhysRevD.76.084032</a>)</li>
+
+<!-- Authors: Birjoo Vaishnav and Ian Hinder and Frank Herrmann and Deirdre M
+ Shoemaker -->
+<li><a name="carpet-vaishnav2007a">Birjoo</a> Vaishnav, Ian
+ Hinder, Frank Herrmann, and Deirdre M. Shoemaker.
+<a href="http://arxiv.org/abs/0705.3829">Matched filtering of numerical
+ relativity templates of spinning binary black holes</a>.
+<cite>Phys. Rev. D</cite>, 76:084020, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.084020">doi:10.1103/PhysRevD.76.084020</a>)</li>
+
+<!-- Authors: Parameswaran Ajith and Stanislav Babak and Yanbei Chen and Martin
+ Hewitson and Badri Krishnan and John T Whelan and Bernd Brugmann and Peter
+ Diener and Jose González and Mark Hannam and Sascha Husa and Michael Koppitz
+ and Denis Pollney and Luciano Rezzolla and Lucia Santamaria and Alicia M
+ Sintes and Ulrich Sperhake and Jonathan Thornburg -->
+<li><a name="carpet-ajith2007a">Parameswaran</a> Ajith, Stanislav
+ Babak, Yanbei Chen, Martin Hewitson, Badri Krishnan, John T. Whelan, Bernd
+ Brügmann, Peter Diener, José González, Mark Hannam, Sascha Husa,
+ Michael Koppitz, Denis Pollney, Luciano Rezzolla, Lucía Santamaría,
+ Alicia M. Sintes, Ulrich Sperhake, and Jonathan Thornburg.
+<a href="http://arxiv.org/abs/0704.3764">Phenomenological template family for
+ black-hole coalescence waveforms</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S689–S699, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/19/S31">doi:10.1088/0264-9381/24/19/S31</a>)</li>
+
+<!-- Authors: Jonathan Thornburg and Peter Diener and Denis Pollney and Luciano
+ Rezzolla and Erik Schnetter and Ed Seidel and Ryoji Takahashi -->
+<li><a name="carpet-thornburg2007a">Jonathan</a> Thornburg, Peter
+ Diener, Denis Pollney, Luciano Rezzolla, Erik Schnetter, Ed Seidel, and Ryoji
+ Takahashi.
+<a href="http://arxiv.org/abs/gr-qc/0701038">Are moving punctures equivalent to
+ moving black holes?</a>.
+<cite>Class. Quantum Grav.</cite>, 24:3911–3918, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/15/009">doi:10.1088/0264-9381/24/15/009</a>)</li>
+
+<!-- Authors: Jose A Gonzalez and Mark D Hannam and Ulrich Sperhake and Bernd
+ Brugmann and Sascha Husa -->
+<li><a name="carpet-gonzalez2007a">Jos</a>é A. González,
+ Mark D. Hannam, Ulrich Sperhake, Bernd Brügmann, and Sascha Husa.
+<a href="http://arxiv.org/abs/gr-qc/0702052">Supermassive recoil velocities for
+ binary black-hole mergers with antialigned spins</a>.
+<cite>Phys. Rev. Lett.</cite>, 98:231101, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.98.231101">doi:10.1103/PhysRevLett.98.231101</a>)</li>
+
+<!-- Authors: Manuela Campanelli and Carlos O Lousto and Yosef Zlochower and
+ David Merritt -->
+<li><a name="carpet-campanelli2007b">Manuela</a> Campanelli,
+ Carlos O. Lousto, Yosef Zlochower, and David Merritt.
+<a href="http://arxiv.org/abs/gr-qc/0702133">Maximum gravitational recoil</a>.
+<cite>Phys. Rev. Lett.</cite>, 98:231102, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.98.231102">doi:10.1103/PhysRevLett.98.231102</a>)</li>
+
+<!-- Authors: Manuela Campanelli and Carlos O Lousto and Yosef Zlochower and
+ David Merritt -->
+<li><a name="carpet-campanelli2007a">Manuela</a> Campanelli,
+ Carlos O. Lousto, Yosef Zlochower, and David Merritt.
+Large merger recoils and spin flips from generic black-hole binaries.
+<cite>Astrophys. J. Lett.</cite>, 659:L5–L8, 2007.
+(<a href="http://dx.doi.org/abs/gr-qc/0701164">doi:abs/gr-qc/0701164</a>)</li>
+
+<!-- Authors: Frank Herrmann and Ian Hinder and Deirdre M Shoemaker and Pablo
+ Laguna and Richard A Matzner -->
+<li><a name="carpet-herrmann2007b">Frank</a> Herrmann, Ian Hinder,
+ Deirdre M. Shoemaker, Pablo Laguna, and Richard A. Matzner.
+<a href="http://arxiv.org/abs/gr-qc/0701143">Gravitational recoil from spinning
+ binary black hole mergers</a>.
+<cite>Astrophys. J.</cite>, 661:430–436, 2007.
+(<a href="http://dx.doi.org/10.1086/513603">doi:10.1086/513603</a>)</li>
+
+<!-- Authors: Michael Koppitz and Denis Pollney and Christian Reisswig and
+ Luciano Rezzolla and Jonathan Thornburg and Peter Diener and Erik Schnetter
+ -->
+<li><a name="carpet-koppitz2007a">Michael</a> Koppitz, Denis
+ Pollney, Christian Reisswig, Luciano Rezzolla, Jonathan Thornburg, Peter
+ Diener, and Erik Schnetter.
+<a href="http://arxiv.org/abs/gr-qc/0701163">Recoil velocities from equal-mass
+ binary-black-hole mergers</a>.
+<cite>Phys. Rev. Lett.</cite>, 99:041102, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.99.041102">doi:10.1103/PhysRevLett.99.041102</a>)</li>
+
+<!-- Authors: Pedro Marronetti and Wolfgang Tichy and Bernd Brugmann and Jose
+ Gonzalez and Mark Hannam and Sascha Husa and Ulrich Sperhake -->
+<li><a name="carpet-marronetti2007a">Pedro</a> Marronetti,
+ Wolfgang Tichy, Bernd Brügmann, José González, Mark Hannam,
+ Sascha Husa, and Ulrich Sperhake.
+<a href="http://arxiv.org/abs/gr-qc/0701123">Binary black holes on a budget:
+ simulations using workstations</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S45–S58, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S05">doi:10.1088/0264-9381/24/12/S05</a>)</li>
+
+<!-- Authors: Bruno Giacomazzo and Luciano Rezzolla -->
+<li><a name="carpet-giacomazzo2007a">Bruno</a> Giacomazzo and
+ Luciano Rezzolla.
+<a href="http://arxiv.org/abs/gr-qc/0701109">WhiskyMHD: a new numerical code
+ for general relativistic magnetohydrodynamics</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S235–S258, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S16">doi:10.1088/0264-9381/24/12/S16</a>)</li>
+
+<!-- Authors: Frank Herrmann and Ian Hinder and Deirdre M Shoemaker and Pablo
+ Laguna -->
+<li><a name="carpet-herrmann2007a">Frank</a> Herrmann, Ian Hinder,
+ Deirdre M. Shoemaker, and Pablo Laguna.
+<a href="http://arxiv.org/abs/gr-qc/0601026">Unequal mass binary black hole
+ plunges and gravitational recoil</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S33–S42, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S04">doi:10.1088/0264-9381/24/12/S04</a>)</li>
+
+<!-- Authors: John G Baker and Manuela Campanelli and Frans Pretorius and Yosef
+ Zlochower -->
+<li><a name="carpet-baker2006a">John</a> G. Baker, Manuela
+ Campanelli, Frans Pretorius, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/gr-qc/0701016">Comparisons of binary black hole
+ merger waveforms</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S25–S31, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S03">doi:10.1088/0264-9381/24/12/S03</a>)</li>
+
+<!-- Authors: Enrique Pazos and Ernst Nils Dorband and Alessandro Nagar and
+ Carlos Palenzuela and Erik Schnetter and Manuel Tiglio -->
+<li><a name="carept-pazos2006a">Enrique</a> Pazos, Ernst Nils
+ Dorband, Alessandro Nagar, Carlos Palenzuela, Erik Schnetter, and Manuel
+ Tiglio.
+<a href="http://arxiv.org/abs/gr-qc/0612149">How far away is far enough for
+ extracting numerical waveforms, and how much do they depend on the extraction
+ method?</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S341–S368, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S22">doi:10.1088/0264-9381/24/12/S22</a>)</li>
+
+<!-- Authors: Bela Szilagyi and Denis Pollney and Luciano Rezzolla and Jonathan
+ Thornburg and Jeffrey Winicour -->
+<li><a name="carpet-szilagyi2006a">B</a>éla Szilágyi,
+ Denis Pollney, Luciano Rezzolla, Jonathan Thornburg, and Jeffrey Winicour.
+<a href="http://arxiv.org/abs/gr-qc/0612150">An explicit harmonic code for
+ black-hole evolution using excision</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S275–S293, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S18">doi:10.1088/0264-9381/24/12/S18</a>)</li>
+
+<!-- Authors: Luca Baiotti and Ian Hawke and Luciano Rezzolla -->
+<li><a name="carpet-baiotti2006b">Luca</a> Baiotti, Ian Hawke, and
+ Luciano Rezzolla.
+<a href="http://arxiv.org/abs/gr-qc/0701043">On the gravitational radiation
+ from the collapse of neutron stars to rotating black holes</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S187–S206, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S13">doi:10.1088/0264-9381/24/12/S13</a>)</li>
+
+<!-- Authors: Christian D Ott and Harald Dimmelmeier and Andreas Marek and Hans
+ Thomas Janka and Burkhard Zink and Ian Hawke and Erik Schnetter -->
+<li><a name="carpet-ott2006b">Christian</a> D. Ott, Harald
+ Dimmelmeier, Andreas Marek, Hans-Thomas Janka, Burkhard Zink, Ian Hawke, and
+ Erik Schnetter.
+<a href="http://arxiv.org/abs/astro-ph/0612638">Rotating collapse of stellar
+ iron cores in general relativity</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S139–S154, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S10">doi:10.1088/0264-9381/24/12/S10</a>)</li>
+
+<!-- Authors: Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D Ott and Erik Schnetter and Ewald Muller -->
+<li><a name="carpet-zink2006a">Burkhard</a> Zink, Nikolaos
+ Stergioulas, Ian Hawke, Christian D. Ott, Erik Schnetter, and Ewald
+ Müller.
+<a href="http://arxiv.org/abs/astro-ph/0611601">Non-axisymmetric instability
+ and fragmentation of general relativistic quasitoroidal stars</a>.
+<cite>Phys. Rev. D</cite>, 76:024019, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.024019">doi:10.1103/PhysRevD.76.024019</a>)</li>
+
+<!-- Authors: Bernd Brugmann and Jose A Gonzalez and Mark Hannam and Sascha
+ Husa and Ulrich Sperhake and Wolfgang Tichy -->
+<li><a name="carpet-bruegmann2006a">Bernd</a> Brügmann,
+ José A. González, Mark Hannam, Sascha Husa, Ulrich Sperhake, and
+ Wolfgang Tichy.
+<a href="http://arxiv.org/abs/gr-qc/0610128">Calibration of moving puncture
+ simulations</a>.
+<cite>Phys. Rev. D</cite>, 77:024027, 2008.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.77.024027">doi:10.1103/PhysRevD.77.024027</a>)</li>
+
+<!-- Authors: Christian Reisswig and Nigel T Bishop and Chi Wai Lai and
+ Jonathan Thornburg and Bela Szilagyi -->
+<li><a name="carpet-reisswig2006a">Christian</a> Reisswig,
+ Nigel T. Bishop, Chi Wai Lai, Jonathan Thornburg, and Béla Szilágyi.
+<a href="http://arxiv.org/abs/gr-qc/0610019">Characteristic evolutions in
+ numerical relativity using six angular patches</a>.
+<cite>Class. Quantum Grav.</cite>, 24:S327–S339, 2007.
+(<a href="http://dx.doi.org/10.1088/0264-9381/24/12/S21">doi:10.1088/0264-9381/24/12/S21</a>)</li>
+
+<!-- Authors: Christian D Ott and Harald Dimmelmeier and Andreas Marek and Hans
+ Thomas Janka and Ian Hawke and Burkhard Zink and Erik Schnetter -->
+<li><a name="carpet-ott2006a">Christian</a> D. Ott, Harald
+ Dimmelmeier, Andreas Marek, Hans-Thomas Janka, Ian Hawke, Burkhard Zink, and
+ Erik Schnetter.
+<a href="http://arxiv.org/abs/astro-ph/0609819">3D collapse of rotating
+ stellar iron cores in general relativity including deleptonization and a
+ nuclear equation of state</a>.
+<cite>Phys. Rev. Lett.</cite>, 98:261101, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.98.261101">doi:10.1103/PhysRevLett.98.261101</a>)</li>
+
+<!-- Authors: Luca Baiotti and Luciano Rezzolla -->
+<li><a name="carpet-baiotti2006a">Luca</a> Baiotti and Luciano
+ Rezzolla.
+<a href="http://arxiv.org/abs/gr-qc/0608113">Challenging the paradigm of
+ singularity excision in gravitational collapse</a>.
+<cite>Phys. Rev. Lett.</cite>, 97:141101, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.97.141101">doi:10.1103/PhysRevLett.97.141101</a>)</li>
+
+<!-- Authors: Ernst Nils Dorband and Emanuele Berti and Peter Diener and Erik
+ Schnetter and Manuel Tiglio -->
+<li><a name="carpet-dorband2006a">Ernst</a> Nils Dorband, Emanuele
+ Berti, Peter Diener, Erik Schnetter, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/gr-qc/0608091">A numerical study of the
+ quasinormal mode excitation of kerr black holes</a>.
+<cite>Phys. Rev. D</cite>, 74:084028, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.74.084028">doi:10.1103/PhysRevD.74.084028</a>)</li>
+
+<!-- Authors: Frank Loffler and Luciano Rezzolla and Marcus Ansorg -->
+<li><a name="carpet-loeffler2006a">Frank</a> Löffler, Luciano
+ Rezzolla, and Marcus Ansorg.
+<a href="http://arxiv.org/abs/gr-qc/0606104">Numerical evolutions of a black
+ hole-neutron star system in full general relativity: Head-on collision</a>.
+<cite>Phys. Rev. D</cite>, 74:104018, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.74.104018">doi:10.1103/PhysRevD.74.104018</a>)</li>
+
+<!-- Authors: Ulrich Sperhake -->
+<li><a name="carpet-sperhake2006a">Ulrich</a> Sperhake.
+<a href="http://arxiv.org/abs/gr-qc/0606079">Binary black-hole evolutions of
+ excision and puncture data</a>.
+<cite>Phys. Rev. D</cite>, 76:104015, 2007.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.76.104015">doi:10.1103/PhysRevD.76.104015</a>)</li>
+
+<!-- Authors: Erik Schnetter and Badri Krishnan and Florian Beyer -->
+<li><a name="carpet-schnetter2006b">Erik</a> Schnetter, Badri
+ Krishnan, and Florian Beyer.
+<a href="http://arxiv.org/abs/gr-qc/0604015">Introduction to dynamical horizons
+ in numerical relativity</a>.
+<cite>Phys. Rev. D</cite>, 74:024028, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.74.024028">doi:10.1103/PhysRevD.74.024028</a>)</li>
+
+<!-- Authors: Carlos F Sopuerta and Ulrich Sperhake and Pablo Laguna -->
+<li><a name="carpet-sopuerta2006a">Carlos</a> F. Sopuerta, Ulrich
+ Sperhake, and Pablo Laguna.
+<a href="http://arxiv.org/abs/gr-qc/0605018">Hydro-without-hydro framework for
+ simulations of black hole-neutron star binaries</a>.
+<cite>Class. Quantum Grav.</cite>, 23:S579–S598, 2006.
+(<a href="http://dx.doi.org/10.1088/0264-9381/23/16/S15">doi:10.1088/0264-9381/23/16/S15</a>)</li>
+
+<!-- Authors: Erik Schnetter and Peter Diener and Ernst Nils Dorband and Manuel
+ Tiglio -->
+<li><a name="carpet-schnetter2006a">Erik</a> Schnetter, Peter
+ Diener, Ernst Nils Dorband, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/gr-qc/0602104">A multi-block infrastructure for
+ three-dimensional time-dependent numerical relativity</a>.
+<cite>Class. Quantum Grav.</cite>, 23:S553–S578, 2006.
+(<a href="http://dx.doi.org/10.1088/0264-9381/23/16/S14">doi:10.1088/0264-9381/23/16/S14</a>)</li>
+
+<!-- Authors: Peter Diener and Ernst Nils Dorband and Erik Schnetter and Manuel
+ Tiglio -->
+<li><a name="carpet-diener2005b">Peter</a> Diener, Ernst Nils
+ Dorband, Erik Schnetter, and Manuel Tiglio.
+<a href="http://arxiv.org/abs/gr-qc/0512001">Optimized high-order derivative
+ and dissipation operators satisfying summation by parts, and applications in
+ three-dimensional multi-block evolutions</a>.
+<cite>J. Sci. Comput.</cite>, 32:109–145, 2007.
+(<a href="http://dx.doi.org/10.1007/s10915-006-9123-7">doi:10.1007/s10915-006-9123-7</a>)</li>
+
+<!-- Authors: Peter Diener and Frank Herrmann and Denis Pollney and Erik
+ Schnetter and Edward Seidel and Ryoji Takahashi and Jonathan Thornburg and
+ Jason Ventrella -->
+<li><a name="carpet-diener2005a">Peter</a> Diener, Frank Herrmann,
+ Denis Pollney, Erik Schnetter, Edward Seidel, Ryoji Takahashi, Jonathan
+ Thornburg, and Jason Ventrella.
+<a href="http://arxiv.org/abs/gr-qc/0512108">Accurate evolution of orbiting
+ binary black holes</a>.
+<cite>Phys. Rev. Lett.</cite>, 96:121101, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.96.121101">doi:10.1103/PhysRevLett.96.121101</a>)</li>
+
+<!-- Authors: Ulrich Sperhake and Bernard Kelly and Pablo Laguna and Kenneth L
+ Smith and Erik Schnetter -->
+<li><a name="carpet-sperhake2005a">Ulrich</a> Sperhake, Bernard
+ Kelly, Pablo Laguna, Kenneth L. Smith, and Erik Schnetter.
+<a href="http://arxiv.org/abs/gr-qc/0503071">Black hole head-on collisions and
+ gravitational waves with fixed mesh-refinement and dynamic singularity
+ excision</a>.
+<cite>Phys. Rev. D</cite>, 71:124042, 2005.
+(<a href="http://dx.doi.org/10.1103/PhysRevD.71.124042">doi:10.1103/PhysRevD.71.124042</a>)</li>
+
+<!-- Authors: Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D Ott and Erik Schnetter and Ewald Muller -->
+<li><a name="carpet-zink2005a">Burkhard</a> Zink, Nikolaos
+ Stergioulas, Ian Hawke, Christian D. Ott, Erik Schnetter, and Ewald
+ Müller.
+<a href="http://arxiv.org/abs/gr-qc/0501080">Formation of supermassive black
+ holes through fragmentation of torodial supermassive stars</a>.
+<cite>Phys. Rev. Lett.</cite>, 96:161101, 2006.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.96.161101">doi:10.1103/PhysRevLett.96.161101</a>)</li>
+
+<!-- Authors: Luca Baiotti and Ian Hawke and Luciano Rezzolla and Erik
+ Schnetter -->
+<li><a name="carpet-baiotti2004a">Luca</a> Baiotti, Ian Hawke,
+ Luciano Rezzolla, and Erik Schnetter.
+<a href="http://arxiv.org/abs/gr-qc/0503016">Gravitational-wave emission from
+ rotating gravitational collapse in three dimensions</a>.
+<cite>Phys. Rev. Lett.</cite>, 95:131101, 2005.
+(<a href="http://dx.doi.org/10.1103/PhysRevLett.94.131101">doi:10.1103/PhysRevLett.94.131101</a>)</li>
+
+<!-- Authors: Erik Schnetter and Scott H Hawley and Ian Hawke -->
+<li><a name="carpet-schnetter2003a">Erik</a> Schnetter, Scott H.
+ Hawley, and Ian Hawke.
+<a href="http://arxiv.org/abs/gr-qc/0310042">Evolutions in 3d numerical
+ relativity using fixed mesh refinement</a>.
+<cite>Class. Quantum Grav.</cite>, 21:1465–1488, 2004.
+(<a href="http://dx.doi.org/10.1088/0264-9381/21/6/014">doi:10.1088/0264-9381/21/6/014</a>)</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-refereed -->
+<h2>Book Chapters</h2>
+
+<!-- BEGIN BIBLIOGRAPHY citations-book -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-book.aux publications.html -->
+<ol class="bib2xhtml">
+
+<!-- Authors: Erik Schnetter and Christian D Ott and Gabrielle Allen and Peter
+ Diener and Tom Goodale and Thomas Radke and Edward Seidel and John Shalf -->
+<li><a name="carpet-schnetter2007a">Erik</a> Schnetter,
+ Christian D. Ott, Gabrielle Allen, Peter Diener, Tom Goodale, Thomas Radke,
+ Edward Seidel, and John Shalf.
+<a href="http://arxiv.org/abs/0707.1607">Cactus Framework: Black holes to
+ gamma ray bursts</a>.
+In David A. Bader, editor, <cite>Petascale Computing: Algorithms and
+ Applications</cite>, Computational Science Series, chapter 24, pages
+ 507–528. Chapman &amp; Hall/CRC, 2007.</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-book -->
+<h2>Conference Proceedings, Preprints, Technical Reports, and Books</h2>
+
+<!-- BEGIN BIBLIOGRAPHY citations-report -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-report.aux publications.html -->
+<ol class="bib2xhtml">
+
+<!-- Authors: Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D Ott and Erik Schnetter and Ewald Muller -->
+<li><a name="carpet-zink2005b">Burkhard</a> Zink, Nikolaos
+ Stergioulas, Ian Hawke, Christian D. Ott, Erik Schnetter, and Ewald
+ Müller.
+Rotational instabilities in supermassive stars: a new way to form supermassive
+ black holes.
+In N. K. Spyrou, N. Stergioulas, and C. Tsagas, editors, <cite>International
+ Scientific Workshop on Cosmology and Gravitational Physics, Thessaloniki,
+ December 15-16, 2005</cite>, pages 155–160. ZITI, 2006.</li>
+
+<!-- Authors: Christian Reisswig and Nigel T Bishop and Denis Pollney and Bela
+ Szilagyi -->
+<li><a name="carpet-reisswig2009b">Christian</a> Reisswig, Nigel T.
+ Bishop, Denis Pollney, and Béla Szilágyi.
+<a href="http://arxiv.org/abs/0907.2637">Unambiguous determination of
+ gravitational waveforms from binary black hole mergers</a>.
+arXiv:0907.2637 [gr-qc], 2009.</li>
+
+<!-- Authors: Ulrich Sperhake and Vitor Cardoso and Frans Pretorius and
+ Emanuele Berti and Tanja Hinderer and Nicolas Yunes -->
+<li><a name="carpet-sperhake2009a">Ulrich</a> Sperhake, Vitor
+ Cardoso, Frans Pretorius, Emanuele Berti, Tanja Hinderer, and Nicolas Yunes.
+<a href="http://arxiv.org/abs/0907.1252">Cross section, final spin and
+ zoom-whirl behavior in high-energy black hole collisions</a>.
+arXiv:0907.1252 [gr-qc], 2009.</li>
+
+<!-- Authors: Geoffrey Lovelace and Yanbei Chen and Michael Cohen and Jeffrey D
+ Kaplan and Drew Keppel and Keith D Matthews and David A Nichols and Mark A
+ Scheel and Ulrich Sperhake -->
+<li><a name="carpet-lovelace2009a">Geoffrey</a> Lovelace, Yanbei
+ Chen, Michael Cohen, Jeffrey D. Kaplan, Drew Keppel, Keith D. Matthews,
+ David A. Nichols, Mark A. Scheel, and Ulrich Sperhake.
+<a href="http://arxiv.org/abs/0907.0869">Momentum flow in black-hole binaries:
+ II. Numerical simulations of equal-mass, head-on mergers with
+ antiparallel spins</a>.
+arXiv:0907.0869 [gr-qc], 2009.</li>
+
+<!-- Authors: James Healy and Janna Levin and Deirdre Shoemaker -->
+<li><a name="carpet-healy2009a">James</a> Healy, Janna Levin, and
+ Deirdre Shoemaker.
+<a href="http://arxiv.org/abs/0907.0671">Zoom-whirl orbits in black hole
+ binaries</a>.
+arXiv:0907.0671 [gr-qc], 2009.</li>
+
+<!-- Authors: Christian Reisswig and Sascha Husa and Luciano Rezzolla and Ernst
+ Nils Dorband and Denis Pollney and Jennifer Seiler -->
+<li><a name="carpet-reisswig2009a">Christian</a> Reisswig, Sascha
+ Husa, Luciano Rezzolla, Ernst Nils Dorband, Denis Pollney, and Jennifer
+ Seiler.
+<a href="http://arxiv.org/abs/0907.0462">Gravitational-wave detectability of
+ equal-mass black-hole binaries with aligned spins</a>.
+arXiv:0907.0462 [gr-qc], 2009.</li>
+
+<!-- Authors: James Healy and Pablo Laguna and Richard A Matzner and Deirdre M
+ Shoemaker -->
+<li><a name="carpet-healy2009b">James</a> Healy, Pablo Laguna,
+ Richard A. Matzner, and Deirdre M. Shoemaker.
+<a href="http://arxiv.org/abs/0905.3914">Final mass and spin of merged black
+ holes and the golden black hole</a>.
+arXiv:0905.3914 [gr-qc], 2009.</li>
+
+<!-- Authors: Christian D Ott -->
+<li><a name="carpet-ott2009a">Christian</a> D. Ott.
+<a href="http://arxiv.org/abs/0905.2797">Probing the core-collapse supernova
+ mechanism with gravitational waves</a>.
+arXiv:0905.2797 [gr-qc], 2009.</li>
+
+<!-- Authors: Carlos O Lousto and Manuela Campanelli and Yosef Zlochower -->
+<li><a name="carpet-lousto2009a">Carlos</a> O. Lousto, Manuela
+ Campanelli, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0904.3541">Remnant masses, spins and recoils from
+ the merger of generic black-hole binaries</a>.
+arXiv:0904.3541 [gr-qc], 2009.</li>
+
+<!-- Authors: Enrico Barausse and Luciano Rezzolla -->
+<li><a name="carpet-barausse2009a">Enrico</a> Barausse and Luciano
+ Rezzolla.
+<a href="http://arxiv.org/abs/0904.2577">Predicting the direction of the final
+ spin from the coalescence of two black holes</a>.
+arXiv:0904.2577 [gr-qc], 2009.</li>
+
+<!-- Authors: Sebastiano Bernuzzi and Lucao Baiotti and Giovanni Corvino and
+ Roberto De Pietri and Alessandro Nagar -->
+<li><a name="carpet-bernuzzi2009a">Sebastiano</a> Bernuzzi, Lucao
+ Baiotti, Giovanni Corvino, Roberto De Pietri, and Alessandro Nagar.
+<a href="http://arxiv.org/abs/0902.2720">Gravitational-wave extraction from
+ neutron-star oscillations</a>.
+arXiv:0902.2720 [gr-qc], 2009.</li>
+
+<!-- Authors: Tanja Bode and Pablo Laguna and Deirdre M Shoemaker and Ian
+ Hinder and Frank Herrmann and Jirjoo Vishnav -->
+<li><a name="carpet-bode2009a">Tanja</a> Bode, Pablo Laguna,
+ Deirdre M. Shoemaker, Ian Hinder, Frank Herrmann, and Jirjoo Vishnav.
+<a href="http://arxiv.org/abs/0902.1127">Binary black hole evolutions of
+ approximate puncture initial data</a>.
+arXiv:0902.1127 [gr-qc], 2009.</li>
+
+<!-- Authors: Hiroyuki Nakano and Manuela Campanelli and Carlos O Lousto and
+ Yosef Zlochower -->
+<li><a name="carpetresult-nakano2008a">Hiroyuki</a> Nakano,
+ Manuela Campanelli, Carlos O. Lousto, and Yosef Zlochower.
+<a href="http://arxiv.org/abs/0901.3861">Comparison of post-Newtonian and
+ numerical evolutions of black-hole binaries</a>.
+arXiv:0901.3861 [gr-qc], 2009.</li>
+
+<!-- Authors: Bruno Giacomazzo and Luciano Rezzolla and Luca Baiotti -->
+<li><a name="carpet-giacomazzo2009a">Bruno</a> Giacomazzo, Luciano
+ Rezzolla, and Luca Baiotti.
+<a href="http://arxiv.org/abs/0901.2722">The influence of magnetic fields on
+ the gravitational-wave emission from binary neutron stars</a>.
+arXiv:0901.2722v1 [gr-qc], 2009.</li>
+
+<!-- Authors: Jian Tao and Gabrielle Allen and Ian Hinder and Erik Schnetter
+ and Yosef Zlochower -->
+<li><a name="carpet-tao2008a">Jian</a> Tao, Gabrielle Allen, Ian
+ Hinder, Erik Schnetter, and Yosef Zlochower.
+<a href="http://www.cct.lsu.edu/CCT-TR/CCT-TR-2008-5">XiRel: Standard
+ benchmarks for numerical relativity codes using Cactus and Carpet</a>.
+Technical Report 5, Center for Computation &amp; Technology, Louisiana State
+ University, 2008.</li>
+
+<!-- Authors: Ian Hinder and Frank Herrmann and Pablo Laguna and Deirdre
+ Shoemaker -->
+<li><a name="carpet-hinder2008a">Ian</a> Hinder, Frank Herrmann,
+ Pablo Laguna, and Deirdre Shoemaker.
+<a href="http://arxiv.org/abs/0806.1037">Comparisons of eccentric binary black
+ hole simulations with post-Newtonian models</a>.
+arXiv:0806.1037 [gr-qc], 2008.</li>
+
+<!-- Authors: John G Baker and William D Boggs and Joan M Centrella and Bernard
+ J Kelly and Sean T McWilliams and James R van Meter -->
+<li><a name="carpetresult-baker2007a">John</a> G. Baker,
+ William D. Boggs, Joan M. Centrella, Bernard J. Kelly, Sean T. McWilliams,
+ and James R. van Meter.
+<a href="http://arxiv.org/abs/0708.4202">Gravitational waves from black-hole
+ mergers</a>.
+In <cite>Proceedings of the 2007 Spring Symposium of the Space Telescope
+ Science Institute (Baltimore, MD)</cite>, page (to be published), 2007.</li>
+
+<!-- Authors: Luca Baiotti and Ian Hawke and Luciano Rezzolla and Erik
+ Schnetter -->
+<li><a name="carpet-baiotti2006c">Luca</a> Baiotti, Ian Hawke,
+ Luciano Rezzolla, and Erik Schnetter.
+<a href="http://stacks.iop.org/JPConf/66/012045">Details on the
+ gravitational-wave emission from rotating gravitational collapse in 3D</a>.
+In <cite>XXIXth Spanish Relativity Meeting (E.R.E. 2006)</cite>, volume 66 of
+ <cite>J. Phys.: Conf. Ser.</cite>, page 012045, 2007.
+(<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012045">doi:10.1088/1742-6596/66/1/012045</a>)</li>
+
+<!-- Authors: Ulrich Sperhake -->
+<li><a name="carpet-sperhake2006c">Ulrich</a> Sperhake.
+<a href="http://stacks.iop.org/JPConf/66/012049">Black-hole binary evolutions
+ with the LEAN code</a>.
+In <cite>XXIXth Spanish Relativity Meeting (E.R.E. 2006)</cite>, volume 66 of
+ <cite>J. Phys.: Conf. Ser.</cite>, page 012049, 2007.
+(<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012049">doi:10.1088/1742-6596/66/1/012049</a>)</li>
+
+<!-- Authors: Jose A Font -->
+<li><a name="carpetresult-font2006a">Jos</a>é A. Font.
+<a href="http://stacks.iop.org/JPConf/66/012063">Current status of relativistic
+ core collapse simulations</a>.
+In <cite>XXIXth Spanish Relativity Meeting (E.R.E. 2006)</cite>, volume 66 of
+ <cite>J. Phys.: Conf. Ser.</cite>, page 012063, 2007.
+(<a href="http://dx.doi.org/10.1088/1742-6596/66/1/012063">doi:10.1088/1742-6596/66/1/012063</a>)</li>
+
+<!-- Authors: Ulrich Sperhake and Bernd Brugmann and Jose Gonzalez and Mark
+ Hannam and Sascha Husa -->
+<li><a name="carpet-sperhake2006b">Ulrich</a> Sperhake, Bernd
+ Brügmann, José González, Mark Hannam, and Sascha Husa.
+<a href="http://arxiv.org/abs/0705.2035">Head-on collisions of different
+ initial data</a>.
+In <cite>Proceedings of the 11th Marcel Grossmann Meeting (MG11) in Berlin,
+ Germany, July 23-29, 2006</cite>, 2007.</li>
+
+<!-- Authors: Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D Ott and Erik Schnetter and Ewald Muller -->
+<li><a name="carpet-zink2006b">Burkhard</a> Zink, Nikolaos
+ Stergioulas, Ian Hawke, Christian D. Ott, Erik Schnetter, and Ewald
+ Müller.
+<a href="http://arxiv.org/abs/0704.0431">Fragmentation of general relativistic
+ quasi-toroidal polytropes</a>.
+In <cite>Proceedings of the 11th Marcel Grossmann Meeting (MG11) in Berlin,
+ Germany, July 23-29, 2006</cite>, 2007.</li>
+
+<!-- Authors: Burkhard Zink and Nikolaos Stergioulas and Ian Hawke and
+ Christian D Ott and Erik Schnetter and Ewald Muller -->
+<li><a name="carpet-zink2006c">Burkhard</a> Zink, Nikolaos
+ Stergioulas, Ian Hawke, Christian D. Ott, Erik Schnetter, and Ewald
+ Müller.
+<a href="http://stacks.iop.org/JPConf/68/012050">Supermassive black hole
+ formation through rotational instabilities</a>.
+In <cite>12th Conference on Recent Developments in Gravity (NEB XII)</cite>,
+ volume 68 of <cite>J. Phys.: Conf. Ser.</cite>, page 012050, 2007.
+(<a href="http://dx.doi.org/10.1088/1742-6596/68/1/012050">doi:10.1088/1742-6596/68/1/012050</a>)</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-report -->
+<h2>Theses</h2>
+
+<!-- BEGIN BIBLIOGRAPHY citations-thesis -->
+<!--
+ DO NOT MODIFY THIS BIBLIOGRAPHY BY HAND! IT IS MAINTAINED AUTOMATICALLY!
+ YOUR CHANGES WILL BE LOST THE NEXT TIME IT IS UPDATED!
+-->
+<!-- Generated by: ./bib2xhtml -s unsortlist -u citations-thesis.aux publications.html -->
+<ol class="bib2xhtml">
+
+<!-- Authors: Eloisa Bentivegna -->
+<li><a name="carpet-bentivegna2008b">Eloisa</a> Bentivegna.
+<a href="http://etda.libraries.psu.edu/
+theses/approved/WorldWideIndex/ETD-2570/index.html"><cite>Ringing in unison:
+ exploring black hole coalescence with quasinormal modes</cite></a>.
+PhD thesis, Pennsylvania State University, 2008.</li>
+
+<!-- Authors: Michael Jasiulek -->
+<li><a name="carpet-jasiulek2008a">Michael</a> Jasiulek.
+Spin measures on isolated and dynamical horizons in numerical relativity.
+Master's thesis, Humboldt-Universität zu Berlin, 2008.</li>
+
+<!-- Authors: Ernst Nils Dorband -->
+<li><a name="carpet-dorband2007a">Ernst</a> Nils Dorband.
+<a href="http://www.cct.lsu.edu/~dorband/thesis.pdf"><cite>Computing and
+ Analyzing Gravitational Radiation in Black Hole Simulations Using a New
+ Multi-Block Approach to Numerical Relativity</cite></a>.
+PhD thesis, Louisiana State University, 2007.</li>
+
+<!-- Authors: Wolfgang Kastaun -->
+<li><a name="carpet-kastaun2007a">Wolfgang</a> Kastaun.
+<a href="http://tobias-lib.ub.uni-tuebingen.de/
+volltexte/2007/2803/"><cite>Developing a code for general relativistic
+ hydrodynamics with application to neutron star oscillations</cite></a>.
+PhD thesis, Universität Tübingen, 2007.</li>
+
+<!-- Authors: Gian Mario Manca -->
+<li><a name="carpet-manca2007a">Gian</a> Mario Manca.
+<cite>Dynamical instabilities in rapidly rotating neutron star models</cite>.
+PhD thesis, Università di Parma, 2007.</li>
+
+<!-- Authors: Christian D Ott -->
+<li><a name="carpet-ott2007a">Christian</a> D. Ott.
+<a href="http://stellarcollapse.org/papers/thesis_final.pdf"><cite>Stellar Iron
+ Core Collapse in {3+1} General Relativity and The Gravitational Wave
+ Signature of Core-Collapse Supernovae</cite></a>.
+PhD thesis, Universität Potsdam, 2007.</li>
+
+<!-- Authors: Anil Zenginoglu -->
+<li><a name="carpet-2007a">An</a>ıl Zenginoğlu.
+<a href="http://arxiv.org/abs/0711.0873"><cite>A conformal approach to
+ numerical calculations of asymptotically flat spacetimes</cite></a>.
+PhD thesis, Universität Potsdam, 2007.</li>
+
+<!-- Authors: Frank Loffler -->
+<li><a name="carpet-loeffler2005a">Frank</a> Löffler.
+<a href="http://opus.kobv.de/ubp/volltexte/2006/774/"><cite>Numerical
+ Simulations of Neutron Star-Black Hole Mergers</cite></a>.
+PhD thesis, Universität Potsdam, 2006.</li>
+
+<!-- Authors: Sasanka Madiraju -->
+<li><a name="carpet-madiraju2006a">Sasanka</a> Madiraju.
+<a href="http://www.cactuscode.org/Articles/Cactus_Madiraju06.pdf">Performance
+ profiling with Cactus benchmarks</a>.
+Master's thesis, Louisiana State University, 2006.</li>
+
+<!-- Authors: Burkhard Zink -->
+<li><a name="carpet-zink2006d">Burkhard</a> Zink.
+<a href="http://nbn-resolving.de/urn/resolver.pl
+?urn=urn:nbn:de:bvb:91-diss20060623-1915123970"><cite>Black hole formation
+ from non-axisymmetric instabilities in quasi-toroidal stars</cite></a>.
+PhD thesis, Technische Universität München, 2006.</li>
+
+<!-- Authors: Frank Herrmann -->
+<li><a name="carpet-herrmann2005a">Frank</a> Herrmann.
+<cite>Evolution and analysis of binary black hole spacetimes</cite>.
+PhD thesis, Universität Potsdam, 2005.</li>
+
+<!-- Authors: Michael Koppitz -->
+<li><a name="carpet-koppitz2004a">Michael</a> Koppitz.
+<a href="http://opus.kobv.de/ubp/volltexte/2005/134/"><cite>Numerical Studies
+ Of Black Hole Initial Data</cite></a>.
+PhD thesis, Universität Potsdam, 2004.</li>
+
+</ol>
+
+<!-- END BIBLIOGRAPHY citations-thesis -->
+<!--
+
+Luca Baiotti,
+Numerical relativity simulations of non-vacuum spacetimes in three
+dimensions,
+PhD thesis, SISSA, 2004.
+[does not use Carpet]
+
+Bernard Kelly,
+The Next Generation of Binary Black Hole Head-On Collisions, and their
+Aftermath,
+PhD thesis, Penn State University, 2004.
+[does not use Carpet]
+
+Kenneth Smith,
+Dynamic Singularity Excision in Numerical Relativity,
+PhD thesis, Penn State University, 2004.
+[does not use Carpet]
+
+Bruno Giacomazzo,
+General Relativistic Magnetohydrodynamics: fundamental aspects and applications,
+PhD thesis, SISSA, 2006.
+[does not use Carpet]
+
+-->
+
+ <hr />
+
+ <p>Go back to the <a href="..">Carpet home page</a>.</p>
+
+ <hr />
+
+ <p>
+ <a href="http://www.xemacs.org/About/created.html"><img src="../cbxSmall.jpg"
+ alt="Created with XEmacs!" height="36" width="100" /></a>
+
+ <a href="http://www.anybrowser.org/campaign/"><img src="../logoab8.png"
+ alt="Best Viewed With Any Browser" height="31" width="88" /></a>
+
+ <a href="http://validator.w3.org/check?uri=referer"><img src="../valid-xhtml10.png"
+ alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+ </p>
+
+ <address><a href="mailto:schnetter@cct.lsu.edu">Erik Schnetter</a></address>
+<p>
+<!-- Created: Sun Feb 26 2006 -->
+<!-- hhmts start -->
+Last modified: 2009-03-06
+<!-- hhmts end -->
+</p>
+
+ </body>
+</html>
diff --git a/Carpet/CarpetWeb/scaling-amr/minimise.sh b/Carpet/CarpetWeb/scaling-amr/minimise.sh
index 2769773d8..2769773d8 100755..100644
--- a/Carpet/CarpetWeb/scaling-amr/minimise.sh
+++ b/Carpet/CarpetWeb/scaling-amr/minimise.sh
diff --git a/Carpet/CarpetWeb/scaling-improved/KL9_CCT_vacuum.asc b/Carpet/CarpetWeb/scaling-improved/KL9_CCT_vacuum.asc
new file mode 100644
index 000000000..72e3829c3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/KL9_CCT_vacuum.asc
@@ -0,0 +1,15 @@
+
+# min
+#1:ncores 2:totalwalltime 3:initialise 4:evolve 5:thorns 6:syncs 7:output 8:regrid 9:restrict
+ 1 166.538 1.234 165.301 151.533 13.013 0.002 0.038 0.121
+ 2 184.087 1.467 182.617 146.464 32.789 0.002 0.046 2.615
+ 4 222.507 2.042 220.460 154.111 60.024 0.001 0.057 5.615
+ 8 249.777 2.394 247.378 161.157 76.278 0.002 0.066 8.865
+ 16 289.908 3.178 286.723 187.395 83.122 0.001 0.091 14.265
+ 32 306.595 4.026 302.561 182.373 101.549 0.001 0.135 16.780
+ 64 325.550 5.807 319.727 182.030 113.278 0.001 0.177 22.330
+ 128 327.973 9.502 318.444 182.151 109.057 0.001 0.327 24.063
+ 256 355.912 23.444 332.316 182.260 120.230 0.001 0.702 25.793
+ 512 410.086 71.320 338.582 180.838 118.263 0.001 2.623 33.638
+ 1024 606.565 255.550 350.505 185.833 122.054 0.001 7.273 33.686
+ 2048 1357.896 982.257 375.051 205.373 140.679 0.001 14.646 35.469
diff --git a/Carpet/CarpetWeb/scaling-improved/Makefile b/Carpet/CarpetWeb/scaling-improved/Makefile
new file mode 100644
index 000000000..a409ba7f3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/Makefile
@@ -0,0 +1,36 @@
+all: results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+
+results.eps results-best.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out
+results-scaled.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out results-sicortex.out results-surveyor.out
+results-sicortex.eps: results-sicortex.out
+results-surveyor.eps: results-surveyor.out
+results-openmp-node.eps: results-ranger-openmp-node.out
+results-openmp-procs.eps: results-ranger-openmp-procs.out
+results-whatif.eps: results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out
+
+results-ranger-openmp-procs.out results-ranger-openmp-node.out: results2openmp results-ranger.out
+ ./results2openmp
+
+results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out: results2whatif results-ranger.out
+ ./results2whatif
+
+%.eps: %.gnuplot
+ gnuplot < $*.gnuplot
+
+%.pdf: %.eps
+ epstopdf $*.eps
+
+rsync:
+ -rsync -Paz franklin.nersc.gov:/project/projectdirs/m152/schnette/franklin/Calpha/results-franklin.out .
+ -rsync -Paz -e 'ssh numrel02.cct.lsu.edu ssh' lu78kog@hlrb2.lrz-muenchen.de:Calpha/results-hlrb2.out .
+ -rsync -Paz kraken-pwd.nics.utk.edu:work/Calpha/results-kraken.out .
+ -rsync -Paz queenbee.loni.org:work/Calpha/results-queenbee.out .
+ -rsync -Paz ranger.tacc.utexas.edu:work/Calpha/results-ranger.out .
+
+clean:
+ rm -f results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+ rm -f results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
+
+.PHONY: all rsync clean
+
+.PRECIOUS: results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
diff --git a/Carpet/CarpetWeb/scaling-improved/openmp-ranger.out b/Carpet/CarpetWeb/scaling-improved/openmp-ranger.out
new file mode 100644
index 000000000..2eacd10b3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/openmp-ranger.out
@@ -0,0 +1,45 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 71 135.63270587 135.40044100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 71 186.41453722 186.15565600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 71 141.51701227 281.73762600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 71 228.27816767 228.01424800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 71 209.97284200 414.55791500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 71 257.80748799 1012.46728000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 71 279.55088937 277.57337300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 71 242.58659491 479.38994400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 71 328.67928713 1292.82478800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 71 291.50975695 2271.12593300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 71 375.95657347 375.46341200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 71 330.96690626 645.80038000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 71 429.58751955 1668.59631500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 71 490.51058293 3782.34037100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 71 656.72454561 9945.57355800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 71 417.34331894 415.39392000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 71 368.67281962 693.36329100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 71 488.48490761 1789.02781400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 71 607.70209688 4613.98434600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 71 758.89552524 11259.30765700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 71 431.95664416 431.63498300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 71 444.19184591 804.59427400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 71 545.43877754 1850.99568200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 71 636.76134103 4722.85116200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 71 743.16011415 11063.20738400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 71 430.91503566 430.43491100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 71 440.23977765 802.17812500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 71 522.37506390 1795.84423300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 71 697.91456742 4817.27303700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 71 792.28551614 11551.60588900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 71 432.57437397 431.60298900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 71 450.67742913 816.63503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 71 531.22941551 1840.13502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 71 438.81654108 438.29943200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 71 484.87606011 874.36265300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 71 547.03842935 1875.64522500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 71 399.03692711 398.91291300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 71 455.91632274 455.34043200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 01 71 433.90391986 433.17103800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 01 71 437.99540328 436.87931300
diff --git a/Carpet/CarpetWeb/scaling-improved/openmp.eps b/Carpet/CarpetWeb/scaling-improved/openmp.eps
new file mode 100644
index 000000000..437a4f913
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/openmp.eps
@@ -0,0 +1,1207 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: openmp.eps
+%%Creator: gnuplot 4.2 patchlevel 4
+%%CreationDate: Sun Dec 28 23:16:40 2008
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 230 176
+%%EndComments
+%%BeginProlog
+/gnudict 256 dict def
+gnudict begin
+%
+% The following 6 true/false flags may be edited by hand if required
+% The unit line width may also be changed
+%
+/Color true def
+/Blacktext false def
+/Solid false def
+/Dashlength 1 def
+/Landscape false def
+/Level1 false def
+/Rounded false def
+/TransparentPatterns false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+%
+/vshift -46 def
+/dl1 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
+} def
+/dl2 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul add } if
+} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+Level1 {} {
+/SDict 10 dict def
+systemdict /pdfmark known not {
+ userdict /pdfmark systemdict /cleartomark get put
+} if
+SDict begin [
+ /Title (openmp.eps)
+ /Subject (gnuplot plot)
+ /Creator (gnuplot 4.2 patchlevel 4 )
+ /Author (Erik Schnetter)
+% /Producer (gnuplot)
+% /Keywords ()
+ /CreationDate (Sun Dec 28 23:16:40 2008)
+ /DOCINFO pdfmark
+end
+} ifelse
+%
+% Gnuplot Prolog Version 4.2 (August 2006)
+%
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/Z {closepath} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow {currentpoint stroke M 0 vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
+/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
+/BL {stroke userlinewidth 2 mul setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/AL {stroke userlinewidth 2 div setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/UL {dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def} def
+/PL {stroke userlinewidth setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+% Default Line colors
+/LCw {1 1 1} def
+/LCb {0 0 0} def
+/LCa {0 0 0} def
+/LC0 {1 0 0} def
+/LC1 {0 1 0} def
+/LC2 {0 0 1} def
+/LC3 {1 0 1} def
+/LC4 {0 1 1} def
+/LC5 {1 1 0} def
+/LC6 {0 0 0} def
+/LC7 {1 0.3 0} def
+/LC8 {0.5 0.5 0.5} def
+% Default Line Types
+/LTw {PL [] 1 setgray} def
+/LTb {BL [] LCb DL} def
+/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
+/LT0 {PL [] LC0 DL} def
+/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
+/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
+/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
+/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
+/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
+/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
+/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
+/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
+/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
+/Dia {stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt} def
+/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt} def
+/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke} def
+/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt} def
+/Star {2 copy Pls Crs} def
+/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill} def
+/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill} def
+/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt} def
+/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill} def
+/Pent {stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt} def
+/PentF {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore} def
+/Circle {stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt} def
+/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
+/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
+/C1 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C2 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C3 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C4 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C5 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc} bind def
+/C6 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C7 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C8 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C9 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C11 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C12 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C13 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C14 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc} bind def
+/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath} bind def
+/Square {dup Rec} bind def
+/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
+/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
+/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
+/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
+/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
+/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare} bind def
+/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare} bind def
+/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
+/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
+/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
+/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
+/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
+/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
+/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
+/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
+/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
+/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
+/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
+/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
+/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
+/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
+/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
+/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
+/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
+/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
+/DiaE {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke} def
+/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke} def
+/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke} def
+/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke} def
+/PentE {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore} def
+/CircE {stroke [] 0 setdash
+ hpt 0 360 arc stroke} def
+/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
+/DiaW {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke} def
+/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke} def
+/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke} def
+/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke} def
+/PentW {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore} def
+/CircW {stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke} def
+/BoxFill {gsave Rec 1 setgray fill grestore} def
+/Density {
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor} def
+/BoxColFill {gsave Rec PolyFill} def
+/PolyFill {gsave Density fill grestore grestore} def
+/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
+%
+% PostScript Level 1 Pattern Fill routine for rectangles
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill {gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 M 0 PFs V} for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 2 1 roll M PFs 0 V} for
+ } if
+ stroke grestore} def
+%
+/languagelevel where
+ {pop languagelevel} {1} ifelse
+ 2 lt
+ {/InterpretLevel1 true def}
+ {/InterpretLevel1 Level1 def}
+ ifelse
+%
+% PostScript level 2 pattern fill definitions
+%
+/Level2PatternFill {
+/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
+ bind def
+/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
+>> matrix makepattern
+/Pat1 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
+ 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
+>> matrix makepattern
+/Pat2 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
+ 8 8 L 8 0 L 0 0 L fill}
+>> matrix makepattern
+/Pat3 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
+ 0 12 M 12 0 L stroke}
+>> matrix makepattern
+/Pat4 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
+ 0 -4 M 12 8 L stroke}
+>> matrix makepattern
+/Pat5 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
+ 0 12 M 8 -4 L 4 12 M 10 0 L stroke}
+>> matrix makepattern
+/Pat6 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
+ 0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
+>> matrix makepattern
+/Pat7 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
+ 12 0 M -4 8 L 12 4 M 0 10 L stroke}
+>> matrix makepattern
+/Pat8 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
+ -4 0 M 12 8 L -4 4 M 8 10 L stroke}
+>> matrix makepattern
+/Pat9 exch def
+/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
+/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
+/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
+/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
+/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
+/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
+/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
+} def
+%
+%
+%End of PostScript Level 2 code
+%
+/PatternBgnd {
+ TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
+} def
+%
+% Substitute for Level 2 pattern fill codes with
+% grayscale if Level 2 support is not selected.
+%
+/Level1PatternFill {
+/Pattern1 {0.250 Density} bind def
+/Pattern2 {0.500 Density} bind def
+/Pattern3 {0.750 Density} bind def
+/Pattern4 {0.125 Density} bind def
+/Pattern5 {0.375 Density} bind def
+/Pattern6 {0.625 Density} bind def
+/Pattern7 {0.875 Density} bind def
+} def
+%
+% Now test for support of Level 2 code
+%
+Level1 {Level1PatternFill} {Level2PatternFill} ifelse
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+/MFshow {
+ { dup 5 get 3 ge
+ { 5 get 3 eq {gsave} {grestore} ifelse }
+ {dup dup 0 get findfont exch 1 get scalefont setfont
+ [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
+ get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
+ {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
+ get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
+ dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
+ show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
+ pop aload pop M} ifelse }ifelse }ifelse }
+ ifelse }
+ forall} bind def
+/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
+ {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
+ 6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
+/MLshow { currentpoint stroke M
+ 0 exch R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MRshow { currentpoint stroke M
+ exch dup MFwidth neg 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MCshow { currentpoint stroke M
+ exch dup MFwidth -2 div 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/XYsave { [( ) 1 2 true false 3 ()] } bind def
+/XYrestore { [( ) 1 2 true false 4 ()] } bind def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+gsave % colour palette begin
+/maxcolors 0 def
+/HSV2RGB { exch dup 0.0 eq {pop exch pop dup dup} % achromatic gray
+ { /HSVs exch def /HSVv exch def 6.0 mul dup floor dup 3 1 roll sub
+ /HSVf exch def /HSVi exch cvi def /HSVp HSVv 1.0 HSVs sub mul def
+ /HSVq HSVv 1.0 HSVs HSVf mul sub mul def
+ /HSVt HSVv 1.0 HSVs 1.0 HSVf sub mul sub mul def
+ /HSVi HSVi 6 mod def 0 HSVi eq {HSVv HSVt HSVp}
+ {1 HSVi eq {HSVq HSVv HSVp}{2 HSVi eq {HSVp HSVv HSVt}
+ {3 HSVi eq {HSVp HSVq HSVv}{4 HSVi eq {HSVt HSVp HSVv}
+ {HSVv HSVp HSVq} ifelse} ifelse} ifelse} ifelse} ifelse
+ } ifelse} def
+/Constrain {
+ dup 0 lt {0 exch pop}{dup 1 gt {1 exch pop} if} ifelse} def
+/YIQ2RGB {
+ 3 copy -1.702 mul exch -1.105 mul add add Constrain 4 1 roll
+ 3 copy -0.647 mul exch -0.272 mul add add Constrain 5 1 roll
+ 0.621 mul exch -0.956 mul add add Constrain 3 1 roll } def
+/CMY2RGB { 1 exch sub exch 1 exch sub 3 2 roll 1 exch sub 3 1 roll exch } def
+/XYZ2RGB { 3 copy -0.9017 mul exch -0.1187 mul add exch 0.0585 mul exch add
+ Constrain 4 1 roll 3 copy -0.0279 mul exch 1.999 mul add exch
+ -0.9844 mul add Constrain 5 1 roll -0.2891 mul exch -0.5338 mul add
+ exch 1.91 mul exch add Constrain 3 1 roll} def
+/SelectSpace {ColorSpace (HSV) eq {HSV2RGB}{ColorSpace (XYZ) eq {
+ XYZ2RGB}{ColorSpace (CMY) eq {CMY2RGB}{ColorSpace (YIQ) eq {YIQ2RGB}
+ if} ifelse} ifelse} ifelse} def
+/InterpolatedColor false def
+/cF7 {sqrt} bind def % sqrt(x)
+/cF5 {dup dup mul mul} bind def % x^3
+/cF15 {360 mul sin} bind def % sin(360x)
+/pm3dround {maxcolors 0 gt {dup 1 ge
+ {pop 1} {maxcolors mul floor maxcolors 1 sub div} ifelse} if} def
+/pm3dGamma 1.0 1.5 div def
+/ColorSpace (RGB) def
+Color true and { % COLOUR vs. GRAY map
+ InterpolatedColor { %% Interpolation vs. RGB-Formula
+ /g {stroke pm3dround /grayv exch def interpolate
+ SelectSpace setrgbcolor} bind def
+ }{
+ /g {stroke pm3dround dup cF7 Constrain exch dup cF5 Constrain exch cF15 Constrain
+ SelectSpace setrgbcolor} bind def
+ } ifelse
+}{
+ /g {stroke pm3dround pm3dGamma exp setgray} bind def
+} ifelse
+1.000 UL
+LTb
+1799 2144 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Cactus Benchmark)]
+] -46.7 MCshow
+1.000 UP
+%pm3d_map_begin
+.145 g 1080 1038 N -1012 196 337 0 338 0 h
+.3461 g 2430 1038 N 0 -196 338 0 0 196 h
+.2895 g 2093 1038 N 0 -196 337 0 0 196 h
+.2409 g 1755 1038 N 0 -196 338 0 0 196 h
+.1871 g 1418 1038 N 0 -196 337 0 0 196 h
+.4281 g 2430 1234 N 0 -195 338 0 0 195 h
+.3732 g 2093 1234 N 0 -195 337 0 0 195 h
+.3224 g 1755 1234 N 0 -195 338 0 0 195 h
+.2605 g 1418 1234 N 0 -195 337 0 0 195 h
+.1665 g 1080 1038 N 0 -195 675 195 -337 196 h
+.6007 g 2430 1429 N 0 -196 338 0 0 196 h
+.5298 g 2093 1429 N 0 -196 337 0 0 196 h
+.445 g 1755 1429 N 0 -196 338 0 0 196 h
+.3559 g 1418 1429 N 0 -196 337 0 0 196 h
+.7722 g 2430 1625 N 0 -195 338 0 0 195 h
+.7223 g 2093 1625 N 0 -195 337 0 0 195 h
+.6415 g 1755 1625 N 0 -195 338 0 0 195 h
+.4883 g 1418 1625 N 0 -195 337 0 0 195 h
+%pm3d_map_end
+1.000 UL
+LT0
+1.000 UL
+LTb
+634 1934 N
+634 585 L
+2331 0 V
+0 1349 V
+-2331 0 V
+Z stroke
+1.000 UL
+LTb
+744 586 M
+0 41 V
+0 1307 R
+0 -41 V
+941 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1081 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1190 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1279 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1354 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1419 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1476 586 M
+0 41 V
+0 1307 R
+0 -41 V
+744 586 M
+0 82 V
+stroke
+744 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.25)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+744 1934 M
+0 -82 V
+1081 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1279 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1419 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1527 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1616 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1691 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1756 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1812 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1081 586 M
+0 82 V
+stroke
+1081 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+1081 1934 M
+0 -82 V
+1419 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1616 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1756 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1864 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1953 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2028 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2093 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2150 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1419 586 M
+0 82 V
+stroke
+1419 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+1419 1934 M
+0 -82 V
+1756 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1953 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2093 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2201 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2290 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2365 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2430 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2487 586 M
+0 41 V
+0 1307 R
+0 -41 V
+1756 586 M
+0 82 V
+stroke
+1756 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 2)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+1756 1934 M
+0 -82 V
+2093 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2290 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2430 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2539 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2627 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2703 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2768 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2825 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2093 586 M
+0 82 V
+stroke
+2093 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2093 1934 M
+0 -82 V
+2430 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2627 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2768 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2876 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2965 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2430 586 M
+0 82 V
+stroke
+2430 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 8)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2430 1934 M
+0 -82 V
+2768 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2965 586 M
+0 41 V
+0 1307 R
+0 -41 V
+2768 586 M
+0 82 V
+stroke
+2768 404 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2768 1934 M
+0 -82 V
+stroke
+LCb setrgbcolor
+1800 194 M
+[ [(Helvetica) 140.0 0.0 true true 0 (number of MPI processes)]
+] -46.7 MCshow
+LTb
+1.000 UL
+LTb
+635 649 M
+41 0 V
+2289 0 R
+-41 0 V
+635 763 M
+41 0 V
+2289 0 R
+-41 0 V
+635 844 M
+41 0 V
+2289 0 R
+-41 0 V
+635 907 M
+41 0 V
+2289 0 R
+-41 0 V
+635 958 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1002 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1039 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1073 M
+41 0 V
+2289 0 R
+-41 0 V
+635 649 M
+82 0 V
+stroke
+526 649 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.25)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 649 M
+-82 0 V
+635 844 M
+41 0 V
+2289 0 R
+-41 0 V
+635 958 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1039 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1102 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1154 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1197 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1235 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1267 M
+41 0 V
+2289 0 R
+-41 0 V
+635 844 M
+82 0 V
+stroke
+526 844 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.5)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 844 M
+-82 0 V
+635 1039 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1154 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1235 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1297 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1348 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1392 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1429 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1462 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1039 M
+82 0 V
+stroke
+526 1039 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 1039 M
+-82 0 V
+635 1235 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1348 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1429 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1492 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1543 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1587 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1625 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1658 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1235 M
+82 0 V
+stroke
+526 1235 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 2)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 1235 M
+-82 0 V
+635 1429 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1543 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1625 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1687 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1739 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1782 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1820 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1853 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1429 M
+82 0 V
+stroke
+526 1429 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 1429 M
+-82 0 V
+635 1625 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1739 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1820 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1883 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1934 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1625 M
+82 0 V
+stroke
+526 1625 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 8)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 1625 M
+-82 0 V
+635 1820 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1934 M
+41 0 V
+2289 0 R
+-41 0 V
+635 1820 M
+82 0 V
+stroke
+526 1820 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MRshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+2965 1820 M
+-82 0 V
+stroke
+LCb setrgbcolor
+64 1260 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (number of OpenMP threads)]
+] -46.7 MCshow
+grestore
+LTb
+1.000 UL
+LTb
+634 1934 N
+634 585 L
+2331 0 V
+0 1349 V
+-2331 0 V
+Z stroke
+stroke gsave %% draw gray scale smooth box
+maxcolors 0 gt {/imax maxcolors def} {/imax 1024 def} ifelse
+3023 585 translate 117 1349 scale 0 setlinewidth
+/ystep 1 imax div def /y0 0 def /ii 0 def
+{ y0 g 0 y0 N 1 0 V 0 ystep V -1 0 f
+/y0 y0 ystep add def /ii ii 1 add def
+ii imax ge {exit} if } loop
+grestore 0 setgray
+1.000 UL
+LTb
+3023 585 N
+117 0 V
+0 1349 V
+-117 0 V
+0 -1349 V
+Z stroke
+1.000 UL
+LTb
+1.000 UL
+LTb
+3140 585 M
+-63 0 V
+stroke
+3224 585 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 585 M
+63 0 V
+54 269 R
+-63 0 V
+stroke
+3224 854 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 5)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 854 M
+63 0 V
+54 270 R
+-63 0 V
+stroke
+3224 1124 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 10)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 1124 M
+63 0 V
+54 270 R
+-63 0 V
+stroke
+3224 1394 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 15)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 1394 M
+63 0 V
+54 270 R
+-63 0 V
+stroke
+3224 1664 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 20)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 1664 M
+63 0 V
+54 270 R
+-63 0 V
+stroke
+3224 1934 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 25)]
+] -46.7 MLshow
+1.000 UL
+LTb
+3023 1934 M
+63 0 V
+stroke
+LCb setrgbcolor
+3602 1259 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (time per RHS evaluation [)]
+[(Symbol) 140.0 0.0 true true 0 (m)]
+[(Helvetica) 140.0 0.0 true true 0 (s])]
+] -46.7 MCshow
+grestore
+LTb
+1.000 UP
+grestore % colour palette end
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Symbol Helvetica
diff --git a/Carpet/CarpetWeb/scaling-improved/openmp.gnuplot b/Carpet/CarpetWeb/scaling-improved/openmp.gnuplot
new file mode 100644
index 000000000..f0bc72218
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/openmp.gnuplot
@@ -0,0 +1,31 @@
+set terminal postscript eps enhanced color colortext
+set output "openmp.eps"
+
+set size 0.5
+
+set logscale x
+set logscale y
+
+set title "Cactus Benchmark"
+set xlabel "number of MPI processes"
+set ylabel "number of OpenMP threads"
+set xrange [0.2:24]
+set yrange [0.2:24]
+set xtics 2
+set ytics 2
+set cbrange [0:]
+set cblabel "time per RHS evaluation [{/Symbol m}s]"
+
+set pm3d map
+set pm3d
+#set pm3d corners2color c1
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+sp "< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==$5 || $6==16) && $8==71) print; }' results-ranger.out | sort -n -k 7 | awk 'BEGIN { print 0, 0, 0, 0, 0.5, 0, 0.5, 0, 100; print 0, 0, 0, 0, 0.5, 0, 1, 0, 100; print 0, 0, 0, 0, 0.5, 0, 2, 0, 100; print 0, 0, 0, 0, 0.5, 0, 4, 0, 100; print 0, 0, 0, 0, 0.5, 0, 8, 0, 100; print 0, 0, 0, 0, 0.5, 0, 16, 0, 100; } { if ($7!=old7) { print \"\"; print 0, 0, 0, 0, 0.5, 0, old7, 0, 100; } old7=$7; print; }';" u ($5/$7):($7):($9/25**3/128/2/4*1e6) notitle
+
+# TODO: show also ppn-used vs. threads, for mpiprocs=1
diff --git a/Carpet/CarpetWeb/scaling-improved/openmp.pdf b/Carpet/CarpetWeb/scaling-improved/openmp.pdf
new file mode 100644
index 000000000..030f5f76a
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/openmp.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-improved/results-best.eps b/Carpet/CarpetWeb/scaling-improved/results-best.eps
new file mode 100644
index 000000000..bc7e08b28
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-best.eps
@@ -0,0 +1,854 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: results-best.eps
+%%Creator: gnuplot 4.2 patchlevel 4
+%%CreationDate: Thu Mar 26 16:34:37 2009
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 230 176
+%%EndComments
+%%BeginProlog
+/gnudict 256 dict def
+gnudict begin
+%
+% The following 6 true/false flags may be edited by hand if required
+% The unit line width may also be changed
+%
+/Color true def
+/Blacktext false def
+/Solid false def
+/Dashlength 1 def
+/Landscape false def
+/Level1 false def
+/Rounded false def
+/TransparentPatterns false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+%
+/vshift -46 def
+/dl1 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
+} def
+/dl2 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul add } if
+} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+Level1 {} {
+/SDict 10 dict def
+systemdict /pdfmark known not {
+ userdict /pdfmark systemdict /cleartomark get put
+} if
+SDict begin [
+ /Title (results-best.eps)
+ /Subject (gnuplot plot)
+ /Creator (gnuplot 4.2 patchlevel 4 )
+ /Author (Erik Schnetter)
+% /Producer (gnuplot)
+% /Keywords ()
+ /CreationDate (Thu Mar 26 16:34:37 2009)
+ /DOCINFO pdfmark
+end
+} ifelse
+%
+% Gnuplot Prolog Version 4.2 (August 2006)
+%
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/Z {closepath} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow {currentpoint stroke M 0 vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
+/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
+/BL {stroke userlinewidth 2 mul setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/AL {stroke userlinewidth 2 div setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/UL {dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def} def
+/PL {stroke userlinewidth setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+% Default Line colors
+/LCw {1 1 1} def
+/LCb {0 0 0} def
+/LCa {0 0 0} def
+/LC0 {1 0 0} def
+/LC1 {0 1 0} def
+/LC2 {0 0 1} def
+/LC3 {1 0 1} def
+/LC4 {0 1 1} def
+/LC5 {1 1 0} def
+/LC6 {0 0 0} def
+/LC7 {1 0.3 0} def
+/LC8 {0.5 0.5 0.5} def
+% Default Line Types
+/LTw {PL [] 1 setgray} def
+/LTb {BL [] LCb DL} def
+/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
+/LT0 {PL [] LC0 DL} def
+/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
+/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
+/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
+/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
+/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
+/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
+/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
+/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
+/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
+/Dia {stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt} def
+/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt} def
+/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke} def
+/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt} def
+/Star {2 copy Pls Crs} def
+/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill} def
+/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill} def
+/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt} def
+/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill} def
+/Pent {stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt} def
+/PentF {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore} def
+/Circle {stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt} def
+/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
+/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
+/C1 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C2 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C3 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C4 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C5 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc} bind def
+/C6 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C7 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C8 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C9 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C11 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C12 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C13 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C14 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc} bind def
+/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath} bind def
+/Square {dup Rec} bind def
+/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
+/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
+/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
+/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
+/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
+/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare} bind def
+/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare} bind def
+/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
+/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
+/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
+/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
+/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
+/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
+/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
+/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
+/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
+/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
+/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
+/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
+/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
+/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
+/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
+/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
+/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
+/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
+/DiaE {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke} def
+/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke} def
+/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke} def
+/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke} def
+/PentE {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore} def
+/CircE {stroke [] 0 setdash
+ hpt 0 360 arc stroke} def
+/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
+/DiaW {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke} def
+/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke} def
+/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke} def
+/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke} def
+/PentW {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore} def
+/CircW {stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke} def
+/BoxFill {gsave Rec 1 setgray fill grestore} def
+/Density {
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor} def
+/BoxColFill {gsave Rec PolyFill} def
+/PolyFill {gsave Density fill grestore grestore} def
+/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
+%
+% PostScript Level 1 Pattern Fill routine for rectangles
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill {gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 M 0 PFs V} for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 2 1 roll M PFs 0 V} for
+ } if
+ stroke grestore} def
+%
+/languagelevel where
+ {pop languagelevel} {1} ifelse
+ 2 lt
+ {/InterpretLevel1 true def}
+ {/InterpretLevel1 Level1 def}
+ ifelse
+%
+% PostScript level 2 pattern fill definitions
+%
+/Level2PatternFill {
+/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
+ bind def
+/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
+>> matrix makepattern
+/Pat1 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
+ 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
+>> matrix makepattern
+/Pat2 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
+ 8 8 L 8 0 L 0 0 L fill}
+>> matrix makepattern
+/Pat3 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
+ 0 12 M 12 0 L stroke}
+>> matrix makepattern
+/Pat4 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
+ 0 -4 M 12 8 L stroke}
+>> matrix makepattern
+/Pat5 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
+ 0 12 M 8 -4 L 4 12 M 10 0 L stroke}
+>> matrix makepattern
+/Pat6 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
+ 0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
+>> matrix makepattern
+/Pat7 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
+ 12 0 M -4 8 L 12 4 M 0 10 L stroke}
+>> matrix makepattern
+/Pat8 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
+ -4 0 M 12 8 L -4 4 M 8 10 L stroke}
+>> matrix makepattern
+/Pat9 exch def
+/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
+/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
+/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
+/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
+/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
+/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
+/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
+} def
+%
+%
+%End of PostScript Level 2 code
+%
+/PatternBgnd {
+ TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
+} def
+%
+% Substitute for Level 2 pattern fill codes with
+% grayscale if Level 2 support is not selected.
+%
+/Level1PatternFill {
+/Pattern1 {0.250 Density} bind def
+/Pattern2 {0.500 Density} bind def
+/Pattern3 {0.750 Density} bind def
+/Pattern4 {0.125 Density} bind def
+/Pattern5 {0.375 Density} bind def
+/Pattern6 {0.625 Density} bind def
+/Pattern7 {0.875 Density} bind def
+} def
+%
+% Now test for support of Level 2 code
+%
+Level1 {Level1PatternFill} {Level2PatternFill} ifelse
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+/MFshow {
+ { dup 5 get 3 ge
+ { 5 get 3 eq {gsave} {grestore} ifelse }
+ {dup dup 0 get findfont exch 1 get scalefont setfont
+ [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
+ get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
+ {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
+ get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
+ dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
+ show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
+ pop aload pop M} ifelse }ifelse }ifelse }
+ ifelse }
+ forall} bind def
+/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
+ {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
+ 6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
+/MLshow { currentpoint stroke M
+ 0 exch R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MRshow { currentpoint stroke M
+ exch dup MFwidth neg 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MCshow { currentpoint stroke M
+ exch dup MFwidth -2 div 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/XYsave { [( ) 1 2 true false 3 ()] } bind def
+/XYrestore { [( ) 1 2 true false 4 ()] } bind def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+798 448 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 448 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 655 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 655 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 5)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 861 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 10)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 1068 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 1068 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 15)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 1274 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 1274 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 20)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 1481 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 1481 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 25)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 1687 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 1687 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 30)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 1894 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 1894 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 35)]
+] -46.7 MRshow
+1.000 UL
+LTb
+798 2100 M
+63 0 V
+2585 0 R
+-63 0 V
+stroke
+714 2100 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 40)]
+] -46.7 MRshow
+1.000 UL
+LTb
+888 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+888 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1239 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1239 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1590 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1590 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1940 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1940 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 64)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2291 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2291 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 256)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2642 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2642 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (1k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2993 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2993 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (4k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3343 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3343 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (16k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+798 2100 N
+798 448 L
+2648 0 V
+0 1652 V
+-2648 0 V
+Z stroke
+LCb setrgbcolor
+308 1274 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (time per RHS evaluation [)]
+[(Symbol) 140.0 0.0 true true 0 (m)]
+[(Helvetica) 140.0 0.0 true true 0 (s])]
+] -46.7 MCshow
+grestore
+LTb
+LCb setrgbcolor
+2122 98 M
+[ [(Helvetica) 140.0 0.0 true true 0 (number of cores)]
+] -46.7 MCshow
+LTb
+2122 2310 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Cactus Benchmark)]
+] -46.7 MCshow
+1.000 UP
+1.000 UL
+LTb
+1.000 UP
+3.000 UL
+LT0
+LTb
+2795 1141 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Franklin)]
+] -46.7 MRshow
+LT0
+2879 1141 M
+399 0 V
+888 966 M
+176 150 V
+175 251 V
+175 82 V
+176 72 V
+175 47 V
+175 52 V
+176 -78 V
+175 -69 V
+176 -74 V
+175 -55 V
+392 -18 V
+134 27 V
+888 966 Pls
+1064 1116 Pls
+1239 1367 Pls
+1414 1449 Pls
+1590 1521 Pls
+1765 1568 Pls
+1940 1620 Pls
+2116 1542 Pls
+2291 1473 Pls
+2467 1399 Pls
+2642 1344 Pls
+3034 1326 Pls
+3168 1353 Pls
+3078 1141 Pls
+1.000 UP
+3.000 UL
+LT1
+LTb
+2795 1001 M
+[ [(Helvetica) 140.0 0.0 true true 0 (HLRB II)]
+] -46.7 MRshow
+LT1
+2879 1001 M
+399 0 V
+888 966 M
+176 256 V
+175 231 V
+175 108 V
+176 104 V
+175 160 V
+175 149 V
+176 -111 V
+175 -85 V
+176 -18 V
+350 155 V
+888 966 Crs
+1064 1222 Crs
+1239 1453 Crs
+1414 1561 Crs
+1590 1665 Crs
+1765 1825 Crs
+1940 1974 Crs
+2116 1863 Crs
+2291 1778 Crs
+2467 1760 Crs
+2817 1915 Crs
+3078 1001 Crs
+1.000 UP
+3.000 UL
+LT2
+LTb
+2795 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Kraken \(NT=1\))]
+] -46.7 MRshow
+LT2
+2879 861 M
+399 0 V
+1239 1399 M
+175 91 V
+176 78 V
+175 50 V
+175 62 V
+176 -79 V
+175 -65 V
+176 -91 V
+175 -53 V
+175 33 V
+176 -54 V
+175 13 V
+1239 1399 Star
+1414 1490 Star
+1590 1568 Star
+1765 1618 Star
+1940 1680 Star
+2116 1601 Star
+2291 1536 Star
+2467 1445 Star
+2642 1392 Star
+2817 1425 Star
+2993 1371 Star
+3168 1384 Star
+3078 861 Star
+1.000 UP
+3.000 UL
+LT3
+LTb
+2795 721 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Queen Bee \(NT=2\))]
+] -46.7 MRshow
+LT3
+2879 721 M
+399 0 V
+1064 995 M
+175 244 V
+175 325 V
+176 46 V
+175 31 V
+175 134 V
+176 -7 V
+175 43 V
+176 -16 V
+175 41 V
+175 -30 V
+1064 995 Box
+1239 1239 Box
+1414 1564 Box
+1590 1610 Box
+1765 1641 Box
+1940 1775 Box
+2116 1768 Box
+2291 1811 Box
+2467 1795 Box
+2642 1836 Box
+2817 1806 Box
+3078 721 Box
+1.000 UP
+3.000 UL
+LT4
+LTb
+2795 581 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Ranger \(NT=1\))]
+] -46.7 MRshow
+LT4
+2879 581 M
+399 0 V
+888 798 M
+176 131 V
+175 108 V
+175 133 V
+176 165 V
+175 83 V
+175 107 V
+176 38 V
+175 -3 V
+176 5 V
+175 16 V
+175 -103 V
+176 147 V
+175 -57 V
+103 11 V
+888 798 BoxF
+1064 929 BoxF
+1239 1037 BoxF
+1414 1170 BoxF
+1590 1335 BoxF
+1765 1418 BoxF
+1940 1525 BoxF
+2116 1563 BoxF
+2291 1560 BoxF
+2467 1565 BoxF
+2642 1581 BoxF
+2817 1478 BoxF
+2993 1625 BoxF
+3168 1568 BoxF
+3271 1579 BoxF
+3078 581 BoxF
+1.000 UL
+LTb
+798 2100 N
+798 448 L
+2648 0 V
+0 1652 V
+-2648 0 V
+Z stroke
+1.000 UP
+1.000 UL
+LTb
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Symbol Helvetica
diff --git a/Carpet/CarpetWeb/scaling-improved/results-best.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-best.gnuplot
new file mode 100644
index 000000000..a6d513861
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-best.gnuplot
@@ -0,0 +1,28 @@
+set terminal postscript eps enhanced color colortext
+set output "results-best.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8== 0) print; }' results-franklin.out" u 5:($9/25**3/128/2/4*1e6) t "Franklin" w lp lt 1 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8==10) print; }' results-hlrb2.out" u 5:($9/25**3/128/2/4*1e6) t "HLRB II" w lp lt 2 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "Kraken (NT=1)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 2 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e6) t "Queen Bee (NT=2)" w lp lt 4 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 1 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e6) t "Ranger (NT=1)" w lp lt 5 lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-best.pdf b/Carpet/CarpetWeb/scaling-improved/results-best.pdf
new file mode 100644
index 000000000..33914ba94
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-best.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-improved/results-best.png b/Carpet/CarpetWeb/scaling-improved/results-best.png
new file mode 100644
index 000000000..72ce65072
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-best.png
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-improved/results-franklin.out b/Carpet/CarpetWeb/scaling-improved/results-franklin.out
new file mode 100644
index 000000000..e06898667
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-franklin.out
@@ -0,0 +1,61 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000001 01 01 00 46.59141803 46.54692400
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000002 02 01 00 64.66142988 64.03200700
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000002 02 02 00 106.16554523 106.07061500
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000004 04 01 00 99.28665590 97.61407500
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000004 04 02 00 138.40062428 137.36857400
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000004 04 04 00 185.69085288 185.13554300
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000008 04 01 00 134.16131091 131.96025200
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000008 04 02 00 193.42913461 191.87198200
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000008 04 04 00 254.52130032 253.30783200
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000016 04 01 00 146.17235804 144.01698800
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000016 04 02 00 206.43724728 204.82077300
+Bench_McLachlan_Carpet_9lev 000128 0016 franklin 000016 04 04 00 349.00458694 347.49770200
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000001 01 01 00 109.02620959 108.30275200
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000002 02 01 00 153.42561579 152.54552000
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000002 02 02 00 205.82838392 205.10481500
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000004 04 01 00 200.73065782 198.60041000
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000004 04 02 00 312.24916768 310.29545300
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000004 04 04 00 413.10681486 410.76164900
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000008 04 01 00 226.20393562 223.07393600
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000008 04 02 00 308.03878021 305.65912700
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000008 04 04 00 497.83455467 495.27092500
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000016 04 01 00 243.05851984 240.24699000
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000016 04 02 00 334.25339341 330.78065500
+Bench_McLachlan_Carpet_9lev 000128 0020 franklin 000016 04 04 00 555.86645508 552.71452600
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000001 01 01 00 200.52615380 200.11651900
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000002 02 01 00 258.85028219 257.58810300
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000002 02 02 00 376.77956176 374.53139800
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000004 04 01 00 356.12734818 352.49403200
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000004 04 02 00 467.80149412 464.40499100
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000004 04 04 00 703.13283277 698.62764900
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000008 04 01 00 387.94961166 383.00392000
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000008 04 02 00 529.59994006 524.28075700
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000008 04 04 00 827.06824517 821.43530600
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000016 04 01 00 415.75278378 411.28570600
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000016 04 02 00 600.05137348 593.86910000
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000016 04 04 00 999.85881615 992.26602400
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000032 04 01 00 433.85825539 429.98283300
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000064 04 01 00 454.07660961 451.30421500
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000128 04 01 00 423.68280458 420.67826400
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000256 04 01 00 396.90142655 393.84460100
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 000512 04 01 00 368.35541272 365.66287100
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 001024 04 01 00 347.23339319 344.68554700
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 004816 04 01 00 339.97812581 337.50111100
+Bench_McLachlan_Carpet_9lev 000128 0025 franklin 008192 04 01 00 350.57442069 348.11775800
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000001 01 01 00 342.52737689 341.37732300
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000002 02 01 00 411.65423775 409.59765500
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000002 02 02 00 675.66905141 672.46602300
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000004 04 01 00 540.94369054 532.70927500
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000004 04 02 00 788.15172911 781.74488600
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000004 04 04 00 1095.25965381 1087.87998700
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000008 04 01 00 593.98074484 585.41257700
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000008 04 02 00 827.25919771 818.51112900
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000008 04 04 00 1241.78931952 1230.92093400
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000016 04 01 00 617.07089901 610.27012600
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000016 04 02 00 972.72111559 961.15606200
+Bench_McLachlan_Carpet_9lev 000128 0030 franklin 000016 04 04 00 1827.67744350 1814.06942400
diff --git a/Carpet/CarpetWeb/scaling-improved/results-hlrb2.out b/Carpet/CarpetWeb/scaling-improved/results-hlrb2.out
new file mode 100644
index 000000000..b0e9853ab
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-hlrb2.out
@@ -0,0 +1,85 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000024 0020 hlrb2 000001 01 01 00 5.13499665 5.14400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000001 01 01 00 186.91880655 185.61600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000002 02 01 00 220.20438910 219.11600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000002 02 02 00 214.55147696 423.92400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 01 00 231.18661833 230.90000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 02 00 251.77147675 492.43200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 04 00 291.56947160 1082.29200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 01 00 284.81413913 284.18800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 02 00 306.43832397 590.70000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 04 00 324.80125213 1212.27600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 08 00 369.53091407 2550.59200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 01 00 301.74512243 301.32800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 02 00 305.04176641 579.66400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 04 00 363.74049592 1335.77600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 08 00 426.92180514 2849.48800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 16 00 474.11036873 5928.32400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 01 00 312.45066810 311.97600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 02 00 350.20448923 654.86000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 04 00 431.81555462 1477.58400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 08 00 471.02439666 3095.39600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 16 00 628.79774189 7100.15200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 32 00 675.18877506 14212.50000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 01 00 335.72597265 335.33600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 02 00 391.93287492 682.36400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 04 00 453.71378946 1517.36000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 08 00 540.30726910 3248.62000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 16 00 732.82437968 7613.05600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 32 00 867.69349027 16565.68400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 64 00 1005.85764909 37395.58400000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000001 01 01 10 1.29906511 1.20000000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000002 02 01 10 2.13740206 2.10400000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000004 04 01 10 2.62449074 2.54800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000008 08 01 10 2.21243858 2.19200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000016 16 01 10 2.43998551 2.32800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000032 32 01 10 2.35174751 2.33200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000064 64 01 10 2.89009404 2.89200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000128 128 01 10 2.22359061 2.20000000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000256 256 01 10 2.50717616 2.46800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000512 512 01 10 6.91676068 6.71600000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 001024 1024 01 10 30.94050145 30.87600000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 002048 2048 01 10 3.83641720 3.80800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000001 01 01 00 182.51141620 182.02400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000001 01 01 10 200.79874182 200.18800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 01 00 281.35725307 280.12400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 01 10 299.81318593 298.43600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 02 00 204.77519417 405.15200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 01 00 373.53716779 371.05200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 01 10 389.50963879 387.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 02 00 323.96468210 635.69600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 04 00 274.13237286 1066.83600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 01 00 416.79449534 413.90000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 01 10 431.01822519 428.78400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 02 00 402.00020862 783.81200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 04 00 471.18366361 1798.19600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 08 00 345.37232614 2586.30400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 01 00 490.85937953 489.64400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 01 10 471.45920944 469.04800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 02 00 455.23554587 885.59600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 04 00 582.81878591 2200.88000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 08 00 639.37896895 4726.56800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 16 00 485.79755044 6897.66400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 01 00 525.12310481 524.21200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 01 10 533.41243887 532.36800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 02 00 506.58320308 957.85600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 04 00 643.36008477 2417.87600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 08 00 858.16334009 6280.97200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 16 00 1073.52412605 15029.21600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 32 00 796.23935318 20802.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 01 00 595.84084988 595.24800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 01 10 591.00428939 590.34400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 02 00 599.32032919 1027.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 04 00 741.07681203 2395.47200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 08 00 926.82490373 6575.82000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 16 00 1314.07155108 17533.72400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 32 00 1355.17224264 33640.83200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 64 00 1319.33960485 57778.41600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000128 128 01 10 548.16778946 547.12800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000256 256 01 10 515.22758889 513.61200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000512 512 01 10 508.34639978 505.00800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 002048 2048 01 10 568.32370758 567.65200000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-kraken.out b/Carpet/CarpetWeb/scaling-improved/results-kraken.out
new file mode 100644
index 000000000..f9728c756
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-kraken.out
@@ -0,0 +1,155 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000001 01 01 33 109.19729781 108.99882800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000001 01 01 34 109.09158993 108.95080200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 01 01 33 148.00641775 147.46521000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 01 01 34 148.16187906 147.77725300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 01 33 102.00947356 101.07031500
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 01 34 156.70413160 155.81374400
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 02 33 120.50324011 119.90754000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 02 34 120.47982860 120.00346300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 01 01 33 178.69807887 177.90312300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 01 01 34 178.83109379 178.35513800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 01 33 125.59497881 124.02373500
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 01 34 186.82694960 185.61961300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 02 33 181.93941998 181.19531200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 02 34 181.48260045 180.60730600
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 01 34 211.47782874 209.34510400
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 02 34 200.71978760 198.68443700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 04 33 149.56758142 148.14525800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 04 34 149.55455232 148.19328600
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 01 33 136.45625806 134.60037200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 01 34 209.99556732 208.06101300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 02 33 180.95635247 179.98325900
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 02 34 180.68239951 179.73525700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 01 34 237.70729899 234.50266700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 02 34 197.34633946 194.59619800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 04 33 188.64441633 187.08766200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 04 34 188.58916926 187.20766000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 01 34 255.59704399 252.35976700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 02 34 215.29695988 212.00524800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 04 33 215.65991402 213.45737200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 04 34 215.44885087 213.58133100
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 016384 04 01 34 247.56583500 238.97092800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 016384 04 04 34 235.92132401 234.86663400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000001 01 01 33 202.49026227 201.88463000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000001 01 01 34 202.58828378 202.18864100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 01 01 33 264.73202300 264.27650400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 01 01 34 264.90249634 264.41650800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 01 33 165.44561672 164.02621600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 01 34 264.46396589 263.09642300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 02 33 214.43991065 212.49327000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 02 34 214.37821507 212.40132200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 01 01 33 328.79410410 327.94450300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 01 01 34 329.11067104 328.30052900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 01 33 206.90042567 204.72480900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 01 34 336.04583859 333.90087900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 02 33 271.49293232 269.68886600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 02 34 271.63745141 270.14490100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 34 372.38452768 367.98705000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 40 372.03597379 367.97498500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 41 392.82768083 380.37575900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 42 373.66510510 369.27107700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 50 368.31895638 364.48679000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 51 389.47344708 376.82760600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 52 381.81449485 369.91510800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 02 34 290.58105302 287.16990900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 04 33 249.97653389 247.73548000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 04 34 249.93689775 247.75549200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 01 33 221.96153808 219.27369900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 01 34 361.20681596 358.99450800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 02 33 301.06568599 298.90267800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 02 34 300.77219176 298.41466800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 34 407.60074544 401.93712300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 40 406.22219968 400.48103400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 41 432.37560892 417.52610000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 42 406.76333976 401.51711500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 50 403.65297389 398.66888300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 51 427.29224968 414.18987800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 52 421.87990785 407.86147400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 02 34 323.52657080 318.13587900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 04 33 285.03661680 281.53359100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 04 34 285.44802928 281.94565700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 34 438.65774727 433.75105700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 40 437.11231232 432.00299900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 41 471.07068157 458.44064900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 42 436.67520261 431.73097400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 50 433.79905939 429.07077700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 51 468.87827706 455.78450100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 52 465.03736973 453.38033300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 02 34 368.64797521 362.79467100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 04 33 352.07736850 347.05771000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 04 34 352.05782557 347.29366700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 34 457.92055535 453.76035900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 40 455.55066156 451.18017200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 41 498.60762858 489.55061300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 42 458.02307916 453.80837500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 50 453.33379769 449.05209000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 51 491.67039084 482.87815000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 52 490.74024415 479.36598700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 02 34 377.04069376 372.46728400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 04 34 400.57756186 393.43260000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 34 480.94191217 478.12985600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 40 481.26686096 478.52986600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 41 537.32176471 531.71323500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 42 480.81742573 477.93786000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 43 537.09543371 530.57710700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 50 477.42585325 474.75770700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 51 533.61160135 527.58096600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 52 543.91181445 536.93353600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 02 34 398.29332542 394.60868200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 04 34 456.41613126 454.54041600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 34 450.16913104 447.73999500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 40 451.70227528 448.60801500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 41 508.44143081 502.75140000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 42 449.33756542 446.68789900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 50 446.53416204 443.65970800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 51 500.59744263 494.36288200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 52 517.28014588 510.25591400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 02 34 407.26108623 403.70926900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 04 34 451.18516040 450.31215100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 34 422.14895868 419.53817200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 40 421.97694206 419.01421600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 41 475.54798317 470.22535700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 42 421.12047768 418.43815100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 50 421.50431681 418.52209200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 51 476.86723900 470.84938700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 52 518.99811196 512.80408400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 02 34 420.01091719 416.57804300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 04 34 453.44058633 452.18426700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 34 389.54352736 386.97619000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 40 390.15875745 387.68823700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 41 454.51942396 450.28011900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 42 391.22567034 388.69628300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 50 386.16655254 383.67997000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 51 458.97451353 454.44442800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 52 490.89922404 485.80636300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 02 34 388.41631484 385.63210600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 04 34 383.46425056 382.26388500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 34 369.72977018 367.19493400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 40 368.90278816 366.38286900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 41 439.54885840 434.64718200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 42 369.72414255 367.41096000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 50 365.84427381 363.40272800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 51 436.93441629 431.95500700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 52 480.04649687 474.67367400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 04 34 405.19849849 404.13726000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 34 353.80410862 351.20992500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 50 378.49561858 376.21552700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 51 476.40951514 471.73747300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 52 523.34186959 518.44838400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 04 34 388.17184496 387.18421600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 34 356.66594577 354.00613500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 50 357.60511637 355.38218100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 51 484.72250724 480.57803300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 52 502.55980611 496.09100500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 04 34 377.75547314 376.76753700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 34 358.68025899 356.47829200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 50 362.58709908 360.02246700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 51 496.09946489 492.02273600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 52 494.35133028 489.53059200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 04 34 377.67238784 376.55554100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 016384 04 04 34 360.58743620 359.65844000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-kraken.out.old b/Carpet/CarpetWeb/scaling-improved/results-kraken.out.old
new file mode 100644
index 000000000..f9728c756
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-kraken.out.old
@@ -0,0 +1,155 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000001 01 01 33 109.19729781 108.99882800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000001 01 01 34 109.09158993 108.95080200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 01 01 33 148.00641775 147.46521000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 01 01 34 148.16187906 147.77725300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 01 33 102.00947356 101.07031500
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 01 34 156.70413160 155.81374400
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 02 33 120.50324011 119.90754000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000002 02 02 34 120.47982860 120.00346300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 01 01 33 178.69807887 177.90312300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 01 01 34 178.83109379 178.35513800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 01 33 125.59497881 124.02373500
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 01 34 186.82694960 185.61961300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 02 33 181.93941998 181.19531200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 02 02 34 181.48260045 180.60730600
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 01 34 211.47782874 209.34510400
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 02 34 200.71978760 198.68443700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 04 33 149.56758142 148.14525800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000004 04 04 34 149.55455232 148.19328600
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 01 33 136.45625806 134.60037200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 01 34 209.99556732 208.06101300
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 02 33 180.95635247 179.98325900
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 02 02 34 180.68239951 179.73525700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 01 34 237.70729899 234.50266700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 02 34 197.34633946 194.59619800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 04 33 188.64441633 187.08766200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000008 04 04 34 188.58916926 187.20766000
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 01 34 255.59704399 252.35976700
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 02 34 215.29695988 212.00524800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 04 33 215.65991402 213.45737200
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 000016 04 04 34 215.44885087 213.58133100
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 016384 04 01 34 247.56583500 238.97092800
+Bench_McLachlan_Carpet_9lev 000128 0020 kraken 016384 04 04 34 235.92132401 234.86663400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000001 01 01 33 202.49026227 201.88463000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000001 01 01 34 202.58828378 202.18864100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 01 01 33 264.73202300 264.27650400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 01 01 34 264.90249634 264.41650800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 01 33 165.44561672 164.02621600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 01 34 264.46396589 263.09642300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 02 33 214.43991065 212.49327000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 02 34 214.37821507 212.40132200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 01 01 33 328.79410410 327.94450300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 01 01 34 329.11067104 328.30052900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 01 33 206.90042567 204.72480900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 01 34 336.04583859 333.90087900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 02 33 271.49293232 269.68886600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 02 34 271.63745141 270.14490100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 34 372.38452768 367.98705000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 40 372.03597379 367.97498500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 41 392.82768083 380.37575900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 42 373.66510510 369.27107700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 50 368.31895638 364.48679000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 51 389.47344708 376.82760600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 52 381.81449485 369.91510800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 02 34 290.58105302 287.16990900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 04 33 249.97653389 247.73548000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 04 34 249.93689775 247.75549200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 01 33 221.96153808 219.27369900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 01 34 361.20681596 358.99450800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 02 33 301.06568599 298.90267800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 02 34 300.77219176 298.41466800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 34 407.60074544 401.93712300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 40 406.22219968 400.48103400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 41 432.37560892 417.52610000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 42 406.76333976 401.51711500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 50 403.65297389 398.66888300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 51 427.29224968 414.18987800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 52 421.87990785 407.86147400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 02 34 323.52657080 318.13587900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 04 33 285.03661680 281.53359100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 04 34 285.44802928 281.94565700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 34 438.65774727 433.75105700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 40 437.11231232 432.00299900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 41 471.07068157 458.44064900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 42 436.67520261 431.73097400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 50 433.79905939 429.07077700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 51 468.87827706 455.78450100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 52 465.03736973 453.38033300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 02 34 368.64797521 362.79467100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 04 33 352.07736850 347.05771000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 04 34 352.05782557 347.29366700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 34 457.92055535 453.76035900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 40 455.55066156 451.18017200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 41 498.60762858 489.55061300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 42 458.02307916 453.80837500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 50 453.33379769 449.05209000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 51 491.67039084 482.87815000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 52 490.74024415 479.36598700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 02 34 377.04069376 372.46728400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 04 34 400.57756186 393.43260000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 34 480.94191217 478.12985600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 40 481.26686096 478.52986600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 41 537.32176471 531.71323500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 42 480.81742573 477.93786000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 43 537.09543371 530.57710700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 50 477.42585325 474.75770700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 51 533.61160135 527.58096600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 52 543.91181445 536.93353600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 02 34 398.29332542 394.60868200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 04 34 456.41613126 454.54041600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 34 450.16913104 447.73999500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 40 451.70227528 448.60801500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 41 508.44143081 502.75140000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 42 449.33756542 446.68789900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 50 446.53416204 443.65970800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 51 500.59744263 494.36288200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 52 517.28014588 510.25591400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 02 34 407.26108623 403.70926900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 04 34 451.18516040 450.31215100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 34 422.14895868 419.53817200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 40 421.97694206 419.01421600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 41 475.54798317 470.22535700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 42 421.12047768 418.43815100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 50 421.50431681 418.52209200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 51 476.86723900 470.84938700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 52 518.99811196 512.80408400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 02 34 420.01091719 416.57804300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 04 34 453.44058633 452.18426700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 34 389.54352736 386.97619000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 40 390.15875745 387.68823700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 41 454.51942396 450.28011900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 42 391.22567034 388.69628300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 50 386.16655254 383.67997000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 51 458.97451353 454.44442800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 52 490.89922404 485.80636300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 02 34 388.41631484 385.63210600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 04 34 383.46425056 382.26388500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 34 369.72977018 367.19493400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 40 368.90278816 366.38286900
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 41 439.54885840 434.64718200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 42 369.72414255 367.41096000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 50 365.84427381 363.40272800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 51 436.93441629 431.95500700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 52 480.04649687 474.67367400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 04 34 405.19849849 404.13726000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 34 353.80410862 351.20992500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 50 378.49561858 376.21552700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 51 476.40951514 471.73747300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 52 523.34186959 518.44838400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 04 34 388.17184496 387.18421600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 34 356.66594577 354.00613500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 50 357.60511637 355.38218100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 51 484.72250724 480.57803300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 52 502.55980611 496.09100500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 04 34 377.75547314 376.76753700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 34 358.68025899 356.47829200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 50 362.58709908 360.02246700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 51 496.09946489 492.02273600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 52 494.35133028 489.53059200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 04 34 377.67238784 376.55554100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 016384 04 04 34 360.58743620 359.65844000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-old.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-old.gnuplot
new file mode 100644
index 000000000..640ab4e33
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-old.gnuplot
@@ -0,0 +1,28 @@
+set terminal postscript eps enhanced color colortext
+set output "results-old.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:4096]
+set yrange [0:30]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set parametric
+set trange [0:100]
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"KL9_CCT_vacuum.asc" u 1:($4/25**3/128/2/4*1e6) t "Ranger, Sept. 2008" w lp lw 3, \
+16, t t "node boundary"
diff --git a/Carpet/CarpetWeb/scaling-improved/results-openmp-node.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-openmp-node.gnuplot
new file mode 100644
index 000000000..c3cb5e0b1
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-openmp-node.gnuplot
@@ -0,0 +1,30 @@
+set terminal postscript eps enhanced color colortext
+set output "results-openmp-node.eps"
+
+set size 0.5
+
+set logscale x
+set xtics 2
+set xrange [0.7:24]
+set yrange [0:]
+
+set title "Cactus Benchmark (using 1 node)"
+set xlabel "number of MPI processes"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"results-ranger-openmp-node.out" u 5:($9/25**3/128/2/4*1e6) t "Ranger (varying NT)" w lp lw 3
+#p \
+#"results-ranger-openmp-node.out" u 5:($7== 1 ? $9/25**3/128/2/4*1e6 : 0/0) t "Ranger (NT=1)" w lp lw 3, \
+#"results-ranger-openmp-node.out" u 5:($7== 2 ? $9/25**3/128/2/4*1e6 : 0/0) t "Ranger (NT=2)" w lp lw 3, \
+#"results-ranger-openmp-node.out" u 5:($7== 4 ? $9/25**3/128/2/4*1e6 : 0/0) t "Ranger (NT=4)" w lp lw 3, \
+#"results-ranger-openmp-node.out" u 5:($7== 8 ? $9/25**3/128/2/4*1e6 : 0/0) t "Ranger (NT=8)" w lp lw 3, \
+#"results-ranger-openmp-node.out" u 5:($7==16 ? $9/25**3/128/2/4*1e6 : 0/0) t "Ranger (NT=16)" w lp lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-openmp-procs.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-openmp-procs.gnuplot
new file mode 100644
index 000000000..f39e8dac7
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-openmp-procs.gnuplot
@@ -0,0 +1,24 @@
+set terminal postscript eps enhanced color colortext
+set output "results-openmp-procs.eps"
+
+set size 0.5
+
+set logscale x
+set xtics 2
+set xrange [0.7:24]
+set yrange [0:]
+
+set title "Cactus Benchmark (using 16 cores)"
+set xlabel "number of allocated nodes"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"results-ranger-openmp-procs.out" u ($5/$6):($9/25**3/128/2/4*1e6) t "Ranger (varying NT)" w lp lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-queenbee.out b/Carpet/CarpetWeb/scaling-improved/results-queenbee.out
new file mode 100644
index 000000000..5db4b6512
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-queenbee.out
@@ -0,0 +1,64 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000001 01 01 00 192.41465856 192.19000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 01 01 00 247.58707602 247.54000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 02 01 00 252.84641560 252.63000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 02 02 00 211.89443066 423.22000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 01 01 00 291.86994262 291.58000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 02 01 00 299.71507797 299.27000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 02 02 00 284.05902364 560.60000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 01 00 327.73749532 327.60000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 02 00 306.53941308 601.71000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 04 00 266.50271884 1047.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 01 01 00 334.87156639 334.98000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 02 01 00 341.38289479 341.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 02 02 00 329.95559572 650.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 01 00 363.86975480 363.84000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 02 00 347.63124832 685.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 04 00 349.35187769 1372.93000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 01 00 472.02766403 471.96000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 02 00 432.37333332 848.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 04 00 405.74953017 1589.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 08 00 311.92569237 2418.38000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 02 01 00 376.39248101 376.05000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 02 02 00 360.33294887 704.33000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 01 00 391.21701541 391.10000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 02 00 376.96218700 738.11000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 04 00 427.00053038 1655.09000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 01 00 487.31315479 487.13000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 02 00 450.30715053 886.20000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 04 00 478.74580880 1858.89000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 08 00 451.08012243 3476.24000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 01 00 412.51873882 412.45000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 02 00 397.65224627 781.26000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 04 00 494.58752844 1893.86000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 01 00 521.08718036 520.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 02 00 462.28543603 901.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 04 00 536.74782493 2071.99000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 08 00 553.78660053 4207.04000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 01 00 534.01307232 534.02000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 02 00 514.00439649 964.46000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 04 00 589.64245797 2178.76000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 08 00 648.65108784 4776.36000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 01 00 521.74439626 521.24000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 02 00 511.19930447 956.29000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 04 00 619.28712022 2143.82000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 08 00 695.10842290 5124.03000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 01 00 514.35862553 514.12000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 02 00 528.11674355 977.45000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 04 00 625.20248372 2171.54000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 08 00 750.10765112 5297.43000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 01 00 508.68920159 508.38000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 02 00 521.84319640 969.64000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 04 00 595.94903104 2098.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 08 00 820.56607938 4984.09000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 01 00 483.79867738 483.14000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 02 00 537.76884637 990.30000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 04 00 619.06761756 2145.23000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 08 00 794.11657260 5014.59000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 02 00 526.11768787 968.65000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 04 00 624.46017058 2173.93000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 08 00 751.06089897 4937.30000000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-node.out b/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-node.out
new file mode 100644
index 000000000..8e2712572
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-node.out
@@ -0,0 +1,20 @@
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 71 135.63270587 135.40044100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 71 186.41453722 186.15565600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 71 228.27816767 228.01424800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 71 279.55088937 277.57337300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 71 141.51701227 281.73762600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 71 209.97284200 414.55791500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 71 242.58659491 479.38994400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 71 257.80748799 1012.46728000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 71 328.67928713 1292.82478800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 71 291.50975695 2271.12593300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
diff --git a/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-procs.out b/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-procs.out
new file mode 100644
index 000000000..3f100e361
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-ranger-openmp-procs.out
@@ -0,0 +1,20 @@
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 71 292.02127953 289.43007600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 71 295.99160188 294.03436700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 71 296.42845066 294.75439600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 71 300.73102585 300.54277200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 71 274.05435093 535.64549700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 71 274.77006856 537.34158400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 71 267.87115046 526.22084900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 71 380.32455437 1480.97253000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 71 397.65546045 1544.81659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 71 414.87878198 3210.36063800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
diff --git a/Carpet/CarpetWeb/scaling-improved/results-ranger.out b/Carpet/CarpetWeb/scaling-improved/results-ranger.out
new file mode 100644
index 000000000..f3d2cd6f5
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-ranger.out
@@ -0,0 +1,731 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000001 01 01 00 203.34181004 203.17269400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000002 01 01 00 216.48381171 214.91743400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 01 01 00 224.79743401 222.67391600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 01 00 225.55916500 223.26195300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 02 00 227.73820433 448.76805100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 01 00 250.15185397 247.88349900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 02 00 228.08169453 449.48009900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 04 00 217.13066064 842.24063700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 01 01 00 233.10094116 229.75036200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 01 00 233.19921911 229.78636000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 02 00 244.37134496 477.12581700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 01 00 258.23619396 254.33989300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 02 00 244.90335442 477.42583900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 04 00 249.90565515 961.74010700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 01 00 269.97584784 266.77666800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 02 00 263.66399936 514.15613600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 04 00 251.26438961 962.74016300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 08 00 451.35835544 1759.58196800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 01 01 00 251.79208282 248.25551300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 01 00 250.43519239 247.35945700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 02 00 262.76931463 499.52722200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 01 00 272.61282118 268.75279900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 02 00 263.38652800 497.81511700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 04 00 267.84285138 1015.03143900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 01 00 283.82180268 280.40552400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 02 00 276.44695753 529.56109800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 04 00 269.95993217 1019.53972100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 02 00 302.52861096 580.79630100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 04 00 287.96300239 1085.59584900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 08 00 506.02417788 1958.31438900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 16 00 945.63415069 3586.02411700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 01 00 244.06186508 240.83505200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 02 00 311.07908856 545.71810200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 01 00 260.56962053 256.90806000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 02 00 307.42328503 541.94187400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 02 00 329.18879068 579.17619800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 04 00 320.86426466 1168.51303200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 08 00 557.53919876 2063.66497100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 01 00 301.34188177 297.53859700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 02 00 355.17583551 633.57159300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 04 00 341.13174056 1237.64134900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 08 00 569.41086980 2091.24669300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 16 00 1033.12306375 3830.38338700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 01 00 289.06331326 285.16581900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 02 00 352.71452486 598.60540800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 04 00 362.43147997 1209.49558600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 01 00 304.82141249 300.97080700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 02 00 357.45966333 615.11044000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 04 00 364.19004945 1221.94837000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 02 00 410.85168504 676.29426200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 04 00 389.78656087 1289.66060200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 08 00 617.16478157 2196.09324100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 16 00 1122.14518604 3964.89579300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 01 00 283.19449419 279.26945200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 02 00 354.73297941 638.81991800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 04 00 351.54334233 1171.76523100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 08 00 686.13575692 2212.90629800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 01 00 314.41209947 309.90736600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 02 00 381.45197367 685.53884100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 04 00 381.18182537 1250.76617500
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 16 00 1238.58164954 4001.79410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 01 00 321.26949165 317.55183900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 02 00 353.36466413 627.80722700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 04 00 394.88733847 1258.84668200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 08 00 750.20929978 2398.59789600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 16 00 1296.49837951 4002.73814800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 01 00 330.05376020 328.70453600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 02 00 370.45905646 641.72410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 04 00 463.38659104 1306.92167900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 08 00 817.68327319 2451.90123900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 16 00 1392.72301206 4172.90078600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 01 00 327.57180887 326.18838700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 02 00 393.14333660 665.91761700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 04 00 460.19393866 1323.99474200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 08 00 829.87244544 2422.70740900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 16 00 1417.12743675 4216.83553800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 01 00 336.75282418 335.08493800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 02 00 415.28737663 659.84523800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 04 00 461.46395478 1308.48578000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 08 00 824.18623915 2315.60871300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 16 00 1773.87495286 4689.15305600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 01 00 345.42287805 344.43352700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 02 00 456.01397646 731.16169900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 04 00 468.62811576 1321.83061000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 08 00 781.69233130 2354.10312300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 02 00 408.13220878 671.70598400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 04 00 435.55672982 1382.01036700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 08 00 824.13038674 2327.15343400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 16 00 1644.94038777 4342.18337400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 15 1.99500456 1.73611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 16 2.00825253 1.71611100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 17 1.99534991 1.74410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 18 1.92537351 1.72410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 19 1.80289350 1.67210600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 20 1.89577949 1.72410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 21 2.03105967 1.73610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 22 1.98644780 1.70410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 23 1.98241529 1.72811000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 24 2.09280068 1.74410900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 25 1.72968587 1.72010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 26 1.83753688 1.66410200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 32 1.76542921 1.71211000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 33 1.70881499 1.68010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 34 1.71809744 1.72410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 35 1.92583941 1.92412000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 36 2.60543477 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 37 1.78591132 1.67610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 38 1.67977806 1.65610300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 39 1.71200809 1.68410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 40 1.92712333 1.71610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 45 10.92630000 10.82467500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 46 202.63338200 50.85917400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 47 10.95013800 10.73666800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 60 13.47732400 13.25682900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 61 11.09817600 11.08468800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 62 13.52589500 13.27283100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 63 13.51054200 13.21682600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 64 11.08019700 11.07269300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 65 12.79806000 12.49678500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 66 11.67222800 11.50471500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 68 11.02299500 10.90468000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 69 12.30104200 12.03675200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 70 11.51838900 11.09269500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 71 11.67129800 11.41671600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 15 1.85304780 1.82811700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 16 2.01170792 1.84011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 17 2.03905799 2.02812900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 18 2.03484985 1.84811400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 19 1.89138905 1.81611400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 20 1.88166371 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 21 1.85964446 1.85211800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 22 1.88492482 1.87211600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 23 1.89094756 1.88011500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 24 2.19453134 1.84011900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 25 2.15761771 1.87611600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 26 1.89103346 1.85611700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 32 1.89248386 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 33 2.09446628 1.84811300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 34 1.94313465 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 35 1.91670404 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 36 1.93606592 1.90011600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 37 1.82418737 1.80011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 38 1.85275587 1.81611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 39 1.89841448 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 40 2.24104077 1.92011800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 45 12.05363100 11.94074500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 46 153.75240200 38.76242300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 47 12.12808900 12.11676100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 60 14.92394500 14.78492700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 61 12.12349400 12.10075400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 62 14.80466800 14.74892300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 63 14.96187400 14.76092000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 64 12.12595700 12.12475500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 65 14.30293200 14.16088700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 66 13.13248600 13.04481600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 68 11.91711700 11.90874800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 69 13.52738500 13.50084500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 70 12.10463500 12.10076100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 71 12.51535400 12.43277500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 15 2.14613841 2.13613300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 16 2.08964146 2.07213000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 17 2.23050875 2.22414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 18 2.45300750 2.42815000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 19 2.69288940 2.66816700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 20 2.30087397 2.26413900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 21 2.71575292 2.69617000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 22 2.27281504 2.25213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 23 2.89347846 2.86417800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 24 2.74981965 2.75217300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 25 2.43014465 2.41215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 26 2.27919672 2.19213600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 32 2.51603498 2.49615300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 33 2.34132568 2.24014300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 34 2.19736293 2.14013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 35 2.42015784 2.16013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 36 2.19682006 2.18013500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 37 2.47760253 2.47215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 38 2.09433999 2.05612900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 39 2.15514387 2.13613200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 40 2.23896073 2.21614100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 45 10.95491800 10.87668200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 46 106.99900000 27.63373000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 47 10.66279400 10.57666300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 60 16.02752500 15.98900000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 61 11.20916600 11.15670000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 62 15.88848200 15.86499100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 63 15.97672400 15.93699700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 64 11.44016900 11.21270800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 65 16.10954400 15.98500300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 66 13.21578600 13.20082600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 68 10.71742600 10.70867100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 69 13.56445000 13.52484800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 70 11.25670200 11.16469700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 71 11.90071800 11.63672700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 15 2.44970802 2.26414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 16 2.44833974 2.32414800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 17 2.17747496 2.13212900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 18 2.17540596 2.14813400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 19 2.22853039 2.21214100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 20 2.25197693 2.24414200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 21 2.39005092 2.35214700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 22 2.21986902 2.19213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 23 2.22432535 2.22013800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 24 2.34639108 2.32014600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 25 2.22560016 2.19613700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 26 2.31736788 2.28814300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 32 2.33359981 2.31614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 33 2.07182797 2.03212500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 34 2.33560754 2.32414700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 35 2.19612642 2.09213100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 36 2.19244615 2.16413500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 37 2.56025559 2.53615900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 38 2.14005742 2.10413400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 39 2.21802727 2.19213500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 40 2.34475534 2.23213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 45 10.59146700 10.47665100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 46 121.83194400 31.24195100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 47 9.74507300 9.73260600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 61 10.81497000 10.58865900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 62 15.83085700 15.80098800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 63 16.00367800 15.98499700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 64 10.68756500 10.54865800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 65 15.84196900 15.81298400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 66 14.56524400 14.53291100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 68 10.19511200 10.18463500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 69 15.11225800 15.08894100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 70 10.60586400 10.56865700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 71 11.36569300 11.30870500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 15 2.61408830 2.59216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 16 2.38613506 2.36814600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 17 2.65185052 2.63216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 18 2.21687388 2.21614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 19 2.46240048 2.31214300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 20 2.46646909 2.46415100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 21 2.57484497 2.56415900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 22 2.65125207 2.62016000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 23 2.49789271 2.49615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 24 2.46372185 2.44414900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 25 2.49743606 2.34014800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 26 2.53578516 2.46815600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 32 2.32310441 2.33614600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 33 2.56218035 2.55615800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 34 2.20594374 2.18413700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 35 2.36721832 2.37214800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 36 2.66904334 2.66416600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 37 2.66352913 2.64016100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 38 2.33906610 2.33214500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 39 2.36094293 2.33214600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 40 2.50301425 2.42415400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 45 10.54430300 10.50866100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 46 105.94739300 26.98968800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 47 10.16426200 10.14063600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 61 10.65739500 10.62066700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 62 16.37545900 16.34101900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 63 16.53941800 16.50903400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 64 11.19909400 11.17269800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 65 16.05018200 15.99299800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 66 18.35528100 18.28514800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 68 10.25009600 10.23264100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 69 19.74344600 19.55722000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 70 10.69282400 10.68066800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 71 11.11411900 11.08069000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 23 2.77533373 2.72417000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 24 3.47726487 3.45621600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 25 7.75072005 7.74448500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 26 2.78908377 2.76417400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 32 2.50527371 2.47615500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 33 2.84105095 2.84017600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 34 2.38207440 2.37614700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 35 2.48143756 2.46815400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 36 2.52331640 2.47615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 37 2.48741660 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 38 2.69686531 2.56816000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 39 2.43263093 2.39615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 40 2.63556658 2.61216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 45 10.70063300 10.44465300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 47 10.23449000 10.22063700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 63 17.44569300 17.40108600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 65 16.34998700 16.31701600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 25.81468100 25.64560200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 32.28495700 32.28201600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.81439500 34.63816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.96018700 34.65416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 68 10.12227100 10.11663300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 69 27.51798900 27.31770500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 71 13.30935100 12.96880600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 23 2.70602361 2.68016800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 24 2.82725128 2.82817600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 25 2.71012373 2.64816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 26 2.70717850 2.66416700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 32 2.80160223 2.80017500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 33 2.96337194 2.94818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 34 2.44735784 2.42415500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 35 2.92295252 2.88017700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 36 2.84464568 2.47215300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 38 2.47655275 2.48015500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 39 2.36914912 2.30414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 42 10.24891600 9.95662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 52 10.04778200 9.97662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 63 17.51489100 17.46509400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 65 16.74508900 16.51303500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 71 10.68492600 10.54465500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 23 3.64010966 3.64423000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 24 3.75214619 3.70422900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 25 3.54584343 3.52822100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 26 3.33211255 3.22020200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 32 3.52961315 3.53621800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 33 2.77292498 2.72416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 34 2.44419424 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 35 2.62340227 2.00412400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 36 2.55986319 2.41615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 37 2.50177845 2.52415600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 38 2.29403566 2.28414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 39 2.21099217 2.17613500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 59 19.20047400 18.75317000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 60 19.44039300 19.17319900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 63 19.68925600 19.28920800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 65 18.39071800 18.36115100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 69 77.17565300 76.88080800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 71 10.14661700 9.86061600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 32 3.02414120 3.01619100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 33 2.82916677 2.81217700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 34 2.73830927 2.70416900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 35 3.13103430 3.08419400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 36 3.62117172 2.96818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 37 3.07523643 3.05219100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 38 9.34603220 9.33258200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 39 4.41087391 4.40027600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 71 10.41400200 9.96062700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 32 19.03294052 19.03318900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 33 3.20325611 3.18420100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 34 3.64873286 3.63622900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 35 5.76824320 5.74435900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 36 4.06577632 3.83224100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 37 4.00333875 3.99624700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 38 3.47725648 3.44421500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 39 4.64220864 3.98825000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 37 7.63925136 7.62847900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 38 4.95942385 4.92830900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 39 6.55097068 5.95237300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 00 122.54106532 122.43964000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 70 137.91245362 137.53659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 71 135.63270587 135.40044100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 00 183.05137779 182.34740400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 70 187.30018361 186.34765600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 71 185.75841382 184.67950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 00 180.00077328 179.96324900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 70 188.91985668 188.72779100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 71 186.41453722 186.15565600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 00 129.85302923 258.85217000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 70 139.97521767 278.69341900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 71 141.51701227 281.73762600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 00 236.26691144 234.90266100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 70 236.73086903 234.96268500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 71 229.82467734 228.02229000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 00 236.15145878 235.09065900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 70 240.49140858 239.34294100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 71 232.66685038 231.09043800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 00 216.99292067 426.67066900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 70 217.82767517 428.97080600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 71 216.73058569 426.98272200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 00 248.75942817 248.53554600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 70 232.06587985 231.78249500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 71 228.27816767 228.01424800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 00 214.19796909 422.93842400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 70 220.67594718 435.16720400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 71 209.97284200 414.55791500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 00 225.72213129 891.25570400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 70 257.72389956 1015.82752300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 71 257.80748799 1012.46728000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 00 274.82082107 272.30100200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 70 288.00210531 285.37783300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 71 274.44160638 271.89699400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 00 273.54665117 271.10493300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 70 286.84754310 284.44175300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 71 265.18844890 262.77241500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 00 271.56964828 531.53722400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 70 258.95359301 506.47966600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 71 246.48077225 483.78221200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 00 288.28569852 286.34586800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 70 282.58045572 280.80555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 71 270.86291599 269.04481700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 00 271.14896550 530.75718300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 70 257.72701692 505.51159700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 71 249.47188872 489.49062600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 00 322.88345290 1264.75505300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 70 328.14615812 1287.45648300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 71 321.18477198 1262.11486800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 00 297.04119270 296.97457100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 70 287.90201298 287.66194600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 71 279.55088937 277.57337300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 00 285.83271012 561.34306600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 71 242.58659491 479.38994400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 00 320.14915635 1255.83848600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 70 320.23161459 1253.39429600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 71 328.67928713 1292.82478800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 00 448.40270118 1763.57421700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 70 292.77910061 2273.21404200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 71 291.50975695 2271.12593300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 00 301.51189092 299.24667900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 70 303.41105413 300.74280200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 71 292.02127953 289.43007600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 00 301.62872519 299.57471400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 70 309.30955111 307.18317000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 71 295.99160188 294.03436700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 00 309.13612524 597.00130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 70 288.63654603 562.76319700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 71 274.05435093 535.64549700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 00 318.14699887 316.27575400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 70 303.45030848 302.42288800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 71 296.42845066 294.75439600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 00 309.54233248 602.84166500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 70 295.24449971 575.24799300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 71 274.77006856 537.34158400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 00 417.05867436 1607.25245900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 70 409.92962198 1583.87495800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 71 380.32455437 1480.97253000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 00 323.18693460 323.06420400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 70 310.41332580 309.94337800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 71 300.73102585 300.54277200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 00 328.35249656 635.21967600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 70 284.72961366 558.63492700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 71 267.87115046 526.22084900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 00 418.01371976 1606.47240400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 70 405.35986899 1569.39808900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 71 397.65546045 1544.81659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 00 726.72729222 2703.58096900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 70 407.85024613 3166.64991000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 71 414.87878198 3210.36063800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 00 360.43062715 359.66248400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 01 362.41548137 362.25466100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 02 359.46430584 358.82244000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 03 360.40211611 359.69846600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 04 361.60963682 360.76253200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 05 362.19089131 361.76658000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 06 362.14195383 361.62658800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 07 362.09293188 361.56259000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 08 363.41700161 362.63865000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 11 361.72727898 360.91055500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 27 362.05011972 361.62260700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 29 369.80960707 356.04224300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 30 372.54992350 360.49454200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 31 372.06669911 371.12721500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 69 350.95761078 350.33787100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 70 351.63983979 350.51789600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 00 340.94451255 667.23371500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 00 440.90069490 1696.21401700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 01 443.54903601 1698.69415800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 02 440.82711267 1688.11348200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 03 441.00726498 1691.36168700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 00 698.48752227 2602.79866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 70 413.90443403 3212.12476500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 00 795.00396901 3094.41337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 70 387.08693269 5906.86915500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 00 326.04384389 324.21627800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 70 337.57346556 335.35695900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 71 318.80304607 316.93181800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 00 333.07253875 644.93227800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 70 316.28406517 610.91020600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 71 298.15574373 578.73616000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 00 333.26932616 331.41269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 71 313.61524679 311.77549800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 00 333.52000621 645.64032800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 71 291.33919633 566.53543500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 00 515.54133086 1943.80147900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 70 469.89494876 1810.14911700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 71 442.70702729 1717.55536200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 00 343.17846395 341.57736700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 70 340.33822680 338.78114200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 71 323.65484424 321.82412700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 00 351.70758524 675.06217300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 70 303.79429054 591.36899800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 71 293.69677634 568.89953600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 00 517.49909365 1954.82218200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 70 479.90251154 1844.21924800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 71 451.36163723 1748.77729400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 00 1055.86987880 3701.79133200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 70 531.59447720 4051.62517600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 71 507.91281970 3901.08381400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 00 390.31553259 389.97238000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 01 395.77887272 395.56872000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 02 390.80241660 389.85234000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 03 393.12085078 392.10847000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 04 395.55309817 395.37269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 05 389.81423140 389.29636700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 06 393.19438455 392.82055600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 07 389.67084561 389.54837000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 08 391.29633427 391.10443000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 11 390.72713972 390.20437800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 27 398.28608009 396.02876700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 29 401.03977832 386.98017800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 30 404.52326881 394.25663200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 31 437.06683003 436.70730500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 69 382.99106211 382.33189300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 70 385.36752349 385.00806600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 71 375.95657347 375.46341200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 00 383.35456131 739.23424900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 70 349.61876433 680.23451300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 71 330.96690626 645.80038000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 00 529.41246322 1993.43258400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 01 537.49802173 2019.49822300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 02 528.36463041 1995.14468600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 03 535.24064646 2024.62652000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 70 463.23995386 1788.59178500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 71 429.58751955 1668.59631500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 00 1036.91991574 3633.95512500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 70 517.86666666 3962.95167500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 71 490.51058293 3782.34037100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 00 1346.48871925 4979.39919700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 70 649.30993415 9793.99613300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 71 656.72454561 9945.57355800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 00 384.25940026 382.68789800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 70 360.45498790 359.24643200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 71 342.33402440 341.78132500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 00 382.84727695 697.47958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 70 347.90248895 645.36434500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 71 334.55869590 624.17098500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 00 569.85026179 2026.69067000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 70 516.36014326 1858.87618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 71 487.75067417 1760.92603900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 00 386.26711080 386.06411100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 70 369.37387139 368.83503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 71 367.71863649 367.61898100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 00 397.71097153 728.80952900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 70 353.01166100 652.56876500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 71 334.64443949 624.41101400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 00 572.20395575 2024.86254400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 70 534.26113687 1926.90839800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 71 504.74932960 1827.05818100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 00 1554.26026900 4989.75183300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 70 652.86537102 4888.66553100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 71 600.04190600 4547.24018500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 00 431.31010658 431.16292700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 01 441.13154728 439.83948700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 02 439.77616612 438.00337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 03 470.26668580 469.08130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 04 433.97723262 433.57512000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 05 456.80279773 455.35247100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 06 439.04137152 438.76341500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 07 427.26071143 426.63864600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 08 427.65338278 427.44271400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 11 437.41002050 437.15531900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 27 463.11914877 462.82891700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 29 2328.28713066 2318.43289800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 30 439.66708345 429.57086600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 31 433.89363870 433.76313800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 69 416.50034724 415.57397400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 70 436.47173601 436.23527100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 71 417.34331894 415.39392000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 00 427.14753026 787.80123700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 70 395.14246498 733.56984800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 71 368.67281962 693.36329100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 00 591.74799377 2118.78441700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 01 606.03415259 2161.71509800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 02 606.57069465 2160.00298500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 03 609.42726870 2169.47158600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 70 528.83833280 1917.96386400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 71 488.48490761 1789.02781400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 00 1546.19907614 5007.49296100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 70 631.67315156 4768.09001100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 71 607.70209688 4613.98434600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 00 1858.96060941 6315.72272000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 70 804.20874109 11734.48135300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 71 758.89552524 11259.30765700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 00 364.62904241 364.22276400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 70 379.81920310 379.69573800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 71 396.00827453 395.18070400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 00 440.86034016 796.68577000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 70 378.40813455 703.46795100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 71 413.95889019 758.59540300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 00 599.82393181 1979.99574800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 70 540.37555430 1850.29964100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 71 503.74059530 1748.33327700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 00 1788.01350286 5380.72425200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 70 678.67737144 5006.15286600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 71 642.28407215 4769.47405600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 00 404.99298149 404.92531000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 01 431.08043735 430.71091800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 02 427.04413413 426.51866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 03 433.42988977 431.87500600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 04 417.92239112 417.67407500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 05 429.07855982 427.86275000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 06 444.53289246 444.34380100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 07 418.31180983 416.85004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 08 422.25409577 420.87826200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 11 413.70373561 412.40574900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 27 434.69497877 432.78307600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 29 419.66531388 410.26962500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 30 439.21915391 428.73479800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 31 434.61412737 433.23107800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 69 430.70154522 430.00688500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 70 438.41579003 437.91137400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 71 431.95664416 431.63498300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 00 472.33713063 856.02950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 70 421.91766016 779.28067100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 71 444.19184591 804.59427400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 00 628.96382082 2049.31606300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 01 642.24077718 2088.03048700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 02 689.82439842 2179.65220800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 03 670.76284182 2138.68566500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 70 559.62706526 1905.94711600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 71 545.43877754 1850.99568200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 00 1763.50365242 5334.35736900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 70 689.57964971 5051.44369100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 71 636.76134103 4722.85116200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 00 2237.19241006 7141.26229600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 70 800.63435093 11681.41004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 71 743.16011415 11063.20738400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 00 416.81854382 416.65008200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 01 424.06496044 423.97053300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 02 435.50639245 435.05518500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 03 452.47220833 452.26825200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 04 420.10070920 419.89827200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 05 419.56022792 419.16618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 06 435.70374093 433.69513500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 07 426.06771261 425.86660700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 08 416.79365528 416.45001900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 11 426.59510188 424.97055100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 27 422.20029125 421.98237100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 29 451.74462182 442.01958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 30 429.08432736 421.15431500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 31 431.13646925 430.77493200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 69 428.61061831 428.29876600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 70 443.75125332 443.19964900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 71 430.91503566 430.43491100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 00 493.58668537 878.29491000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 70 482.44695258 863.17793000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 71 440.23977765 802.17812500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 00 639.43174573 2105.13555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 02 661.28716728 2138.28163000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 03 661.23409816 2155.13869800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 70 563.27954600 1899.01067800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 71 522.37506390 1795.84423300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 00 2007.78571537 5415.25443200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 70 761.92412640 5155.37016100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 71 697.91456742 4817.27303700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 00 2633.87542579 7447.83346100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 70 874.75492376 12621.71282100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 71 792.28551614 11551.60588900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 00 432.15376549 432.15100400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 01 441.80254700 441.46759900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 02 466.84211560 466.84116400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 03 455.53552447 455.25647500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 04 429.11185786 428.98679500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 27 483.96443456 481.35408500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 29 455.41548594 447.59996800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 30 470.07764442 460.69678200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 31 467.55431002 465.62509900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 69 445.45534276 444.89979100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 71 432.57437397 431.60298900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 00 481.33138896 871.35843600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 71 450.67742913 816.63503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 00 629.96891954 2108.09974400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 01 650.63503716 2168.72754200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 02 659.67285103 2198.78939500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 03 658.38587013 2192.54502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 71 531.22941551 1840.13502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 08 00 2182.42442297 5113.60358800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 16 00 2917.04701424 7032.92755200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 00 430.57254488 429.10679800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 01 437.24065480 436.92725400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 02 470.04598340 469.48934500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 03 452.01172928 452.10824500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 04 435.76047032 435.42721100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 27 464.35032003 462.29691900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 29 465.19633431 457.62460400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 30 452.24806910 439.00743100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 31 454.38764507 451.27620200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 71 438.81654108 438.29943200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 00 503.23849598 902.79243700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 71 484.87606011 874.36265300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 00 648.85708079 2173.22782000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 01 678.40451218 2219.06267800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 02 692.87624405 2285.97485100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 03 693.47299075 2276.57427800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 71 547.03842935 1875.64522500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 08 00 2192.73954194 5185.64406200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 16 00 3194.24190197 7228.57974800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 00 474.30655592 473.98159600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 01 482.89148177 482.66217100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 02 486.30503508 484.72232100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 03 486.71080130 485.29434700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 27 519.71460553 519.34445800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 29 502.39021118 491.49071300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 30 466.38628136 456.32853800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 31 463.41367294 463.26092800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 71 399.03692711 398.91291300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 00 516.41948016 932.54231900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 71 485.12292738 857.40158900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 00 644.42646233 2202.95367200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 01 676.88389260 2272.85005100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 02 671.90049929 2283.31869400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 03 679.92398633 2195.80124500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 71 573.36576023 1935.17692900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 08 00 2191.28902042 5020.00972000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 30 564.43722649 556.34275800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 31 540.58077165 540.06973100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 71 455.91632274 455.34043200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 00 598.95507284 1056.66598500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 71 471.13539881 838.79645300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 00 655.37947027 2238.28789400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 01 686.16152266 2319.69698300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 02 700.27613265 2338.29413500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 03 673.68116989 2296.11949200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 71 573.91736912 1928.58452600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 08 00 2164.29166218 4984.59550500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 01 71 433.90391986 433.17103800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 00 618.88302882 1096.32051400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 71 451.53836770 830.44792700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 00 664.84209040 2282.41064700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 01 687.25730075 2343.11442100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 02 686.03115911 2356.38325800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 03 699.08293954 2368.18000400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 71 543.33106637 1907.09519100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 08 00 2165.34595664 4986.41963400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 01 71 437.99540328 436.87931300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 02 71 463.45291184 859.60171800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 01 738.65903756 2406.06234900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 02 793.26796536 2537.16257600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 03 710.98674150 2315.13667500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 71 545.43758320 1926.07638400
diff --git a/Carpet/CarpetWeb/scaling-improved/results-scaled.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-scaled.gnuplot
new file mode 100644
index 000000000..018da8749
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-scaled.gnuplot
@@ -0,0 +1,40 @@
+set terminal postscript eps enhanced color colortext
+set output "results-scaled.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "1000 cycles per RHS evaluation"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+
+# MHz flop/cycle
+# Franklin : 2300 4
+# HLRB II : 1600 4
+# Kraken : 2300 4
+# Queen Bee: 2330 4
+# Ranger : 2300 4
+# SiCortex : 700 2
+# Surveyor : 850 4
+
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8== 0) print; }' results-franklin.out" u 5:($9/25**3/128/2/4*1e3*(2300*4)) t "Franklin" w lp lt 1 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8==10) print; }' results-hlrb2.out" u 5:($9/25**3/128/2/4*1e3*(1600*4)) t "HLRB II" w lp lt 2 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e3*(2300*4)) t "Kraken (NT=1)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 2 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e3*(2330*4)) t "Queen Bee (NT=2)" w lp lt 4 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 1 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e3*(2300*4)) t "Ranger (NT=1)" w lp lt 5 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==20 && ($6== 6 || $6==$5) && $7== 1 && $8== 9) print; }' results-sicortex.out" u 5:($9/20**3/128/2/4*1e3*( 700*2)) t "SiCortex (NT=1)" w lp lt 6 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==13 && ($6== 4 || $6==$5) && $7== 1 && $8==12) print; }' results-surveyor.out" u 5:($9/13**3/128/2/4*1e3*( 850*4)) t "Surveyor (NT=1)" w lp lt 7 lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-sicortex.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-sicortex.gnuplot
new file mode 100644
index 000000000..016baa5dd
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-sicortex.gnuplot
@@ -0,0 +1,24 @@
+set terminal postscript eps enhanced color colortext
+set output "results-sicortex.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==20 && ($6== 6 || $6==$5) && $7== 1 && $8== 9) print; }' results-sicortex.out" u 5:($9/20**3/128/2/4*1e6) t "SiCortex (NT=1)" w lp lt 1 lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-sicortex.out b/Carpet/CarpetWeb/scaling-improved/results-sicortex.out
new file mode 100644
index 000000000..e06222dec
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-sicortex.out
@@ -0,0 +1,73 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000009 03 01 09 160.97924924 160.90000000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000012 02 01 09 169.91864061 169.83800000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000012 06 01 09 216.23553324 216.08500000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000018 03 01 09 194.86012912 194.76400000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000018 06 01 09 209.45180464 209.34200000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000036 06 01 09 218.57264876 218.44500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000001 01 01 09 577.03916478 576.51300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000001 01 01 10 584.84026647 584.26700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 01 01 09 1063.53720546 1062.85200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 01 01 10 1073.46784306 1072.78200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 01 09 886.65131402 886.22300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 01 10 879.80119944 879.30700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 02 10 1080.79185009 2041.34200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 01 01 09 1637.62942624 1636.88100000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 01 01 10 1658.30288005 1657.51800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 01 09 1014.73026657 1014.23700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 01 10 991.87625074 991.39300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 03 10 1350.42324567 3631.75200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 01 09 1555.37436056 1554.86200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 01 10 1548.87241173 1548.36700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 02 10 1990.86815596 3806.46600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 01 01 09 2953.73614597 2952.76700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 01 01 10 3058.68801212 3057.59900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 01 09 2192.51062202 2192.05300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 01 10 2160.93858528 2160.50300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 02 10 2905.12031174 5576.29500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 01 09 1811.42113948 1810.98300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 01 10 1783.56004071 1783.05200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 03 10 2471.15107203 6736.12300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 01 09 1312.47908449 1311.62500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 01 10 1256.62998867 1255.75800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 02 10 5779.03792477 2972.75600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 03 10 7082.16307092 5182.78300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 06 10 1992.49259830 9297.26600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 01 09 1150.66821122 1150.17600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 01 10 1634.80302310 1634.35900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 03 10 3699.17927527 10041.99900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 01 09 1206.51082349 1206.05800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 01 10 2445.88993430 2445.16000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 02 10 4919.54614115 9497.25900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 01 09 1536.47537231 1535.58100000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 01 10 1487.75196719 1486.85700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 02 10 10569.93517756 5442.61700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 03 10 10535.11860585 8066.33800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 06 10 3076.13520050 15588.30900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 01 09 1386.79382586 1386.32300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 01 10 2212.76893878 2212.24700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 03 10 6044.88727355 16669.88300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 01 09 1490.72433352 1489.82600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 01 10 1449.57670307 1448.65400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 02 10 9206.37890959 4956.86500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 06 10 4521.90128183 23111.06500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 01 09 1556.78021669 1555.88500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 01 10 1506.67594385 1505.71200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 02 10 11190.43197107 5677.51000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000048 06 01 09 1805.66064787 1804.73900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000048 06 01 10 1766.07638407 1765.00800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000096 06 01 09 1729.37948060 1728.85000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000096 06 01 10 1707.35560274 1706.36200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000192 06 01 09 1559.74821520 1559.26200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000192 06 01 10 1535.94878769 1535.01800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000384 06 01 09 1495.67836642 1495.17400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000384 06 01 10 1462.88292074 1462.33400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000768 06 01 09 1342.76321959 1341.88500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000768 06 01 10 1325.73432612 1324.92600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001152 06 01 09 1249.66528654 1249.07300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001152 06 01 10 1236.83454061 1236.02500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001410 06 01 10 1584.19222546 1583.07200000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-surveyor.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-surveyor.gnuplot
new file mode 100644
index 000000000..9501d9233
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-surveyor.gnuplot
@@ -0,0 +1,24 @@
+set terminal postscript eps enhanced color colortext
+set output "results-surveyor.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==13 && ($6== 4 || $6==$5) && $7== 1 && $8==12) print; }' results-surveyor.out" u 5:($9/13**3/128/2/4*1e6) t "Surveyor (NT=1)" w lp lt 1 lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results-surveyor.out b/Carpet/CarpetWeb/scaling-improved/results-surveyor.out
new file mode 100644
index 000000000..48e76387a
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-surveyor.out
@@ -0,0 +1,27 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000008 04 01 11 624.81453443 624.81587300
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000016 04 01 11 722.29658222 722.29789900
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000032 04 01 11 856.51289034 856.51418100
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000064 04 01 11 990.83257842 990.83382200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 12 474.73102307 474.73792200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 12 587.83344865 587.84038800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 12 621.02077198 621.02724100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 01 12 663.63607979 663.64234500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 01 12 704.49752784 704.50370900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 01 12 680.81795001 680.82374700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 01 12 656.88587546 656.89153500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 01 12 629.33461618 629.34111400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 01 12 614.91167831 614.91829700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 01 12 605.89694047 605.90319800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 01 12 610.38005638 610.38661600
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 00 854.29521608 854.30252600
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 03 877.72644567 877.73262500
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 12 856.12551332 856.13247900
+Bench_McLachlan_Carpet_9lev 000128 0020 surveyor 000004 04 01 00 1737.21421933 1737.22385900
+Bench_McLachlan_Carpet_9lev 000128 0020 surveyor 000004 04 01 03 1771.05630064 1771.06430100
+Bench_McLachlan_Carpet_9lev 000128 0025 surveyor 000004 04 01 00 3050.30690145 3050.31646500
+Bench_McLachlan_Carpet_9lev 000128 0025 surveyor 000004 04 01 03 3093.32195663 3093.32960000
diff --git a/Carpet/CarpetWeb/scaling-improved/results-whatif-bw.out b/Carpet/CarpetWeb/scaling-improved/results-whatif-bw.out
new file mode 100644
index 000000000..23c5c310a
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-whatif-bw.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 51 389.47344708 376.82760600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 51 427.29224968 414.18987800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 51 468.87827706 455.78450100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 51 491.67039084 482.87815000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 51 533.61160135 527.58096600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 51 500.59744263 494.36288200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 51 476.86723900 470.84938700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 51 458.97451353 454.44442800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 51 436.93441629 431.95500700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 51 476.40951514 471.73747300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 51 484.72250724 480.57803300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 51 496.09946489 492.02273600
diff --git a/Carpet/CarpetWeb/scaling-improved/results-whatif-bwlat.out b/Carpet/CarpetWeb/scaling-improved/results-whatif-bwlat.out
new file mode 100644
index 000000000..a3e22a0d1
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-whatif-bwlat.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 52 381.81449485 369.91510800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 52 421.87990785 407.86147400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 52 465.03736973 453.38033300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 52 490.74024415 479.36598700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 52 543.91181445 536.93353600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 52 517.28014588 510.25591400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 52 518.99811196 512.80408400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 52 490.89922404 485.80636300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 52 480.04649687 474.67367400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 52 523.34186959 518.44838400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 52 502.55980611 496.09100500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 52 494.35133028 489.53059200
diff --git a/Carpet/CarpetWeb/scaling-improved/results-whatif-orig.out b/Carpet/CarpetWeb/scaling-improved/results-whatif-orig.out
new file mode 100644
index 000000000..00101ea76
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-whatif-orig.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 50 368.31895638 364.48679000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 50 403.65297389 398.66888300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 50 433.79905939 429.07077700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 50 453.33379769 449.05209000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 50 477.42585325 474.75770700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 50 446.53416204 443.65970800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 50 421.50431681 418.52209200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 50 386.16655254 383.67997000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 50 365.84427381 363.40272800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 50 378.49561858 376.21552700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 50 357.60511637 355.38218100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 50 362.58709908 360.02246700
diff --git a/Carpet/CarpetWeb/scaling-improved/results-whatif.gnuplot b/Carpet/CarpetWeb/scaling-improved/results-whatif.gnuplot
new file mode 100644
index 000000000..ae9ef9df3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results-whatif.gnuplot
@@ -0,0 +1,32 @@
+set terminal postscript eps enhanced color colortext
+set output "results-whatif.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark (Kraken, NT=1)"
+set xlabel "number of cores"
+#set ylabel "time per RHS evaluation [{/Symbol m}s]"
+set ylabel "wall time increase"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+#p \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "original" w lp lt 1 lw 3, \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==51) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "bandwidth" w lp lt 2 lw 3, \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==52) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "bandwidth+latency" w lp lt 3 lw 3
+
+p \
+"< paste results-whatif-orig.out results-whatif-orig.out" u 5:($19/$9) t "original" w lp lt 1 lw 3, \
+"< paste results-whatif-orig.out results-whatif-bw.out" u 5:($19/$9) t "increased BW" w lp lt 2 lw 3, \
+"< paste results-whatif-orig.out results-whatif-bwlat.out" u 5:($19/$9) t "increased BW and LAT" w lp lt 3 lw 3
diff --git a/Carpet/CarpetWeb/scaling-improved/results.gnuplot b/Carpet/CarpetWeb/scaling-improved/results.gnuplot
new file mode 100644
index 000000000..83062f7bf
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results.gnuplot
@@ -0,0 +1,48 @@
+set terminal postscript eps enhanced color colortext
+set output "results.eps"
+
+#set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8==10) print; }' results-hlrb2.out" u 5:($9/25**3/128/2/4*1e6) t "HLRB II" w lp lt 1 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "Kraken (NT=1)" w lp lt 2 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 1 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e6) t "Queen Bee (NT=1)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 2 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e6) t "Queen Bee (NT=2)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 4 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e6) t "Queen Bee (NT=4)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 8 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e6) t "Queen Bee (NT=8)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 1 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e6) t "Ranger (NT=1)" w lp lt 4 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 2 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e6) t "Ranger (NT=2)" w lp lt 4 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 4 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e6) t "Ranger (NT=4)" w lp lt 4 lw 3
+
+# HLRB 2: have results up to 2048 cores; runs with 4080 cores failed,
+# reason unknown. Job with updated executable and fewer output files
+# submitted; still fails for unknown reason. Could be out of memory.
+
+# Intrepid: no allocation.
+
+# Kraken: have results up to 8192 cores; runs with up 18048 cores did
+# fail, reason unknown. (out of memory? did work with NT=2 and
+# NT=4.)
+
+# Queen Bee: have results up to 1024 cores; runs with up to 2048 cores
+# are submitted.
+
+# Ranger: have results up to 12288 cores; runs with more cores depend
+# on permissions from system administrators.
diff --git a/Carpet/CarpetWeb/scaling-improved/results2openmp b/Carpet/CarpetWeb/scaling-improved/results2openmp
new file mode 100644
index 000000000..40ad477fc
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results2openmp
@@ -0,0 +1,19 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+
+
+
+# Select output for 16 allocated cores
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $5==16 && $8==71) print; }' results-ranger.out |
+sort -n -k 7 |
+awk '{ if ($7!=old7) print ""; old7=$7; print; }' > results-ranger-openmp-procs.out
+
+
+
+# Select output for 1 node
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $5/$6==1 && $8==71) print; }' results-ranger.out |
+sort -n -k 7 |
+awk '{ if ($7!=old7) print ""; old7=$7; print; }' > results-ranger-openmp-node.out
diff --git a/Carpet/CarpetWeb/scaling-improved/results2whatif b/Carpet/CarpetWeb/scaling-improved/results2whatif
new file mode 100644
index 000000000..54ab149f9
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-improved/results2whatif
@@ -0,0 +1,16 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+
+
+
+# Select output for original
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out > results-whatif-orig.out
+
+# Select output for increased bandwidth
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==51) print; }' results-kraken.out > results-whatif-bw.out
+
+# Select output for increased bandwidth and latency
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==52) print; }' results-kraken.out > results-whatif-bwlat.out
diff --git a/Carpet/CarpetWeb/scaling-ranger/findrow b/Carpet/CarpetWeb/scaling-ranger/findrow
index 8fa9c2f59..8fa9c2f59 100755..100644
--- a/Carpet/CarpetWeb/scaling-ranger/findrow
+++ b/Carpet/CarpetWeb/scaling-ranger/findrow
diff --git a/Carpet/CarpetWeb/scaling-ranger/loopprocs b/Carpet/CarpetWeb/scaling-ranger/loopprocs
index e7ed327ba..e7ed327ba 100755..100644
--- a/Carpet/CarpetWeb/scaling-ranger/loopprocs
+++ b/Carpet/CarpetWeb/scaling-ranger/loopprocs
diff --git a/Carpet/CarpetWeb/scaling-surveyor/Makefile b/Carpet/CarpetWeb/scaling-surveyor/Makefile
new file mode 100644
index 000000000..a409ba7f3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/Makefile
@@ -0,0 +1,36 @@
+all: results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+
+results.eps results-best.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out
+results-scaled.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out results-sicortex.out results-surveyor.out
+results-sicortex.eps: results-sicortex.out
+results-surveyor.eps: results-surveyor.out
+results-openmp-node.eps: results-ranger-openmp-node.out
+results-openmp-procs.eps: results-ranger-openmp-procs.out
+results-whatif.eps: results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out
+
+results-ranger-openmp-procs.out results-ranger-openmp-node.out: results2openmp results-ranger.out
+ ./results2openmp
+
+results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out: results2whatif results-ranger.out
+ ./results2whatif
+
+%.eps: %.gnuplot
+ gnuplot < $*.gnuplot
+
+%.pdf: %.eps
+ epstopdf $*.eps
+
+rsync:
+ -rsync -Paz franklin.nersc.gov:/project/projectdirs/m152/schnette/franklin/Calpha/results-franklin.out .
+ -rsync -Paz -e 'ssh numrel02.cct.lsu.edu ssh' lu78kog@hlrb2.lrz-muenchen.de:Calpha/results-hlrb2.out .
+ -rsync -Paz kraken-pwd.nics.utk.edu:work/Calpha/results-kraken.out .
+ -rsync -Paz queenbee.loni.org:work/Calpha/results-queenbee.out .
+ -rsync -Paz ranger.tacc.utexas.edu:work/Calpha/results-ranger.out .
+
+clean:
+ rm -f results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+ rm -f results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
+
+.PHONY: all rsync clean
+
+.PRECIOUS: results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
diff --git a/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.eps b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.eps
new file mode 100644
index 000000000..6fed628bd
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.eps
@@ -0,0 +1,764 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: results-surveyor.eps
+%%Creator: gnuplot 4.2 patchlevel 4
+%%CreationDate: Mon Mar 30 10:12:39 2009
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 230 176
+%%EndComments
+%%BeginProlog
+/gnudict 256 dict def
+gnudict begin
+%
+% The following 6 true/false flags may be edited by hand if required
+% The unit line width may also be changed
+%
+/Color true def
+/Blacktext false def
+/Solid false def
+/Dashlength 1 def
+/Landscape false def
+/Level1 false def
+/Rounded false def
+/TransparentPatterns false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+%
+/vshift -46 def
+/dl1 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
+} def
+/dl2 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul add } if
+} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+Level1 {} {
+/SDict 10 dict def
+systemdict /pdfmark known not {
+ userdict /pdfmark systemdict /cleartomark get put
+} if
+SDict begin [
+ /Title (results-surveyor.eps)
+ /Subject (gnuplot plot)
+ /Creator (gnuplot 4.2 patchlevel 4 )
+ /Author (Erik Schnetter)
+% /Producer (gnuplot)
+% /Keywords ()
+ /CreationDate (Mon Mar 30 10:12:39 2009)
+ /DOCINFO pdfmark
+end
+} ifelse
+%
+% Gnuplot Prolog Version 4.2 (August 2006)
+%
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/Z {closepath} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow {currentpoint stroke M 0 vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
+/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
+/BL {stroke userlinewidth 2 mul setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/AL {stroke userlinewidth 2 div setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/UL {dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def} def
+/PL {stroke userlinewidth setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+% Default Line colors
+/LCw {1 1 1} def
+/LCb {0 0 0} def
+/LCa {0 0 0} def
+/LC0 {1 0 0} def
+/LC1 {0 1 0} def
+/LC2 {0 0 1} def
+/LC3 {1 0 1} def
+/LC4 {0 1 1} def
+/LC5 {1 1 0} def
+/LC6 {0 0 0} def
+/LC7 {1 0.3 0} def
+/LC8 {0.5 0.5 0.5} def
+% Default Line Types
+/LTw {PL [] 1 setgray} def
+/LTb {BL [] LCb DL} def
+/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
+/LT0 {PL [] LC0 DL} def
+/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
+/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
+/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
+/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
+/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
+/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
+/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
+/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
+/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
+/Dia {stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt} def
+/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt} def
+/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke} def
+/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt} def
+/Star {2 copy Pls Crs} def
+/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill} def
+/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill} def
+/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt} def
+/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill} def
+/Pent {stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt} def
+/PentF {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore} def
+/Circle {stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt} def
+/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
+/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
+/C1 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C2 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C3 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C4 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C5 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc} bind def
+/C6 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C7 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C8 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C9 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C11 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C12 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C13 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C14 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc} bind def
+/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath} bind def
+/Square {dup Rec} bind def
+/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
+/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
+/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
+/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
+/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
+/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare} bind def
+/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare} bind def
+/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
+/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
+/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
+/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
+/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
+/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
+/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
+/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
+/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
+/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
+/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
+/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
+/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
+/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
+/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
+/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
+/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
+/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
+/DiaE {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke} def
+/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke} def
+/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke} def
+/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke} def
+/PentE {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore} def
+/CircE {stroke [] 0 setdash
+ hpt 0 360 arc stroke} def
+/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
+/DiaW {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke} def
+/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke} def
+/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke} def
+/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke} def
+/PentW {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore} def
+/CircW {stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke} def
+/BoxFill {gsave Rec 1 setgray fill grestore} def
+/Density {
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor} def
+/BoxColFill {gsave Rec PolyFill} def
+/PolyFill {gsave Density fill grestore grestore} def
+/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
+%
+% PostScript Level 1 Pattern Fill routine for rectangles
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill {gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 M 0 PFs V} for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 2 1 roll M PFs 0 V} for
+ } if
+ stroke grestore} def
+%
+/languagelevel where
+ {pop languagelevel} {1} ifelse
+ 2 lt
+ {/InterpretLevel1 true def}
+ {/InterpretLevel1 Level1 def}
+ ifelse
+%
+% PostScript level 2 pattern fill definitions
+%
+/Level2PatternFill {
+/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
+ bind def
+/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
+>> matrix makepattern
+/Pat1 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
+ 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
+>> matrix makepattern
+/Pat2 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
+ 8 8 L 8 0 L 0 0 L fill}
+>> matrix makepattern
+/Pat3 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
+ 0 12 M 12 0 L stroke}
+>> matrix makepattern
+/Pat4 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
+ 0 -4 M 12 8 L stroke}
+>> matrix makepattern
+/Pat5 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
+ 0 12 M 8 -4 L 4 12 M 10 0 L stroke}
+>> matrix makepattern
+/Pat6 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
+ 0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
+>> matrix makepattern
+/Pat7 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
+ 12 0 M -4 8 L 12 4 M 0 10 L stroke}
+>> matrix makepattern
+/Pat8 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
+ -4 0 M 12 8 L -4 4 M 8 10 L stroke}
+>> matrix makepattern
+/Pat9 exch def
+/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
+/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
+/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
+/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
+/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
+/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
+/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
+} def
+%
+%
+%End of PostScript Level 2 code
+%
+/PatternBgnd {
+ TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
+} def
+%
+% Substitute for Level 2 pattern fill codes with
+% grayscale if Level 2 support is not selected.
+%
+/Level1PatternFill {
+/Pattern1 {0.250 Density} bind def
+/Pattern2 {0.500 Density} bind def
+/Pattern3 {0.750 Density} bind def
+/Pattern4 {0.125 Density} bind def
+/Pattern5 {0.375 Density} bind def
+/Pattern6 {0.625 Density} bind def
+/Pattern7 {0.875 Density} bind def
+} def
+%
+% Now test for support of Level 2 code
+%
+Level1 {Level1PatternFill} {Level2PatternFill} ifelse
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+/MFshow {
+ { dup 5 get 3 ge
+ { 5 get 3 eq {gsave} {grestore} ifelse }
+ {dup dup 0 get findfont exch 1 get scalefont setfont
+ [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
+ get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
+ {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
+ get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
+ dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
+ show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
+ pop aload pop M} ifelse }ifelse }ifelse }
+ ifelse }
+ forall} bind def
+/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
+ {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
+ 6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
+/MLshow { currentpoint stroke M
+ 0 exch R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MRshow { currentpoint stroke M
+ exch dup MFwidth neg 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MCshow { currentpoint stroke M
+ exch dup MFwidth -2 div 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/XYsave { [( ) 1 2 true false 3 ()] } bind def
+/XYrestore { [( ) 1 2 true false 4 ()] } bind def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+882 448 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 448 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 684 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 684 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 50)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 920 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 920 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 100)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1156 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1156 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 150)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1392 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1392 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 200)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1628 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1628 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 250)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1864 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1864 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 300)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 2100 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 2100 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 350)]
+] -46.7 MRshow
+1.000 UL
+LTb
+969 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+969 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1309 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1309 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1649 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1649 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1988 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1988 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 64)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2328 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2328 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 256)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2667 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2667 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (1k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3007 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3007 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (4k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3347 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3347 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (16k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+LCb setrgbcolor
+308 1274 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (time per RHS evaluation [)]
+[(Symbol) 140.0 0.0 true true 0 (m)]
+[(Helvetica) 140.0 0.0 true true 0 (s])]
+] -46.7 MCshow
+grestore
+LTb
+LCb setrgbcolor
+2164 98 M
+[ [(Helvetica) 140.0 0.0 true true 0 (number of cores)]
+] -46.7 MCshow
+LTb
+2164 2310 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Cactus Benchmark)]
+] -46.7 MCshow
+1.000 UP
+1.000 UL
+LTb
+1.000 UP
+3.000 UL
+LT0
+LTb
+2795 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Surveyor \(gcc\))]
+] -46.7 MRshow
+LT0
+2879 861 M
+399 0 V
+1309 1444 M
+170 237 V
+170 70 V
+169 89 V
+170 86 V
+170 -50 V
+170 -50 V
+170 -58 V
+169 -30 V
+170 -19 V
+170 10 V
+1309 1444 Pls
+1479 1681 Pls
+1649 1751 Pls
+1818 1840 Pls
+1988 1926 Pls
+2158 1876 Pls
+2328 1826 Pls
+2498 1768 Pls
+2667 1738 Pls
+2837 1719 Pls
+3007 1729 Pls
+3078 861 Pls
+1.000 UP
+3.000 UL
+LT1
+LTb
+2795 721 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Surveyor \(XL -O3\))]
+] -46.7 MRshow
+LT1
+2879 721 M
+399 0 V
+1309 1191 M
+170 271 V
+170 101 V
+169 112 V
+170 119 V
+170 -59 V
+170 -60 V
+170 -71 V
+169 -21 V
+170 -14 V
+170 40 V
+1309 1191 Crs
+1479 1462 Crs
+1649 1563 Crs
+1818 1675 Crs
+1988 1794 Crs
+2158 1735 Crs
+2328 1675 Crs
+2498 1604 Crs
+2667 1583 Crs
+2837 1569 Crs
+3007 1609 Crs
+3078 721 Crs
+1.000 UP
+3.000 UL
+LT2
+LTb
+2795 581 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Surveyor \(XL -O2 NT=1\))]
+] -46.7 MRshow
+LT2
+2879 581 M
+399 0 V
+1309 1292 M
+170 287 V
+170 111 V
+169 117 V
+170 129 V
+170 -64 V
+170 -64 V
+170 -76 V
+169 -27 V
+170 -17 V
+170 27 V
+1309 1292 Star
+1479 1579 Star
+1649 1690 Star
+1818 1807 Star
+1988 1936 Star
+2158 1872 Star
+2328 1808 Star
+2498 1732 Star
+2667 1705 Star
+2837 1688 Star
+3007 1715 Star
+3078 581 Star
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+1.000 UP
+1.000 UL
+LTb
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Symbol Helvetica
diff --git a/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.gnuplot b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.gnuplot
new file mode 100644
index 000000000..8bd18e336
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.gnuplot
@@ -0,0 +1,26 @@
+set terminal postscript eps enhanced color colortext
+set output "results-surveyor.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "time per RHS evaluation [{/Symbol m}s]"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==13 && ($6== 4 || $6==$5) && $7== 1 && $8==12) print; }' results-surveyor.out" u 5:($9/13**3/128/2/4*1e6) t "Surveyor (gcc)" w lp lt 1 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==13 && ($6== 4 || $6==$5) && $7== 1 && $8==17) print; }' results-surveyor.out" u 5:($9/13**3/128/2/4*1e6) t "Surveyor (XL -O3)" w lp lt 2 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==13 && ($6== 4 || $6==$5) && $7== 1 && $8==24) print; }' results-surveyor.out" u 5:($9/13**3/128/2/4*1e6) t "Surveyor (XL -O2 NT=1)" w lp lt 3 lw 3
diff --git a/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.out b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.out
new file mode 100644
index 000000000..28e221cb7
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.out
@@ -0,0 +1,83 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000008 04 01 11 624.81453443 624.81587300
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000016 04 01 11 722.29658222 722.29789900
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000032 04 01 11 856.51289034 856.51418100
+Bench_McLachlan_Carpet_9lev 000016 0013 surveyor 000064 04 01 11 990.83257842 990.83382200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 12 474.73102307 474.73792200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 13 474.73304176 474.74013000
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 14 353.43284893 353.44015100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 15 354.80218959 354.80959700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 16 354.25393677 354.25944800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 17 354.24795341 354.25368500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 01 24 402.40606427 402.43172300
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 02 24 368.71265006 368.73671500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000004 04 04 24 423.47243500 423.49637700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 12 587.83344865 587.84038800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 13 587.83427477 587.84117200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 16 483.27703333 483.28223200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 17 483.28208899 483.28713400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 01 24 539.04188609 539.06714400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 02 24 478.89512539 478.91900600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000008 04 04 24 529.95997810 529.98364000
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 12 621.02077198 621.02724100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 13 621.02325130 621.02977400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 16 531.48647189 531.49166300
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 17 531.50013304 531.50524200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 01 24 591.86942029 591.89477900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 02 24 546.27444744 546.29893600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000016 04 04 24 601.43862677 601.46170600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 01 12 663.63607979 663.64234500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 01 17 584.96824789 584.97351100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 01 24 647.66671872 647.69216700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 02 24 583.07553291 583.10012000
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000032 04 04 24 680.23909044 680.26201800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 01 12 704.49752784 704.50370900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 01 17 641.53944421 641.54449600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 01 24 709.36412024 709.38944500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 02 24 672.67334104 672.69806600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000064 04 04 24 733.98860598 734.01216900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 01 12 680.81795001 680.82374700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 01 17 613.33822298 613.34337200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 01 24 678.77758837 678.80245200
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 02 24 712.54289889 712.56739100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000128 04 04 24 777.76560855 777.78945600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 01 12 656.88587546 656.89153500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 01 17 584.75300932 584.75826400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 01 24 648.16144729 648.18662400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 02 24 726.10420942 726.12888400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000256 04 04 24 871.23243618 871.25640300
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 01 12 629.33461618 629.34111400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 01 17 550.75939202 550.76536000
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 01 24 612.12420130 612.15021700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 02 24 660.35826373 660.38315900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 000512 04 04 24 777.18240929 777.20551700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 01 12 614.91167831 614.91829700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 01 17 540.82126856 540.82751900
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 01 24 599.33794880 599.36401100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 02 24 726.01640749 726.04139400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 001024 04 04 24 801.99207425 802.01554500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 01 12 605.89694047 605.90319800
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 01 17 534.18274617 534.18838400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 01 24 591.15428829 591.18018600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 02 24 684.06852770 684.09363500
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 002048 04 04 24 786.45297337 786.47702100
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 01 12 610.38005638 610.38661600
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 01 17 553.31349373 553.31948300
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 01 24 603.95671153 603.98307400
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 02 24 621.42736435 621.45178700
+Bench_McLachlan_Carpet_9lev 000128 0013 surveyor 004096 04 04 24 723.74744177 723.77182100
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 00 854.29521608 854.30252600
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 03 877.72644567 877.73262500
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000004 04 01 12 856.12551332 856.13247900
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000008 04 01 12 997.28535914 997.29286100
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000016 04 01 12 1033.45034432 1033.45698300
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000032 04 01 12 1080.10361314 1080.11021100
+Bench_McLachlan_Carpet_9lev 000128 0016 surveyor 000064 04 01 12 1126.44904256 1126.45584400
+Bench_McLachlan_Carpet_9lev 000128 0020 surveyor 000004 04 01 00 1737.21421933 1737.22385900
+Bench_McLachlan_Carpet_9lev 000128 0020 surveyor 000004 04 01 03 1771.05630064 1771.06430100
+Bench_McLachlan_Carpet_9lev 000128 0025 surveyor 000004 04 01 00 3050.30690145 3050.31646500
+Bench_McLachlan_Carpet_9lev 000128 0025 surveyor 000004 04 01 03 3093.32195663 3093.32960000
diff --git a/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.pdf b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.pdf
new file mode 100644
index 000000000..2eed66999
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.png b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.png
new file mode 100644
index 000000000..76032a1ea
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-surveyor/results-surveyor.png
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-whatif/Makefile b/Carpet/CarpetWeb/scaling-whatif/Makefile
new file mode 100644
index 000000000..a409ba7f3
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/Makefile
@@ -0,0 +1,36 @@
+all: results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+
+results.eps results-best.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out
+results-scaled.eps: results-franklin.out results-hlrb2.out results-kraken.out results-queenbee.out results-ranger.out results-sicortex.out results-surveyor.out
+results-sicortex.eps: results-sicortex.out
+results-surveyor.eps: results-surveyor.out
+results-openmp-node.eps: results-ranger-openmp-node.out
+results-openmp-procs.eps: results-ranger-openmp-procs.out
+results-whatif.eps: results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out
+
+results-ranger-openmp-procs.out results-ranger-openmp-node.out: results2openmp results-ranger.out
+ ./results2openmp
+
+results-whatif-orig.out results-whatif-bw.out results-whatif-bwlat.out: results2whatif results-ranger.out
+ ./results2whatif
+
+%.eps: %.gnuplot
+ gnuplot < $*.gnuplot
+
+%.pdf: %.eps
+ epstopdf $*.eps
+
+rsync:
+ -rsync -Paz franklin.nersc.gov:/project/projectdirs/m152/schnette/franklin/Calpha/results-franklin.out .
+ -rsync -Paz -e 'ssh numrel02.cct.lsu.edu ssh' lu78kog@hlrb2.lrz-muenchen.de:Calpha/results-hlrb2.out .
+ -rsync -Paz kraken-pwd.nics.utk.edu:work/Calpha/results-kraken.out .
+ -rsync -Paz queenbee.loni.org:work/Calpha/results-queenbee.out .
+ -rsync -Paz ranger.tacc.utexas.edu:work/Calpha/results-ranger.out .
+
+clean:
+ rm -f results-old.pdf results.pdf results-best.pdf results-scaled.pdf results-sicortex.pdf results-surveyor.pdf results-openmp-node.pdf results-openmp-procs.pdf results-whatif.pdf
+ rm -f results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
+
+.PHONY: all rsync clean
+
+.PRECIOUS: results-old.eps results.eps results-best.eps results-scaled.eps results-sicortex.eps results-surveyor.eps results-openmp-node.eps results-openmp-procs.eps results-whatif.eps
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-ranger.out b/Carpet/CarpetWeb/scaling-whatif/results-ranger.out
new file mode 100644
index 000000000..f3d2cd6f5
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-ranger.out
@@ -0,0 +1,731 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000001 01 01 00 203.34181004 203.17269400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000002 01 01 00 216.48381171 214.91743400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 01 01 00 224.79743401 222.67391600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 01 00 225.55916500 223.26195300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 02 00 227.73820433 448.76805100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 01 00 250.15185397 247.88349900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 02 00 228.08169453 449.48009900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 04 00 217.13066064 842.24063700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 01 01 00 233.10094116 229.75036200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 01 00 233.19921911 229.78636000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 02 00 244.37134496 477.12581700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 01 00 258.23619396 254.33989300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 02 00 244.90335442 477.42583900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 04 00 249.90565515 961.74010700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 01 00 269.97584784 266.77666800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 02 00 263.66399936 514.15613600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 04 00 251.26438961 962.74016300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 08 00 451.35835544 1759.58196800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 01 01 00 251.79208282 248.25551300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 01 00 250.43519239 247.35945700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 02 00 262.76931463 499.52722200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 01 00 272.61282118 268.75279900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 02 00 263.38652800 497.81511700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 04 00 267.84285138 1015.03143900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 01 00 283.82180268 280.40552400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 02 00 276.44695753 529.56109800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 04 00 269.95993217 1019.53972100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 02 00 302.52861096 580.79630100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 04 00 287.96300239 1085.59584900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 08 00 506.02417788 1958.31438900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 16 00 945.63415069 3586.02411700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 01 00 244.06186508 240.83505200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 02 00 311.07908856 545.71810200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 01 00 260.56962053 256.90806000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 02 00 307.42328503 541.94187400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 02 00 329.18879068 579.17619800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 04 00 320.86426466 1168.51303200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 08 00 557.53919876 2063.66497100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 01 00 301.34188177 297.53859700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 02 00 355.17583551 633.57159300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 04 00 341.13174056 1237.64134900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 08 00 569.41086980 2091.24669300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 16 00 1033.12306375 3830.38338700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 01 00 289.06331326 285.16581900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 02 00 352.71452486 598.60540800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 04 00 362.43147997 1209.49558600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 01 00 304.82141249 300.97080700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 02 00 357.45966333 615.11044000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 04 00 364.19004945 1221.94837000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 02 00 410.85168504 676.29426200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 04 00 389.78656087 1289.66060200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 08 00 617.16478157 2196.09324100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 16 00 1122.14518604 3964.89579300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 01 00 283.19449419 279.26945200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 02 00 354.73297941 638.81991800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 04 00 351.54334233 1171.76523100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 08 00 686.13575692 2212.90629800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 01 00 314.41209947 309.90736600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 02 00 381.45197367 685.53884100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 04 00 381.18182537 1250.76617500
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 16 00 1238.58164954 4001.79410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 01 00 321.26949165 317.55183900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 02 00 353.36466413 627.80722700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 04 00 394.88733847 1258.84668200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 08 00 750.20929978 2398.59789600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 16 00 1296.49837951 4002.73814800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 01 00 330.05376020 328.70453600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 02 00 370.45905646 641.72410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 04 00 463.38659104 1306.92167900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 08 00 817.68327319 2451.90123900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 16 00 1392.72301206 4172.90078600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 01 00 327.57180887 326.18838700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 02 00 393.14333660 665.91761700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 04 00 460.19393866 1323.99474200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 08 00 829.87244544 2422.70740900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 16 00 1417.12743675 4216.83553800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 01 00 336.75282418 335.08493800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 02 00 415.28737663 659.84523800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 04 00 461.46395478 1308.48578000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 08 00 824.18623915 2315.60871300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 16 00 1773.87495286 4689.15305600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 01 00 345.42287805 344.43352700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 02 00 456.01397646 731.16169900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 04 00 468.62811576 1321.83061000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 08 00 781.69233130 2354.10312300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 02 00 408.13220878 671.70598400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 04 00 435.55672982 1382.01036700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 08 00 824.13038674 2327.15343400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 16 00 1644.94038777 4342.18337400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 15 1.99500456 1.73611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 16 2.00825253 1.71611100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 17 1.99534991 1.74410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 18 1.92537351 1.72410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 19 1.80289350 1.67210600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 20 1.89577949 1.72410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 21 2.03105967 1.73610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 22 1.98644780 1.70410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 23 1.98241529 1.72811000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 24 2.09280068 1.74410900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 25 1.72968587 1.72010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 26 1.83753688 1.66410200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 32 1.76542921 1.71211000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 33 1.70881499 1.68010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 34 1.71809744 1.72410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 35 1.92583941 1.92412000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 36 2.60543477 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 37 1.78591132 1.67610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 38 1.67977806 1.65610300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 39 1.71200809 1.68410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 40 1.92712333 1.71610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 45 10.92630000 10.82467500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 46 202.63338200 50.85917400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 47 10.95013800 10.73666800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 60 13.47732400 13.25682900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 61 11.09817600 11.08468800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 62 13.52589500 13.27283100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 63 13.51054200 13.21682600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 64 11.08019700 11.07269300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 65 12.79806000 12.49678500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 66 11.67222800 11.50471500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 68 11.02299500 10.90468000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 69 12.30104200 12.03675200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 70 11.51838900 11.09269500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 71 11.67129800 11.41671600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 15 1.85304780 1.82811700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 16 2.01170792 1.84011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 17 2.03905799 2.02812900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 18 2.03484985 1.84811400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 19 1.89138905 1.81611400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 20 1.88166371 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 21 1.85964446 1.85211800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 22 1.88492482 1.87211600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 23 1.89094756 1.88011500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 24 2.19453134 1.84011900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 25 2.15761771 1.87611600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 26 1.89103346 1.85611700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 32 1.89248386 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 33 2.09446628 1.84811300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 34 1.94313465 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 35 1.91670404 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 36 1.93606592 1.90011600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 37 1.82418737 1.80011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 38 1.85275587 1.81611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 39 1.89841448 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 40 2.24104077 1.92011800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 45 12.05363100 11.94074500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 46 153.75240200 38.76242300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 47 12.12808900 12.11676100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 60 14.92394500 14.78492700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 61 12.12349400 12.10075400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 62 14.80466800 14.74892300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 63 14.96187400 14.76092000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 64 12.12595700 12.12475500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 65 14.30293200 14.16088700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 66 13.13248600 13.04481600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 68 11.91711700 11.90874800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 69 13.52738500 13.50084500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 70 12.10463500 12.10076100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 71 12.51535400 12.43277500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 15 2.14613841 2.13613300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 16 2.08964146 2.07213000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 17 2.23050875 2.22414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 18 2.45300750 2.42815000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 19 2.69288940 2.66816700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 20 2.30087397 2.26413900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 21 2.71575292 2.69617000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 22 2.27281504 2.25213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 23 2.89347846 2.86417800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 24 2.74981965 2.75217300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 25 2.43014465 2.41215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 26 2.27919672 2.19213600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 32 2.51603498 2.49615300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 33 2.34132568 2.24014300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 34 2.19736293 2.14013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 35 2.42015784 2.16013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 36 2.19682006 2.18013500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 37 2.47760253 2.47215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 38 2.09433999 2.05612900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 39 2.15514387 2.13613200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 40 2.23896073 2.21614100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 45 10.95491800 10.87668200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 46 106.99900000 27.63373000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 47 10.66279400 10.57666300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 60 16.02752500 15.98900000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 61 11.20916600 11.15670000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 62 15.88848200 15.86499100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 63 15.97672400 15.93699700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 64 11.44016900 11.21270800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 65 16.10954400 15.98500300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 66 13.21578600 13.20082600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 68 10.71742600 10.70867100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 69 13.56445000 13.52484800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 70 11.25670200 11.16469700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 71 11.90071800 11.63672700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 15 2.44970802 2.26414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 16 2.44833974 2.32414800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 17 2.17747496 2.13212900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 18 2.17540596 2.14813400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 19 2.22853039 2.21214100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 20 2.25197693 2.24414200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 21 2.39005092 2.35214700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 22 2.21986902 2.19213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 23 2.22432535 2.22013800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 24 2.34639108 2.32014600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 25 2.22560016 2.19613700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 26 2.31736788 2.28814300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 32 2.33359981 2.31614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 33 2.07182797 2.03212500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 34 2.33560754 2.32414700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 35 2.19612642 2.09213100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 36 2.19244615 2.16413500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 37 2.56025559 2.53615900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 38 2.14005742 2.10413400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 39 2.21802727 2.19213500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 40 2.34475534 2.23213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 45 10.59146700 10.47665100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 46 121.83194400 31.24195100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 47 9.74507300 9.73260600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 61 10.81497000 10.58865900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 62 15.83085700 15.80098800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 63 16.00367800 15.98499700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 64 10.68756500 10.54865800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 65 15.84196900 15.81298400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 66 14.56524400 14.53291100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 68 10.19511200 10.18463500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 69 15.11225800 15.08894100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 70 10.60586400 10.56865700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 71 11.36569300 11.30870500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 15 2.61408830 2.59216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 16 2.38613506 2.36814600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 17 2.65185052 2.63216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 18 2.21687388 2.21614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 19 2.46240048 2.31214300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 20 2.46646909 2.46415100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 21 2.57484497 2.56415900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 22 2.65125207 2.62016000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 23 2.49789271 2.49615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 24 2.46372185 2.44414900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 25 2.49743606 2.34014800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 26 2.53578516 2.46815600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 32 2.32310441 2.33614600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 33 2.56218035 2.55615800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 34 2.20594374 2.18413700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 35 2.36721832 2.37214800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 36 2.66904334 2.66416600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 37 2.66352913 2.64016100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 38 2.33906610 2.33214500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 39 2.36094293 2.33214600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 40 2.50301425 2.42415400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 45 10.54430300 10.50866100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 46 105.94739300 26.98968800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 47 10.16426200 10.14063600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 61 10.65739500 10.62066700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 62 16.37545900 16.34101900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 63 16.53941800 16.50903400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 64 11.19909400 11.17269800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 65 16.05018200 15.99299800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 66 18.35528100 18.28514800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 68 10.25009600 10.23264100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 69 19.74344600 19.55722000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 70 10.69282400 10.68066800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 71 11.11411900 11.08069000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 23 2.77533373 2.72417000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 24 3.47726487 3.45621600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 25 7.75072005 7.74448500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 26 2.78908377 2.76417400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 32 2.50527371 2.47615500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 33 2.84105095 2.84017600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 34 2.38207440 2.37614700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 35 2.48143756 2.46815400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 36 2.52331640 2.47615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 37 2.48741660 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 38 2.69686531 2.56816000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 39 2.43263093 2.39615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 40 2.63556658 2.61216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 45 10.70063300 10.44465300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 47 10.23449000 10.22063700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 63 17.44569300 17.40108600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 65 16.34998700 16.31701600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 25.81468100 25.64560200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 32.28495700 32.28201600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.81439500 34.63816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.96018700 34.65416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 68 10.12227100 10.11663300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 69 27.51798900 27.31770500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 71 13.30935100 12.96880600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 23 2.70602361 2.68016800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 24 2.82725128 2.82817600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 25 2.71012373 2.64816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 26 2.70717850 2.66416700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 32 2.80160223 2.80017500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 33 2.96337194 2.94818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 34 2.44735784 2.42415500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 35 2.92295252 2.88017700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 36 2.84464568 2.47215300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 38 2.47655275 2.48015500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 39 2.36914912 2.30414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 42 10.24891600 9.95662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 52 10.04778200 9.97662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 63 17.51489100 17.46509400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 65 16.74508900 16.51303500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 71 10.68492600 10.54465500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 23 3.64010966 3.64423000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 24 3.75214619 3.70422900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 25 3.54584343 3.52822100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 26 3.33211255 3.22020200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 32 3.52961315 3.53621800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 33 2.77292498 2.72416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 34 2.44419424 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 35 2.62340227 2.00412400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 36 2.55986319 2.41615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 37 2.50177845 2.52415600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 38 2.29403566 2.28414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 39 2.21099217 2.17613500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 59 19.20047400 18.75317000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 60 19.44039300 19.17319900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 63 19.68925600 19.28920800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 65 18.39071800 18.36115100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 69 77.17565300 76.88080800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 71 10.14661700 9.86061600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 32 3.02414120 3.01619100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 33 2.82916677 2.81217700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 34 2.73830927 2.70416900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 35 3.13103430 3.08419400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 36 3.62117172 2.96818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 37 3.07523643 3.05219100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 38 9.34603220 9.33258200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 39 4.41087391 4.40027600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 71 10.41400200 9.96062700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 32 19.03294052 19.03318900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 33 3.20325611 3.18420100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 34 3.64873286 3.63622900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 35 5.76824320 5.74435900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 36 4.06577632 3.83224100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 37 4.00333875 3.99624700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 38 3.47725648 3.44421500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 39 4.64220864 3.98825000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 37 7.63925136 7.62847900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 38 4.95942385 4.92830900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 39 6.55097068 5.95237300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 00 122.54106532 122.43964000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 70 137.91245362 137.53659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 71 135.63270587 135.40044100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 00 183.05137779 182.34740400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 70 187.30018361 186.34765600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 71 185.75841382 184.67950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 00 180.00077328 179.96324900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 70 188.91985668 188.72779100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 71 186.41453722 186.15565600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 00 129.85302923 258.85217000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 70 139.97521767 278.69341900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 71 141.51701227 281.73762600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 00 236.26691144 234.90266100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 70 236.73086903 234.96268500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 71 229.82467734 228.02229000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 00 236.15145878 235.09065900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 70 240.49140858 239.34294100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 71 232.66685038 231.09043800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 00 216.99292067 426.67066900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 70 217.82767517 428.97080600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 71 216.73058569 426.98272200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 00 248.75942817 248.53554600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 70 232.06587985 231.78249500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 71 228.27816767 228.01424800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 00 214.19796909 422.93842400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 70 220.67594718 435.16720400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 71 209.97284200 414.55791500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 00 225.72213129 891.25570400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 70 257.72389956 1015.82752300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 71 257.80748799 1012.46728000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 00 274.82082107 272.30100200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 70 288.00210531 285.37783300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 71 274.44160638 271.89699400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 00 273.54665117 271.10493300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 70 286.84754310 284.44175300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 71 265.18844890 262.77241500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 00 271.56964828 531.53722400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 70 258.95359301 506.47966600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 71 246.48077225 483.78221200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 00 288.28569852 286.34586800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 70 282.58045572 280.80555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 71 270.86291599 269.04481700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 00 271.14896550 530.75718300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 70 257.72701692 505.51159700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 71 249.47188872 489.49062600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 00 322.88345290 1264.75505300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 70 328.14615812 1287.45648300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 71 321.18477198 1262.11486800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 00 297.04119270 296.97457100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 70 287.90201298 287.66194600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 71 279.55088937 277.57337300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 00 285.83271012 561.34306600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 71 242.58659491 479.38994400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 00 320.14915635 1255.83848600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 70 320.23161459 1253.39429600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 71 328.67928713 1292.82478800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 00 448.40270118 1763.57421700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 70 292.77910061 2273.21404200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 71 291.50975695 2271.12593300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 00 301.51189092 299.24667900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 70 303.41105413 300.74280200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 71 292.02127953 289.43007600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 00 301.62872519 299.57471400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 70 309.30955111 307.18317000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 71 295.99160188 294.03436700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 00 309.13612524 597.00130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 70 288.63654603 562.76319700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 71 274.05435093 535.64549700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 00 318.14699887 316.27575400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 70 303.45030848 302.42288800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 71 296.42845066 294.75439600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 00 309.54233248 602.84166500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 70 295.24449971 575.24799300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 71 274.77006856 537.34158400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 00 417.05867436 1607.25245900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 70 409.92962198 1583.87495800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 71 380.32455437 1480.97253000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 00 323.18693460 323.06420400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 70 310.41332580 309.94337800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 71 300.73102585 300.54277200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 00 328.35249656 635.21967600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 70 284.72961366 558.63492700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 71 267.87115046 526.22084900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 00 418.01371976 1606.47240400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 70 405.35986899 1569.39808900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 71 397.65546045 1544.81659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 00 726.72729222 2703.58096900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 70 407.85024613 3166.64991000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 71 414.87878198 3210.36063800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 00 360.43062715 359.66248400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 01 362.41548137 362.25466100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 02 359.46430584 358.82244000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 03 360.40211611 359.69846600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 04 361.60963682 360.76253200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 05 362.19089131 361.76658000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 06 362.14195383 361.62658800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 07 362.09293188 361.56259000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 08 363.41700161 362.63865000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 11 361.72727898 360.91055500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 27 362.05011972 361.62260700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 29 369.80960707 356.04224300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 30 372.54992350 360.49454200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 31 372.06669911 371.12721500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 69 350.95761078 350.33787100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 70 351.63983979 350.51789600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 00 340.94451255 667.23371500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 00 440.90069490 1696.21401700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 01 443.54903601 1698.69415800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 02 440.82711267 1688.11348200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 03 441.00726498 1691.36168700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 00 698.48752227 2602.79866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 70 413.90443403 3212.12476500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 00 795.00396901 3094.41337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 70 387.08693269 5906.86915500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 00 326.04384389 324.21627800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 70 337.57346556 335.35695900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 71 318.80304607 316.93181800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 00 333.07253875 644.93227800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 70 316.28406517 610.91020600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 71 298.15574373 578.73616000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 00 333.26932616 331.41269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 71 313.61524679 311.77549800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 00 333.52000621 645.64032800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 71 291.33919633 566.53543500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 00 515.54133086 1943.80147900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 70 469.89494876 1810.14911700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 71 442.70702729 1717.55536200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 00 343.17846395 341.57736700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 70 340.33822680 338.78114200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 71 323.65484424 321.82412700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 00 351.70758524 675.06217300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 70 303.79429054 591.36899800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 71 293.69677634 568.89953600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 00 517.49909365 1954.82218200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 70 479.90251154 1844.21924800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 71 451.36163723 1748.77729400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 00 1055.86987880 3701.79133200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 70 531.59447720 4051.62517600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 71 507.91281970 3901.08381400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 00 390.31553259 389.97238000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 01 395.77887272 395.56872000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 02 390.80241660 389.85234000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 03 393.12085078 392.10847000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 04 395.55309817 395.37269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 05 389.81423140 389.29636700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 06 393.19438455 392.82055600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 07 389.67084561 389.54837000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 08 391.29633427 391.10443000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 11 390.72713972 390.20437800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 27 398.28608009 396.02876700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 29 401.03977832 386.98017800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 30 404.52326881 394.25663200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 31 437.06683003 436.70730500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 69 382.99106211 382.33189300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 70 385.36752349 385.00806600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 71 375.95657347 375.46341200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 00 383.35456131 739.23424900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 70 349.61876433 680.23451300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 71 330.96690626 645.80038000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 00 529.41246322 1993.43258400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 01 537.49802173 2019.49822300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 02 528.36463041 1995.14468600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 03 535.24064646 2024.62652000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 70 463.23995386 1788.59178500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 71 429.58751955 1668.59631500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 00 1036.91991574 3633.95512500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 70 517.86666666 3962.95167500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 71 490.51058293 3782.34037100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 00 1346.48871925 4979.39919700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 70 649.30993415 9793.99613300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 71 656.72454561 9945.57355800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 00 384.25940026 382.68789800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 70 360.45498790 359.24643200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 71 342.33402440 341.78132500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 00 382.84727695 697.47958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 70 347.90248895 645.36434500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 71 334.55869590 624.17098500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 00 569.85026179 2026.69067000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 70 516.36014326 1858.87618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 71 487.75067417 1760.92603900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 00 386.26711080 386.06411100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 70 369.37387139 368.83503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 71 367.71863649 367.61898100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 00 397.71097153 728.80952900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 70 353.01166100 652.56876500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 71 334.64443949 624.41101400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 00 572.20395575 2024.86254400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 70 534.26113687 1926.90839800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 71 504.74932960 1827.05818100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 00 1554.26026900 4989.75183300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 70 652.86537102 4888.66553100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 71 600.04190600 4547.24018500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 00 431.31010658 431.16292700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 01 441.13154728 439.83948700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 02 439.77616612 438.00337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 03 470.26668580 469.08130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 04 433.97723262 433.57512000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 05 456.80279773 455.35247100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 06 439.04137152 438.76341500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 07 427.26071143 426.63864600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 08 427.65338278 427.44271400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 11 437.41002050 437.15531900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 27 463.11914877 462.82891700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 29 2328.28713066 2318.43289800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 30 439.66708345 429.57086600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 31 433.89363870 433.76313800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 69 416.50034724 415.57397400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 70 436.47173601 436.23527100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 71 417.34331894 415.39392000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 00 427.14753026 787.80123700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 70 395.14246498 733.56984800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 71 368.67281962 693.36329100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 00 591.74799377 2118.78441700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 01 606.03415259 2161.71509800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 02 606.57069465 2160.00298500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 03 609.42726870 2169.47158600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 70 528.83833280 1917.96386400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 71 488.48490761 1789.02781400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 00 1546.19907614 5007.49296100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 70 631.67315156 4768.09001100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 71 607.70209688 4613.98434600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 00 1858.96060941 6315.72272000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 70 804.20874109 11734.48135300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 71 758.89552524 11259.30765700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 00 364.62904241 364.22276400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 70 379.81920310 379.69573800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 71 396.00827453 395.18070400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 00 440.86034016 796.68577000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 70 378.40813455 703.46795100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 71 413.95889019 758.59540300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 00 599.82393181 1979.99574800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 70 540.37555430 1850.29964100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 71 503.74059530 1748.33327700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 00 1788.01350286 5380.72425200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 70 678.67737144 5006.15286600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 71 642.28407215 4769.47405600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 00 404.99298149 404.92531000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 01 431.08043735 430.71091800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 02 427.04413413 426.51866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 03 433.42988977 431.87500600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 04 417.92239112 417.67407500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 05 429.07855982 427.86275000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 06 444.53289246 444.34380100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 07 418.31180983 416.85004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 08 422.25409577 420.87826200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 11 413.70373561 412.40574900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 27 434.69497877 432.78307600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 29 419.66531388 410.26962500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 30 439.21915391 428.73479800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 31 434.61412737 433.23107800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 69 430.70154522 430.00688500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 70 438.41579003 437.91137400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 71 431.95664416 431.63498300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 00 472.33713063 856.02950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 70 421.91766016 779.28067100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 71 444.19184591 804.59427400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 00 628.96382082 2049.31606300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 01 642.24077718 2088.03048700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 02 689.82439842 2179.65220800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 03 670.76284182 2138.68566500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 70 559.62706526 1905.94711600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 71 545.43877754 1850.99568200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 00 1763.50365242 5334.35736900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 70 689.57964971 5051.44369100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 71 636.76134103 4722.85116200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 00 2237.19241006 7141.26229600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 70 800.63435093 11681.41004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 71 743.16011415 11063.20738400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 00 416.81854382 416.65008200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 01 424.06496044 423.97053300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 02 435.50639245 435.05518500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 03 452.47220833 452.26825200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 04 420.10070920 419.89827200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 05 419.56022792 419.16618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 06 435.70374093 433.69513500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 07 426.06771261 425.86660700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 08 416.79365528 416.45001900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 11 426.59510188 424.97055100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 27 422.20029125 421.98237100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 29 451.74462182 442.01958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 30 429.08432736 421.15431500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 31 431.13646925 430.77493200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 69 428.61061831 428.29876600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 70 443.75125332 443.19964900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 71 430.91503566 430.43491100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 00 493.58668537 878.29491000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 70 482.44695258 863.17793000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 71 440.23977765 802.17812500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 00 639.43174573 2105.13555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 02 661.28716728 2138.28163000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 03 661.23409816 2155.13869800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 70 563.27954600 1899.01067800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 71 522.37506390 1795.84423300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 00 2007.78571537 5415.25443200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 70 761.92412640 5155.37016100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 71 697.91456742 4817.27303700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 00 2633.87542579 7447.83346100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 70 874.75492376 12621.71282100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 71 792.28551614 11551.60588900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 00 432.15376549 432.15100400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 01 441.80254700 441.46759900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 02 466.84211560 466.84116400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 03 455.53552447 455.25647500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 04 429.11185786 428.98679500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 27 483.96443456 481.35408500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 29 455.41548594 447.59996800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 30 470.07764442 460.69678200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 31 467.55431002 465.62509900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 69 445.45534276 444.89979100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 71 432.57437397 431.60298900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 00 481.33138896 871.35843600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 71 450.67742913 816.63503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 00 629.96891954 2108.09974400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 01 650.63503716 2168.72754200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 02 659.67285103 2198.78939500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 03 658.38587013 2192.54502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 71 531.22941551 1840.13502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 08 00 2182.42442297 5113.60358800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 16 00 2917.04701424 7032.92755200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 00 430.57254488 429.10679800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 01 437.24065480 436.92725400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 02 470.04598340 469.48934500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 03 452.01172928 452.10824500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 04 435.76047032 435.42721100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 27 464.35032003 462.29691900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 29 465.19633431 457.62460400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 30 452.24806910 439.00743100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 31 454.38764507 451.27620200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 71 438.81654108 438.29943200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 00 503.23849598 902.79243700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 71 484.87606011 874.36265300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 00 648.85708079 2173.22782000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 01 678.40451218 2219.06267800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 02 692.87624405 2285.97485100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 03 693.47299075 2276.57427800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 71 547.03842935 1875.64522500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 08 00 2192.73954194 5185.64406200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 16 00 3194.24190197 7228.57974800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 00 474.30655592 473.98159600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 01 482.89148177 482.66217100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 02 486.30503508 484.72232100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 03 486.71080130 485.29434700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 27 519.71460553 519.34445800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 29 502.39021118 491.49071300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 30 466.38628136 456.32853800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 31 463.41367294 463.26092800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 71 399.03692711 398.91291300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 00 516.41948016 932.54231900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 71 485.12292738 857.40158900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 00 644.42646233 2202.95367200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 01 676.88389260 2272.85005100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 02 671.90049929 2283.31869400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 03 679.92398633 2195.80124500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 71 573.36576023 1935.17692900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 08 00 2191.28902042 5020.00972000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 30 564.43722649 556.34275800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 31 540.58077165 540.06973100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 71 455.91632274 455.34043200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 00 598.95507284 1056.66598500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 71 471.13539881 838.79645300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 00 655.37947027 2238.28789400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 01 686.16152266 2319.69698300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 02 700.27613265 2338.29413500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 03 673.68116989 2296.11949200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 71 573.91736912 1928.58452600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 08 00 2164.29166218 4984.59550500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 01 71 433.90391986 433.17103800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 00 618.88302882 1096.32051400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 71 451.53836770 830.44792700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 00 664.84209040 2282.41064700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 01 687.25730075 2343.11442100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 02 686.03115911 2356.38325800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 03 699.08293954 2368.18000400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 71 543.33106637 1907.09519100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 08 00 2165.34595664 4986.41963400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 01 71 437.99540328 436.87931300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 02 71 463.45291184 859.60171800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 01 738.65903756 2406.06234900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 02 793.26796536 2537.16257600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 03 710.98674150 2315.13667500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 71 545.43758320 1926.07638400
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif-bw.out b/Carpet/CarpetWeb/scaling-whatif/results-whatif-bw.out
new file mode 100644
index 000000000..23c5c310a
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif-bw.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 51 389.47344708 376.82760600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 51 427.29224968 414.18987800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 51 468.87827706 455.78450100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 51 491.67039084 482.87815000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 51 533.61160135 527.58096600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 51 500.59744263 494.36288200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 51 476.86723900 470.84938700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 51 458.97451353 454.44442800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 51 436.93441629 431.95500700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 51 476.40951514 471.73747300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 51 484.72250724 480.57803300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 51 496.09946489 492.02273600
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif-bwlat.out b/Carpet/CarpetWeb/scaling-whatif/results-whatif-bwlat.out
new file mode 100644
index 000000000..a3e22a0d1
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif-bwlat.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 52 381.81449485 369.91510800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 52 421.87990785 407.86147400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 52 465.03736973 453.38033300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 52 490.74024415 479.36598700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 52 543.91181445 536.93353600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 52 517.28014588 510.25591400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 52 518.99811196 512.80408400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 52 490.89922404 485.80636300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 52 480.04649687 474.67367400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 52 523.34186959 518.44838400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 52 502.55980611 496.09100500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 52 494.35133028 489.53059200
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif-orig.out b/Carpet/CarpetWeb/scaling-whatif/results-whatif-orig.out
new file mode 100644
index 000000000..00101ea76
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif-orig.out
@@ -0,0 +1,12 @@
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 50 368.31895638 364.48679000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 50 403.65297389 398.66888300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 50 433.79905939 429.07077700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 50 453.33379769 449.05209000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 50 477.42585325 474.75770700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 50 446.53416204 443.65970800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 50 421.50431681 418.52209200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 50 386.16655254 383.67997000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 50 365.84427381 363.40272800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 50 378.49561858 376.21552700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 50 357.60511637 355.38218100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 50 362.58709908 360.02246700
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif.eps b/Carpet/CarpetWeb/scaling-whatif/results-whatif.eps
new file mode 100644
index 000000000..00a627161
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif.eps
@@ -0,0 +1,813 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: results-whatif.eps
+%%Creator: gnuplot 4.2 patchlevel 4
+%%CreationDate: Fri Mar 27 15:37:44 2009
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 230 176
+%%EndComments
+%%BeginProlog
+/gnudict 256 dict def
+gnudict begin
+%
+% The following 6 true/false flags may be edited by hand if required
+% The unit line width may also be changed
+%
+/Color true def
+/Blacktext false def
+/Solid false def
+/Dashlength 1 def
+/Landscape false def
+/Level1 false def
+/Rounded false def
+/TransparentPatterns false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+%
+/vshift -46 def
+/dl1 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
+} def
+/dl2 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul add } if
+} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+Level1 {} {
+/SDict 10 dict def
+systemdict /pdfmark known not {
+ userdict /pdfmark systemdict /cleartomark get put
+} if
+SDict begin [
+ /Title (results-whatif.eps)
+ /Subject (gnuplot plot)
+ /Creator (gnuplot 4.2 patchlevel 4 )
+ /Author (Erik Schnetter)
+% /Producer (gnuplot)
+% /Keywords ()
+ /CreationDate (Fri Mar 27 15:37:44 2009)
+ /DOCINFO pdfmark
+end
+} ifelse
+%
+% Gnuplot Prolog Version 4.2 (August 2006)
+%
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/Z {closepath} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow {currentpoint stroke M 0 vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
+/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
+/BL {stroke userlinewidth 2 mul setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/AL {stroke userlinewidth 2 div setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/UL {dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def} def
+/PL {stroke userlinewidth setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+% Default Line colors
+/LCw {1 1 1} def
+/LCb {0 0 0} def
+/LCa {0 0 0} def
+/LC0 {1 0 0} def
+/LC1 {0 1 0} def
+/LC2 {0 0 1} def
+/LC3 {1 0 1} def
+/LC4 {0 1 1} def
+/LC5 {1 1 0} def
+/LC6 {0 0 0} def
+/LC7 {1 0.3 0} def
+/LC8 {0.5 0.5 0.5} def
+% Default Line Types
+/LTw {PL [] 1 setgray} def
+/LTb {BL [] LCb DL} def
+/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
+/LT0 {PL [] LC0 DL} def
+/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
+/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
+/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
+/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
+/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
+/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
+/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
+/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
+/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
+/Dia {stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt} def
+/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt} def
+/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke} def
+/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt} def
+/Star {2 copy Pls Crs} def
+/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill} def
+/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill} def
+/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt} def
+/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill} def
+/Pent {stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt} def
+/PentF {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore} def
+/Circle {stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt} def
+/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
+/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
+/C1 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C2 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C3 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C4 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C5 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc} bind def
+/C6 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C7 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C8 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C9 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C11 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C12 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C13 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C14 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc} bind def
+/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath} bind def
+/Square {dup Rec} bind def
+/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
+/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
+/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
+/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
+/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
+/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare} bind def
+/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare} bind def
+/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
+/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
+/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
+/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
+/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
+/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
+/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
+/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
+/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
+/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
+/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
+/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
+/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
+/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
+/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
+/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
+/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
+/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
+/DiaE {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke} def
+/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke} def
+/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke} def
+/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke} def
+/PentE {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore} def
+/CircE {stroke [] 0 setdash
+ hpt 0 360 arc stroke} def
+/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
+/DiaW {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke} def
+/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke} def
+/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke} def
+/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke} def
+/PentW {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore} def
+/CircW {stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke} def
+/BoxFill {gsave Rec 1 setgray fill grestore} def
+/Density {
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor} def
+/BoxColFill {gsave Rec PolyFill} def
+/PolyFill {gsave Density fill grestore grestore} def
+/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
+%
+% PostScript Level 1 Pattern Fill routine for rectangles
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill {gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 M 0 PFs V} for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 2 1 roll M PFs 0 V} for
+ } if
+ stroke grestore} def
+%
+/languagelevel where
+ {pop languagelevel} {1} ifelse
+ 2 lt
+ {/InterpretLevel1 true def}
+ {/InterpretLevel1 Level1 def}
+ ifelse
+%
+% PostScript level 2 pattern fill definitions
+%
+/Level2PatternFill {
+/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
+ bind def
+/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
+>> matrix makepattern
+/Pat1 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
+ 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
+>> matrix makepattern
+/Pat2 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
+ 8 8 L 8 0 L 0 0 L fill}
+>> matrix makepattern
+/Pat3 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
+ 0 12 M 12 0 L stroke}
+>> matrix makepattern
+/Pat4 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
+ 0 -4 M 12 8 L stroke}
+>> matrix makepattern
+/Pat5 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
+ 0 12 M 8 -4 L 4 12 M 10 0 L stroke}
+>> matrix makepattern
+/Pat6 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
+ 0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
+>> matrix makepattern
+/Pat7 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
+ 12 0 M -4 8 L 12 4 M 0 10 L stroke}
+>> matrix makepattern
+/Pat8 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
+ -4 0 M 12 8 L -4 4 M 8 10 L stroke}
+>> matrix makepattern
+/Pat9 exch def
+/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
+/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
+/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
+/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
+/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
+/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
+/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
+} def
+%
+%
+%End of PostScript Level 2 code
+%
+/PatternBgnd {
+ TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
+} def
+%
+% Substitute for Level 2 pattern fill codes with
+% grayscale if Level 2 support is not selected.
+%
+/Level1PatternFill {
+/Pattern1 {0.250 Density} bind def
+/Pattern2 {0.500 Density} bind def
+/Pattern3 {0.750 Density} bind def
+/Pattern4 {0.125 Density} bind def
+/Pattern5 {0.375 Density} bind def
+/Pattern6 {0.625 Density} bind def
+/Pattern7 {0.875 Density} bind def
+} def
+%
+% Now test for support of Level 2 code
+%
+Level1 {Level1PatternFill} {Level2PatternFill} ifelse
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+/MFshow {
+ { dup 5 get 3 ge
+ { 5 get 3 eq {gsave} {grestore} ifelse }
+ {dup dup 0 get findfont exch 1 get scalefont setfont
+ [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
+ get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
+ {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
+ get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
+ dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
+ show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
+ pop aload pop M} ifelse }ifelse }ifelse }
+ ifelse }
+ forall} bind def
+/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
+ {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
+ 6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
+/MLshow { currentpoint stroke M
+ 0 exch R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MRshow { currentpoint stroke M
+ exch dup MFwidth neg 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MCshow { currentpoint stroke M
+ exch dup MFwidth -2 div 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/XYsave { [( ) 1 2 true false 3 ()] } bind def
+/XYrestore { [( ) 1 2 true false 4 ()] } bind def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+882 448 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 448 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 655 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 655 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.2)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 861 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.4)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1068 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1068 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.6)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1274 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1274 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0.8)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1481 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1481 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1687 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1687 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1.2)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1894 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1894 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1.4)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 2100 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 2100 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1.6)]
+] -46.7 MRshow
+1.000 UL
+LTb
+969 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+969 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1309 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1309 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1649 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1649 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1988 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1988 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 64)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2328 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2328 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 256)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2667 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2667 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (1k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3007 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3007 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (4k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3347 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3347 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (16k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+LCb setrgbcolor
+308 1274 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (wall time increase)]
+] -46.7 MCshow
+grestore
+LTb
+LCb setrgbcolor
+2164 98 M
+[ [(Helvetica) 140.0 0.0 true true 0 (number of cores)]
+] -46.7 MCshow
+LTb
+2164 2310 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Cactus Benchmark \(Kraken, NT=1\))]
+] -46.7 MCshow
+1.000 UP
+1.000 UL
+LTb
+1.000 UP
+3.000 UL
+LT0
+LTb
+2795 1001 M
+[ [(Helvetica) 140.0 0.0 true true 0 (original)]
+] -46.7 MRshow
+LT0
+2879 1001 M
+399 0 V
+1309 1481 M
+170 0 V
+170 0 V
+169 0 V
+170 0 V
+170 0 V
+170 0 V
+170 0 V
+169 0 V
+170 0 V
+170 0 V
+170 0 V
+1309 1481 Pls
+1479 1481 Pls
+1649 1481 Pls
+1818 1481 Pls
+1988 1481 Pls
+2158 1481 Pls
+2328 1481 Pls
+2498 1481 Pls
+2667 1481 Pls
+2837 1481 Pls
+3007 1481 Pls
+3177 1481 Pls
+3078 1001 Pls
+1.000 UP
+3.000 UL
+LT1
+LTb
+2795 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 (increased BW)]
+] -46.7 MRshow
+LT1
+2879 861 M
+399 0 V
+1309 1540 M
+170 1 V
+170 23 V
+169 4 V
+170 34 V
+170 4 V
+170 10 V
+170 59 V
+169 6 V
+170 67 V
+170 100 V
+170 13 V
+1309 1540 Crs
+1479 1541 Crs
+1649 1564 Crs
+1818 1568 Crs
+1988 1602 Crs
+2158 1606 Crs
+2328 1616 Crs
+2498 1675 Crs
+2667 1681 Crs
+2837 1748 Crs
+3007 1848 Crs
+3177 1861 Crs
+3078 861 Crs
+1.000 UP
+3.000 UL
+LT2
+LTb
+2795 721 M
+[ [(Helvetica) 140.0 0.0 true true 0 (increased LAT)]
+] -46.7 MRshow
+LT2
+2879 721 M
+399 0 V
+1309 1460 M
+170 7 V
+170 5 V
+169 7 V
+170 21 V
+170 15 V
+170 57 V
+170 -20 V
+169 30 V
+170 0 V
+170 -64 V
+170 -41 V
+1309 1460 Star
+1479 1467 Star
+1649 1472 Star
+1818 1479 Star
+1988 1500 Star
+2158 1515 Star
+2328 1572 Star
+2498 1552 Star
+2667 1582 Star
+2837 1582 Star
+3007 1518 Star
+3177 1477 Star
+3078 721 Star
+1.000 UP
+3.000 UL
+LT3
+LTb
+2795 581 M
+[ [(Helvetica) 140.0 0.0 true true 0 (increased BW and LAT)]
+] -46.7 MRshow
+LT3
+2879 581 M
+399 0 V
+1309 1518 M
+170 9 V
+170 28 V
+169 11 V
+170 58 V
+170 20 V
+170 75 V
+170 42 V
+169 42 V
+170 73 V
+170 23 V
+170 -43 V
+1309 1518 Box
+1479 1527 Box
+1649 1555 Box
+1818 1566 Box
+1988 1624 Box
+2158 1644 Box
+2328 1719 Box
+2498 1761 Box
+2667 1803 Box
+2837 1876 Box
+3007 1899 Box
+3177 1856 Box
+3078 581 Box
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+1.000 UP
+1.000 UL
+LTb
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif.gnuplot b/Carpet/CarpetWeb/scaling-whatif/results-whatif.gnuplot
new file mode 100644
index 000000000..378d3928a
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif.gnuplot
@@ -0,0 +1,33 @@
+set terminal postscript eps enhanced color colortext
+set output "results-whatif.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark (Kraken, NT=1)"
+set xlabel "number of cores"
+#set ylabel "time per RHS evaluation [{/Symbol m}s]"
+set ylabel "wall time increase"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+#p \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "original" w lp lt 1 lw 3, \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==51) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "bandwidth" w lp lt 2 lw 3, \
+#"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==52) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e6) t "bandwidth+latency" w lp lt 3 lw 3
+
+p \
+"< paste results-whatif-orig.out results-whatif-orig.out" u 5:($19/$9) t "original" w lp lt 1 lw 3, \
+"< paste results-whatif-orig.out results-whatif-bw.out" u 5:($19/$9) t "increased BW" w lp lt 2 lw 3, \
+"< paste results-whatif-bw.out results-whatif-bwlat.out" u 5:($19/$9) t "increased LAT" w lp lt 3 lw 3, \
+"< paste results-whatif-orig.out results-whatif-bwlat.out" u 5:($19/$9) t "increased BW and LAT" w lp lt 4 lw 3
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif.pdf b/Carpet/CarpetWeb/scaling-whatif/results-whatif.pdf
new file mode 100644
index 000000000..0b33d0977
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-whatif/results-whatif.png b/Carpet/CarpetWeb/scaling-whatif/results-whatif.png
new file mode 100644
index 000000000..06e442856
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results-whatif.png
Binary files differ
diff --git a/Carpet/CarpetWeb/scaling-whatif/results2whatif b/Carpet/CarpetWeb/scaling-whatif/results2whatif
new file mode 100644
index 000000000..54ab149f9
--- /dev/null
+++ b/Carpet/CarpetWeb/scaling-whatif/results2whatif
@@ -0,0 +1,16 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+
+
+
+# Select output for original
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==50) print; }' results-kraken.out > results-whatif-orig.out
+
+# Select output for increased bandwidth
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==51) print; }' results-kraken.out > results-whatif-bw.out
+
+# Select output for increased bandwidth and latency
+awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==52) print; }' results-kraken.out > results-whatif-bwlat.out
diff --git a/Carpet/CarpetWeb/sicortex/results-hlrb2.out b/Carpet/CarpetWeb/sicortex/results-hlrb2.out
new file mode 100644
index 000000000..b0e9853ab
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-hlrb2.out
@@ -0,0 +1,85 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000024 0020 hlrb2 000001 01 01 00 5.13499665 5.14400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000001 01 01 00 186.91880655 185.61600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000002 02 01 00 220.20438910 219.11600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000002 02 02 00 214.55147696 423.92400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 01 00 231.18661833 230.90000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 02 00 251.77147675 492.43200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000004 04 04 00 291.56947160 1082.29200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 01 00 284.81413913 284.18800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 02 00 306.43832397 590.70000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 04 00 324.80125213 1212.27600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000008 08 08 00 369.53091407 2550.59200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 01 00 301.74512243 301.32800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 02 00 305.04176641 579.66400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 04 00 363.74049592 1335.77600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 08 00 426.92180514 2849.48800000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000016 16 16 00 474.11036873 5928.32400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 01 00 312.45066810 311.97600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 02 00 350.20448923 654.86000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 04 00 431.81555462 1477.58400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 08 00 471.02439666 3095.39600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 16 00 628.79774189 7100.15200000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000032 32 32 00 675.18877506 14212.50000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 01 00 335.72597265 335.33600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 02 00 391.93287492 682.36400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 04 00 453.71378946 1517.36000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 08 00 540.30726910 3248.62000000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 16 00 732.82437968 7613.05600000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 32 00 867.69349027 16565.68400000
+Bench_McLachlan_Carpet_1lev 000024 0065 hlrb2 000064 64 64 00 1005.85764909 37395.58400000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000001 01 01 10 1.29906511 1.20000000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000002 02 01 10 2.13740206 2.10400000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000004 04 01 10 2.62449074 2.54800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000008 08 01 10 2.21243858 2.19200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000016 16 01 10 2.43998551 2.32800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000032 32 01 10 2.35174751 2.33200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000064 64 01 10 2.89009404 2.89200000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000128 128 01 10 2.22359061 2.20000000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000256 256 01 10 2.50717616 2.46800000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 000512 512 01 10 6.91676068 6.71600000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 001024 1024 01 10 30.94050145 30.87600000
+Bench_McLachlan_Carpet_9lev 000000 0025 hlrb2 002048 2048 01 10 3.83641720 3.80800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000001 01 01 00 182.51141620 182.02400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000001 01 01 10 200.79874182 200.18800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 01 00 281.35725307 280.12400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 01 10 299.81318593 298.43600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000002 02 02 00 204.77519417 405.15200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 01 00 373.53716779 371.05200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 01 10 389.50963879 387.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 02 00 323.96468210 635.69600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000004 04 04 00 274.13237286 1066.83600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 01 00 416.79449534 413.90000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 01 10 431.01822519 428.78400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 02 00 402.00020862 783.81200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 04 00 471.18366361 1798.19600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000008 08 08 00 345.37232614 2586.30400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 01 00 490.85937953 489.64400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 01 10 471.45920944 469.04800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 02 00 455.23554587 885.59600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 04 00 582.81878591 2200.88000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 08 00 639.37896895 4726.56800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000016 16 16 00 485.79755044 6897.66400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 01 00 525.12310481 524.21200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 01 10 533.41243887 532.36800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 02 00 506.58320308 957.85600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 04 00 643.36008477 2417.87600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 08 00 858.16334009 6280.97200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 16 00 1073.52412605 15029.21600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000032 32 32 00 796.23935318 20802.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 01 00 595.84084988 595.24800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 01 10 591.00428939 590.34400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 02 00 599.32032919 1027.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 04 00 741.07681203 2395.47200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 08 00 926.82490373 6575.82000000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 16 00 1314.07155108 17533.72400000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 32 00 1355.17224264 33640.83200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000064 64 64 00 1319.33960485 57778.41600000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000128 128 01 10 548.16778946 547.12800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000256 256 01 10 515.22758889 513.61200000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 000512 512 01 10 508.34639978 505.00800000
+Bench_McLachlan_Carpet_9lev 000128 0025 hlrb2 002048 2048 01 10 568.32370758 567.65200000
diff --git a/Carpet/CarpetWeb/sicortex/results-kraken.out b/Carpet/CarpetWeb/sicortex/results-kraken.out
new file mode 100644
index 000000000..a1a16999d
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-kraken.out
@@ -0,0 +1,243 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000001 01 01 02 7.94787478 7.93249400
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000002 01 01 02 9.26108479 9.27258000
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000002 02 01 02 9.36145306 9.31658700
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000002 02 02 02 16.08203602 16.05700600
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 01 01 02 10.67179680 10.63266800
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 02 01 02 11.27463484 11.21670000
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 02 02 02 19.23526311 19.18919600
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 04 01 00 11.60254765 11.46872000
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 04 01 02 11.55528212 11.45271400
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 04 02 02 18.88284779 18.80917300
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000004 04 04 02 32.62604594 32.62603600
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000008 02 01 02 12.22258759 12.16075600
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000008 02 02 02 21.00340366 20.95331000
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000008 04 01 02 12.75144887 12.66879000
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000008 04 02 02 21.47143698 21.38933500
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000008 04 04 02 36.18515110 36.16226200
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000016 04 01 02 14.79342532 14.70491800
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000016 04 02 02 26.46943021 26.40965100
+Bench_McLachlan_Carpet_1lev 000010 0020 kraken 000016 04 04 02 38.64918733 38.62241100
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000004 04 01 12 27.21192789 26.64166500
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000008 04 01 12 28.44224620 27.86974100
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000016 04 01 12 30.56476092 30.08188200
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000032 04 01 12 35.21725655 34.79417600
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000064 04 01 12 36.77948976 36.50628200
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000128 04 01 12 36.81042242 36.57428400
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000256 04 01 12 34.36209798 34.08612900
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 000512 04 01 12 32.68366075 32.38602700
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 001024 04 01 12 32.57933545 32.22201500
+Bench_McLachlan_Carpet_1lev 000010 0040 kraken 002048 04 01 12 32.94867969 32.64603700
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000004 04 01 12 47.53453064 46.63891600
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000008 04 01 12 57.37259865 55.95150100
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000016 04 01 12 61.84874105 61.02382200
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000032 04 01 12 63.57527709 62.93193100
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000064 04 01 12 60.43496895 60.02775000
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 000128 04 01 12 62.58501983 62.20388500
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 001024 04 01 12 60.39621639 59.78773300
+Bench_McLachlan_Carpet_1lev 000010 0050 kraken 004096 04 01 12 64.66578913 64.03600400
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000001 01 01 02 290.59384036 290.42214400
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000002 01 01 02 322.72628903 322.52815700
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000002 02 01 02 315.50726414 314.96368700
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000002 02 02 02 566.60829949 566.32739300
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 01 01 02 319.04495120 318.80392300
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 02 01 02 326.05179238 325.57634500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 02 02 02 608.65147138 608.28201300
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 04 01 02 338.25178266 337.01706500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 04 01 12 113.96951675 112.35102400
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 04 01 13 114.07574987 112.41902600
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 04 02 02 602.51760316 601.32958500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000004 04 04 02 1188.90550756 1188.34226800
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 02 01 02 336.60824203 335.88098800
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 02 02 02 620.35857821 619.90274200
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 04 01 02 351.16425180 349.96586900
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 04 01 12 116.48792005 115.05118800
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 04 01 13 116.72861791 115.19119800
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 04 02 02 639.66929793 638.63991400
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000008 04 04 02 1362.29413152 1361.64109500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000016 04 01 02 346.97067857 345.86561500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000016 04 01 12 116.12090397 114.32314200
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000016 04 01 13 116.46594119 114.61916800
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000016 04 02 02 682.83341646 681.59859200
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000016 04 04 02 1346.92159390 1346.23613500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000032 04 01 12 122.02278614 120.49153900
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000032 04 01 13 121.89060760 120.41952500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000064 04 01 12 133.34211421 131.98424500
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000064 04 01 13 133.07034540 131.70423300
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000128 04 01 12 126.24902773 125.24382700
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000128 04 01 13 126.16576052 125.01580900
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000256 04 01 12 121.48957920 120.34752300
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000256 04 01 13 121.20860124 120.02749600
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000512 04 01 12 122.69511318 121.47159100
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 000512 04 01 13 122.63144135 121.28757900
+Bench_McLachlan_Carpet_1lev 000010 0065 kraken 001024 04 01 13 119.64759731 118.44740700
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000004 04 01 20 0.42990088 0.41202400
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000008 04 01 20 0.60535240 0.58003700
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000016 04 01 20 0.73021340 0.69604300
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000032 04 01 20 0.77014732 0.75605100
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000064 04 01 20 0.77263713 0.76404700
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000128 04 01 20 0.71798992 0.71604500
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000256 04 01 20 0.77080584 0.75604900
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 000512 04 01 20 0.80342603 0.82005000
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 001024 04 01 20 0.85210562 0.82405100
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 002048 04 01 20 0.95456362 0.95605900
+Bench_McLachlan_Carpet_9lev 000000 0016 kraken 004096 04 01 20 1.09393191 1.05606800
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000004 04 01 20 0.78223920 0.76805200
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000008 04 01 20 0.96144462 0.94805900
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000016 04 01 20 1.05743384 1.03206100
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000032 04 01 20 1.14855146 1.14407500
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000064 04 01 20 1.06396031 1.03606700
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000128 04 01 20 1.08736897 1.08006600
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000256 04 01 20 1.10718513 1.10407000
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 000512 04 01 20 1.12612391 1.10406900
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 001024 04 01 20 1.16232228 1.13607000
+Bench_McLachlan_Carpet_9lev 000000 0020 kraken 002048 04 01 20 1.26629829 1.23607800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 20 1.24968076 1.26407700
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 21 1.24759078 1.18407500
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 22 1.25134802 1.20407600
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 23 1.24739766 1.21207300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 24 1.24745512 1.26008100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 26 5.36358881 5.35233400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000004 04 01 28 1.24911022 1.21207500
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 20 1.53654361 1.50809000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 21 1.54063582 1.49209100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 22 1.54419923 1.50809400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 23 1.53450680 1.49209400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 24 1.55324411 1.50409400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000008 04 01 28 1.55500674 1.47609100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 20 1.66094589 1.62809800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 21 1.65917921 1.56009700
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 22 1.65821075 1.61210300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 23 1.66190243 1.60410200
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 24 1.65859079 1.64410300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000016 04 01 28 1.64964342 1.60809800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 20 1.66092253 1.62810300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 21 1.66033697 1.62410600
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 22 1.69760680 1.64410000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 23 1.65760398 1.62410200
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 24 1.66064453 1.63210200
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000032 04 01 28 1.69893694 1.66410600
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 20 1.55421257 1.56010000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 21 1.41991830 1.40009100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 22 1.43889093 1.40809100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 23 1.42048407 1.38808800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 24 1.40849781 1.40408800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000064 04 01 28 1.42752171 1.43208600
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 20 1.40061307 1.37208800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 21 1.46240473 1.43209000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 22 1.46996927 1.46009300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 23 1.45506263 1.44008900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 24 1.45532107 1.45209300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000128 04 01 28 1.46230698 1.44009000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 20 1.51593757 1.50809700
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 21 1.52082348 1.49609300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 22 1.47858047 1.48409400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 23 1.46152544 1.44008900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 24 1.50064564 1.48409500
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000256 04 01 28 1.47120667 1.46408800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 20 1.42407560 1.40008900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 21 1.45830798 1.42808900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 22 1.41723943 1.39608800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 23 1.44575596 1.46009300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 24 1.39861012 1.39608800
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 000512 04 01 28 1.39329314 1.38408500
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 20 1.44669151 1.39608900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 21 1.40720439 1.38408400
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 22 1.45295382 1.43609300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 23 1.42609310 1.40008700
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 24 1.42653608 1.40808900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 001024 04 01 28 1.45682573 1.44408900
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 002048 04 01 23 1.52519488 1.48809600
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 002048 04 01 24 1.48798704 1.46409100
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 002048 04 01 28 1.53453398 1.50409300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 002048 04 01 30 11.01676250 10.72066700
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 004096 04 01 23 1.65628982 1.62810500
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 004096 04 01 24 1.65733194 1.60410000
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 004096 04 01 28 1.62728333 1.58410300
+Bench_McLachlan_Carpet_9lev 000000 0025 kraken 008192 04 01 28 2.10963917 2.07613500
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000008 04 01 12 59.28970456 58.29564300
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000016 04 01 12 65.98585582 64.96806400
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000032 04 01 12 71.64952087 70.63641500
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000064 04 01 12 80.28133035 79.52496800
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000128 04 01 12 75.78867579 75.31270100
+Bench_McLachlan_Carpet_9lev 000064 0016 kraken 000512 04 01 12 74.75542927 74.26863300
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000008 04 01 12 99.57380557 98.01411400
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000016 04 01 12 109.34496260 107.86274600
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000032 04 01 12 117.08045626 115.62722600
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000064 04 01 12 127.15897346 126.14786400
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000128 04 01 12 120.24960089 119.38347000
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000256 04 01 12 115.43514180 114.55514800
+Bench_McLachlan_Carpet_9lev 000064 0020 kraken 000512 04 01 12 108.67757297 107.86273900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000001 01 01 02 390.82171249 390.59240000
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000001 01 01 12 82.98405814 82.78917100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 01 01 02 518.23250127 518.06037600
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 01 01 12 111.45380449 111.26294600
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 02 01 02 513.29658246 512.72406100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 02 01 12 111.51867676 110.83092900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 02 02 02 768.23593163 767.13994400
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000002 02 02 12 168.05468917 167.05044300
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 01 01 02 663.19027090 662.88144400
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 01 01 12 142.01069903 141.60486900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 02 01 02 652.03929019 651.12868200
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 02 01 12 140.29551244 139.34470500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 02 02 02 957.09496880 956.29577900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 02 02 12 220.49860144 219.84573000
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 01 02 661.17707586 659.74922900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 01 12 157.98915696 156.30178100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 02 02 953.97091055 952.22752600
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 02 12 227.09365702 225.50606800
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 04 02 1419.20380092 1417.19654500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000004 04 04 12 313.76681566 311.72748600
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 02 01 02 714.04854393 713.20855500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 02 01 12 157.72910070 156.59778900
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 02 02 02 1082.61224389 1081.52357600
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 02 02 12 226.94823670 226.05015500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 01 02 733.03455138 731.44970700
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 01 12 176.83414459 174.33889100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 02 02 1081.98371029 1080.09549500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 02 12 236.78401709 234.65070100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 04 02 1663.53895569 1660.96380500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000008 04 04 12 368.81383181 366.28688800
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 01 02 761.48003578 759.71548300
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 01 12 191.28287601 189.32785300
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 02 02 1185.30628443 1182.85792300
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 02 12 258.24271488 255.62396100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 04 02 1997.87910414 1994.81669500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000016 04 04 12 438.11482263 435.09521100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000032 04 01 12 198.71298528 196.70829100
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000064 04 01 12 210.70279431 209.46508500
+Bench_McLachlan_Carpet_9lev 000064 0025 kraken 000128 04 01 12 201.95456743 200.34852000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000001 01 01 30 191.13029528 190.56792200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 01 01 30 251.60589910 251.05972400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 01 30 252.20534420 250.99569200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000002 02 02 30 358.18211675 356.35828400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 01 01 30 312.89618635 312.17951200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 01 30 320.25629282 318.25590200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 02 02 30 452.85988450 450.93618600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 01 30 359.11516166 355.09020200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 02 30 455.83467698 451.25223400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000004 04 04 30 666.83156729 662.73740700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 01 30 346.07263160 343.40145400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 02 02 30 506.04421544 503.57144000
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 01 30 395.14211416 389.88835800
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 02 30 512.53612590 506.69569200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000008 04 04 30 793.37660098 788.42126400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 01 30 426.47779179 421.43031100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 02 30 584.80397463 578.43612200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000016 04 04 30 961.81026244 955.04365500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000032 04 01 30 442.68943238 438.42743500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000064 04 01 30 467.59605861 464.96112600
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000128 04 01 30 436.89950633 433.63111200
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000256 04 01 30 409.53397202 406.27737100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 000512 04 01 30 376.08005142 373.48734500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 001024 04 01 30 357.54836154 355.05822700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 002048 04 01 30 350.21378970 347.39769100
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 004096 04 01 30 352.67783785 349.93386500
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 01 30 351.96358228 349.36181400
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 008192 04 02 30 471.55692077 468.38126300
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 016384 04 02 30 479.72800827 476.78171700
+Bench_McLachlan_Carpet_9lev 000128 0025 kraken 016384 04 04 30 809.98531985 808.91855300
diff --git a/Carpet/CarpetWeb/sicortex/results-queenbee.out b/Carpet/CarpetWeb/sicortex/results-queenbee.out
new file mode 100644
index 000000000..5db4b6512
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-queenbee.out
@@ -0,0 +1,64 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000001 01 01 00 192.41465856 192.19000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 01 01 00 247.58707602 247.54000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 02 01 00 252.84641560 252.63000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000002 02 02 00 211.89443066 423.22000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 01 01 00 291.86994262 291.58000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 02 01 00 299.71507797 299.27000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 02 02 00 284.05902364 560.60000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 01 00 327.73749532 327.60000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 02 00 306.53941308 601.71000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000004 04 04 00 266.50271884 1047.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 01 01 00 334.87156639 334.98000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 02 01 00 341.38289479 341.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 02 02 00 329.95559572 650.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 01 00 363.86975480 363.84000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 02 00 347.63124832 685.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 04 04 00 349.35187769 1372.93000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 01 00 472.02766403 471.96000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 02 00 432.37333332 848.06000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 04 00 405.74953017 1589.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000008 08 08 00 311.92569237 2418.38000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 02 01 00 376.39248101 376.05000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 02 02 00 360.33294887 704.33000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 01 00 391.21701541 391.10000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 02 00 376.96218700 738.11000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 04 04 00 427.00053038 1655.09000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 01 00 487.31315479 487.13000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 02 00 450.30715053 886.20000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 04 00 478.74580880 1858.89000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000016 08 08 00 451.08012243 3476.24000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 01 00 412.51873882 412.45000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 02 00 397.65224627 781.26000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 04 04 00 494.58752844 1893.86000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 01 00 521.08718036 520.56000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 02 00 462.28543603 901.44000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 04 00 536.74782493 2071.99000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000032 08 08 00 553.78660053 4207.04000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 01 00 534.01307232 534.02000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 02 00 514.00439649 964.46000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 04 00 589.64245797 2178.76000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000064 08 08 00 648.65108784 4776.36000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 01 00 521.74439626 521.24000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 02 00 511.19930447 956.29000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 04 00 619.28712022 2143.82000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000128 08 08 00 695.10842290 5124.03000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 01 00 514.35862553 514.12000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 02 00 528.11674355 977.45000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 04 00 625.20248372 2171.54000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000256 08 08 00 750.10765112 5297.43000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 01 00 508.68920159 508.38000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 02 00 521.84319640 969.64000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 04 00 595.94903104 2098.18000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 000512 08 08 00 820.56607938 4984.09000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 01 00 483.79867738 483.14000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 02 00 537.76884637 990.30000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 04 00 619.06761756 2145.23000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 001024 08 08 00 794.11657260 5014.59000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 02 00 526.11768787 968.65000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 04 00 624.46017058 2173.93000000
+Bench_McLachlan_Carpet_9lev 000128 0025 queenbee 002048 08 08 00 751.06089897 4937.30000000
diff --git a/Carpet/CarpetWeb/sicortex/results-ranger.out b/Carpet/CarpetWeb/sicortex/results-ranger.out
new file mode 100644
index 000000000..f3d2cd6f5
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-ranger.out
@@ -0,0 +1,731 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000001 01 01 00 203.34181004 203.17269400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000002 01 01 00 216.48381171 214.91743400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 01 01 00 224.79743401 222.67391600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 01 00 225.55916500 223.26195300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 02 02 00 227.73820433 448.76805100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 01 00 250.15185397 247.88349900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 02 00 228.08169453 449.48009900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000004 04 04 00 217.13066064 842.24063700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 01 01 00 233.10094116 229.75036200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 01 00 233.19921911 229.78636000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 02 02 00 244.37134496 477.12581700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 01 00 258.23619396 254.33989300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 02 00 244.90335442 477.42583900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 04 04 00 249.90565515 961.74010700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 01 00 269.97584784 266.77666800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 02 00 263.66399936 514.15613600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 04 00 251.26438961 962.74016300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000008 08 08 00 451.35835544 1759.58196800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 01 01 00 251.79208282 248.25551300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 01 00 250.43519239 247.35945700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 02 02 00 262.76931463 499.52722200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 01 00 272.61282118 268.75279900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 02 00 263.38652800 497.81511700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 04 04 00 267.84285138 1015.03143900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 01 00 283.82180268 280.40552400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 02 00 276.44695753 529.56109800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 08 04 00 269.95993217 1019.53972100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 02 00 302.52861096 580.79630100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 04 00 287.96300239 1085.59584900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 08 00 506.02417788 1958.31438900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000016 16 16 00 945.63415069 3586.02411700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 01 00 244.06186508 240.83505200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 02 02 00 311.07908856 545.71810200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 01 00 260.56962053 256.90806000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 04 02 00 307.42328503 541.94187400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 02 00 329.18879068 579.17619800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 04 00 320.86426466 1168.51303200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 08 08 00 557.53919876 2063.66497100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 01 00 301.34188177 297.53859700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 02 00 355.17583551 633.57159300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 04 00 341.13174056 1237.64134900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 08 00 569.41086980 2091.24669300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000032 16 16 00 1033.12306375 3830.38338700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 01 00 289.06331326 285.16581900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 02 00 352.71452486 598.60540800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 04 04 00 362.43147997 1209.49558600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 01 00 304.82141249 300.97080700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 02 00 357.45966333 615.11044000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 08 04 00 364.19004945 1221.94837000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 02 00 410.85168504 676.29426200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 04 00 389.78656087 1289.66060200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 08 00 617.16478157 2196.09324100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000064 16 16 00 1122.14518604 3964.89579300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 01 00 283.19449419 279.26945200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 02 00 354.73297941 638.81991800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 04 00 351.54334233 1171.76523100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 08 08 00 686.13575692 2212.90629800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 01 00 314.41209947 309.90736600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 02 00 381.45197367 685.53884100
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 04 00 381.18182537 1250.76617500
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000128 16 16 00 1238.58164954 4001.79410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 01 00 321.26949165 317.55183900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 02 00 353.36466413 627.80722700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 04 00 394.88733847 1258.84668200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 08 00 750.20929978 2398.59789600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000256 16 16 00 1296.49837951 4002.73814800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 01 00 330.05376020 328.70453600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 02 00 370.45905646 641.72410300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 04 00 463.38659104 1306.92167900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 08 00 817.68327319 2451.90123900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 000512 16 16 00 1392.72301206 4172.90078600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 01 00 327.57180887 326.18838700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 02 00 393.14333660 665.91761700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 04 00 460.19393866 1323.99474200
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 08 00 829.87244544 2422.70740900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 001024 16 16 00 1417.12743675 4216.83553800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 01 00 336.75282418 335.08493800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 02 00 415.28737663 659.84523800
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 04 00 461.46395478 1308.48578000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 08 00 824.18623915 2315.60871300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 002048 16 16 00 1773.87495286 4689.15305600
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 01 00 345.42287805 344.43352700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 02 00 456.01397646 731.16169900
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 04 00 468.62811576 1321.83061000
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 004096 16 08 00 781.69233130 2354.10312300
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 02 00 408.13220878 671.70598400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 04 00 435.55672982 1382.01036700
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 08 00 824.13038674 2327.15343400
+Bench_McLachlan_Carpet_1lev 000024 0065 ranger 008192 16 16 00 1644.94038777 4342.18337400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 15 1.99500456 1.73611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 16 2.00825253 1.71611100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 17 1.99534991 1.74410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 18 1.92537351 1.72410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 19 1.80289350 1.67210600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 20 1.89577949 1.72410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 21 2.03105967 1.73610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 22 1.98644780 1.70410400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 23 1.98241529 1.72811000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 24 2.09280068 1.74410900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 25 1.72968587 1.72010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 26 1.83753688 1.66410200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 32 1.76542921 1.71211000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 33 1.70881499 1.68010700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 34 1.71809744 1.72410700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 35 1.92583941 1.92412000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 36 2.60543477 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 37 1.78591132 1.67610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 38 1.67977806 1.65610300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 39 1.71200809 1.68410800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 40 1.92712333 1.71610600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 45 10.92630000 10.82467500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 46 202.63338200 50.85917400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 47 10.95013800 10.73666800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 60 13.47732400 13.25682900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 61 11.09817600 11.08468800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 62 13.52589500 13.27283100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 63 13.51054200 13.21682600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 64 11.08019700 11.07269300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 65 12.79806000 12.49678500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 66 11.67222800 11.50471500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 68 11.02299500 10.90468000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 69 12.30104200 12.03675200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 70 11.51838900 11.09269500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000016 16 01 71 11.67129800 11.41671600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 15 1.85304780 1.82811700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 16 2.01170792 1.84011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 17 2.03905799 2.02812900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 18 2.03484985 1.84811400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 19 1.89138905 1.81611400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 20 1.88166371 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 21 1.85964446 1.85211800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 22 1.88492482 1.87211600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 23 1.89094756 1.88011500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 24 2.19453134 1.84011900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 25 2.15761771 1.87611600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 26 1.89103346 1.85611700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 32 1.89248386 1.86011400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 33 2.09446628 1.84811300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 34 1.94313465 1.84011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 35 1.91670404 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 36 1.93606592 1.90011600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 37 1.82418737 1.80011200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 38 1.85275587 1.81611200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 39 1.89841448 1.87211900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 40 2.24104077 1.92011800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 45 12.05363100 11.94074500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 46 153.75240200 38.76242300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 47 12.12808900 12.11676100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 60 14.92394500 14.78492700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 61 12.12349400 12.10075400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 62 14.80466800 14.74892300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 63 14.96187400 14.76092000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 64 12.12595700 12.12475500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 65 14.30293200 14.16088700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 66 13.13248600 13.04481600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 68 11.91711700 11.90874800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 69 13.52738500 13.50084500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 70 12.10463500 12.10076100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000032 16 01 71 12.51535400 12.43277500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 15 2.14613841 2.13613300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 16 2.08964146 2.07213000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 17 2.23050875 2.22414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 18 2.45300750 2.42815000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 19 2.69288940 2.66816700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 20 2.30087397 2.26413900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 21 2.71575292 2.69617000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 22 2.27281504 2.25213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 23 2.89347846 2.86417800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 24 2.74981965 2.75217300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 25 2.43014465 2.41215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 26 2.27919672 2.19213600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 32 2.51603498 2.49615300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 33 2.34132568 2.24014300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 34 2.19736293 2.14013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 35 2.42015784 2.16013200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 36 2.19682006 2.18013500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 37 2.47760253 2.47215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 38 2.09433999 2.05612900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 39 2.15514387 2.13613200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 40 2.23896073 2.21614100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 45 10.95491800 10.87668200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 46 106.99900000 27.63373000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 47 10.66279400 10.57666300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 60 16.02752500 15.98900000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 61 11.20916600 11.15670000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 62 15.88848200 15.86499100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 63 15.97672400 15.93699700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 64 11.44016900 11.21270800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 65 16.10954400 15.98500300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 66 13.21578600 13.20082600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 68 10.71742600 10.70867100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 69 13.56445000 13.52484800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 70 11.25670200 11.16469700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000064 16 01 71 11.90071800 11.63672700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 15 2.44970802 2.26414000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 16 2.44833974 2.32414800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 17 2.17747496 2.13212900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 18 2.17540596 2.14813400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 19 2.22853039 2.21214100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 20 2.25197693 2.24414200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 21 2.39005092 2.35214700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 22 2.21986902 2.19213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 23 2.22432535 2.22013800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 24 2.34639108 2.32014600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 25 2.22560016 2.19613700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 26 2.31736788 2.28814300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 32 2.33359981 2.31614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 33 2.07182797 2.03212500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 34 2.33560754 2.32414700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 35 2.19612642 2.09213100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 36 2.19244615 2.16413500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 37 2.56025559 2.53615900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 38 2.14005742 2.10413400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 39 2.21802727 2.19213500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 40 2.34475534 2.23213900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 45 10.59146700 10.47665100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 46 121.83194400 31.24195100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 47 9.74507300 9.73260600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 61 10.81497000 10.58865900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 62 15.83085700 15.80098800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 63 16.00367800 15.98499700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 64 10.68756500 10.54865800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 65 15.84196900 15.81298400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 66 14.56524400 14.53291100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 68 10.19511200 10.18463500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 69 15.11225800 15.08894100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 70 10.60586400 10.56865700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000128 16 01 71 11.36569300 11.30870500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 15 2.61408830 2.59216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 16 2.38613506 2.36814600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 17 2.65185052 2.63216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 18 2.21687388 2.21614200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 19 2.46240048 2.31214300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 20 2.46646909 2.46415100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 21 2.57484497 2.56415900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 22 2.65125207 2.62016000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 23 2.49789271 2.49615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 24 2.46372185 2.44414900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 25 2.49743606 2.34014800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 26 2.53578516 2.46815600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 32 2.32310441 2.33614600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 33 2.56218035 2.55615800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 34 2.20594374 2.18413700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 35 2.36721832 2.37214800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 36 2.66904334 2.66416600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 37 2.66352913 2.64016100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 38 2.33906610 2.33214500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 39 2.36094293 2.33214600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 40 2.50301425 2.42415400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 45 10.54430300 10.50866100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 46 105.94739300 26.98968800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 47 10.16426200 10.14063600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 61 10.65739500 10.62066700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 62 16.37545900 16.34101900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 63 16.53941800 16.50903400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 64 11.19909400 11.17269800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 65 16.05018200 15.99299800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 66 18.35528100 18.28514800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 68 10.25009600 10.23264100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 69 19.74344600 19.55722000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 70 10.69282400 10.68066800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000256 16 01 71 11.11411900 11.08069000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 23 2.77533373 2.72417000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 24 3.47726487 3.45621600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 25 7.75072005 7.74448500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 26 2.78908377 2.76417400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 32 2.50527371 2.47615500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 33 2.84105095 2.84017600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 34 2.38207440 2.37614700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 35 2.48143756 2.46815400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 36 2.52331640 2.47615600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 37 2.48741660 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 38 2.69686531 2.56816000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 39 2.43263093 2.39615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 40 2.63556658 2.61216400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 45 10.70063300 10.44465300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 47 10.23449000 10.22063700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 63 17.44569300 17.40108600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 65 16.34998700 16.31701600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 25.81468100 25.64560200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 32.28495700 32.28201600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.81439500 34.63816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 66 34.96018700 34.65416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 68 10.12227100 10.11663300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 69 27.51798900 27.31770500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 000512 16 01 71 13.30935100 12.96880600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 23 2.70602361 2.68016800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 24 2.82725128 2.82817600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 25 2.71012373 2.64816500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 26 2.70717850 2.66416700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 32 2.80160223 2.80017500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 33 2.96337194 2.94818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 34 2.44735784 2.42415500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 35 2.92295252 2.88017700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 36 2.84464568 2.47215300
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 38 2.47655275 2.48015500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 39 2.36914912 2.30414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 42 10.24891600 9.95662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 52 10.04778200 9.97662400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 63 17.51489100 17.46509400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 65 16.74508900 16.51303500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 001024 16 01 71 10.68492600 10.54465500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 23 3.64010966 3.64423000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 24 3.75214619 3.70422900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 25 3.54584343 3.52822100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 26 3.33211255 3.22020200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 32 3.52961315 3.53621800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 33 2.77292498 2.72416800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 34 2.44419424 2.45215200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 35 2.62340227 2.00412400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 36 2.55986319 2.41615100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 37 2.50177845 2.52415600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 38 2.29403566 2.28414100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 39 2.21099217 2.17613500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 59 19.20047400 18.75317000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 60 19.44039300 19.17319900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 63 19.68925600 19.28920800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 65 18.39071800 18.36115100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 69 77.17565300 76.88080800
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 002048 16 01 71 10.14661700 9.86061600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 32 3.02414120 3.01619100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 33 2.82916677 2.81217700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 34 2.73830927 2.70416900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 35 3.13103430 3.08419400
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 36 3.62117172 2.96818500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 37 3.07523643 3.05219100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 38 9.34603220 9.33258200
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 39 4.41087391 4.40027600
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 004096 16 01 71 10.41400200 9.96062700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 32 19.03294052 19.03318900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 33 3.20325611 3.18420100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 34 3.64873286 3.63622900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 35 5.76824320 5.74435900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 36 4.06577632 3.83224100
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 37 4.00333875 3.99624700
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 38 3.47725648 3.44421500
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 008192 16 01 39 4.64220864 3.98825000
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 37 7.63925136 7.62847900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 38 4.95942385 4.92830900
+Bench_McLachlan_Carpet_9lev 000000 0025 ranger 012288 16 01 39 6.55097068 5.95237300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 00 122.54106532 122.43964000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 70 137.91245362 137.53659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000001 01 01 71 135.63270587 135.40044100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 00 183.05137779 182.34740400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 70 187.30018361 186.34765600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 01 01 71 185.75841382 184.67950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 00 180.00077328 179.96324900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 70 188.91985668 188.72779100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 01 71 186.41453722 186.15565600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 00 129.85302923 258.85217000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 70 139.97521767 278.69341900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000002 02 02 71 141.51701227 281.73762600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 00 236.26691144 234.90266100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 70 236.73086903 234.96268500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 01 01 71 229.82467734 228.02229000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 00 236.15145878 235.09065900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 70 240.49140858 239.34294100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 01 71 232.66685038 231.09043800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 00 216.99292067 426.67066900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 70 217.82767517 428.97080600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 02 02 71 216.73058569 426.98272200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 00 248.75942817 248.53554600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 70 232.06587985 231.78249500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 01 71 228.27816767 228.01424800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 00 214.19796909 422.93842400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 70 220.67594718 435.16720400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 02 71 209.97284200 414.55791500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 00 225.72213129 891.25570400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 70 257.72389956 1015.82752300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000004 04 04 71 257.80748799 1012.46728000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 00 274.82082107 272.30100200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 70 288.00210531 285.37783300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 01 01 71 274.44160638 271.89699400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 00 273.54665117 271.10493300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 70 286.84754310 284.44175300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 01 71 265.18844890 262.77241500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 00 271.56964828 531.53722400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 70 258.95359301 506.47966600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 02 02 71 246.48077225 483.78221200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 00 288.28569852 286.34586800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 70 282.58045572 280.80555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 01 71 270.86291599 269.04481700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 00 271.14896550 530.75718300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 70 257.72701692 505.51159700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 02 71 249.47188872 489.49062600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 00 322.88345290 1264.75505300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 70 328.14615812 1287.45648300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 04 04 71 321.18477198 1262.11486800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 00 297.04119270 296.97457100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 70 287.90201298 287.66194600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 01 71 279.55088937 277.57337300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 00 285.83271012 561.34306600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 02 71 242.58659491 479.38994400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 00 320.14915635 1255.83848600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 70 320.23161459 1253.39429600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 04 71 328.67928713 1292.82478800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 00 448.40270118 1763.57421700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 70 292.77910061 2273.21404200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000008 08 08 71 291.50975695 2271.12593300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 00 301.51189092 299.24667900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 70 303.41105413 300.74280200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 01 01 71 292.02127953 289.43007600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 00 301.62872519 299.57471400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 70 309.30955111 307.18317000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 01 71 295.99160188 294.03436700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 00 309.13612524 597.00130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 70 288.63654603 562.76319700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 02 02 71 274.05435093 535.64549700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 00 318.14699887 316.27575400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 70 303.45030848 302.42288800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 01 71 296.42845066 294.75439600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 00 309.54233248 602.84166500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 70 295.24449971 575.24799300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 02 71 274.77006856 537.34158400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 00 417.05867436 1607.25245900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 70 409.92962198 1583.87495800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 04 04 71 380.32455437 1480.97253000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 00 323.18693460 323.06420400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 70 310.41332580 309.94337800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 01 71 300.73102585 300.54277200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 00 328.35249656 635.21967600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 70 284.72961366 558.63492700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 02 71 267.87115046 526.22084900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 00 418.01371976 1606.47240400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 70 405.35986899 1569.39808900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 04 71 397.65546045 1544.81659500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 00 726.72729222 2703.58096900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 70 407.85024613 3166.64991000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 08 08 71 414.87878198 3210.36063800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 00 360.43062715 359.66248400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 01 362.41548137 362.25466100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 02 359.46430584 358.82244000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 03 360.40211611 359.69846600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 04 361.60963682 360.76253200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 05 362.19089131 361.76658000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 06 362.14195383 361.62658800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 07 362.09293188 361.56259000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 08 363.41700161 362.63865000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 11 361.72727898 360.91055500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 27 362.05011972 361.62260700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 29 369.80960707 356.04224300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 30 372.54992350 360.49454200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 31 372.06669911 371.12721500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 69 350.95761078 350.33787100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 70 351.63983979 350.51789600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 01 71 343.44192950 342.61343200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 00 340.94451255 667.23371500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 02 71 291.96150409 576.26800500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 00 440.90069490 1696.21401700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 01 443.54903601 1698.69415800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 02 440.82711267 1688.11348200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 03 441.00726498 1691.36168700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 04 71 379.51016019 1481.32459900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 00 698.48752227 2602.79866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 70 413.90443403 3212.12476500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 08 71 403.38112376 3126.97943500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 00 795.00396901 3094.41337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 70 387.08693269 5906.86915500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000016 16 16 71 406.25572666 6185.22252200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 00 326.04384389 324.21627800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 70 337.57346556 335.35695900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 01 71 318.80304607 316.93181800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 00 333.07253875 644.93227800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 70 316.28406517 610.91020600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 02 02 71 298.15574373 578.73616000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 00 333.26932616 331.41269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 01 71 313.61524679 311.77549800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 00 333.52000621 645.64032800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 02 71 291.33919633 566.53543500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 00 515.54133086 1943.80147900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 70 469.89494876 1810.14911700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 04 04 71 442.70702729 1717.55536200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 00 343.17846395 341.57736700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 70 340.33822680 338.78114200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 01 71 323.65484424 321.82412700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 00 351.70758524 675.06217300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 70 303.79429054 591.36899800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 02 71 293.69677634 568.89953600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 00 517.49909365 1954.82218200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 70 479.90251154 1844.21924800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 04 71 451.36163723 1748.77729400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 00 1055.86987880 3701.79133200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 70 531.59447720 4051.62517600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 08 08 71 507.91281970 3901.08381400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 00 390.31553259 389.97238000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 01 395.77887272 395.56872000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 02 390.80241660 389.85234000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 03 393.12085078 392.10847000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 04 395.55309817 395.37269600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 05 389.81423140 389.29636700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 06 393.19438455 392.82055600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 07 389.67084561 389.54837000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 08 391.29633427 391.10443000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 11 390.72713972 390.20437800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 27 398.28608009 396.02876700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 29 401.03977832 386.98017800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 30 404.52326881 394.25663200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 31 437.06683003 436.70730500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 69 382.99106211 382.33189300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 70 385.36752349 385.00806600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 01 71 375.95657347 375.46341200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 00 383.35456131 739.23424900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 70 349.61876433 680.23451300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 02 71 330.96690626 645.80038000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 00 529.41246322 1993.43258400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 01 537.49802173 2019.49822300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 02 528.36463041 1995.14468600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 03 535.24064646 2024.62652000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 70 463.23995386 1788.59178500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 04 71 429.58751955 1668.59631500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 00 1036.91991574 3633.95512500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 70 517.86666666 3962.95167500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 08 71 490.51058293 3782.34037100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 00 1346.48871925 4979.39919700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 70 649.30993415 9793.99613300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000032 16 16 71 656.72454561 9945.57355800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 00 384.25940026 382.68789800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 70 360.45498790 359.24643200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 01 71 342.33402440 341.78132500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 00 382.84727695 697.47958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 70 347.90248895 645.36434500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 02 71 334.55869590 624.17098500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 00 569.85026179 2026.69067000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 70 516.36014326 1858.87618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 04 04 71 487.75067417 1760.92603900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 00 386.26711080 386.06411100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 70 369.37387139 368.83503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 01 71 367.71863649 367.61898100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 00 397.71097153 728.80952900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 70 353.01166100 652.56876500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 02 71 334.64443949 624.41101400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 00 572.20395575 2024.86254400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 70 534.26113687 1926.90839800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 04 71 504.74932960 1827.05818100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 00 1554.26026900 4989.75183300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 70 652.86537102 4888.66553100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 08 08 71 600.04190600 4547.24018500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 00 431.31010658 431.16292700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 01 441.13154728 439.83948700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 02 439.77616612 438.00337900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 03 470.26668580 469.08130800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 04 433.97723262 433.57512000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 05 456.80279773 455.35247100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 06 439.04137152 438.76341500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 07 427.26071143 426.63864600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 08 427.65338278 427.44271400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 11 437.41002050 437.15531900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 27 463.11914877 462.82891700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 29 2328.28713066 2318.43289800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 30 439.66708345 429.57086600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 31 433.89363870 433.76313800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 69 416.50034724 415.57397400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 70 436.47173601 436.23527100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 01 71 417.34331894 415.39392000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 00 427.14753026 787.80123700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 70 395.14246498 733.56984800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 02 71 368.67281962 693.36329100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 00 591.74799377 2118.78441700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 01 606.03415259 2161.71509800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 02 606.57069465 2160.00298500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 03 609.42726870 2169.47158600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 70 528.83833280 1917.96386400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 04 71 488.48490761 1789.02781400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 00 1546.19907614 5007.49296100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 70 631.67315156 4768.09001100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 08 71 607.70209688 4613.98434600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 00 1858.96060941 6315.72272000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 70 804.20874109 11734.48135300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000064 16 16 71 758.89552524 11259.30765700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 00 364.62904241 364.22276400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 70 379.81920310 379.69573800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 01 71 396.00827453 395.18070400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 00 440.86034016 796.68577000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 70 378.40813455 703.46795100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 02 71 413.95889019 758.59540300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 00 599.82393181 1979.99574800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 70 540.37555430 1850.29964100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 04 71 503.74059530 1748.33327700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 00 1788.01350286 5380.72425200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 70 678.67737144 5006.15286600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 08 08 71 642.28407215 4769.47405600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 00 404.99298149 404.92531000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 01 431.08043735 430.71091800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 02 427.04413413 426.51866000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 03 433.42988977 431.87500600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 04 417.92239112 417.67407500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 05 429.07855982 427.86275000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 06 444.53289246 444.34380100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 07 418.31180983 416.85004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 08 422.25409577 420.87826200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 11 413.70373561 412.40574900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 27 434.69497877 432.78307600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 29 419.66531388 410.26962500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 30 439.21915391 428.73479800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 31 434.61412737 433.23107800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 69 430.70154522 430.00688500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 70 438.41579003 437.91137400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 01 71 431.95664416 431.63498300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 00 472.33713063 856.02950200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 70 421.91766016 779.28067100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 02 71 444.19184591 804.59427400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 00 628.96382082 2049.31606300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 01 642.24077718 2088.03048700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 02 689.82439842 2179.65220800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 03 670.76284182 2138.68566500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 70 559.62706526 1905.94711600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 04 71 545.43877754 1850.99568200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 00 1763.50365242 5334.35736900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 70 689.57964971 5051.44369100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 08 71 636.76134103 4722.85116200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 00 2237.19241006 7141.26229600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 70 800.63435093 11681.41004500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000128 16 16 71 743.16011415 11063.20738400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 00 416.81854382 416.65008200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 01 424.06496044 423.97053300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 02 435.50639245 435.05518500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 03 452.47220833 452.26825200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 04 420.10070920 419.89827200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 05 419.56022792 419.16618300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 06 435.70374093 433.69513500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 07 426.06771261 425.86660700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 08 416.79365528 416.45001900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 11 426.59510188 424.97055100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 27 422.20029125 421.98237100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 29 451.74462182 442.01958200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 30 429.08432736 421.15431500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 31 431.13646925 430.77493200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 69 428.61061831 428.29876600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 70 443.75125332 443.19964900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 01 71 430.91503566 430.43491100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 00 493.58668537 878.29491000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 70 482.44695258 863.17793000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 02 71 440.23977765 802.17812500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 00 639.43174573 2105.13555200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 02 661.28716728 2138.28163000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 03 661.23409816 2155.13869800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 70 563.27954600 1899.01067800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 04 71 522.37506390 1795.84423300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 00 2007.78571537 5415.25443200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 70 761.92412640 5155.37016100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 08 71 697.91456742 4817.27303700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 00 2633.87542579 7447.83346100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 70 874.75492376 12621.71282100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000256 16 16 71 792.28551614 11551.60588900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 00 432.15376549 432.15100400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 01 441.80254700 441.46759900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 02 466.84211560 466.84116400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 03 455.53552447 455.25647500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 04 429.11185786 428.98679500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 27 483.96443456 481.35408500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 29 455.41548594 447.59996800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 30 470.07764442 460.69678200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 31 467.55431002 465.62509900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 69 445.45534276 444.89979100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 01 71 432.57437397 431.60298900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 00 481.33138896 871.35843600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 02 71 450.67742913 816.63503800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 00 629.96891954 2108.09974400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 01 650.63503716 2168.72754200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 02 659.67285103 2198.78939500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 03 658.38587013 2192.54502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 04 71 531.22941551 1840.13502800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 08 00 2182.42442297 5113.60358800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 000512 16 16 00 2917.04701424 7032.92755200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 00 430.57254488 429.10679800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 01 437.24065480 436.92725400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 02 470.04598340 469.48934500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 03 452.01172928 452.10824500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 04 435.76047032 435.42721100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 27 464.35032003 462.29691900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 29 465.19633431 457.62460400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 30 452.24806910 439.00743100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 31 454.38764507 451.27620200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 01 71 438.81654108 438.29943200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 00 503.23849598 902.79243700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 02 71 484.87606011 874.36265300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 00 648.85708079 2173.22782000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 01 678.40451218 2219.06267800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 02 692.87624405 2285.97485100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 03 693.47299075 2276.57427800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 04 71 547.03842935 1875.64522500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 08 00 2192.73954194 5185.64406200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 001024 16 16 00 3194.24190197 7228.57974800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 00 474.30655592 473.98159600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 01 482.89148177 482.66217100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 02 486.30503508 484.72232100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 03 486.71080130 485.29434700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 27 519.71460553 519.34445800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 29 502.39021118 491.49071300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 30 466.38628136 456.32853800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 31 463.41367294 463.26092800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 01 71 399.03692711 398.91291300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 00 516.41948016 932.54231900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 02 71 485.12292738 857.40158900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 00 644.42646233 2202.95367200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 01 676.88389260 2272.85005100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 02 671.90049929 2283.31869400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 03 679.92398633 2195.80124500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 04 71 573.36576023 1935.17692900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 002048 16 08 00 2191.28902042 5020.00972000
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 30 564.43722649 556.34275800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 31 540.58077165 540.06973100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 01 71 455.91632274 455.34043200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 00 598.95507284 1056.66598500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 02 71 471.13539881 838.79645300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 00 655.37947027 2238.28789400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 01 686.16152266 2319.69698300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 02 700.27613265 2338.29413500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 03 673.68116989 2296.11949200
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 04 71 573.91736912 1928.58452600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 004096 16 08 00 2164.29166218 4984.59550500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 01 71 433.90391986 433.17103800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 00 618.88302882 1096.32051400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 02 71 451.53836770 830.44792700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 00 664.84209040 2282.41064700
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 01 687.25730075 2343.11442100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 02 686.03115911 2356.38325800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 03 699.08293954 2368.18000400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 04 71 543.33106637 1907.09519100
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 008192 16 08 00 2165.34595664 4986.41963400
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 01 71 437.99540328 436.87931300
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 02 71 463.45291184 859.60171800
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 01 738.65903756 2406.06234900
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 02 793.26796536 2537.16257600
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 03 710.98674150 2315.13667500
+Bench_McLachlan_Carpet_9lev 000128 0025 ranger 012288 16 04 71 545.43758320 1926.07638400
diff --git a/Carpet/CarpetWeb/sicortex/results-scaled.eps b/Carpet/CarpetWeb/sicortex/results-scaled.eps
new file mode 100644
index 000000000..6348129c2
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-scaled.eps
@@ -0,0 +1,844 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: results-scaled.eps
+%%Creator: gnuplot 4.2 patchlevel 4
+%%CreationDate: Sat Mar 14 10:38:15 2009
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 230 176
+%%EndComments
+%%BeginProlog
+/gnudict 256 dict def
+gnudict begin
+%
+% The following 6 true/false flags may be edited by hand if required
+% The unit line width may also be changed
+%
+/Color true def
+/Blacktext false def
+/Solid false def
+/Dashlength 1 def
+/Landscape false def
+/Level1 false def
+/Rounded false def
+/TransparentPatterns false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+%
+/vshift -46 def
+/dl1 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
+} def
+/dl2 {
+ 10.0 Dashlength mul mul
+ Rounded { currentlinewidth 0.75 mul add } if
+} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+Level1 {} {
+/SDict 10 dict def
+systemdict /pdfmark known not {
+ userdict /pdfmark systemdict /cleartomark get put
+} if
+SDict begin [
+ /Title (results-scaled.eps)
+ /Subject (gnuplot plot)
+ /Creator (gnuplot 4.2 patchlevel 4 )
+ /Author (Erik Schnetter)
+% /Producer (gnuplot)
+% /Keywords ()
+ /CreationDate (Sat Mar 14 10:38:15 2009)
+ /DOCINFO pdfmark
+end
+} ifelse
+%
+% Gnuplot Prolog Version 4.2 (August 2006)
+%
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/N {newpath moveto} bind def
+/Z {closepath} bind def
+/C {setrgbcolor} bind def
+/f {rlineto fill} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow {currentpoint stroke M 0 vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R
+ Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
+/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+ /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
+/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
+ {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
+/BL {stroke userlinewidth 2 mul setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/AL {stroke userlinewidth 2 div setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+/UL {dup gnulinewidth mul /userlinewidth exch def
+ dup 1 lt {pop 1} if 10 mul /udl exch def} def
+/PL {stroke userlinewidth setlinewidth
+ Rounded {1 setlinejoin 1 setlinecap} if} def
+% Default Line colors
+/LCw {1 1 1} def
+/LCb {0 0 0} def
+/LCa {0 0 0} def
+/LC0 {1 0 0} def
+/LC1 {0 1 0} def
+/LC2 {0 0 1} def
+/LC3 {1 0 1} def
+/LC4 {0 1 1} def
+/LC5 {1 1 0} def
+/LC6 {0 0 0} def
+/LC7 {1 0.3 0} def
+/LC8 {0.5 0.5 0.5} def
+% Default Line Types
+/LTw {PL [] 1 setgray} def
+/LTb {BL [] LCb DL} def
+/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
+/LT0 {PL [] LC0 DL} def
+/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
+/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
+/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
+/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
+/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
+/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
+/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
+/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
+/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
+/Dia {stroke [] 0 setdash 2 copy vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke
+ Pnt} def
+/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
+ currentpoint stroke M
+ hpt neg vpt neg R hpt2 0 V stroke
+ } def
+/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke
+ Pnt} def
+/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
+ hpt2 vpt2 neg V currentpoint stroke M
+ hpt2 neg 0 R hpt2 vpt2 V stroke} def
+/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke
+ Pnt} def
+/Star {2 copy Pls Crs} def
+/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath fill} def
+/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath fill} def
+/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke
+ Pnt} def
+/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath fill} def
+/Pent {stroke [] 0 setdash 2 copy gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore Pnt} def
+/PentF {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath fill grestore} def
+/Circle {stroke [] 0 setdash 2 copy
+ hpt 0 360 arc stroke Pnt} def
+/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
+/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
+/C1 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C2 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C3 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C4 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C5 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc
+ 2 copy moveto
+ 2 copy vpt 180 270 arc closepath fill
+ vpt 0 360 arc} bind def
+/C6 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C7 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 270 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C8 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C9 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 270 450 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 90 180 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C11 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 180 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 270 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C12 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C13 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 0 90 arc closepath fill
+ 2 copy moveto
+ 2 copy vpt 180 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/C14 {BL [] 0 setdash 2 copy moveto
+ 2 copy vpt 90 360 arc closepath fill
+ vpt 0 360 arc} bind def
+/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+ vpt 0 360 arc closepath} bind def
+/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+ neg 0 rlineto closepath} bind def
+/Square {dup Rec} bind def
+/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
+/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
+/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
+/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
+/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
+ exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
+/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
+/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
+/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+ Bsquare} bind def
+/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+ Bsquare} bind def
+/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
+/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy vpt Square fill Bsquare} bind def
+/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+ 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
+/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
+/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
+/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
+/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
+/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
+/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
+/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
+/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
+/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
+/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
+/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
+/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
+/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
+/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
+/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
+/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
+/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
+/DiaE {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V closepath stroke} def
+/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V closepath stroke} def
+/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V closepath stroke} def
+/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V closepath stroke} def
+/PentE {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ closepath stroke grestore} def
+/CircE {stroke [] 0 setdash
+ hpt 0 360 arc stroke} def
+/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
+/DiaW {stroke [] 0 setdash vpt add M
+ hpt neg vpt neg V hpt vpt neg V
+ hpt vpt V hpt neg vpt V Opaque stroke} def
+/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
+ 0 vpt2 neg V hpt2 0 V 0 vpt2 V
+ hpt2 neg 0 V Opaque stroke} def
+/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
+ hpt neg vpt -1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt 1.62 mul V Opaque stroke} def
+/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
+ hpt neg vpt 1.62 mul V
+ hpt 2 mul 0 V
+ hpt neg vpt -1.62 mul V Opaque stroke} def
+/PentW {stroke [] 0 setdash gsave
+ translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+ Opaque stroke grestore} def
+/CircW {stroke [] 0 setdash
+ hpt 0 360 arc Opaque stroke} def
+/BoxFill {gsave Rec 1 setgray fill grestore} def
+/Density {
+ /Fillden exch def
+ currentrgbcolor
+ /ColB exch def /ColG exch def /ColR exch def
+ /ColR ColR Fillden mul Fillden sub 1 add def
+ /ColG ColG Fillden mul Fillden sub 1 add def
+ /ColB ColB Fillden mul Fillden sub 1 add def
+ ColR ColG ColB setrgbcolor} def
+/BoxColFill {gsave Rec PolyFill} def
+/PolyFill {gsave Density fill grestore grestore} def
+/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
+%
+% PostScript Level 1 Pattern Fill routine for rectangles
+% Usage: x y w h s a XX PatternFill
+% x,y = lower left corner of box to be filled
+% w,h = width and height of box
+% a = angle in degrees between lines and x-axis
+% XX = 0/1 for no/yes cross-hatch
+%
+/PatternFill {gsave /PFa [ 9 2 roll ] def
+ PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
+ PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
+ gsave 1 setgray fill grestore clip
+ currentlinewidth 0.5 mul setlinewidth
+ /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
+ 0 0 M PFa 5 get rotate PFs -2 div dup translate
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 M 0 PFs V} for
+ 0 PFa 6 get ne {
+ 0 1 PFs PFa 4 get div 1 add floor cvi
+ {PFa 4 get mul 0 2 1 roll M PFs 0 V} for
+ } if
+ stroke grestore} def
+%
+/languagelevel where
+ {pop languagelevel} {1} ifelse
+ 2 lt
+ {/InterpretLevel1 true def}
+ {/InterpretLevel1 Level1 def}
+ ifelse
+%
+% PostScript level 2 pattern fill definitions
+%
+/Level2PatternFill {
+/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
+ bind def
+/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke}
+>> matrix makepattern
+/Pat1 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
+ 0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
+>> matrix makepattern
+/Pat2 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
+ 8 8 L 8 0 L 0 0 L fill}
+>> matrix makepattern
+/Pat3 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
+ 0 12 M 12 0 L stroke}
+>> matrix makepattern
+/Pat4 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
+ 0 -4 M 12 8 L stroke}
+>> matrix makepattern
+/Pat5 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
+ 0 12 M 8 -4 L 4 12 M 10 0 L stroke}
+>> matrix makepattern
+/Pat6 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
+ 0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
+>> matrix makepattern
+/Pat7 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
+ 12 0 M -4 8 L 12 4 M 0 10 L stroke}
+>> matrix makepattern
+/Pat8 exch def
+<< Tile8x8
+ /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
+ -4 0 M 12 8 L -4 4 M 8 10 L stroke}
+>> matrix makepattern
+/Pat9 exch def
+/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
+/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
+/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
+/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
+/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
+/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
+/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
+} def
+%
+%
+%End of PostScript Level 2 code
+%
+/PatternBgnd {
+ TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
+} def
+%
+% Substitute for Level 2 pattern fill codes with
+% grayscale if Level 2 support is not selected.
+%
+/Level1PatternFill {
+/Pattern1 {0.250 Density} bind def
+/Pattern2 {0.500 Density} bind def
+/Pattern3 {0.750 Density} bind def
+/Pattern4 {0.125 Density} bind def
+/Pattern5 {0.375 Density} bind def
+/Pattern6 {0.625 Density} bind def
+/Pattern7 {0.875 Density} bind def
+} def
+%
+% Now test for support of Level 2 code
+%
+Level1 {Level1PatternFill} {Level2PatternFill} ifelse
+%
+/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
+dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
+currentdict end definefont pop
+/MFshow {
+ { dup 5 get 3 ge
+ { 5 get 3 eq {gsave} {grestore} ifelse }
+ {dup dup 0 get findfont exch 1 get scalefont setfont
+ [ currentpoint ] exch dup 2 get 0 exch R dup 5 get 2 ne {dup dup 6
+ get exch 4 get {show} {stringwidth pop 0 R} ifelse }if dup 5 get 0 eq
+ {dup 3 get {2 get neg 0 exch R pop} {pop aload pop M} ifelse} {dup 5
+ get 1 eq {dup 2 get exch dup 3 get exch 6 get stringwidth pop -2 div
+ dup 0 R} {dup 6 get stringwidth pop -2 div 0 R 6 get
+ show 2 index {aload pop M neg 3 -1 roll neg R pop pop} {pop pop pop
+ pop aload pop M} ifelse }ifelse }ifelse }
+ ifelse }
+ forall} bind def
+/MFwidth {0 exch { dup 5 get 3 ge { 5 get 3 eq { 0 } { pop } ifelse }
+ {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont
+ 6 get stringwidth pop add} {pop} ifelse} ifelse} forall} bind def
+/MLshow { currentpoint stroke M
+ 0 exch R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MRshow { currentpoint stroke M
+ exch dup MFwidth neg 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/MCshow { currentpoint stroke M
+ exch dup MFwidth -2 div 3 -1 roll R
+ Blacktext {gsave 0 setgray MFshow grestore} {MFshow} ifelse } bind def
+/XYsave { [( ) 1 2 true false 3 ()] } bind def
+/XYrestore { [( ) 1 2 true false 4 ()] } bind def
+end
+%%EndProlog
+gnudict begin
+gsave
+50 50 translate
+0.050 0.050 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+882 448 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 448 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 0)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 684 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 684 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 50)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 920 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 920 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 100)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1156 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1156 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 150)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1392 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1392 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 200)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1628 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1628 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 250)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 1864 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 1864 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 300)]
+] -46.7 MRshow
+1.000 UL
+LTb
+882 2100 M
+63 0 V
+2501 0 R
+-63 0 V
+stroke
+798 2100 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 350)]
+] -46.7 MRshow
+1.000 UL
+LTb
+969 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+969 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 1)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1309 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1309 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 4)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1649 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1649 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 16)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1988 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+1988 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 64)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2328 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2328 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 ( 256)]
+] -46.7 MCshow
+1.000 UL
+LTb
+2667 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+2667 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (1k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3007 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3007 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (4k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+3347 448 M
+0 63 V
+0 1589 R
+0 -63 V
+stroke
+3347 308 M
+[ [(Helvetica) 140.0 0.0 true true 0 (16k)]
+] -46.7 MCshow
+1.000 UL
+LTb
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+LCb setrgbcolor
+308 1274 M
+currentpoint gsave translate 90 rotate 0 0 moveto
+[ [(Helvetica) 140.0 0.0 true true 0 (1000 cycles per RHS evaluation)]
+] -46.7 MCshow
+grestore
+LTb
+LCb setrgbcolor
+2164 98 M
+[ [(Helvetica) 140.0 0.0 true true 0 (number of cores)]
+] -46.7 MCshow
+LTb
+2164 2310 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Cactus Benchmark)]
+] -46.7 MCshow
+1.000 UP
+1.000 UL
+LTb
+1.000 UP
+3.000 UL
+LT0
+LTb
+2795 1141 M
+[ [(Helvetica) 140.0 0.0 true true 0 (HLRB II)]
+] -46.7 MRshow
+LT0
+2879 1141 M
+399 0 V
+969 827 M
+170 187 V
+170 169 V
+170 79 V
+170 76 V
+169 117 V
+170 109 V
+170 -81 V
+170 -62 V
+170 -13 V
+339 113 V
+969 827 Pls
+1139 1014 Pls
+1309 1183 Pls
+1479 1262 Pls
+1649 1338 Pls
+1818 1455 Pls
+1988 1564 Pls
+2158 1483 Pls
+2328 1421 Pls
+2498 1408 Pls
+2837 1521 Pls
+3078 1141 Pls
+1.000 UP
+3.000 UL
+LT1
+LTb
+2795 1001 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Kraken \(NT=1\))]
+] -46.7 MRshow
+LT1
+2879 1001 M
+399 0 V
+969 967 M
+170 165 V
+170 291 V
+170 97 V
+170 85 V
+169 44 V
+170 68 V
+170 -83 V
+170 -75 V
+170 -90 V
+169 -51 V
+170 -20 V
+170 7 V
+170 -2 V
+969 967 Crs
+1139 1132 Crs
+1309 1423 Crs
+1479 1520 Crs
+1649 1605 Crs
+1818 1649 Crs
+1988 1717 Crs
+2158 1634 Crs
+2328 1559 Crs
+2498 1469 Crs
+2667 1418 Crs
+2837 1398 Crs
+3007 1405 Crs
+3177 1403 Crs
+3078 1001 Crs
+1.000 UP
+3.000 UL
+LT2
+LTb
+2795 861 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Queen Bee \(NT=2\))]
+] -46.7 MRshow
+LT2
+2879 861 M
+399 0 V
+1139 1031 M
+170 260 V
+170 346 V
+170 49 V
+169 33 V
+170 142 V
+170 -8 V
+170 47 V
+170 -17 V
+169 44 V
+170 -32 V
+1139 1031 Star
+1309 1291 Star
+1479 1637 Star
+1649 1686 Star
+1818 1719 Star
+1988 1861 Star
+2158 1853 Star
+2328 1900 Star
+2498 1883 Star
+2667 1927 Star
+2837 1895 Star
+3078 861 Star
+1.000 UP
+3.000 UL
+LT3
+LTb
+2795 721 M
+[ [(Helvetica) 140.0 0.0 true true 0 (Ranger \(NT=1\))]
+] -46.7 MRshow
+LT3
+2879 721 M
+399 0 V
+969 816 M
+170 138 V
+170 114 V
+170 139 V
+170 173 V
+169 88 V
+170 113 V
+170 39 V
+170 -2 V
+170 4 V
+169 17 V
+170 -108 V
+170 154 V
+170 -59 V
+99 11 V
+969 816 Box
+1139 954 Box
+1309 1068 Box
+1479 1207 Box
+1649 1380 Box
+1818 1468 Box
+1988 1581 Box
+2158 1620 Box
+2328 1618 Box
+2498 1622 Box
+2667 1639 Box
+2837 1531 Box
+3007 1685 Box
+3177 1626 Box
+3276 1637 Box
+3078 721 Box
+1.000 UP
+3.000 UL
+LTb
+2795 581 M
+[ [(Helvetica) 140.0 0.0 true true 0 (SiCortex \(NT=1\))]
+] -46.7 MRshow
+2879 581 M
+399 0 V
+969 913 M
+170 250 V
+100 104 V
+169 240 V
+170 180 V
+99 -37 V
+170 54 V
+71 201 V
+170 -62 V
+169 -137 V
+170 -52 V
+170 -123 V
+99 -75 V
+969 913 BoxF
+1139 1163 BoxF
+1239 1267 BoxF
+1408 1507 BoxF
+1578 1687 BoxF
+1677 1650 BoxF
+1847 1704 BoxF
+1918 1905 BoxF
+2088 1843 BoxF
+2257 1706 BoxF
+2427 1654 BoxF
+2597 1531 BoxF
+2696 1456 BoxF
+3078 581 BoxF
+1.000 UL
+LTb
+882 2100 N
+882 448 L
+2564 0 V
+0 1652 V
+-2564 0 V
+Z stroke
+1.000 UP
+1.000 UL
+LTb
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
diff --git a/Carpet/CarpetWeb/sicortex/results-scaled.gnuplot b/Carpet/CarpetWeb/sicortex/results-scaled.gnuplot
new file mode 100644
index 000000000..a70d55d00
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-scaled.gnuplot
@@ -0,0 +1,36 @@
+set terminal postscript eps enhanced color colortext
+set output "results-scaled.eps"
+
+set size 0.5
+
+set logscale x
+set xtics (1, 4, 16, 64, 256, "1k" 1024, "4k" 4096, "16k" 16384)
+set xrange [0.7:24576]
+set yrange [0:]
+
+set title "Cactus Benchmark"
+set xlabel "number of cores"
+set ylabel "1000 cycles per RHS evaluation"
+
+set key bottom
+
+# 25^3 grid points per core
+# 128 time steps
+# 9 refinement levels
+# a factor 2 because of the Berger-Oliger subcycling
+# 4 Runge-Kutta substeps per time step
+# 1e6 us per second
+
+# MHz flop/cycle
+# HLRB II : 1600 4
+# Kraken : 2300 4
+# Queen Bee: 2330 4
+# Ranger : 2300 4
+# SiCortex : 700 2
+
+p \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && $7== 1 && $8==10) print; }' results-hlrb2.out" u 5:($9/25**3/128/2/4*1e3*(1600*4)) t "HLRB II" w lp lt 1 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 4 || $6==$5) && $7== 1 && $8==30) print; }' results-kraken.out" u 5:($9/25**3/128/2/4*1e3*(2300*4)) t "Kraken (NT=1)" w lp lt 2 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6== 8 || $6==$5) && $7== 2 && $8== 0) print; }' results-queenbee.out" u 5:($9/25**3/128/2/4*1e3*(2330*4)) t "Queen Bee (NT=2)" w lp lt 3 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==25 && ($6==16 || $6==$5) && $7== 1 && $8==71) print; }' results-ranger.out" u 5:($9/25**3/128/2/4*1e3*(2300*4)) t "Ranger (NT=1)" w lp lt 4 lw 3, \
+"< awk '/^Bench_McLachlan_Carpet_9lev/ { if ($2==128 && $3==20 && ($6== 6 || $6==$5) && $7== 1 && $8== 9) print; }' results-sicortex.out" u 5:($9/20**3/128/2/4*1e3*( 700*2)) t "SiCortex (NT=1)" w lp lt -1 lw 3
diff --git a/Carpet/CarpetWeb/sicortex/results-scaled.pdf b/Carpet/CarpetWeb/sicortex/results-scaled.pdf
new file mode 100644
index 000000000..629e96d5d
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-scaled.pdf
Binary files differ
diff --git a/Carpet/CarpetWeb/sicortex/results-scaled.png b/Carpet/CarpetWeb/sicortex/results-scaled.png
new file mode 100644
index 000000000..41b39a93f
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-scaled.png
Binary files differ
diff --git a/Carpet/CarpetWeb/sicortex/results-sicortex.out b/Carpet/CarpetWeb/sicortex/results-sicortex.out
new file mode 100644
index 000000000..e06222dec
--- /dev/null
+++ b/Carpet/CarpetWeb/sicortex/results-sicortex.out
@@ -0,0 +1,73 @@
+# Cactus benchmark results
+# processes = procs
+# nodes = procs / ppn
+#
+# benchmark steps size machine procs ppn tpp iter walltime cputime
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000009 03 01 09 160.97924924 160.90000000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000012 02 01 09 169.91864061 169.83800000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000012 06 01 09 216.23553324 216.08500000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000018 03 01 09 194.86012912 194.76400000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000018 06 01 09 209.45180464 209.34200000
+Bench_McLachlan_Carpet_9lev 000016 0020 sicortex 000036 06 01 09 218.57264876 218.44500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000001 01 01 09 577.03916478 576.51300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000001 01 01 10 584.84026647 584.26700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 01 01 09 1063.53720546 1062.85200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 01 01 10 1073.46784306 1072.78200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 01 09 886.65131402 886.22300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 01 10 879.80119944 879.30700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000002 02 02 10 1080.79185009 2041.34200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 01 01 09 1637.62942624 1636.88100000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 01 01 10 1658.30288005 1657.51800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 01 09 1014.73026657 1014.23700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 01 10 991.87625074 991.39300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000003 03 03 10 1350.42324567 3631.75200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 01 09 1555.37436056 1554.86200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 01 10 1548.87241173 1548.36700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000004 02 02 10 1990.86815596 3806.46600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 01 01 09 2953.73614597 2952.76700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 01 01 10 3058.68801212 3057.59900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 01 09 2192.51062202 2192.05300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 01 10 2160.93858528 2160.50300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 02 02 10 2905.12031174 5576.29500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 01 09 1811.42113948 1810.98300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 01 10 1783.56004071 1783.05200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 03 03 10 2471.15107203 6736.12300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 01 09 1312.47908449 1311.62500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 01 10 1256.62998867 1255.75800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 02 10 5779.03792477 2972.75600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 03 10 7082.16307092 5182.78300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000006 06 06 10 1992.49259830 9297.26600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 01 09 1150.66821122 1150.17600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 01 10 1634.80302310 1634.35900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000009 03 03 10 3699.17927527 10041.99900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 01 09 1206.51082349 1206.05800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 01 10 2445.88993430 2445.16000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 02 02 10 4919.54614115 9497.25900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 01 09 1536.47537231 1535.58100000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 01 10 1487.75196719 1486.85700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 02 10 10569.93517756 5442.61700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 03 10 10535.11860585 8066.33800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000012 06 06 10 3076.13520050 15588.30900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 01 09 1386.79382586 1386.32300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 01 10 2212.76893878 2212.24700000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 03 03 10 6044.88727355 16669.88300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 01 09 1490.72433352 1489.82600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 01 10 1449.57670307 1448.65400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 02 10 9206.37890959 4956.86500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000018 06 06 10 4521.90128183 23111.06500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 01 09 1556.78021669 1555.88500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 01 10 1506.67594385 1505.71200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000036 06 02 10 11190.43197107 5677.51000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000048 06 01 09 1805.66064787 1804.73900000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000048 06 01 10 1766.07638407 1765.00800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000096 06 01 09 1729.37948060 1728.85000000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000096 06 01 10 1707.35560274 1706.36200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000192 06 01 09 1559.74821520 1559.26200000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000192 06 01 10 1535.94878769 1535.01800000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000384 06 01 09 1495.67836642 1495.17400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000384 06 01 10 1462.88292074 1462.33400000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000768 06 01 09 1342.76321959 1341.88500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 000768 06 01 10 1325.73432612 1324.92600000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001152 06 01 09 1249.66528654 1249.07300000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001152 06 01 10 1236.83454061 1236.02500000
+Bench_McLachlan_Carpet_9lev 000128 0020 sicortex 001410 06 01 10 1584.19222546 1583.07200000
diff --git a/Carpet/CarpetWeb/status-reports.html b/Carpet/CarpetWeb/status-reports.html
index 8d60a7e5a..00c999f43 100644
--- a/Carpet/CarpetWeb/status-reports.html
+++ b/Carpet/CarpetWeb/status-reports.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Status Reports</title>
</head>
diff --git a/Carpet/CarpetWeb/version-3.html b/Carpet/CarpetWeb/version-3.html
index d9e4fe9d8..086a57def 100644
--- a/Carpet/CarpetWeb/version-3.html
+++ b/Carpet/CarpetWeb/version-3.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Version 3</title>
</head>
diff --git a/Carpet/CarpetWeb/version-4.html b/Carpet/CarpetWeb/version-4.html
index e8f0a91d7..6067bcda9 100644
--- a/Carpet/CarpetWeb/version-4.html
+++ b/Carpet/CarpetWeb/version-4.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Version 4</title>
</head>
diff --git a/Carpet/CarpetWeb/visualisation-tools.html b/Carpet/CarpetWeb/visualisation-tools.html
index 8dbe93d43..9b8573904 100644
--- a/Carpet/CarpetWeb/visualisation-tools.html
+++ b/Carpet/CarpetWeb/visualisation-tools.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carpet Visualisation Tools</title>
</head>
diff --git a/Carpet/CarpetWeb/work-with-darcs.html b/Carpet/CarpetWeb/work-with-darcs.html
index 5235d6faa..23596fed3 100644
--- a/Carpet/CarpetWeb/work-with-darcs.html
+++ b/Carpet/CarpetWeb/work-with-darcs.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Working with Darcs</title>
</head>
diff --git a/Carpet/CarpetWeb/work-with-git.html b/Carpet/CarpetWeb/work-with-git.html
index 1edd52d53..c19481cca 100644
--- a/Carpet/CarpetWeb/work-with-git.html
+++ b/Carpet/CarpetWeb/work-with-git.html
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="ISO-8859-15"?>
+<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Working with Git</title>
</head>
diff --git a/Carpet/LoopControl/README b/Carpet/LoopControl/README
index 50e2eacb5..f3c5055b2 100644
--- a/Carpet/LoopControl/README
+++ b/Carpet/LoopControl/README
@@ -1,9 +1,10 @@
Cactus Code Thorn LoopControl
-Thorn Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
-Thorn Maintainer(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Author(s) : Erik Schnetter <schnetter@cct.lsu.edu>
+Maintainer(s): Erik Schnetter <schnetter@cct.lsu.edu>
+Licence : GPLv2+
--------------------------------------------------------------------------
-Purpose of the thorn:
+1. Purpose
Iterate over multi-dimensional arrays in an efficient manner, using
OpenMP (if available) and cach-aware loop tiling.
diff --git a/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.hill.par b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.hill.par
new file mode 100644
index 000000000..c7cac7fdd
--- /dev/null
+++ b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.hill.par
@@ -0,0 +1,132 @@
+Cactus::cctk_run_title = "Benchmark of McLachlan using Carpet with one refinement level"
+Cactus::cctk_timer_output = "full"
+
+Cactus::cctk_itlast = @ITERATIONS@
+
+
+
+ActiveThorns = "Fortran"
+
+
+
+ActiveThorns = "LoopControl"
+
+#LoopControl::printstats = yes
+
+LoopControl::legacy_init = no
+LoopControl::use_random_restart_hill_climbing = yes
+
+
+
+ActiveThorns = "IOUtil"
+
+#IO::print_timing_info = yes
+
+
+
+ActiveThorns = "InitBase"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetReduce"
+
+Carpet::domain_from_coordbase = yes
+
+driver::ghost_size = 3
+
+Carpet::init_fill_timelevels = yes
+
+CarpetLib::combine_recompose = yes
+
+#CarpetLib::print_timestats_every = 1
+CarpetLib::print_memstats_every = @ITERATIONS@
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+CoordBase::xmin = 0.0
+CoordBase::ymin = 0.0
+CoordBase::zmin = 0.0
+CoordBase::xmax = 1.0
+CoordBase::ymax = 1.0
+CoordBase::zmax = 1.0
+
+CoordBase::spacing = "numcells"
+CoordBase::ncells_x = @NCELLSI@
+CoordBase::ncells_y = @NCELLSJ@
+CoordBase::ncells_z = @NCELLSK@
+
+CartGrid3D::type = "coordbase"
+CartGrid3D::domain = "octant"
+CartGrid3D::avoid_originx = no
+CartGrid3D::avoid_originy = no
+CartGrid3D::avoid_originz = no
+
+CoordBase::boundary_size_x_lower = 3
+CoordBase::boundary_size_y_lower = 3
+CoordBase::boundary_size_z_lower = 3
+CoordBase::boundary_shiftout_x_lower = 1
+CoordBase::boundary_shiftout_y_lower = 1
+CoordBase::boundary_shiftout_z_lower = 1
+
+CoordBase::boundary_size_x_upper = 3
+CoordBase::boundary_size_y_upper = 3
+CoordBase::boundary_size_z_upper = 3
+
+
+
+ActiveThorns = "MoL NaNChecker Time"
+
+MoL::ODE_Method = "RK4"
+MoL::MoL_Intermediate_Steps = 4
+MoL::MoL_Num_Scratch_Levels = 1
+
+Time::dtfac = 0.4
+
+
+
+ActiveThorns = "ADMBase ADMCoupling ADMMacros CoordGauge StaticConformal"
+
+ADMBase::initial_data = "Cartesian Minkowski"
+ADMBase::initial_lapse = "one"
+ADMBase::initial_shift = "zero"
+ADMBase::initial_dtlapse = "zero"
+ADMBase::initial_dtshift = "zero"
+
+
+
+ActiveThorns = "GenericFD ML_BSSN ML_BSSN_Helper TmunuBase"
+
+ADMBase::evolution_method = "ML_BSSN"
+ADMBase::lapse_evolution_method = "ML_BSSN"
+ADMBase::shift_evolution_method = "ML_BSSN"
+
+ML_BSSN::my_boundary_condition = "Minkowski"
+
+ML_BSSN::harmonicN = 1 # 1+log
+ML_BSSN::harmonicF = 2.0 # 1+log
+ML_BSSN::ShiftGammaCoeff = 0.75
+ML_BSSN::BetaDriver = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = @ITERATIONS@
+#IOBasic::outInfo_vars = "ADMBase::alp"
+
+
+
+#ActiveThorns = "CarpetIOASCII"
+#
+#IOASCII::out0D_every = @ITERATIONS@
+#IOASCII::out0D_vars = "Carpet::timing"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::output_all_timers = yes
+TimerReport::all_timers_clock = "cycle"
diff --git a/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.legacy.par b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.legacy.par
new file mode 100644
index 000000000..dc1bbbdcb
--- /dev/null
+++ b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.legacy.par
@@ -0,0 +1,132 @@
+Cactus::cctk_run_title = "Benchmark of McLachlan using Carpet with one refinement level"
+Cactus::cctk_timer_output = "full"
+
+Cactus::cctk_itlast = @ITERATIONS@
+
+
+
+ActiveThorns = "Fortran"
+
+
+
+ActiveThorns = "LoopControl"
+
+#LoopControl::printstats = yes
+
+LoopControl::legacy_init = yes
+LoopControl::use_random_restart_hill_climbing = no
+
+
+
+ActiveThorns = "IOUtil"
+
+#IO::print_timing_info = yes
+
+
+
+ActiveThorns = "InitBase"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetReduce"
+
+Carpet::domain_from_coordbase = yes
+
+driver::ghost_size = 3
+
+Carpet::init_fill_timelevels = yes
+
+CarpetLib::combine_recompose = yes
+
+#CarpetLib::print_timestats_every = 1
+CarpetLib::print_memstats_every = @ITERATIONS@
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+CoordBase::xmin = 0.0
+CoordBase::ymin = 0.0
+CoordBase::zmin = 0.0
+CoordBase::xmax = 1.0
+CoordBase::ymax = 1.0
+CoordBase::zmax = 1.0
+
+CoordBase::spacing = "numcells"
+CoordBase::ncells_x = @NCELLSI@
+CoordBase::ncells_y = @NCELLSJ@
+CoordBase::ncells_z = @NCELLSK@
+
+CartGrid3D::type = "coordbase"
+CartGrid3D::domain = "octant"
+CartGrid3D::avoid_originx = no
+CartGrid3D::avoid_originy = no
+CartGrid3D::avoid_originz = no
+
+CoordBase::boundary_size_x_lower = 3
+CoordBase::boundary_size_y_lower = 3
+CoordBase::boundary_size_z_lower = 3
+CoordBase::boundary_shiftout_x_lower = 1
+CoordBase::boundary_shiftout_y_lower = 1
+CoordBase::boundary_shiftout_z_lower = 1
+
+CoordBase::boundary_size_x_upper = 3
+CoordBase::boundary_size_y_upper = 3
+CoordBase::boundary_size_z_upper = 3
+
+
+
+ActiveThorns = "MoL NaNChecker Time"
+
+MoL::ODE_Method = "RK4"
+MoL::MoL_Intermediate_Steps = 4
+MoL::MoL_Num_Scratch_Levels = 1
+
+Time::dtfac = 0.4
+
+
+
+ActiveThorns = "ADMBase ADMCoupling ADMMacros CoordGauge StaticConformal"
+
+ADMBase::initial_data = "Cartesian Minkowski"
+ADMBase::initial_lapse = "one"
+ADMBase::initial_shift = "zero"
+ADMBase::initial_dtlapse = "zero"
+ADMBase::initial_dtshift = "zero"
+
+
+
+ActiveThorns = "GenericFD ML_BSSN ML_BSSN_Helper TmunuBase"
+
+ADMBase::evolution_method = "ML_BSSN"
+ADMBase::lapse_evolution_method = "ML_BSSN"
+ADMBase::shift_evolution_method = "ML_BSSN"
+
+ML_BSSN::my_boundary_condition = "Minkowski"
+
+ML_BSSN::harmonicN = 1 # 1+log
+ML_BSSN::harmonicF = 2.0 # 1+log
+ML_BSSN::ShiftGammaCoeff = 0.75
+ML_BSSN::BetaDriver = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = @ITERATIONS@
+#IOBasic::outInfo_vars = "ADMBase::alp"
+
+
+
+#ActiveThorns = "CarpetIOASCII"
+#
+#IOASCII::out0D_every = @ITERATIONS@
+#IOASCII::out0D_vars = "Carpet::timing"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::output_all_timers = yes
+TimerReport::all_timers_clock = "cycle"
diff --git a/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.par b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.par
new file mode 100644
index 000000000..ab607feca
--- /dev/null
+++ b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.par
@@ -0,0 +1,132 @@
+Cactus::cctk_run_title = "Benchmark of McLachlan using Carpet with one refinement level"
+Cactus::cctk_timer_output = "full"
+
+Cactus::cctk_itlast = @ITERATIONS@
+
+
+
+ActiveThorns = "Fortran"
+
+
+
+ActiveThorns = "LoopControl"
+
+#LoopControl::printstats = yes
+
+LoopControl::legacy_init = @LEGACY_INIT@
+LoopControl::use_random_restart_hill_climbing = @HILL_CLIMBING@
+
+
+
+ActiveThorns = "IOUtil"
+
+#IO::print_timing_info = yes
+
+
+
+ActiveThorns = "InitBase"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetReduce"
+
+Carpet::domain_from_coordbase = yes
+
+driver::ghost_size = 3
+
+Carpet::init_fill_timelevels = yes
+
+CarpetLib::combine_recompose = yes
+
+#CarpetLib::print_timestats_every = 1
+CarpetLib::print_memstats_every = @ITERATIONS@
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+CoordBase::xmin = 0.0
+CoordBase::ymin = 0.0
+CoordBase::zmin = 0.0
+CoordBase::xmax = 1.0
+CoordBase::ymax = 1.0
+CoordBase::zmax = 1.0
+
+CoordBase::spacing = "numcells"
+CoordBase::ncells_x = @NCELLSI@
+CoordBase::ncells_y = @NCELLSJ@
+CoordBase::ncells_z = @NCELLSK@
+
+CartGrid3D::type = "coordbase"
+CartGrid3D::domain = "octant"
+CartGrid3D::avoid_originx = no
+CartGrid3D::avoid_originy = no
+CartGrid3D::avoid_originz = no
+
+CoordBase::boundary_size_x_lower = 3
+CoordBase::boundary_size_y_lower = 3
+CoordBase::boundary_size_z_lower = 3
+CoordBase::boundary_shiftout_x_lower = 1
+CoordBase::boundary_shiftout_y_lower = 1
+CoordBase::boundary_shiftout_z_lower = 1
+
+CoordBase::boundary_size_x_upper = 3
+CoordBase::boundary_size_y_upper = 3
+CoordBase::boundary_size_z_upper = 3
+
+
+
+ActiveThorns = "MoL NaNChecker Time"
+
+MoL::ODE_Method = "RK4"
+MoL::MoL_Intermediate_Steps = 4
+MoL::MoL_Num_Scratch_Levels = 1
+
+Time::dtfac = 0.4
+
+
+
+ActiveThorns = "ADMBase ADMCoupling ADMMacros CoordGauge StaticConformal"
+
+ADMBase::initial_data = "Cartesian Minkowski"
+ADMBase::initial_lapse = "one"
+ADMBase::initial_shift = "zero"
+ADMBase::initial_dtlapse = "zero"
+ADMBase::initial_dtshift = "zero"
+
+
+
+ActiveThorns = "GenericFD ML_BSSN ML_BSSN_Helper TmunuBase"
+
+ADMBase::evolution_method = "ML_BSSN"
+ADMBase::lapse_evolution_method = "ML_BSSN"
+ADMBase::shift_evolution_method = "ML_BSSN"
+
+ML_BSSN::my_boundary_condition = "Minkowski"
+
+ML_BSSN::harmonicN = 1 # 1+log
+ML_BSSN::harmonicF = 2.0 # 1+log
+ML_BSSN::ShiftGammaCoeff = 0.75
+ML_BSSN::BetaDriver = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = @ITERATIONS@
+#IOBasic::outInfo_vars = "ADMBase::alp"
+
+
+
+#ActiveThorns = "CarpetIOASCII"
+#
+#IOASCII::out0D_every = @ITERATIONS@
+#IOASCII::out0D_vars = "Carpet::timing"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::output_all_timers = yes
+TimerReport::all_timers_clock = "cycle"
diff --git a/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.standard.par b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.standard.par
new file mode 100644
index 000000000..690b37c26
--- /dev/null
+++ b/Carpet/LoopControl/par/Bench_McLachlan_Carpet_1lev.standard.par
@@ -0,0 +1,132 @@
+Cactus::cctk_run_title = "Benchmark of McLachlan using Carpet with one refinement level"
+Cactus::cctk_timer_output = "full"
+
+Cactus::cctk_itlast = @ITERATIONS@
+
+
+
+ActiveThorns = "Fortran"
+
+
+
+ActiveThorns = "LoopControl"
+
+#LoopControl::printstats = yes
+
+LoopControl::legacy_init = no
+LoopControl::use_random_restart_hill_climbing = no
+
+
+
+ActiveThorns = "IOUtil"
+
+#IO::print_timing_info = yes
+
+
+
+ActiveThorns = "InitBase"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetReduce"
+
+Carpet::domain_from_coordbase = yes
+
+driver::ghost_size = 3
+
+Carpet::init_fill_timelevels = yes
+
+CarpetLib::combine_recompose = yes
+
+#CarpetLib::print_timestats_every = 1
+CarpetLib::print_memstats_every = @ITERATIONS@
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+CoordBase::xmin = 0.0
+CoordBase::ymin = 0.0
+CoordBase::zmin = 0.0
+CoordBase::xmax = 1.0
+CoordBase::ymax = 1.0
+CoordBase::zmax = 1.0
+
+CoordBase::spacing = "numcells"
+CoordBase::ncells_x = @NCELLSI@
+CoordBase::ncells_y = @NCELLSJ@
+CoordBase::ncells_z = @NCELLSK@
+
+CartGrid3D::type = "coordbase"
+CartGrid3D::domain = "octant"
+CartGrid3D::avoid_originx = no
+CartGrid3D::avoid_originy = no
+CartGrid3D::avoid_originz = no
+
+CoordBase::boundary_size_x_lower = 3
+CoordBase::boundary_size_y_lower = 3
+CoordBase::boundary_size_z_lower = 3
+CoordBase::boundary_shiftout_x_lower = 1
+CoordBase::boundary_shiftout_y_lower = 1
+CoordBase::boundary_shiftout_z_lower = 1
+
+CoordBase::boundary_size_x_upper = 3
+CoordBase::boundary_size_y_upper = 3
+CoordBase::boundary_size_z_upper = 3
+
+
+
+ActiveThorns = "MoL NaNChecker Time"
+
+MoL::ODE_Method = "RK4"
+MoL::MoL_Intermediate_Steps = 4
+MoL::MoL_Num_Scratch_Levels = 1
+
+Time::dtfac = 0.4
+
+
+
+ActiveThorns = "ADMBase ADMCoupling ADMMacros CoordGauge StaticConformal"
+
+ADMBase::initial_data = "Cartesian Minkowski"
+ADMBase::initial_lapse = "one"
+ADMBase::initial_shift = "zero"
+ADMBase::initial_dtlapse = "zero"
+ADMBase::initial_dtshift = "zero"
+
+
+
+ActiveThorns = "GenericFD ML_BSSN ML_BSSN_Helper TmunuBase"
+
+ADMBase::evolution_method = "ML_BSSN"
+ADMBase::lapse_evolution_method = "ML_BSSN"
+ADMBase::shift_evolution_method = "ML_BSSN"
+
+ML_BSSN::my_boundary_condition = "Minkowski"
+
+ML_BSSN::harmonicN = 1 # 1+log
+ML_BSSN::harmonicF = 2.0 # 1+log
+ML_BSSN::ShiftGammaCoeff = 0.75
+ML_BSSN::BetaDriver = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = @ITERATIONS@
+#IOBasic::outInfo_vars = "ADMBase::alp"
+
+
+
+#ActiveThorns = "CarpetIOASCII"
+#
+#IOASCII::out0D_every = @ITERATIONS@
+#IOASCII::out0D_vars = "Carpet::timing"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::output_all_timers = yes
+TimerReport::all_timers_clock = "cycle"
diff --git a/Carpet/LoopControl/src/loopcontrol.h b/Carpet/LoopControl/src/loopcontrol.h
index dfe7dda60..7f882617c 100644
--- a/Carpet/LoopControl/src/loopcontrol.h
+++ b/Carpet/LoopControl/src/loopcontrol.h
@@ -162,6 +162,11 @@ static inline
int
lc_state_valid (lc_statset_t const * restrict const ls,
lc_state_t const * restrict const state)
+ CCTK_ATTRIBUTE_PURE;
+static inline
+int
+lc_state_valid (lc_statset_t const * restrict const ls,
+ lc_state_t const * restrict const state)
{
if (state->topology >= 0 && state->topology < ls->ntopologies) {
int const * restrict const ntilings =
@@ -177,6 +182,11 @@ static inline
int
lc_state_equal (lc_state_t const * restrict const state1,
lc_state_t const * restrict const state2)
+ CCTK_ATTRIBUTE_PURE;
+static inline
+int
+lc_state_equal (lc_state_t const * restrict const state1,
+ lc_state_t const * restrict const state2)
{
return (state1->topology == state2->topology &&
state1->tiling[0] == state2->tiling[0] &&
@@ -193,7 +203,8 @@ lc_stattime_init (lc_stattime_t * restrict const lt,
lc_stattime_t *
lc_stattime_find (lc_statset_t const * restrict const ls,
- lc_state_t const * restrict const state);
+ lc_state_t const * restrict const state)
+ CCTK_ATTRIBUTE_PURE;
lc_stattime_t *
lc_stattime_find_create (lc_statset_t * restrict const ls,
@@ -211,7 +222,8 @@ lc_statset_init (lc_statset_t * restrict const ls,
lc_statset_t *
lc_statset_find (lc_statmap_t const * restrict const lm,
int const num_threads,
- int const npoints[3]);
+ int const npoints[3])
+ CCTK_ATTRIBUTE_PURE;
lc_statset_t *
lc_statset_find_create (lc_statmap_t * restrict const lm,
@@ -253,6 +265,10 @@ typedef struct lc_control_t {
static inline
int
lc_min (int const i, int const j)
+ CCTK_ATTRIBUTE_CONST;
+static inline
+int
+lc_min (int const i, int const j)
{
return i < j ? i : j;
}
@@ -260,6 +276,10 @@ lc_min (int const i, int const j)
static inline
int
lc_max (int const i, int const j)
+ CCTK_ATTRIBUTE_CONST;
+static inline
+int
+lc_max (int const i, int const j)
{
return i > j ? i : j;
}
diff --git a/Carpet/doc/documentation.tex b/Carpet/doc/documentation.tex
index ed1e75c84..9871de511 100644
--- a/Carpet/doc/documentation.tex
+++ b/Carpet/doc/documentation.tex
@@ -873,7 +873,7 @@ answers.
Firstly, Carpet does not itself implement periodic boundaries. The
thorn {\tt TAT/Periodic} is ``more or less'' driver independent and
does. This should be used to implement the actual boundary
- conditions. You should not need to change your code - just activate
+ conditions. You should not need to change your code -- just activate
the thorn with the appropriate parameters.
Secondly, periodic boundaries do {\bf not} work the same way as
@@ -890,7 +890,7 @@ answers.
shown in figure~\ref{fig:Periodic1}.
\begin{figure}[htbp]
\begin{center}
- \includegraphics[scale=0.5]{Periodic1
+ \includegraphics[scale=0.5]{Periodic1}
\caption{Periodic grids identify boundary points and interior
points. The interior points are given by circles and the
boundary points by squares. The identifications are shown by the
@@ -917,7 +917,7 @@ answers.
\end{itemize}
\begin{figure}[htbp]
\begin{center}
- \includegraphics[scale=0.5]{Periodic2
+ \includegraphics[scale=0.5]{Periodic2}
\caption{A periodic refined grid. The boundary zones are blue
plus signs, the interior blue crosses. Note that the interior
points on the refined grid extend \textit{outside} the
diff --git a/Carpet/doc/scheduling.aux b/Carpet/doc/scheduling.aux
new file mode 100644
index 000000000..97a8a11d8
--- /dev/null
+++ b/Carpet/doc/scheduling.aux
@@ -0,0 +1,45 @@
+\relax
+\citation{Schnetter-etal-03b}
+\citation{Berger-1982}
+\citation{Berger84}
+\citation{Berger86}
+\citation{Berger89}
+\citation{Berger91}
+\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}\textbf {PUGH} Scheduling}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {3}\textbf {Carpet} Scheduling}{1}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}The Berger-Oliger Algorithm}{2}}
+\newlabel{sect-Berger-Oliger-algorithm}{{3.1}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Grid Attributes}{2}}
+\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces The \textbf {PUGH} schedule}}{2}}
+\newlabel{fig-PUGH-schedule}{{1}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Modes}{3}}
+\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces The Berger-Oliger Algorithm}}{3}}
+\newlabel{fig-Berger-Oliger-algorithm}{{2}{3}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.1}What to Do in Each Mode}{4}}
+\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces What Carpet Defines in Each Mode}}{4}}
+\newlabel{tab-what-Carpet-defines-in-each-mode}{{1}{4}}
+\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Carpet Loops and Modes}}{5}}
+\newlabel{fig-Carpet-loops-and-modes}{{3}{5}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.2}Querying and Changing Modes}{6}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}The \textbf {Carpet} Scheduling Pipeline}{6}}
+\newlabel{sect-Carpet-scheduling-pipeline}{{3.4}{6}}
+\bibstyle{alpha}
+\bibdata{scheduling}
+\bibcite{Berger89}{BC89}
+\bibcite{Berger-1982}{Ber82}
+\bibcite{Berger86}{Ber86}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Examples, Tips, and Tricks}{7}}
+\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.1}Example 1}{7}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Other Miscellaneous Stuff}{7}}
+\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Summary of the \textbf {Carpet} schedule}}{8}}
+\newlabel{fig-Carpet-Berger-Oliger-summary}{{4}{8}}
+\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces Detailed View of the \textbf {Carpet} Berger-Oliger Algorithm}}{9}}
+\newlabel{fig-Carpet-Berger-Oliger-details}{{5}{9}}
+\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces How Carpet uses Modes when Calling Scheduled Routines}}{10}}
+\newlabel{fig-how-Carpet-uses-modes}{{6}{10}}
+\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces Example1}}{11}}
+\newlabel{fig-example1}{{7}{11}}
+\bibcite{Berger84}{BO84}
+\bibcite{Berger91}{BR91}
+\bibcite{Schnetter-etal-03b}{SHH04}
diff --git a/Carpet/doc/scheduling.bbl b/Carpet/doc/scheduling.bbl
new file mode 100644
index 000000000..a01be44b7
--- /dev/null
+++ b/Carpet/doc/scheduling.bbl
@@ -0,0 +1,38 @@
+\begin{thebibliography}{SHH04}
+
+\bibitem[BC89]{Berger89}
+Marsha~J. Berger and P.~Colella.
+\newblock Local adaptive mesh refinement for shock hydrodynamics.
+\newblock {\em J. Comput. Phys.}, 82:64--84, 1989.
+
+\bibitem[Ber82]{Berger-1982}
+Marsha~J. Berger.
+\newblock {\em Adaptive Mesh Refinement for Hyperbolic Partial Differential
+ Equations}.
+\newblock PhD thesis, Stanford University, 1982.
+\newblock {U}niversity {M}icrofilms \#DA 83-01196.
+
+\bibitem[Ber86]{Berger86}
+Marsha~J. Berger.
+\newblock Data structures for adaptive grid generation.
+\newblock {\em SIAM Journal of Scientific and Statistical Computing},
+ 7(3):904--916, July 1986.
+
+\bibitem[BO84]{Berger84}
+Marsha~J. Berger and Joseph Oliger.
+\newblock Adaptive mesh refinement for hyperbolic partial differential
+ equations.
+\newblock {\em J. Comput. Phys.}, 53:484--512, 1984.
+
+\bibitem[BR91]{Berger91}
+M.~Berger and I.~Rigoutsos.
+\newblock Adaptive mesh refinement for hyperbolic partial differential
+ equations.
+\newblock {\em IEEE Transactions on Systems, Man and Cybernetics}, 21(5), 1991.
+
+\bibitem[SHH04]{Schnetter-etal-03b}
+Erik Schnetter, Scott~H. Hawley, and Ian Hawke.
+\newblock Evolutions in {3D} numerical relativity using fixed mesh refinement.
+\newblock {\em Class. Quantum Grav.}, 21(6):1465--1488, 21 March 2004.
+
+\end{thebibliography}
diff --git a/Carpet/doc/scheduling.blg b/Carpet/doc/scheduling.blg
new file mode 100644
index 000000000..14e6c4636
--- /dev/null
+++ b/Carpet/doc/scheduling.blg
@@ -0,0 +1,45 @@
+This is BibTeX, Version 0.99c (Web2C 7.5.6)
+The top-level auxiliary file: scheduling.aux
+The style file: alpha.bst
+Database file #1: scheduling.bib
+You've used 6 entries,
+ 2543 wiz_defined-function locations,
+ 601 strings with 5219 characters,
+and the built_in function-call counts, 2243 in all, are:
+= -- 232
+> -- 98
+< -- 2
++ -- 31
+- -- 31
+* -- 168
+:= -- 387
+add.period$ -- 19
+call.type$ -- 6
+change.case$ -- 34
+chr.to.int$ -- 6
+cite$ -- 6
+duplicate$ -- 83
+empty$ -- 157
+format.name$ -- 39
+if$ -- 443
+int.to.chr$ -- 1
+int.to.str$ -- 0
+missing$ -- 5
+newline$ -- 34
+num.names$ -- 18
+pop$ -- 19
+preamble$ -- 1
+purify$ -- 41
+quote$ -- 0
+skip$ -- 74
+stack$ -- 0
+substring$ -- 138
+swap$ -- 6
+text.length$ -- 2
+text.prefix$ -- 2
+top$ -- 0
+type$ -- 48
+warning$ -- 0
+while$ -- 23
+width$ -- 7
+write$ -- 82
diff --git a/Carpet/doc/scheduling.log b/Carpet/doc/scheduling.log
new file mode 100644
index 000000000..074a13e27
--- /dev/null
+++ b/Carpet/doc/scheduling.log
@@ -0,0 +1,355 @@
+This is pdfTeX, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2008.7.9) 28 AUG 2008 15:53
+entering extended mode
+**\nonstopmode \input{/Users/eschnett/Calpha/carpet/Carpet/doc/scheduling.tex}
+(/Users/eschnett/Calpha/carpet/Carpet/doc/scheduling.tex
+(/opt/local/share/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
+(/opt/local/share/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2005/09/16 v1.4f Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/Users/eschnett/Calpha/carpet/Carpet/doc/scheduling.aux)
+\openout1 = `scheduling.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 26.
+LaTeX Font Info: ... okay on input line 26.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <12> on input line 31.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <8> on input line 31.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <6> on input line 31.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <7> on input line 50.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <5> on input line 50.
+LaTeX Font Info: Try loading font information for OMS+cmr on input line 62.
+
+(/opt/local/share/texmf-dist/tex/latex/base/omscmr.fd
+File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 62.
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 118--119
+ []
+ []
+
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 133--134
+ [][]
+ []
+
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 139--140
+ [][]
+ []
+
+
+Overfull \hbox (2.31596pt too wide) in paragraph at lines 154--155
+ [][]
+ []
+
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 159--160
+ [][]
+ []
+
+[1
+
+{/opt/local/share/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+LaTeX Font Info: Font shape `OT1/cmtt/bx/n' in size <10> not available
+(Font) Font shape `OT1/cmtt/m/n' tried instead on input line 246.
+ [2] [3] [4]
+[5] [6]
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 638--639
+ []
+ []
+
+
+Underfull \hbox (badness 3579) in paragraph at lines 679--679
+\OT1/cmr/m/n/10 POST[]RECOVER[]VARIABLES $[][]\OMS/cmsy/m/n/10 !$
+ []
+
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 679--680
+ [][]
+ []
+
+
+Overfull \hbox (2.31596pt too wide) in paragraph at lines 690--691
+ [][]
+ []
+
+
+Overfull \hbox (4.75467pt too wide) in paragraph at lines 711--712
+ [][]
+ []
+
+
+Overfull \hbox (2.31596pt too wide) in paragraph at lines 720--721
+ [][]
+ []
+
+
+Overfull \hbox (6.79999pt too wide) in paragraph at lines 724--725
+ [][]
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 750--751
+ []
+ []
+
+
+Overfull \hbox (3.21214pt too wide) in paragraph at lines 767--767
+[]$[]$ []
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 767--768
+ [][]
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+\OT1/cmr/m/n/10 INITIAL POS-TINI-
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Overfull \hbox (6.98305pt too wide) in paragraph at lines 946--946
+[]\OT1/cmr/m/n/10 POSTREGRIDINITIAL
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[][]
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (3.43626pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (6.80959pt too wide) in paragraph at lines 946--946
+[]\OT1/cmr/m/n/10 POSTRESTRICTINITIAL
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+\OT1/cmr/m/n/10 POSTPOSTINITIAL
+ []
+
+
+Overfull \hbox (6.63156pt too wide) in paragraph at lines 946--946
+[][]
+ []
+
+
+Overfull \hbox (8.19237pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (8.19237pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (2.01521pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Overfull \hbox (11.90251pt too wide) in paragraph at lines 946--946
+\OT1/cmr/m/n/10 RECOVER[]VARIABLES
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 946--946
+[]\OT1/cmtt/m/n/10 loop $\OMS/cmsy/m/n/10 "$
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[][]
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (3.43626pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (6.45119pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (30.9541pt too wide) in paragraph at lines 946--946
+[]\OT1/cmr/m/n/10 POST[]RECOVER[]VARIABLES
+ []
+
+
+Overfull \hbox (6.63156pt too wide) in paragraph at lines 946--946
+[][]
+ []
+
+
+Overfull \hbox (8.19237pt too wide) in paragraph at lines 946--946
+[]
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 946--947
+ [][]
+ []
+
+
+Overfull \hbox (3.21214pt too wide) in paragraph at lines 965--965
+[]$[]$ []
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 965--966
+ [][]
+ []
+
+
+Overfull \hbox (333.56543pt too wide) in paragraph at lines 1072--1072
+[]$[]$ $[]$
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 1072--1073
+ [][]
+ []
+
+
+Overfull \hbox (3.21214pt too wide) in paragraph at lines 1090--1090
+[]$[]$ []
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 1090--1091
+ [][]
+ []
+
+
+Overfull \hbox (3.21214pt too wide) in paragraph at lines 1106--1106
+[]$[]$ []
+ []
+
+
+Overfull \hbox (13.46664pt too wide) in paragraph at lines 1106--1107
+ [][]
+ []
+
+
+LaTeX Warning: Float too large for page by 56.33575pt on input line 1133.
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 1237--1240
+
+ []
+
+
+LaTeX Warning: Float too large for page by 18.68066pt on input line 1321.
+
+(/Users/eschnett/Calpha/carpet/Carpet/doc/scheduling.bbl [7] [8] [9] [10]
+[11]) [12] (/Users/eschnett/Calpha/carpet/Carpet/doc/scheduling.aux) )
+Here is how much of TeX's memory you used:
+ 295 strings out of 94073
+ 3762 string characters out of 1164798
+ 71804 words of memory out of 1500000
+ 3642 multiletter control sequences out of 10000+50000
+ 9493 words of font info for 34 fonts, out of 1200000 for 2000
+ 645 hyphenation exceptions out of 8191
+ 25i,16n,19p,239b,380s stack positions out of 5000i,500n,6000p,200000b,5000s
+</opt/loc
+al/share/texmf-dist/fonts/type1/bluesky/cm/cmbx10.pfb></opt/local/share/texmf-d
+ist/fonts/type1/bluesky/cm/cmbx12.pfb></opt/local/share/texmf-dist/fonts/type1/
+bluesky/cm/cmbx8.pfb></opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmbx9.
+pfb></opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmmi10.pfb></opt/local/
+share/texmf-dist/fonts/type1/bluesky/cm/cmr10.pfb></opt/local/share/texmf-dist/
+fonts/type1/bluesky/cm/cmr12.pfb></opt/local/share/texmf-dist/fonts/type1/blues
+ky/cm/cmr17.pfb></opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmr6.pfb></
+opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmr7.pfb></opt/local/share/te
+xmf-dist/fonts/type1/bluesky/cm/cmr8.pfb></opt/local/share/texmf-dist/fonts/typ
+e1/bluesky/cm/cmr9.pfb></opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmsy
+10.pfb></opt/local/share/texmf-dist/fonts/type1/bluesky/cm/cmti10.pfb></opt/loc
+al/share/texmf-dist/fonts/type1/bluesky/cm/cmtt10.pfb></opt/local/share/texmf-d
+ist/fonts/type1/bluesky/cm/cmtt8.pfb>
+Output written on scheduling.pdf (12 pages, 153691 bytes).
+PDF statistics:
+ 105 PDF objects out of 1000 (max. 8388607)
+ 0 named destinations out of 1000 (max. 131072)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/Carpet/doc/scheduling.pdf b/Carpet/doc/scheduling.pdf
new file mode 100644
index 000000000..69659ef02
--- /dev/null
+++ b/Carpet/doc/scheduling.pdf
Binary files differ
diff --git a/Carpet/doxygen/Doxyfile b/Carpet/doxygen/Doxyfile
deleted file mode 100644
index 3964c2808..000000000
--- a/Carpet/doxygen/Doxyfile
+++ /dev/null
@@ -1,1081 +0,0 @@
-# Doxyfile 1.3.4
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = Carpet
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = doxygen
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch,
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en
-# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese,
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
-# members of a class in the documentation of that class as if those members were
-# ordinary class members. Constructors, destructors and assignment operators of
-# the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH = /home/eschnett/Calpha/Cactus/arrangements/Carpet/
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explict @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# reimplements.
-
-INHERIT_DOCS = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
-# only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = .
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
-
-FILE_PATTERNS = *.c *.cc *.h *.hh *.F77 *.F *.F90 *.inc
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-
-INPUT_FILTER =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = NO
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = YES
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 4
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output dir.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES = mathpple
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimised for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assigments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed.
-
-PREDEFINED = FOR_DOXYGEN_ONLY \
- CARPET_INT \
- CARPET_REAL \
- CARPET_COMPLEX
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse the
-# parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
-# super classes. Setting the tag to NO turns the diagrams off. Note that this
-# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
-# recommended to install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similiar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
-CALL_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes that
-# lay further from the root node will be omitted. Note that setting this option to
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that a graph may be further truncated if the graph's image dimensions are
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
diff --git a/Carpet/doxygen/README b/Carpet/doxygen/README
deleted file mode 100644
index c426f7d30..000000000
--- a/Carpet/doxygen/README
+++ /dev/null
@@ -1,14 +0,0 @@
-This directory contains, in the CVS or darcs repository, the Doxygen
-configuration file. The generated documentation will also be placed
-here, but should not go into the repository.
-
-Create the Doxygen configuration by running the command
-
- doxygen doxygen/Doxyfile
-
-from one directory up, i.e., from the Carpet arrangement directory.
-This will create html documentation in a subdirectory html, and latex
-documentation in a subdirectory latex. The latex subdirectory
-contains a makefile that creates pdf from the latex sources.
-
--erik
diff --git a/CarpetAttic/Cart3dTest/utils/cmptest b/CarpetAttic/Cart3dTest/utils/cmptest
index 53ea9d35f..53ea9d35f 100755..100644
--- a/CarpetAttic/Cart3dTest/utils/cmptest
+++ b/CarpetAttic/Cart3dTest/utils/cmptest
diff --git a/CarpetAttic/Cart3dTest/utils/mptest b/CarpetAttic/Cart3dTest/utils/mptest
index 98b4c07c5..98b4c07c5 100755..100644
--- a/CarpetAttic/Cart3dTest/utils/mptest
+++ b/CarpetAttic/Cart3dTest/utils/mptest
diff --git a/CarpetDev/CarpetIOF5/README b/CarpetDev/CarpetIOF5/README
index a03d4b2f5..a625117a0 100644
--- a/CarpetDev/CarpetIOF5/README
+++ b/CarpetDev/CarpetIOF5/README
@@ -11,16 +11,20 @@ Input and output data using the HDF5 based F5 file format.
An F5 file contains the following hierarchy:
- file
- timestep
- simulation
- topology
- coordinate_system
- physical_quantity
- tensor_component
- data_region
+ Bundle
+ Slice
+ Grid
+ Topology
+ Representation
+ Field
-2006-06-05: Werner says that tensor_component and data_region should
-be interchanged.
+We have a class hierarchy:
-2007-04-25: Werner confirms this.
+ file
+ timestep (slice)
+ simulation (grid) [grid hierarchy of one patch]
+ topology (topology) [one refinement level]
+ coordinate_system (representation)
+ physical_quantity (field)
+ data_region
+ tensor_component
diff --git a/CarpetDev/CarpetIOF5/configuration.ccl b/CarpetDev/CarpetIOF5/configuration.ccl
index 1ab5bc27d..d5c33c995 100644
--- a/CarpetDev/CarpetIOF5/configuration.ccl
+++ b/CarpetDev/CarpetIOF5/configuration.ccl
@@ -1,3 +1,3 @@
# Configuration definitions for thorn CarpetIOF5
-REQUIRES Carpet CarpetLib HDF5 IOUtil
+REQUIRES Carpet CarpetLib F5 HDF5 IOUtil
diff --git a/CarpetDev/CarpetIOF5/interface.ccl b/CarpetDev/CarpetIOF5/interface.ccl
index db9d9c014..aa7a39fee 100644
--- a/CarpetDev/CarpetIOF5/interface.ccl
+++ b/CarpetDev/CarpetIOF5/interface.ccl
@@ -3,7 +3,7 @@
IMPLEMENTS: IOF5
USES INCLUDE: bbox.hh defs.hh dh.hh vect.hh
-USES INCLUDE: carpet.hh
+USES INCLUDE: carpet.hh modes.hh
@@ -26,7 +26,25 @@ REQUIRES FUNCTION IO_TruncateOutputFiles
# Return a pointer to an unmodifiable C string
+# which contains a unique ID for this configuration
+CCTK_POINTER_TO_CONST \
+FUNCTION UniqueConfigID (CCTK_POINTER_TO_CONST IN cctkGH)
+USES FUNCTION UniqueConfigID
+
+# Return a pointer to an unmodifiable C string
+# which contains a unique ID for this build
+CCTK_POINTER_TO_CONST \
+FUNCTION UniqueBuildID (CCTK_POINTER_TO_CONST IN cctkGH)
+USES FUNCTION UniqueBuildID
+
+# Return a pointer to an unmodifiable C string
# which contains a unique ID for this simulation
CCTK_POINTER_TO_CONST \
-FUNCTION UniqueSimulationID (CCTK_POINTER_TO_CONST IN cctkGH)
+FUNCTION UniqueSimulationID (CCTK_POINTER_TO_CONST IN cctkGH)
USES FUNCTION UniqueSimulationID
+
+# Return a pointer to an unmodifiable C string
+# which contains a unique ID for this run
+CCTK_POINTER_TO_CONST \
+FUNCTION UniqueRunID (CCTK_POINTER_TO_CONST IN cctkGH)
+USES FUNCTION UniqueRunID
diff --git a/CarpetDev/CarpetIOF5/par/wavetoy-cc-ref.par b/CarpetDev/CarpetIOF5/par/wavetoy-cc-ref.par
new file mode 100644
index 000000000..1e8c2783d
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/par/wavetoy-cc-ref.par
@@ -0,0 +1,244 @@
+Cactus::cctk_run_title = "WaveToy cell-centred refined"
+
+Cactus::cctk_full_warnings = yes
+Cactus::highlight_warning_messages = no
+#Cactus::cctk_timer_output = "full"
+
+Cactus::terminate = "time"
+Cactus::cctk_final_time = 1.0
+
+
+
+ActiveThorns = "IOUtil"
+
+IO::out_dir = $parfile
+
+
+
+ActiveThorns = "InitBase"
+
+InitBase::initial_data_setup_method = "init_single_level"
+
+
+
+ActiveThorns = "AEILocalInterp"
+
+ActiveThorns = "Fortran"
+
+ActiveThorns = "HDF5"
+
+ActiveThorns = "LocalInterp"
+
+ActiveThorns = "LoopControl"
+
+ActiveThorns = "NaNCatcher"
+
+ActiveThorns = "Slab"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetInterp CarpetReduce CarpetSlab"
+
+Carpet::verbose = no
+Carpet::schedule_barriers = no
+Carpet::veryverbose = no
+CarpetLib::output_bboxes = no
+
+Carpet::domain_from_coordbase = yes
+Carpet::max_refinement_levels = 3
+
+driver::ghost_size = 2
+
+Carpet::refinement_centering = "cell"
+Carpet::prolongation_order_space = 2
+Carpet::prolongation_order_time = 2
+
+Carpet::convergence_level = 0
+
+Carpet::init_each_timelevel = yes
+Carpet::regrid_during_initialisation = no
+Carpet::enable_all_storage = no
+
+Carpet::poison_new_timelevels = yes
+CarpetLib::poison_new_memory = yes
+
+Carpet::grid_structure_filename = "carpet-grid-structure"
+Carpet::output_timers_every = 100
+CarpetLib::print_timestats_every = 100
+CarpetLib::print_memstats_every = 100
+
+
+
+ActiveThorns = "NaNChecker"
+
+NaNChecker::check_every = 100
+NaNChecker::action_if_found = "terminate"
+NaNChecker::check_vars = "
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+
+CoordBase::xmin = -0.50
+CoordBase::ymin = -0.50
+CoordBase::zmin = -0.50
+CoordBase::xmax = +0.50
+CoordBase::ymax = +0.50
+CoordBase::zmax = +0.50
+CoordBase::dx = 0.05
+CoordBase::dy = 0.05
+CoordBase::dz = 0.05
+
+CoordBase::boundary_staggered_x_lower = yes
+CoordBase::boundary_staggered_y_lower = yes
+CoordBase::boundary_staggered_z_lower = yes
+CoordBase::boundary_staggered_x_upper = yes
+CoordBase::boundary_staggered_y_upper = yes
+CoordBase::boundary_staggered_z_upper = yes
+
+CartGrid3D::type = "coordbase"
+
+
+
+ActiveThorns = "CarpetRegrid2"
+
+CarpetRegrid2::regrid_every = 0
+
+CarpetRegrid2::snap_to_coarse = yes
+
+CarpetRegrid2::num_centres = 1
+
+CarpetRegrid2::num_levels_1 = 3
+CarpetRegrid2::radius_1[1] = 0.25
+CarpetRegrid2::radius_1[2] = 0.125
+
+
+
+ActiveThorns = "WavetoyC"
+
+WaveToy::bound = "radiation"
+
+
+
+ActiveThorns = "IDScalarWaveC"
+
+IDScalarWave::initial_data = "gaussian"
+IDScalarWave::radius = 0.0
+IDScalarWave::sigma = 0.1
+IDScalarWave::amplitude = 1.0
+
+
+
+ActiveThorns = "Time"
+
+Time::dtfac = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = 1
+IOBasic::outInfo_reductions = "norm2 minimum maximum"
+IOBasic::outInfo_vars = "
+ WaveToy::phi
+"
+
+
+
+ActiveThorns = "CarpetIOScalar"
+
+IOScalar::one_file_per_group = yes
+
+IOScalar::outScalar_every = 1
+IOScalar::outScalar_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "CarpetIOASCII"
+
+IOASCII::one_file_per_group = yes
+
+#IOASCII::output_symmetry_points = no
+#IOASCII::out3D_ghosts = no
+
+IOASCII::out0D_every = 1
+IOASCII::out0D_vars = "
+ Carpet::timing
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out1D_every = 1
+IOASCII::out1D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out2D_every = 10
+IOASCII::out2D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out3D_every = 100
+IOASCII::out3D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+Activethorns = "CarpetIOHDF5"
+
+IOHDF5::out_every = 100
+IOHDF5::compression_level = 1
+IOHDF5::out_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOHDF5::checkpoint = yes
+IO::checkpoint_dir = $parfile
+IO::checkpoint_ID = yes
+IO::checkpoint_every = 100
+IO::checkpoint_on_terminate = yes
+
+Carpet::regrid_during_recovery = no
+IOHDF5::use_grid_structure_from_checkpoint = yes
+
+IO::recover = "autoprobe"
+IO::recover_dir = $parfile
+
+
+
+ActiveThorns = "Formaline"
+
+Formaline::send_as_rdf = yes
+Formaline::rdf_hostname[0] = "buran.aei.mpg.de"
+Formaline::rdf_port [0] = 24997
+Formaline::rdf_hostname[1] = "devportal.cct.lsu.edu"
+Formaline::rdf_port [1] = 8080
+
+
+
+ActiveThorns = "Twitter"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::out_every = 100
+TimerReport::out_filename = "TimerReport"
diff --git a/CarpetDev/CarpetIOF5/par/wavetoy-cc-uni.par b/CarpetDev/CarpetIOF5/par/wavetoy-cc-uni.par
new file mode 100644
index 000000000..d5265e3c8
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/par/wavetoy-cc-uni.par
@@ -0,0 +1,230 @@
+Cactus::cctk_run_title = "WaveToy cell-centred unigrid"
+
+Cactus::cctk_full_warnings = yes
+Cactus::highlight_warning_messages = no
+#Cactus::cctk_timer_output = "full"
+
+Cactus::terminate = "time"
+Cactus::cctk_final_time = 1.0
+
+
+
+ActiveThorns = "IOUtil"
+
+IO::out_dir = $parfile
+
+
+
+ActiveThorns = "InitBase"
+
+InitBase::initial_data_setup_method = "init_single_level"
+
+
+
+ActiveThorns = "AEILocalInterp"
+
+ActiveThorns = "Fortran"
+
+ActiveThorns = "HDF5"
+
+ActiveThorns = "LocalInterp"
+
+ActiveThorns = "LoopControl"
+
+ActiveThorns = "NaNCatcher"
+
+ActiveThorns = "Slab"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetInterp CarpetReduce CarpetSlab"
+
+Carpet::verbose = no
+Carpet::schedule_barriers = no
+Carpet::veryverbose = no
+CarpetLib::output_bboxes = no
+
+Carpet::domain_from_coordbase = yes
+Carpet::max_refinement_levels = 3
+
+driver::ghost_size = 2
+
+Carpet::refinement_centering = "cell"
+Carpet::prolongation_order_space = 3
+Carpet::prolongation_order_time = 2
+
+Carpet::convergence_level = 0
+
+Carpet::init_each_timelevel = yes
+Carpet::regrid_during_initialisation = no
+Carpet::enable_all_storage = no
+
+Carpet::poison_new_timelevels = yes
+CarpetLib::poison_new_memory = yes
+
+Carpet::grid_structure_filename = "carpet-grid-structure"
+Carpet::output_timers_every = 100
+CarpetLib::print_timestats_every = 100
+CarpetLib::print_memstats_every = 100
+
+
+
+ActiveThorns = "NaNChecker"
+
+NaNChecker::check_every = 100
+NaNChecker::action_if_found = "terminate"
+NaNChecker::check_vars = "
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+
+CoordBase::xmin = -0.50
+CoordBase::ymin = -0.50
+CoordBase::zmin = -0.50
+CoordBase::xmax = +0.50
+CoordBase::ymax = +0.50
+CoordBase::zmax = +0.50
+CoordBase::dx = 0.0125
+CoordBase::dy = 0.0125
+CoordBase::dz = 0.0125
+
+CoordBase::boundary_staggered_x_lower = yes
+CoordBase::boundary_staggered_y_lower = yes
+CoordBase::boundary_staggered_z_lower = yes
+CoordBase::boundary_staggered_x_upper = yes
+CoordBase::boundary_staggered_y_upper = yes
+CoordBase::boundary_staggered_z_upper = yes
+
+CartGrid3D::type = "coordbase"
+
+
+
+ActiveThorns = "WavetoyC"
+
+WaveToy::bound = "radiation"
+
+
+
+ActiveThorns = "IDScalarWaveC"
+
+IDScalarWave::initial_data = "gaussian"
+IDScalarWave::radius = 0.0
+IDScalarWave::sigma = 0.1
+IDScalarWave::amplitude = 1.0
+
+
+
+ActiveThorns = "Time"
+
+Time::dtfac = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = 1
+IOBasic::outInfo_reductions = "norm2 minimum maximum"
+IOBasic::outInfo_vars = "
+ WaveToy::phi
+"
+
+
+
+ActiveThorns = "CarpetIOScalar"
+
+IOScalar::one_file_per_group = yes
+
+IOScalar::outScalar_every = 1
+IOScalar::outScalar_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "CarpetIOASCII"
+
+IOASCII::one_file_per_group = yes
+
+IOASCII::output_symmetry_points = no
+IOASCII::out3D_ghosts = no
+
+IOASCII::out0D_every = 1
+IOASCII::out0D_vars = "
+ Carpet::timing
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out1D_every = 1
+IOASCII::out1D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out2D_every = 10
+IOASCII::out2D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out3D_every = 100
+IOASCII::out3D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+Activethorns = "CarpetIOHDF5"
+
+IOHDF5::out_every = 100
+IOHDF5::compression_level = 1
+IOHDF5::out_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOHDF5::checkpoint = yes
+IO::checkpoint_dir = $parfile
+IO::checkpoint_ID = yes
+IO::checkpoint_every = 100
+IO::checkpoint_on_terminate = yes
+
+Carpet::regrid_during_recovery = no
+IOHDF5::use_grid_structure_from_checkpoint = yes
+
+IO::recover = "autoprobe"
+IO::recover_dir = $parfile
+
+
+
+ActiveThorns = "Formaline"
+
+Formaline::send_as_rdf = yes
+Formaline::rdf_hostname[0] = "buran.aei.mpg.de"
+Formaline::rdf_port [0] = 24997
+Formaline::rdf_hostname[1] = "devportal.cct.lsu.edu"
+Formaline::rdf_port [1] = 8080
+
+
+
+ActiveThorns = "Twitter"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::out_every = 100
+TimerReport::out_filename = "TimerReport"
diff --git a/CarpetDev/CarpetIOF5/par/wavetoy-vc-ref.par b/CarpetDev/CarpetIOF5/par/wavetoy-vc-ref.par
new file mode 100644
index 000000000..46ccdd6b2
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/par/wavetoy-vc-ref.par
@@ -0,0 +1,244 @@
+Cactus::cctk_run_title = "WaveToy vertex-centred refined"
+
+Cactus::cctk_full_warnings = yes
+Cactus::highlight_warning_messages = no
+#Cactus::cctk_timer_output = "full"
+
+Cactus::terminate = "time"
+Cactus::cctk_final_time = 1.0
+
+
+
+ActiveThorns = "IOUtil"
+
+IO::out_dir = $parfile
+
+
+
+ActiveThorns = "InitBase"
+
+InitBase::initial_data_setup_method = "init_single_level"
+
+
+
+ActiveThorns = "AEILocalInterp"
+
+ActiveThorns = "Fortran"
+
+ActiveThorns = "HDF5"
+
+ActiveThorns = "LocalInterp"
+
+ActiveThorns = "LoopControl"
+
+ActiveThorns = "NaNCatcher"
+
+ActiveThorns = "Slab"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetInterp CarpetReduce CarpetSlab"
+
+Carpet::verbose = no
+Carpet::schedule_barriers = no
+Carpet::veryverbose = no
+CarpetLib::output_bboxes = no
+
+Carpet::domain_from_coordbase = yes
+Carpet::max_refinement_levels = 3
+
+driver::ghost_size = 2
+
+Carpet::refinement_centering = "vertex"
+Carpet::prolongation_order_space = 3
+Carpet::prolongation_order_time = 2
+
+Carpet::convergence_level = 0
+
+Carpet::init_each_timelevel = yes
+Carpet::regrid_during_initialisation = no
+Carpet::enable_all_storage = no
+
+Carpet::poison_new_timelevels = yes
+CarpetLib::poison_new_memory = yes
+
+Carpet::grid_structure_filename = "carpet-grid-structure"
+Carpet::output_timers_every = 100
+CarpetLib::print_timestats_every = 100
+CarpetLib::print_memstats_every = 100
+
+
+
+ActiveThorns = "NaNChecker"
+
+NaNChecker::check_every = 100
+NaNChecker::action_if_found = "terminate"
+NaNChecker::check_vars = "
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+
+CoordBase::xmin = -0.50
+CoordBase::ymin = -0.50
+CoordBase::zmin = -0.50
+CoordBase::xmax = +0.50
+CoordBase::ymax = +0.50
+CoordBase::zmax = +0.50
+CoordBase::dx = 0.05
+CoordBase::dy = 0.05
+CoordBase::dz = 0.05
+
+CoordBase::boundary_staggered_x_lower = no
+CoordBase::boundary_staggered_y_lower = no
+CoordBase::boundary_staggered_z_lower = no
+CoordBase::boundary_staggered_x_upper = no
+CoordBase::boundary_staggered_y_upper = no
+CoordBase::boundary_staggered_z_upper = no
+
+CartGrid3D::type = "coordbase"
+
+
+
+ActiveThorns = "CarpetRegrid2"
+
+CarpetRegrid2::regrid_every = 0
+
+CarpetRegrid2::snap_to_coarse = yes
+
+CarpetRegrid2::num_centres = 1
+
+CarpetRegrid2::num_levels_1 = 3
+CarpetRegrid2::radius_1[1] = 0.25
+CarpetRegrid2::radius_1[2] = 0.125
+
+
+
+ActiveThorns = "WavetoyC"
+
+WaveToy::bound = "radiation"
+
+
+
+ActiveThorns = "IDScalarWaveC"
+
+IDScalarWave::initial_data = "gaussian"
+IDScalarWave::radius = 0.0
+IDScalarWave::sigma = 0.1
+IDScalarWave::amplitude = 1.0
+
+
+
+ActiveThorns = "Time"
+
+Time::dtfac = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = 1
+IOBasic::outInfo_reductions = "norm2 minimum maximum"
+IOBasic::outInfo_vars = "
+ WaveToy::phi
+"
+
+
+
+ActiveThorns = "CarpetIOScalar"
+
+IOScalar::one_file_per_group = yes
+
+IOScalar::outScalar_every = 1
+IOScalar::outScalar_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "CarpetIOASCII"
+
+IOASCII::one_file_per_group = yes
+
+#IOASCII::output_symmetry_points = no
+#IOASCII::out3D_ghosts = no
+
+IOASCII::out0D_every = 1
+IOASCII::out0D_vars = "
+ Carpet::timing
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out1D_every = 1
+IOASCII::out1D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out2D_every = 10
+IOASCII::out2D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOASCII::out3D_every = 100
+IOASCII::out3D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+
+Activethorns = "CarpetIOHDF5"
+
+IOHDF5::out_every = 100
+IOHDF5::compression_level = 1
+IOHDF5::out_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+IOHDF5::checkpoint = yes
+IO::checkpoint_dir = $parfile
+IO::checkpoint_ID = yes
+IO::checkpoint_every = 100
+IO::checkpoint_on_terminate = yes
+
+Carpet::regrid_during_recovery = no
+IOHDF5::use_grid_structure_from_checkpoint = yes
+
+IO::recover = "autoprobe"
+IO::recover_dir = $parfile
+
+
+
+ActiveThorns = "Formaline"
+
+Formaline::send_as_rdf = yes
+Formaline::rdf_hostname[0] = "buran.aei.mpg.de"
+Formaline::rdf_port [0] = 24997
+Formaline::rdf_hostname[1] = "devportal.cct.lsu.edu"
+Formaline::rdf_port [1] = 8080
+
+
+
+ActiveThorns = "Twitter"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::out_every = 100
+TimerReport::out_filename = "TimerReport"
diff --git a/CarpetDev/CarpetIOF5/par/wavetoy-vc-uni.par b/CarpetDev/CarpetIOF5/par/wavetoy-vc-uni.par
new file mode 100644
index 000000000..e2339f342
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/par/wavetoy-vc-uni.par
@@ -0,0 +1,245 @@
+Cactus::cctk_run_title = "WaveToy vertex-centred unigrid"
+
+Cactus::cctk_full_warnings = yes
+Cactus::highlight_warning_messages = no
+
+Cactus::terminate = "time"
+Cactus::cctk_final_time = 1.0
+
+
+
+ActiveThorns = "IOUtil"
+
+IO::out_dir = $parfile
+
+
+
+ActiveThorns = "InitBase"
+
+InitBase::initial_data_setup_method = "init_single_level"
+
+
+
+ActiveThorns = "AEILocalInterp"
+
+ActiveThorns = "Fortran"
+
+ActiveThorns = "HDF5"
+
+ActiveThorns = "LocalInterp"
+
+ActiveThorns = "LoopControl"
+
+ActiveThorns = "NaNCatcher"
+
+ActiveThorns = "Slab"
+
+
+
+ActiveThorns = "Carpet CarpetLib CarpetInterp CarpetReduce CarpetSlab"
+
+Carpet::verbose = no
+Carpet::schedule_barriers = no
+Carpet::veryverbose = no
+CarpetLib::output_bboxes = no
+
+Carpet::domain_from_coordbase = yes
+Carpet::max_refinement_levels = 3
+
+driver::ghost_size = 2
+
+Carpet::refinement_centering = "vertex"
+Carpet::prolongation_order_space = 3
+Carpet::prolongation_order_time = 2
+
+Carpet::convergence_level = 0
+
+Carpet::init_each_timelevel = yes
+Carpet::regrid_during_initialisation = no
+Carpet::enable_all_storage = no
+
+Carpet::poison_new_timelevels = yes
+CarpetLib::poison_new_memory = yes
+
+Carpet::grid_structure_filename = "carpet-grid-structure"
+Carpet::output_timers_every = 100
+CarpetLib::print_timestats_every = 100
+CarpetLib::print_memstats_every = 100
+
+
+
+ActiveThorns = "NaNChecker"
+
+NaNChecker::check_every = 100
+NaNChecker::action_if_found = "terminate"
+NaNChecker::check_vars = "
+ WaveToy::scalarevolve
+"
+
+
+
+ActiveThorns = "Boundary CartGrid3D CoordBase SymBase"
+
+CoordBase::domainsize = "minmax"
+
+CoordBase::xmin = -0.50
+CoordBase::ymin = -0.50
+CoordBase::zmin = -0.50
+CoordBase::xmax = +0.50
+CoordBase::ymax = +0.50
+CoordBase::zmax = +0.50
+CoordBase::dx = 0.0125
+CoordBase::dy = 0.0125
+CoordBase::dz = 0.0125
+
+CoordBase::boundary_staggered_x_lower = no
+CoordBase::boundary_staggered_y_lower = no
+CoordBase::boundary_staggered_z_lower = no
+CoordBase::boundary_staggered_x_upper = no
+CoordBase::boundary_staggered_y_upper = no
+CoordBase::boundary_staggered_z_upper = no
+
+CartGrid3D::type = "coordbase"
+
+
+
+ActiveThorns = "WavetoyC"
+
+WaveToy::bound = "radiation"
+
+
+
+ActiveThorns = "IDScalarWaveC"
+
+IDScalarWave::initial_data = "gaussian"
+IDScalarWave::radius = 0.0
+IDScalarWave::sigma = 0.1
+IDScalarWave::amplitude = 1.0
+
+
+
+ActiveThorns = "Time"
+
+Time::dtfac = 0.5
+
+
+
+ActiveThorns = "CarpetIOBasic"
+
+IOBasic::outInfo_every = 1
+IOBasic::outInfo_reductions = "norm2 minimum maximum"
+IOBasic::outInfo_vars = "
+ WaveToy::phi
+"
+
+
+
+#ActiveThorns = "CarpetIOScalar"
+#
+#IOScalar::one_file_per_group = yes
+#
+#IOScalar::outScalar_every = 1
+#IOScalar::outScalar_vars = "
+# grid::coordinates
+# CarpetReduce::weight
+# WaveToy::scalarevolve
+#"
+
+
+
+ActiveThorns = "CarpetIOASCII"
+
+IOASCII::one_file_per_group = yes
+
+IOASCII::output_symmetry_points = yes # no
+IOASCII::out3D_ghosts = yes # no
+
+#IOASCII::out0D_every = 1
+#IOASCII::out0D_vars = "
+# Carpet::timing
+# grid::coordinates
+# CarpetReduce::weight
+# WaveToy::scalarevolve
+#"
+
+IOASCII::out1D_every = 1
+IOASCII::out1D_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+#IOASCII::out2D_every = 10
+#IOASCII::out2D_vars = "
+# grid::coordinates
+# CarpetReduce::weight
+# WaveToy::scalarevolve
+#"
+#
+#IOASCII::out3D_every = 100
+#IOASCII::out3D_vars = "
+# grid::coordinates
+# CarpetReduce::weight
+# WaveToy::scalarevolve
+#"
+
+
+
+Activethorns = "CarpetIOHDF5"
+
+IOHDF5::out_every = 64
+IOHDF5::compression_level = 1
+IOHDF5::out_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+#IOHDF5::checkpoint = yes
+#IO::checkpoint_dir = $parfile
+#IO::checkpoint_ID = yes
+#IO::checkpoint_every = 100
+#IO::checkpoint_on_terminate = yes
+#
+#Carpet::regrid_during_recovery = no
+#IOHDF5::use_grid_structure_from_checkpoint = yes
+#
+#IO::recover = "autoprobe"
+#IO::recover_dir = $parfile
+
+
+
+Activethorns = "CarpetIOF5"
+
+IOF5::out_every = 64
+IOF5::chunk_size_x = 8
+IOF5::chunk_size_y = 8
+IOF5::chunk_size_z = 8
+IOF5::compression_level = 1
+IOF5::write_checksum = yes
+IOF5::out_vars = "
+ grid::coordinates
+ CarpetReduce::weight
+ WaveToy::scalarevolve
+"
+
+
+ActiveThorns = "Formaline"
+
+Formaline::send_as_rdf = yes
+Formaline::rdf_hostname[0] = "buran.aei.mpg.de"
+Formaline::rdf_port [0] = 24997
+Formaline::rdf_hostname[1] = "devportal.cct.lsu.edu"
+Formaline::rdf_port [1] = 8080
+
+
+
+ActiveThorns = "Twitter"
+
+
+
+ActiveThorns = "TimerReport"
+
+TimerReport::out_every = 100
+TimerReport::output_all_timers_together = yes
+TimerReport::out_filename = "TimerReport"
diff --git a/CarpetDev/CarpetIOF5/param.ccl b/CarpetDev/CarpetIOF5/param.ccl
index 45b0eeca1..f9d1249bd 100644
--- a/CarpetDev/CarpetIOF5/param.ccl
+++ b/CarpetDev/CarpetIOF5/param.ccl
@@ -62,6 +62,15 @@ STRING out_extension "File name extension" STEERABLE=always
"" :: "File extension (including a leading dot, if desired)"
} ".f5"
+BOOLEAN create_subdirs "Create subdirectories for the output files to reduce the number of files per directory" STEERABLE=always
+{
+} "no"
+
+BOOLEAN one_dir_per_file "Create one subdirectory per output file to reduce locking overhead" STEERABLE=always
+{
+} "no"
+
+
STRING out_vars "Variables and groups which should be output in the F5 file format" STEERABLE=always
@@ -101,17 +110,44 @@ REAL dt_fudge "Fudge factor for time comparisons" STEERABLE=always
+INT chunk_size_x "Chunk size for chunked datasets" STEERABLE=always
+{
+ -1 :: "no chunking (use actual dataset size)"
+ 1:* :: "desired chunk size"
+} -1
+
+INT chunk_size_y "Chunk size for chunked datasets" STEERABLE=always
+{
+ -1 :: "no chunking (use actual dataset size)"
+ 1:* :: "desired chunk size"
+} -1
+
+INT chunk_size_z "Chunk size for chunked datasets" STEERABLE=always
+{
+ -1 :: "no chunking (use actual dataset size)"
+ 1:* :: "desired chunk size"
+} -1
+
INT compression_level "Compression level to use for writing HDF5 data" STEERABLE=always
{
- 0:9 :: "Higher numbers compress better, a value of zero disables compression"
+ 0 :: "no compression"
+ 1:9 :: "higher numbers compress better"
} 0
+BOOLEAN write_checksum "Add a checksum when writing HDF5 files" STEERABLE=always
+{
+} "no"
+
+BOOLEAN check_checksum "Check checksum (if present) when reading HDF5 files" STEERABLE=always
+{
+} "no"
+
KEYWORD output_regions "Regions which should be output" STEERABLE=always
{
"exterior" :: "whole region (including boundaries)"
- "communicated" :: "exterior without outer boundary"
+ #"communicated" :: "exterior without outer boundary"
"owned" :: "evolved in time"
# "active" :: "owned minus buffers"
"interior" :: "interior (without ghost zones)"
diff --git a/CarpetDev/CarpetIOF5/src/IOF5.cc b/CarpetDev/CarpetIOF5/src/IOF5.cc
index 94e1089f3..1173f5228 100644
--- a/CarpetDev/CarpetIOF5/src/IOF5.cc
+++ b/CarpetDev/CarpetIOF5/src/IOF5.cc
@@ -9,12 +9,22 @@
#include <string>
#include <vector>
+// force HDF5 1.8.x installations to use the new API
+#define H5Dcreate_vers 2
+
+#include <hdf5.h>
+
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
+#include "CactusBase/IOUtil/src/ioGH.h"
+#include "CactusBase/IOUtil/src/ioutil_CheckpointRecovery.h"
+
#include "carpet.hh"
+#include "defs.hh"
+
#include "extending.hh"
#include "file.hh"
#include "utils.hh"
@@ -377,36 +387,93 @@ namespace CarpetIOF5 {
extending_t extending (cctkGH);
bool const use_IO_out_dir = strcmp (out_dir, "") == 0;
- string const basename
- = (use_IO_out_dir ? IO_out_dir : out_dir) + string ("/") + alias;
+ string const path = use_IO_out_dir ? IO_out_dir : out_dir;
+ string const basename = alias;
bool const did_truncate = extending.get_did_truncate (basename);
bool const do_truncate
= not did_truncate and IO_TruncateOutputFiles (cctkGH);
extending.set_did_truncate (basename);
- F5::file_t file (cctkGH, basename, string (out_extension), do_truncate);
+ int const proc = CCTK_MyProc (cctkGH);
+ bool have_metafile; // whether there is a metadata file
+ int metadata_processor; // the processor which outputs the metadata file
+ int output_processor; // the processor which outputs our data
+ if (CCTK_EQUALS (out_mode, "proc"))
+ {
+ have_metafile = true;
+ metadata_processor = 0;
+ output_processor = proc;
+ }
+ else if (CCTK_EQUALS (out_mode, "np"))
+ {
+ have_metafile = true;
+ metadata_processor = 0;
+ output_processor = proc / out_proc_every * out_proc_every;
+ }
+ else if (CCTK_EQUALS (out_mode, "onefile"))
+ {
+ have_metafile = false;
+ metadata_processor = 0;
+ output_processor = 0;
+ }
+ else
+ {
+ assert (0);
+ }
+
+ F5::file_t * metafile = NULL;
+ if (have_metafile and proc == metadata_processor)
+ {
+ metafile
+ = new F5::file_t (cctkGH, path, basename, string (out_extension),
+ do_truncate, true, false);
+ }
+
+ F5::file_t * file = NULL;
+ if (proc == output_processor)
+ {
+ file = new F5::file_t (cctkGH, path, basename, string (out_extension),
+ do_truncate, not have_metafile, true);
+ }
if (do_truncate)
{
// Output parameters once after the output file has been created
- if (CCTK_EQUALS (out_save_parameters, "all") or
- CCTK_EQUALS (out_save_parameters, "only set"))
- {
- WriteParameters (file);
- }
- else if (CCTK_EQUALS (out_save_parameters, "no"))
+ if (proc == metadata_processor)
{
- // do nothing
- }
- else
- {
- assert (0);
+ if (CCTK_EQUALS (out_save_parameters, "all") or
+ CCTK_EQUALS (out_save_parameters, "only set"))
+ {
+ WriteParameters (have_metafile ? * metafile : * file);
+ }
+ else if (CCTK_EQUALS (out_save_parameters, "no"))
+ {
+ // do nothing
+ }
+ else
+ {
+ assert (0);
+ }
}
}
- writer_t writer (cctkGH, variable);
- writer.write (file);
+ if (metafile)
+ {
+ writer_t writer (cctkGH, variable);
+ writer.write (* metafile);
+ delete metafile;
+ metafile = NULL;
+ }
+ {
+ writer_t writer (cctkGH, variable);
+#warning "TODO: handle the case where not all processors are writing to their own file"
+ assert (proc == output_processor);
+ assert (file);
+ writer.write (* file);
+ delete file;
+ file = NULL;
+ }
return Error_none;
}
@@ -416,12 +483,84 @@ namespace CarpetIOF5 {
void
WriteParameters (F5::file_t & file)
{
- bool const use_metafile = file.get_have_metafile();
- hid_t const hdf5_file
- = use_metafile ? file.get_hdf5_metafile() : file.get_hdf5_file();
+ DECLARE_CCTK_PARAMETERS;
+
+ cGH const * const cctkGH = file.get_cctkGH ();
+
+ hid_t const hdf5_file = file.get_hdf5_file();
+
+ hid_t const attribute_group
+ = F5::open_or_create_group (hdf5_file,
+ "Parameters and Global Attributes");
+ assert (attribute_group >= 0);
+
+ // unique configuration identifier
+ if (CCTK_IsFunctionAliased ("UniqueConfigID")) {
+ F5::write_or_check_attribute
+ (attribute_group, "config id",
+ static_cast<char const *> (UniqueConfigID (cctkGH)));
+ }
+
+ // unique build identifier
+ if (CCTK_IsFunctionAliased ("UniqueBuildID")) {
+ F5::write_or_check_attribute
+ (attribute_group, "build id",
+ static_cast<char const *> (UniqueBuildID (cctkGH)));
+ }
+
+ // unique simulation identifier
+ if (CCTK_IsFunctionAliased ("UniqueSimulationID")) {
+ F5::write_or_check_attribute
+ (attribute_group, "simulation id",
+ static_cast<char const *> (UniqueSimulationID (cctkGH)));
+ }
+
+ // unique run identifier
+ if (CCTK_IsFunctionAliased ("UniqueRunID")) {
+ F5::write_or_check_attribute
+ (attribute_group, "run id",
+ static_cast<char const *> (UniqueRunID (cctkGH)));
+ }
+
+ // Output Cactus parameters as single string
+ {
+ char * const parameters = IOUtil_GetAllParameters (cctkGH, true);
+ assert (parameters);
+ // Create a dataset, since the data may not fit into an attribute
+ hsize_t const size = strlen (parameters) + 1;
+ hid_t const dataspace = H5Screate_simple (1, & size, NULL);
+ assert (dataspace >= 0);
+ hid_t properties = H5Pcreate (H5P_DATASET_CREATE);
+ assert (properties >= 0);
+ check (not H5Pset_chunk (properties, 1, & size));
+ if (compression_level > 0)
+ {
+ check (not H5Pset_deflate (properties, compression_level));
+ }
+ if (write_checksum)
+ {
+ check (not H5Pset_fletcher32 (properties));
+ }
+ hid_t const dataset
+ = H5Dcreate (attribute_group, "All Parameters", H5T_NATIVE_CHAR,
+ dataspace, H5P_DEFAULT,
+ properties, H5P_DEFAULT);
+ assert (dataset >= 0);
+ check (not H5Dwrite (dataset, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL,
+ H5P_DEFAULT, parameters));
+ check (not H5Dclose (dataset));
+ check (not H5Pclose (properties));
+ check (not H5Sclose (dataspace));
+ free (parameters);
+ }
+
+ check (not H5Gclose (attribute_group));
+ // This is far too slow to be useful
+#if 0
hid_t const parameter_group
= F5::open_or_create_group (hdf5_file, "Cactus parameters");
+ assert (parameter_group >= 0);
int first = 1;
for (;;)
@@ -479,8 +618,8 @@ namespace CarpetIOF5 {
first = 0;
}
- herr_t const herr = H5Gclose (parameter_group);
- assert (not herr);
+ check (not H5Gclose (parameter_group));
+#endif
}
diff --git a/CarpetDev/CarpetIOF5/src/coordinate_system.cc b/CarpetDev/CarpetIOF5/src/coordinate_system.cc
index bb5b6808f..e030c08a9 100644
--- a/CarpetDev/CarpetIOF5/src/coordinate_system.cc
+++ b/CarpetDev/CarpetIOF5/src/coordinate_system.cc
@@ -102,8 +102,7 @@ namespace CarpetIOF5 {
Cartesian_coordinate_system_t::
~ Cartesian_coordinate_system_t ()
{
- herr_t const herr = H5Gclose (m_hdf5_coordinate_system);
- assert (not herr);
+ check (not H5Gclose (m_hdf5_coordinate_system));
}
@@ -114,8 +113,10 @@ namespace CarpetIOF5 {
assert (all (m_level_delta > (CCTK_REAL) 0));
ostringstream namebuf;
- namebuf << "Cartesian 3D, x0=" << m_level_origin
- << ", dx=" << m_level_delta;
+ namebuf << "Cartesian3D-"
+ << name_from_ivect (m_level_origin)
+ << "-"
+ << name_from_ivect (m_level_delta);
string const namestr = namebuf.str();
m_name = namestr;
char const * const name = namestr.c_str();
@@ -124,6 +125,7 @@ namespace CarpetIOF5 {
= open_or_create_group (m_topology.get_hdf5_topology(), name);
assert (m_hdf5_coordinate_system >= 0);
+#warning "TODO: don't output coordinates as attributes"
write_or_check_attribute
(m_hdf5_coordinate_system, "origin", m_level_origin);
write_or_check_attribute
@@ -133,21 +135,20 @@ namespace CarpetIOF5 {
void coordinate_system_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
+ get_topology().get_link_destination (proc, filename, objectname);
+ if (objectname.empty())
{
- initialised = true;
- get_topology().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
+ objectname = m_name;
+ }
+ else
+ {
+ objectname += string ("/") + m_name;
}
- filename = l_filename;
- objectname = l_objectname;
}
diff --git a/CarpetDev/CarpetIOF5/src/coordinate_system.hh b/CarpetDev/CarpetIOF5/src/coordinate_system.hh
index 3a36a458a..2b67b4561 100644
--- a/CarpetDev/CarpetIOF5/src/coordinate_system.hh
+++ b/CarpetDev/CarpetIOF5/src/coordinate_system.hh
@@ -46,7 +46,8 @@ namespace CarpetIOF5 {
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
diff --git a/CarpetDev/CarpetIOF5/src/data_region.cc b/CarpetDev/CarpetIOF5/src/data_region.cc
index 21728c2e6..99b188323 100644
--- a/CarpetDev/CarpetIOF5/src/data_region.cc
+++ b/CarpetDev/CarpetIOF5/src/data_region.cc
@@ -3,12 +3,14 @@
#include <sstream>
#include <string>
+#include <hdf5.h>
+
#include "cctk.h"
-#include "cctk_Parameters.h"
#include "carpet.hh"
#include "data_region.hh"
+#include "utils.hh"
@@ -21,54 +23,19 @@ namespace CarpetIOF5 {
data_region_t::
- data_region_t (tensor_component_t & tensor_component,
+ data_region_t (physical_quantity_t & physical_quantity,
bbox<int, dim> const & region)
- : m_tensor_component (tensor_component),
- m_region (region)
+ : m_physical_quantity (physical_quantity),
+ m_region (region),
+ m_name (string ("region-") + F5::name_from_ibbox (region))
{
- DECLARE_CCTK_PARAMETERS;
-
assert (not region.empty());
- ostringstream namebuf;
-#if 0
- namebuf << "map=" << Carpet::map << " "
- << "region=" << m_region;
-#else
- namebuf << "region=" << m_region;
-#endif
- string const namestr = namebuf.str();
- char const * const name = namestr.c_str();
- assert (name != 0);
-
- int const vartype = CCTK_VarTypeI (m_tensor_component.get_variable());
- assert (vartype >= 0);
- hid_t const hdf5_datatype = hdf5_datatype_from_cactus_datatype (vartype);
- assert (hdf5_datatype >= 0);
-
- vect<hsize_t, dim> const dims
- = (region.shape() / region.stride()).reverse();
- m_dataspace = H5Screate_simple (dim, & dims [0], 0);
- assert (m_dataspace >= 0);
-
- m_properties = H5Pcreate (H5P_DATASET_CREATE);
- assert (m_properties >= 0);
- if (compression_level > 0)
- {
- herr_t const herr1 = H5Pset_chunk (m_properties, dim, & dims [0]);
- assert (not herr1);
- herr_t const herr2 = H5Pset_deflate (m_properties, compression_level);
- assert (not herr2);
- }
-
- m_dataset
- = H5Dcreate (m_tensor_component.get_hdf5_tensor_component(), name,
- hdf5_datatype, m_dataspace,
- H5P_DEFAULT, m_properties, H5P_DEFAULT);
- assert (m_dataset >= 0);
-
- write_or_check_attribute
- (m_dataset, "iorigin", region.lower() / region.stride());
+ m_hdf5_data_region
+ = open_or_create_group (m_physical_quantity
+ .get_hdf5_physical_quantity(),
+ m_name.c_str());
+ assert (m_hdf5_data_region >= 0);
assert (invariant());
}
@@ -78,73 +45,35 @@ namespace CarpetIOF5 {
data_region_t::
~ data_region_t ()
{
- herr_t herr;
-
- herr = H5Dclose (m_dataset);
- assert (not herr);
-
- herr = H5Sclose (m_dataspace);
- assert (not herr);
-
- herr = H5Pclose (m_properties);
+ herr_t const herr = H5Gclose (m_hdf5_data_region);
assert (not herr);
}
- string data_region_t::
- name_from_region (bbox<int, dim> const & region)
+ physical_quantity_t & data_region_t::
+ get_physical_quantity ()
+ const
{
- ostringstream namebuf;
-#if 0
- namebuf << "map=" << Carpet::map << " "
- << "region=" << region;
-#else
- namebuf << "region=" << region;
-#endif
- return namebuf.str();
+ return m_physical_quantity;
}
- tensor_component_t & data_region_t::
- get_tensor_component ()
+ bbox<int, dim> const & data_region_t::
+ get_region ()
const
{
- return m_tensor_component;
+ return m_region;
}
- void data_region_t::
- write (void const * const data,
- int const cactus_datatype)
+ hid_t data_region_t::
+ get_hdf5_data_region ()
const
{
- hid_t const memory_hdf5_datatype
- = hdf5_datatype_from_cactus_datatype (cactus_datatype);
- assert (memory_hdf5_datatype >= 0);
-
- vect<hsize_t, dim> const dims
- = (m_region.shape() / m_region.stride()).reverse();
- hid_t const memory_dataspace
- = H5Screate_simple (dim, & dims [0], & dims [0]);
- assert (memory_dataspace >= 0);
-
- hid_t const transfer_properties = H5Pcreate (H5P_DATASET_XFER);
- assert (transfer_properties >= 0);
-
- herr_t herr;
- herr
- = H5Dwrite (m_dataset, memory_hdf5_datatype, memory_dataspace,
- m_dataspace, transfer_properties, data);
- assert (not herr);
-
- herr = H5Pclose (transfer_properties);
- assert (not herr);
-
- herr = H5Sclose (memory_dataspace);
- assert (not herr);
+ return m_hdf5_data_region;
}
@@ -154,9 +83,7 @@ namespace CarpetIOF5 {
const
{
return (not m_region.empty()
- and m_properties >= 0
- and m_dataset >= 0
- and m_dataspace >= 0);
+ and m_hdf5_data_region >= 0);
}
} // namespace F5
diff --git a/CarpetDev/CarpetIOF5/src/data_region.hh b/CarpetDev/CarpetIOF5/src/data_region.hh
index 29d5504c7..35e5ecc79 100644
--- a/CarpetDev/CarpetIOF5/src/data_region.hh
+++ b/CarpetDev/CarpetIOF5/src/data_region.hh
@@ -1,18 +1,14 @@
#ifndef DATA_REGION_HH
#define DATA_REGION_HH
-// force HDF5 1.8.x installations to use the new API
-#ifdef H5Dcreate_vers
-#undef H5Dcreate_vers
-#endif
-#define H5Dcreate_vers 2
+#include <string>
#include <hdf5.h>
#include "bbox.hh"
#include "defs.hh"
-#include "tensor_component.hh"
+#include "physical_quantity.hh"
@@ -20,15 +16,16 @@ namespace CarpetIOF5 {
namespace F5 {
+ using std::string;
+
class data_region_t {
- tensor_component_t & m_tensor_component;
+ physical_quantity_t & m_physical_quantity;
bbox<int, dim> const m_region;
+ string const m_name;
- hid_t m_properties;
- hid_t m_dataset;
- hid_t m_dataspace;
+ hid_t m_hdf5_data_region;
data_region_t ();
data_region_t (data_region_t const &);
@@ -36,22 +33,22 @@ namespace CarpetIOF5 {
public:
- data_region_t (tensor_component_t & tensor_component,
+ data_region_t (physical_quantity_t & physical_quantity,
bbox<int, dim> const & region);
virtual
~ data_region_t ();
- static string
- name_from_region (bbox<int, dim> const & region);
+ physical_quantity_t &
+ get_physical_quantity ()
+ const;
- tensor_component_t &
- get_tensor_component ()
+ bbox<int, dim> const &
+ get_region ()
const;
- void
- write (void const * data,
- int cactus_datatype)
+ hid_t
+ get_hdf5_data_region ()
const;
virtual bool
diff --git a/CarpetDev/CarpetIOF5/src/extending.cc b/CarpetDev/CarpetIOF5/src/extending.cc
index bff256190..26d63cb60 100644
--- a/CarpetDev/CarpetIOF5/src/extending.cc
+++ b/CarpetDev/CarpetIOF5/src/extending.cc
@@ -1,6 +1,5 @@
#include <cassert>
#include <cstring>
-#include <iostream>
#include "cctk.h"
diff --git a/CarpetDev/CarpetIOF5/src/f5writer.cc b/CarpetDev/CarpetIOF5/src/f5writer.cc
new file mode 100644
index 000000000..b351c7391
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/src/f5writer.cc
@@ -0,0 +1,445 @@
+#include <sstream>
+#include <string>
+
+#include <hdf5.h>
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "carpet.hh"
+
+#include "data_region.hh"
+#include "f5writer.hh"
+#include "file.hh"
+#include "meta_data_region.hh"
+#include "physical_quantity.hh"
+#include "simulation.hh"
+#include "tensor_component.hh"
+#include "timestep.hh"
+#include "topology.hh"
+
+
+
+namespace CarpetIOF5 {
+
+ f5writer_t::
+ f5writer_t (cGH const * const cctkGH,
+ int const variable)
+ : m_cctkGH (cctkGH),
+ m_variable (variable)
+ {
+ }
+
+
+
+ void f5writer_t::
+ write (F5::file_t & file)
+ const
+ {
+ write_meta (file, file.get_have_metafile());
+ }
+
+
+
+ void f5writer_t::
+ write_meta (F5::file_t & file,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_meta");
+ }
+
+ if (Carpet::is_meta_mode())
+ {
+ for (Carpet::mglevel_iterator mglevel_iter (m_cctkGH);
+ not mglevel_iter.done();
+ mglevel_iter.step())
+ {
+ write_one_mglevel (file, have_metafile);
+ }
+ }
+ else
+ {
+ write_one_mglevel (file, have_metafile);
+ }
+ }
+
+
+
+ void f5writer_t::
+ write_one_mglevel (F5::file_t & file,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_mglevel mglevel=%d",
+ Carpet::mglevel);
+ }
+
+ // ostringstream namebuf;
+ // namebuf << "convlevel=" << m_cctkGH->cctk_convlevel;
+ // string const namestr = namebuf.str();
+ // char const * const name = namestr.c_str();
+
+ int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
+ assert (grouptype >= 0);
+ switch (grouptype)
+ {
+ case CCTK_ARRAY:
+ case CCTK_SCALAR:
+ {
+ if (Carpet::do_global_mode)
+ {
+ write_global (file, have_metafile);
+ }
+ }
+ break;
+ case CCTK_GF:
+ {
+ if (Carpet::is_global_mode())
+ {
+ for (Carpet::reflevel_iterator reflevel_iter (m_cctkGH);
+ not reflevel_iter.done();
+ reflevel_iter.step())
+ {
+ write_one_reflevel (file, have_metafile);
+ }
+ }
+ else
+ {
+ write_one_reflevel (simulation, have_metafile);
+ }
+ }
+ break;
+ default:
+ assert (0);
+ }
+ }
+
+
+
+ void f5writer_t::
+ write_global (F5::simulation_t & simulation,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global");
+ }
+
+ F5::unigrid_topology_t topology (simulation);
+
+ int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
+ assert (grouptype >= 0);
+ assert (grouptype == CCTK_SCALAR or grouptype == CCTK_ARRAY);
+
+ vect<CCTK_REAL, dim> level_origin, level_delta;
+ for (int d=0; d<dim; ++d)
+ {
+ level_origin[d] = 0.0;
+ level_delta[d] = 1.0;
+ }
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ int const map = 0;
+ int const reflevel = 0;
+ int const myproc = CCTK_MyProc (m_cctkGH);
+ dh * const dd = Carpet::arrdata.at(group).at(map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+
+ if (have_metafile)
+ {
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+
+
+
+ void f5writer_t::
+ write_one_reflevel (F5::file_t & file,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_reflevel reflevel=%d",
+ Carpet::reflevel);
+ }
+
+ // int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
+ // assert (grouptype >= 0);
+ // assert (grouptype == CCTK_GF);
+
+ // A name for the simulation
+ string sim_id;
+ if (CCTK_IsFunctionAliased ("UniqueSimulationID"))
+ {
+ sim_id = static_cast<char const *> (UniqueSimulationID (m_cctkGH));
+ }
+ else {
+ char parfilename[10000];
+ int const len = CCTK_ParameterFilename (sizeof parfilename, parfilename);
+ assert (len >= 0 and len < sizeof parfilename);
+ sim_id = parfilename;
+ if (sim_id.length() >= 4
+ and sim_id.substr (sim_id.length() - 4) == ".par")
+ {
+ sim_id = sim_id.substr (0, sim_id.length() - 4);
+ }
+ }
+
+ // Refinement factor of current refinement level
+ vect <hsize_t, dim> const current_refinement
+ = vect <int, dim>::ref (m_cctkGH->cctk_levfac);
+
+ // Refinement factor of root refinement level
+ vect <hsize_t, dim> const rootlevel_refinement (1);
+
+ // Remember time when the root level was output the last time
+ static CCTK_REAL rootlevel_time = 0.0;
+ if (all (current_refinement == 1))
+ {
+ rootlevel_time = m_cctkGH->cctk_time;
+ }
+
+ F5Path * refinement_path = NULL;
+ if (any (current_refinement != 1))
+ {
+ refinement_path
+ = F5Rcreate_relative_vertex_Qrefinement3D (file,
+ m_cctkGH->cctk_time,
+ sim_id.c_str(),
+ current_refinement,
+ rootlevel_time,
+ rootlevel_refinement);
+ }
+
+#warning "TODO: what is this doing?"
+ F5T_REFINEMENT3D_POINT = refinement_path->myChart->Point_hid_t;
+
+ if (Carpet::is_level_mode())
+ {
+ for (Carpet::map_iterator map_iter (m_cctkGH, grouptype);
+ not map_iter.done();
+ map_iter.step())
+ {
+ write_one_map (simulation, have_metafile);
+ }
+ }
+ else
+ {
+ write_one_map (simulation, have_metafile);
+ }
+ }
+
+
+
+ void f5writer_t::
+ write_one_map (F5::simulation_t & simulation,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_map map=%d", Carpet::map);
+ }
+
+ // F5::mesh_refinement_topology_t topology
+ // (simulation, Carpet::map, Carpet::reflevel, Carpet::maxreflevels,
+ // Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
+
+ // vect<CCTK_REAL, dim> level_origin, level_delta;
+ // for (int d=0; d<dim; ++d)
+ // {
+ // cGH const * const cctkGH = m_cctkGH;
+ // DECLARE_CCTK_ARGUMENTS;
+ // level_origin[d] = CCTK_ORIGIN_SPACE(d);
+ // level_delta[d] = CCTK_DELTA_SPACE(d);
+ // }
+ // F5::Cartesian_coordinate_system_t coordinate_system
+ // (topology, level_origin, level_delta);
+ //
+ // int const group = CCTK_GroupIndexFromVarI (m_variable);
+ // assert (group >= 0 and group < CCTK_NumGroups());
+ // F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+#warning "TODO: this should depend on the patch number"
+ char const * const coordinate_system = NULL;
+
+ // Depends on the refinement level
+ string const gridname = sim_id + "-" + current_refinement;
+
+ F5Path * const myPath
+ = F5Rcreate_vertex_refinement3D (file,
+ m_cctkGH->cctk_time,
+ sim_id.c_str(),
+ refinement,
+ coordinate_system);
+
+ if (not refinement_path)
+ {
+ // Make root level appear as unigrid topology as well, just to
+ // be nice to tools that do not understand AMR
+ F5Rlink_default_vertex_topology (myPath, current_refinement);
+ }
+
+ // Global information for this refinement level
+ vect <hsize_t, dim> const level_dims
+ = vect <int, dim>::ref (m_cctkGH->cctk_gsh);
+#warning "TODO: switch to double precision"
+ vect <float, dim> const level_min
+ (CCTK_ORIGIN_SPACE(0), CCTK_ORIGIN_SPACE(1), CCTK_ORIGIN_SPACE(2));
+ vect <float, dim> const level_spacing
+ (CCTK_DELTA_SPACE(0), CCTK_DELTA_SPACE(1), CCTK_DELTA_SPACE(2));
+ vect <float, dim> const level_max
+ = level_min + level_spacing * (level_dims - 1);
+
+ // Output geometric information for an entire level; it is
+ // uniformely covered in coordinate space
+ assert (dim == 3);
+ F5Fwrite_linear (myPath, FIBER_HDF5_POSITIONS_STRING,
+ dim, & level_dims [0],
+ F5T_COORD3_FLOAT, & level_min [0], & level_spacing [0]);
+
+ F5Fset_range (myPath, & level_min [0], & level_max [0]);
+
+#error "CONTINUE HERE"
+
+ if (Carpet::is_singlemap_mode())
+ {
+ int const grouptype = CCTK_GroupTypeI (group);
+ assert (grouptype >= 0);
+
+ for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
+ not component_iter.done();
+ component_iter.step())
+ {
+ write_one_component (physical_quantity, have_metafile);
+ }
+ }
+ else
+ {
+ write_one_component (physical_quantity, have_metafile);
+ }
+ }
+
+
+
+ void f5writer_t::
+ write_one_component (F5::physical_quantity_t & physical_quantity,
+ bool const have_metafile)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_component component=%d",
+ Carpet::component);
+ }
+
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ bool const is_local = hh->is_local (Carpet::reflevel, Carpet::component);
+ if (have_metafile or is_local)
+ {
+ dh * const dd = Carpet::vdd.at(Carpet::map);
+ bbox<int, dim> const & region
+ = (dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel)
+ .at(Carpet::component).exterior);
+
+ if (have_metafile)
+ {
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+
+ if (is_local)
+ {
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+ }
+ }
+
+
+
+ bbox<int,dim> const & f5writer_t::
+ determine_region (dh::dboxes const & boxes)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+#warning "TODO: use superregions instead of regions (? only if the regions are on the same processor?); use HDF5 chunks as well"
+
+ bbox<int,dim> dh::dboxes::* boxptr;
+ if (CCTK_EQUALS (output_regions, "exterior"))
+ {
+ boxptr = & dh::dboxes::exterior;
+ }
+ else if (CCTK_EQUALS (output_regions, "owned"))
+ {
+ boxptr = & dh::dboxes::owned;
+ }
+ else if (CCTK_EQUALS (output_regions, "interior"))
+ {
+ boxptr = & dh::dboxes::interior;
+ }
+ else
+ {
+ assert (0);
+ }
+
+ return boxes.*boxptr;
+ }
+
+} // namespace CarpetIOF5
diff --git a/CarpetDev/CarpetIOF5/src/f5writer.hh b/CarpetDev/CarpetIOF5/src/f5writer.hh
new file mode 100644
index 000000000..ae016721e
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/src/f5writer.hh
@@ -0,0 +1,74 @@
+#ifndef F5WRITER_HH
+#define F5WRITER_HH
+
+#include "cctk.h"
+
+#include "bbox.hh"
+#include "defs.hh"
+#include "dh.hh"
+
+#include "file.hh"
+#include "physical_quantity.hh"
+#include "simulation.hh"
+#include "timestep.hh"
+#include "topology.hh"
+
+
+
+namespace CarpetIOF5 {
+
+ class f5writer_t {
+
+ cGH const * const m_cctkGH;
+ int const m_variable;
+
+ public:
+
+ f5writer_t (cGH const * cctkGH,
+ int variable);
+
+ void
+ write (F5::file_t & file)
+ const;
+
+ private:
+
+ void
+ write_meta (F5::file_t & file,
+ bool have_metafile)
+ const;
+
+ void
+ write_one_mglevel (F5::timestep_t & timestep,
+ bool have_metafile)
+ const;
+
+ void
+ write_global (F5::simulation_t & simulation,
+ bool have_metafile)
+ const;
+
+ void
+ write_one_reflevel (F5::simulation_t & simulation,
+ bool have_metafile)
+ const;
+
+ void
+ write_one_map (F5::simulation_t & simulation,
+ bool have_metafile)
+ const;
+
+ void
+ write_one_component (F5::physical_quantity_t & physical_quantity,
+ bool have_metafile)
+ const;
+
+ bbox<int,dim> const &
+ determine_region (dh::dboxes const & boxes)
+ const;
+
+ };
+
+} // namespace CarpetIOF5
+
+#endif // #ifndef F5WRITER_HH
diff --git a/CarpetDev/CarpetIOF5/src/file.cc b/CarpetDev/CarpetIOF5/src/file.cc
index f200277b5..d78dcb001 100644
--- a/CarpetDev/CarpetIOF5/src/file.cc
+++ b/CarpetDev/CarpetIOF5/src/file.cc
@@ -1,16 +1,19 @@
#include <algorithm>
#include <cassert>
#include <iomanip>
-#include <iostream>
#include <sstream>
#include <string>
+#include <vector>
#include <hdf5.h>
#include "cctk.h"
#include "cctk_Parameters.h"
+#include "defs.hh"
+
#include "file.hh"
+#include "utils.hh"
@@ -22,58 +25,86 @@ namespace CarpetIOF5 {
file_t::
file_t (cGH const * const cctkGH,
+ string const path,
string const basename,
string const extension,
- bool const do_truncate)
+ bool const do_truncate,
+ bool const is_metafile,
+ bool const is_datafile)
: m_cctkGH (cctkGH),
+ m_path (path),
m_basename (basename),
- m_extension (extension)
+ m_extension (extension),
+ m_is_metafile (is_metafile),
+ m_is_datafile (is_datafile)
{
- assert (cctkGH);
-
- int const proc = CCTK_MyProc (cctkGH);
- m_have_metafile = determine_want_metafile (proc);
- m_output_processor = determine_output_processor (proc);
+ DECLARE_CCTK_PARAMETERS;
- m_metafilename = make_metafilename ();
- m_filename = make_filename (proc);
+ assert (cctkGH);
- char const * const metafilenameptr = m_metafilename.c_str();
- char const * const filenameptr = m_filename.c_str();
+ // Create file names, creating subdirectories to avoid placing
+ // too many files into the same directory
+ check (CCTK_CreateDirectory (mode, path.c_str()) >= 0);
+ if (is_metafile)
+ {
+ m_filename = basename + extension;
+ }
+ else
+ {
+ int const myproc = CCTK_MyProc (cctkGH);
+ m_filename = create_filename (myproc, true);
+ }
+ string const filepath = m_path + "/" + m_filename;
htri_t is_hdf5;
H5E_BEGIN_TRY {
- is_hdf5 = H5Fis_hdf5 (filenameptr);
+ is_hdf5 = H5Fis_hdf5 (filepath.c_str());
} H5E_END_TRY;
bool const file_exists = is_hdf5 > 0;
- // Ignore the metafile when determining whether the file already
- // exists
if (do_truncate or not file_exists)
{
- m_hdf5_metafile = -1;
- if (m_have_metafile)
+ if (veryverbose)
{
- m_hdf5_metafile
- = H5Fcreate (metafilenameptr,
- H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "H5Fcreate (name=\"%s\")", filepath.c_str());
}
m_hdf5_file
- = H5Fcreate (filenameptr, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ = H5Fcreate (filepath.c_str(),
+ H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
}
else
{
- m_hdf5_metafile = -1;
- if (m_have_metafile)
+ if (veryverbose)
{
- m_hdf5_metafile
- = H5Fopen (metafilenameptr, H5F_ACC_RDWR, H5P_DEFAULT);
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "H5Fopen (name=\"%s\")", filepath.c_str());
}
- m_hdf5_file = H5Fopen (filenameptr, H5F_ACC_RDWR, H5P_DEFAULT);
+ m_hdf5_file = H5Fopen (filepath.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
}
+ assert (m_hdf5_file >= 0);
- m_filenames.resize (CCTK_nProcs (cctkGH));
- m_filenames.at(proc) = m_filename;
+ m_hdf5_fiber_contents = -1;
+ m_hdf5_fiber_global_charts = -1;
+ m_hdf5_fiber_parameter_space = -1;
+ if (m_is_metafile)
+ {
+ create_or_check_version (m_hdf5_file);
+ m_hdf5_fiber_contents
+ = open_or_create_group (m_hdf5_file, "TableOfContents");
+ assert (m_hdf5_fiber_contents >= 0);
+ m_hdf5_fiber_global_charts
+ = open_or_create_group (m_hdf5_file, "Charts");
+ assert (m_hdf5_fiber_global_charts >= 0);
+ m_hdf5_fiber_parameter_space
+ = open_or_create_group (m_hdf5_fiber_contents, "Parameters");
+ assert (m_hdf5_fiber_parameter_space >= 0);
+
+ hid_t const hdf5_time_group
+ = open_or_create_group (m_hdf5_fiber_parameter_space, "Time");
+ assert (hdf5_time_group >= 0);
+ check (not H5Gclose (hdf5_time_group));
+ }
assert (invariant());
}
@@ -83,102 +114,91 @@ namespace CarpetIOF5 {
file_t::
~ file_t()
{
- if (m_have_metafile)
- {
- herr_t const herr = H5Fclose (m_hdf5_metafile);
- assert (not herr);
- }
- herr_t const herr = H5Fclose (m_hdf5_file);
- assert (not herr);
- }
-
-
-
- bool file_t::
- determine_want_metafile (int const proc)
- const
- {
- DECLARE_CCTK_PARAMETERS;
-
- if (CCTK_EQUALS (out_mode, "proc") or
- CCTK_EQUALS (out_mode, "np"))
- {
- return proc == 0;
- }
- else if (CCTK_EQUALS (out_mode, "onefile"))
- {
- return false;
- }
- else
+ if (m_is_metafile)
{
- assert (0);
+ check (not H5Gclose (m_hdf5_fiber_parameter_space));
+ check (not H5Gclose (m_hdf5_fiber_contents));
+ check (not H5Gclose (m_hdf5_fiber_global_charts));
}
+ check (not H5Fclose (m_hdf5_file));
}
- int file_t::
- determine_output_processor (int const proc)
+ string file_t::
+ create_filename (int const proc, bool const create_directories)
const
{
DECLARE_CCTK_PARAMETERS;
- if (CCTK_EQUALS (out_mode, "proc"))
- {
- return proc;
- }
- else if (CCTK_EQUALS (out_mode, "np"))
- {
- return proc / out_proc_every * out_proc_every;
- }
- else if (CCTK_EQUALS (out_mode, "onefile"))
+ int const nprocs = CCTK_nProcs (m_cctkGH);
+ string extrapath;
+ if (create_subdirs)
{
- return 0;
+ if (nprocs >= 10000)
+ {
+ ostringstream buf;
+ buf << extrapath
+ << m_basename
+ << ".p" << setw (max (0, processor_digits - 4)) << setfill ('0')
+ << proc / 10000
+ << "nnnn/";
+ extrapath = buf.str();
+ if (create_directories)
+ {
+ string const filepath = m_path + "/" + extrapath;
+ check (CCTK_CreateDirectory (mode, filepath.c_str()) >= 0);
+ }
+ }
+ if (nprocs >= 100)
+ {
+ ostringstream buf;
+ buf << extrapath
+ << m_basename
+ << ".p" << setw (max (0, processor_digits - 2)) << setfill ('0')
+ << proc / 100
+ << "nn/";
+ extrapath = buf.str();
+ if (create_directories)
+ {
+ string const filepath = m_path + "/" + extrapath;
+ check (CCTK_CreateDirectory (mode, filepath.c_str()) >= 0);
+ }
+ }
}
- else
+ if (one_dir_per_file and nprocs >= 1)
{
- assert (0);
+ ostringstream buf;
+ buf << extrapath
+ << m_basename
+ << ".p" << setw (processor_digits) << setfill ('0')
+ << proc
+ << "/";
+ extrapath = buf.str();
+ if (create_directories)
+ {
+ string const filepath = m_path + "/" + extrapath;
+ check (CCTK_CreateDirectory (mode, filepath.c_str()) >= 0);
+ }
}
+ ostringstream buf;
+ buf << extrapath
+ << m_basename
+ << ".p" << setw (processor_digits) << setfill ('0') << proc
+ << m_extension;
+ return buf.str();
}
-
-
- string file_t::
- make_metafilename ()
- const
+
+
+ void file_t::
+ create_or_check_version (hid_t const hdf5_file)
{
- return m_basename + m_extension;
- }
-
-
-
- string file_t::
- make_filename (int const proc)
- const
- {
- DECLARE_CCTK_PARAMETERS;
-
- ostringstream filenamebuf;
-
- filenamebuf << m_basename;
-
- if (CCTK_EQUALS (out_mode, "proc") or
- CCTK_EQUALS (out_mode, "np"))
- {
- filenamebuf << ".p" << setw (processor_digits) << setfill ('0') << proc;
- }
- else if (CCTK_EQUALS (out_mode, "onefile"))
- {
- // do nothing
- }
- else
- {
- assert (0);
- }
-
- filenamebuf << m_extension;
-
- return filenamebuf.str();
+ hid_t const hdf5_group = open_or_create_group (hdf5_file, "version");
+ assert (hdf5_group >= 0);
+ string const version ("http://www.zib.de/visual/F5-0.1.2/");
+ write_or_check_attribute (hdf5_group, "version", version.c_str());
+ check (not H5Gclose (hdf5_group));
}
@@ -192,72 +212,50 @@ namespace CarpetIOF5 {
- bool file_t::
- get_have_metafile ()
- const
- {
- return m_have_metafile;
- }
-
-
-
- int file_t::
- get_output_processor ()
+ hid_t file_t::
+ get_hdf5_file ()
const
{
- return m_output_processor;
+ return m_hdf5_file;
}
- string file_t::
- get_filename (int const proc)
+ hid_t file_t::
+ get_hdf5_fiber_parameter_space ()
const
{
- assert (proc >= 0 and proc < CCTK_nProcs (m_cctkGH));
- if (m_filenames.at(proc).empty())
- {
- m_filenames.at(proc) = make_filename (proc);
- }
- return m_filenames.at(proc);
+ return m_hdf5_fiber_parameter_space;
}
- hid_t file_t::
- get_hdf5_metafile()
+ bool file_t::
+ get_is_metafile ()
const
{
- return m_hdf5_metafile;
+ return m_is_metafile;
}
- hid_t file_t::
- get_hdf5_file()
+ bool file_t::
+ get_is_datafile ()
const
{
- return m_hdf5_file;
+ return m_is_datafile;
}
void file_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
- {
- initialised = true;
- l_filename = m_filename;
- l_objectname = string ("");
- }
- filename = l_filename;
- objectname = l_objectname;
+ filename = create_filename (proc);
+ objectname = "";
}
@@ -266,9 +264,7 @@ namespace CarpetIOF5 {
invariant()
const
{
- return (m_cctkGH != 0
- and (not m_have_metafile or m_hdf5_metafile >= 0)
- and m_hdf5_file >= 0);
+ return m_cctkGH != 0 and m_hdf5_file >= 0;
}
} // namespace F5
diff --git a/CarpetDev/CarpetIOF5/src/file.hh b/CarpetDev/CarpetIOF5/src/file.hh
index 19add249e..44d8ce00c 100644
--- a/CarpetDev/CarpetIOF5/src/file.hh
+++ b/CarpetDev/CarpetIOF5/src/file.hh
@@ -23,48 +23,46 @@ namespace CarpetIOF5 {
class file_t {
- cGH const * const m_cctkGH;
+ // File mode for creating directories
+ static int const mode = 0755;
- bool m_have_metafile;
- int m_output_processor;
+ cGH const * const m_cctkGH;
+ string const m_path;
string const m_basename;
string const m_extension;
-
- string m_metafilename;
string m_filename;
- vector <string> mutable m_filenames;
+ bool const m_is_metafile;
+ bool const m_is_datafile;
- hid_t m_hdf5_metafile;
hid_t m_hdf5_file;
+ hid_t m_hdf5_fiber_contents;
+ hid_t m_hdf5_fiber_global_charts;
+ hid_t m_hdf5_fiber_parameter_space;
+
file_t ();
file_t (file_t const &);
file_t operator= (file_t const &);
- bool
- determine_want_metafile (int proc)
- const;
-
- int
- determine_output_processor (int proc)
- const;
-
string
- make_metafilename ()
+ create_filename (int proc,
+ bool create_directories = false)
const;
- string
- make_filename (int proc)
- const;
+ static void
+ create_or_check_version (hid_t const hdf5_file);
public:
file_t (cGH const * cctkGH,
- string filename,
+ string path,
+ string basename,
string extension,
- bool do_truncate);
+ bool do_truncate,
+ bool is_metafile,
+ bool is_datafile);
virtual
~ file_t ();
@@ -73,28 +71,23 @@ namespace CarpetIOF5 {
get_cctkGH ()
const;
- bool
- get_have_metafile ()
- const;
-
- int
- get_output_processor ()
+ hid_t
+ get_hdf5_file ()
const;
- string
- get_filename (int proc)
+ hid_t
+ get_hdf5_fiber_parameter_space ()
const;
- hid_t
- get_hdf5_metafile ()
+ bool get_is_metafile ()
const;
- hid_t
- get_hdf5_file ()
+ bool get_is_datafile ()
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
diff --git a/CarpetDev/CarpetIOF5/src/make.code.defn b/CarpetDev/CarpetIOF5/src/make.code.defn
index 0641b4f9d..d0350d235 100644
--- a/CarpetDev/CarpetIOF5/src/make.code.defn
+++ b/CarpetDev/CarpetIOF5/src/make.code.defn
@@ -4,16 +4,16 @@
SRCS = IOF5.cc \
coordinate_system.cc \
data_region.cc \
- extending.cc \
- file.cc \
+ extending.cc \
+ file.cc \
meta_data_region.cc \
- physical_quantity.cc \
- simulation.cc \
- tensor_component.cc \
- timestep.cc \
- topology.cc \
- utils.cc \
- writer.cc
+ physical_quantity.cc \
+ simulation.cc \
+ tensor_component.cc \
+ timestep.cc \
+ topology.cc \
+ utils.cc \
+ writer.cc
# Subdirectories containing source files
SUBDIRS =
diff --git a/CarpetDev/CarpetIOF5/src/meta_data_region.cc b/CarpetDev/CarpetIOF5/src/meta_data_region.cc
index 505508eb9..88963ec34 100644
--- a/CarpetDev/CarpetIOF5/src/meta_data_region.cc
+++ b/CarpetDev/CarpetIOF5/src/meta_data_region.cc
@@ -3,11 +3,14 @@
#include <sstream>
#include <string>
+#include <hdf5.h>
+
#include "cctk.h"
#include "carpet.hh"
-#include "data_region.hh"
+#include "defs.hh"
+
#include "meta_data_region.hh"
#include "utils.hh"
@@ -22,17 +25,14 @@ namespace CarpetIOF5 {
meta_data_region_t::
- meta_data_region_t (tensor_component_t & tensor_component,
+ meta_data_region_t (physical_quantity_t & physical_quantity,
bbox<int, dim> const & region)
- : m_tensor_component (tensor_component),
- m_region (region)
+ : m_physical_quantity (physical_quantity),
+ m_region (region),
+ m_name (string ("region-") + F5::name_from_ibbox (region))
{
assert (not region.empty());
- string const namestr = data_region_t::name_from_region (region);
- char const * const name = namestr.c_str();
- assert (name != 0);
-
assert (invariant());
}
@@ -45,11 +45,11 @@ namespace CarpetIOF5 {
- tensor_component_t & meta_data_region_t::
- get_tensor_component ()
+ physical_quantity_t & meta_data_region_t::
+ get_physical_quantity ()
const
{
- return m_tensor_component;
+ return m_physical_quantity;
}
@@ -58,22 +58,48 @@ namespace CarpetIOF5 {
write (int const proc)
const
{
+ DECLARE_CCTK_PARAMETERS;
+
string filename;
string objectname;
- get_tensor_component().get_link_destination (filename, objectname);
+ get_physical_quantity().get_link_destination (proc, filename, objectname);
- string const name = data_region_t::name_from_region (m_region);
+ hid_t const hdf5_physical_quantity
+ = m_physical_quantity.get_hdf5_physical_quantity();
- hid_t const hdf5_tensor_component
- = m_tensor_component.get_hdf5_tensor_component();
+ bool link_exists;
+ H5E_BEGIN_TRY {
+ H5L_info_t linkbuf;
+ herr_t const herr
+ = H5Lget_info (hdf5_physical_quantity, m_name.c_str(),
+ & linkbuf, H5P_DEFAULT);
+ link_exists = herr == 0;
+ } H5E_END_TRY;
+ if (veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Link \"%s\" %s",
+ m_name.c_str(),
+ link_exists ? "exists" : "does not exist");
+ }
- herr_t const herr
- = H5Lcreate_external (filename.c_str(),
- objectname.c_str(),
- hdf5_tensor_component,
- name.c_str(),
- H5P_DEFAULT, H5P_DEFAULT);
- assert (not herr);
+ if (not link_exists)
+ {
+ if (veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "H5Lcreate_external "
+ "(filename=\"%s\", objectname=\"%s\", linkname=\"%s\")",
+ filename.c_str(),
+ objectname.c_str(),
+ m_name.c_str());
+ }
+ check (not H5Lcreate_external (filename.c_str(),
+ objectname.c_str(),
+ hdf5_physical_quantity,
+ m_name.c_str(),
+ H5P_DEFAULT, H5P_DEFAULT));
+ }
}
diff --git a/CarpetDev/CarpetIOF5/src/meta_data_region.hh b/CarpetDev/CarpetIOF5/src/meta_data_region.hh
index b109c5da4..ac59c18e2 100644
--- a/CarpetDev/CarpetIOF5/src/meta_data_region.hh
+++ b/CarpetDev/CarpetIOF5/src/meta_data_region.hh
@@ -1,12 +1,14 @@
#ifndef META_DATA_REGION_HH
#define META_DATA_REGION_HH
+#include <string>
+
#include <hdf5.h>
#include "bbox.hh"
#include "defs.hh"
-#include "tensor_component.hh"
+#include "physical_quantity.hh"
@@ -14,11 +16,14 @@ namespace CarpetIOF5 {
namespace F5 {
+ using std::string;
+
class meta_data_region_t {
- tensor_component_t & m_tensor_component;
+ physical_quantity_t & m_physical_quantity;
bbox<int, dim> const m_region;
+ string const m_name;
hid_t m_properties;
hid_t m_dataset;
@@ -30,14 +35,14 @@ namespace CarpetIOF5 {
public:
- meta_data_region_t (tensor_component_t & tensor_component,
+ meta_data_region_t (physical_quantity_t & physical_quantity,
bbox<int, dim> const & region);
virtual
~ meta_data_region_t ();
- tensor_component_t &
- get_tensor_component ()
+ physical_quantity_t &
+ get_physical_quantity ()
const;
void
diff --git a/CarpetDev/CarpetIOF5/src/physical_quantity.cc b/CarpetDev/CarpetIOF5/src/physical_quantity.cc
index 0b6720ece..d0cb78dcd 100644
--- a/CarpetDev/CarpetIOF5/src/physical_quantity.cc
+++ b/CarpetDev/CarpetIOF5/src/physical_quantity.cc
@@ -1,6 +1,8 @@
#include <cassert>
#include <cstdlib>
+#include <hdf5.h>
+
#include "cctk.h"
#include "physical_quantity.hh"
@@ -67,6 +69,15 @@ namespace CarpetIOF5 {
+ string physical_quantity_t::
+ get_name ()
+ const
+ {
+ return m_name;
+ }
+
+
+
hid_t physical_quantity_t::
get_hdf5_physical_quantity ()
const
@@ -77,21 +88,20 @@ namespace CarpetIOF5 {
void physical_quantity_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
+ get_coordinate_system().get_link_destination (proc, filename, objectname);
+ if (objectname.empty())
+ {
+ objectname = m_name;
+ }
+ else
{
- initialised = true;
- get_coordinate_system().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
+ objectname += string ("/") + m_name;
}
- filename = l_filename;
- objectname = l_objectname;
}
diff --git a/CarpetDev/CarpetIOF5/src/physical_quantity.hh b/CarpetDev/CarpetIOF5/src/physical_quantity.hh
index 38b670cb2..e2b025b81 100644
--- a/CarpetDev/CarpetIOF5/src/physical_quantity.hh
+++ b/CarpetDev/CarpetIOF5/src/physical_quantity.hh
@@ -40,12 +40,17 @@ namespace CarpetIOF5 {
get_group ()
const;
+ string
+ get_name ()
+ const;
+
hid_t
get_hdf5_physical_quantity ()
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
diff --git a/CarpetDev/CarpetIOF5/src/simulation.cc b/CarpetDev/CarpetIOF5/src/simulation.cc
index 98a0a3888..1adde5e5a 100644
--- a/CarpetDev/CarpetIOF5/src/simulation.cc
+++ b/CarpetDev/CarpetIOF5/src/simulation.cc
@@ -4,6 +4,8 @@
#include "cctk.h"
+#include "defs.hh"
+
#include "simulation.hh"
#include "utils.hh"
@@ -28,6 +30,10 @@ namespace CarpetIOF5 {
m_name.c_str());
assert (m_hdf5_simulation >= 0);
+ cGH const * const cctkGH = m_timestep.get_file().get_cctkGH();
+ write_or_check_attribute
+ (m_hdf5_simulation, "TimeStep", cctkGH->cctk_iteration);
+
assert (invariant());
}
@@ -36,8 +42,7 @@ namespace CarpetIOF5 {
simulation_t::
~ simulation_t()
{
- herr_t const herr = H5Gclose (m_hdf5_simulation);
- assert (not herr);
+ check (not H5Gclose (m_hdf5_simulation));
}
@@ -61,21 +66,20 @@ namespace CarpetIOF5 {
void simulation_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
+ get_timestep().get_link_destination (proc, filename, objectname);
+ if (objectname.empty())
+ {
+ objectname = m_name;
+ }
+ else
{
- initialised = true;
- get_timestep().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
+ objectname += string ("/") + m_name;
}
- filename = l_filename;
- objectname = l_objectname;
}
diff --git a/CarpetDev/CarpetIOF5/src/simulation.hh b/CarpetDev/CarpetIOF5/src/simulation.hh
index 272b3385c..4c4639958 100644
--- a/CarpetDev/CarpetIOF5/src/simulation.hh
+++ b/CarpetDev/CarpetIOF5/src/simulation.hh
@@ -47,7 +47,8 @@ namespace CarpetIOF5 {
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
diff --git a/CarpetDev/CarpetIOF5/src/tensor_component.cc b/CarpetDev/CarpetIOF5/src/tensor_component.cc
index 5d4b281fc..6cd2b6486 100644
--- a/CarpetDev/CarpetIOF5/src/tensor_component.cc
+++ b/CarpetDev/CarpetIOF5/src/tensor_component.cc
@@ -1,7 +1,15 @@
#include <cassert>
#include <cstdlib>
+// force HDF5 1.8.x installations to use the new API
+#define H5Dcreate_vers 2
+
+#include <hdf5.h>
+
#include "cctk.h"
+#include "cctk_Parameters.h"
+
+#include "vect.hh"
#include "tensor_component.hh"
@@ -12,22 +20,65 @@ namespace CarpetIOF5 {
namespace F5 {
tensor_component_t::
- tensor_component_t (physical_quantity_t & physical_quantity,
+ tensor_component_t (data_region_t & data_region,
int const variable)
- : m_physical_quantity (physical_quantity),
+ : m_data_region (data_region),
m_variable (variable)
{
+ DECLARE_CCTK_PARAMETERS;
+
assert (variable >= 0 and variable < CCTK_NumVars());
char const * const name = CCTK_VarName (variable);
assert (name != 0);
m_name = string (name);
- m_hdf5_tensor_component
- = open_or_create_group (m_physical_quantity
- .get_hdf5_physical_quantity(),
- name);
- assert (m_hdf5_tensor_component >= 0);
+ int const vartype = CCTK_VarTypeI (variable);
+ assert (vartype >= 0);
+ hid_t const hdf5_datatype = hdf5_datatype_from_cactus_datatype (vartype);
+ assert (hdf5_datatype >= 0);
+
+ bbox<int, dim> const & region = m_data_region.get_region();
+
+ vect<hsize_t, dim> const dims
+ = (region.shape() / region.stride()).reverse();
+ m_dataspace = H5Screate_simple (dim, & dims [0], 0);
+ assert (m_dataspace >= 0);
+
+ m_properties = H5Pcreate (H5P_DATASET_CREATE);
+ assert (m_properties >= 0);
+ vect<int, dim> const user_chunk_size
+ (chunk_size_x, chunk_size_y, chunk_size_z);
+ bool const need_chunks
+ = any (user_chunk_size > 0) or compression_level > 0 or write_checksum;
+ if (need_chunks)
+ {
+ vect<hsize_t, dim> const chunk_size
+ = either (user_chunk_size > 0,
+ vect<hsize_t, dim> (user_chunk_size),
+ dims);
+ herr_t const herr = H5Pset_chunk (m_properties, dim, & chunk_size [0]);
+ assert (not herr);
+ }
+ if (compression_level > 0)
+ {
+ herr_t const herr = H5Pset_deflate (m_properties, compression_level);
+ assert (not herr);
+ }
+ if (write_checksum)
+ {
+ herr_t const herr = H5Pset_fletcher32 (m_properties);
+ assert (not herr);
+ }
+
+ m_dataset
+ = H5Dcreate (m_data_region.get_hdf5_data_region(), m_name.c_str(),
+ hdf5_datatype, m_dataspace,
+ H5P_DEFAULT, m_properties, H5P_DEFAULT);
+ assert (m_dataset >= 0);
+
+ write_or_check_attribute
+ (m_dataset, "iorigin", region.lower() / region.stride());
assert (invariant());
}
@@ -37,17 +88,25 @@ namespace CarpetIOF5 {
tensor_component_t::
~ tensor_component_t ()
{
- herr_t const herr = H5Gclose (m_hdf5_tensor_component);
+ herr_t herr;
+
+ herr = H5Dclose (m_dataset);
+ assert (not herr);
+
+ herr = H5Sclose (m_dataspace);
+ assert (not herr);
+
+ herr = H5Pclose (m_properties);
assert (not herr);
}
- physical_quantity_t & tensor_component_t::
- get_physical_quantity ()
+ data_region_t & tensor_component_t::
+ get_data_region ()
const
{
- return m_physical_quantity;
+ return m_data_region;
}
@@ -61,31 +120,38 @@ namespace CarpetIOF5 {
- hid_t tensor_component_t::
- get_hdf5_tensor_component ()
- const
- {
- return m_hdf5_tensor_component;
- }
-
-
-
+#warning "TODO: This assumes that the shape of data is the same as the shape of the region; this may not be so if not all of the data are written out"
void tensor_component_t::
- get_link_destination (string & filename,
- string & objectname)
+ write (void const * const data,
+ int const cactus_datatype)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
- {
- initialised = true;
- get_physical_quantity().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
- }
- filename = l_filename;
- objectname = l_objectname;
+ hid_t const memory_hdf5_datatype
+ = hdf5_datatype_from_cactus_datatype (cactus_datatype);
+ assert (memory_hdf5_datatype >= 0);
+
+ bbox<int, dim> const & region = m_data_region.get_region();
+
+ vect<hsize_t, dim> const dims
+ = (region.shape() / region.stride()).reverse();
+ hid_t const memory_dataspace
+ = H5Screate_simple (dim, & dims [0], & dims [0]);
+ assert (memory_dataspace >= 0);
+
+ hid_t const transfer_properties = H5Pcreate (H5P_DATASET_XFER);
+ assert (transfer_properties >= 0);
+
+ herr_t herr;
+ herr
+ = H5Dwrite (m_dataset, memory_hdf5_datatype, memory_dataspace,
+ m_dataspace, transfer_properties, data);
+ assert (not herr);
+
+ herr = H5Pclose (transfer_properties);
+ assert (not herr);
+
+ herr = H5Sclose (memory_dataspace);
+ assert (not herr);
}
@@ -95,7 +161,9 @@ namespace CarpetIOF5 {
const
{
return (m_variable >= 0 and m_variable < CCTK_NumVars()
- and m_hdf5_tensor_component >= 0);
+ and m_properties >= 0
+ and m_dataset >= 0
+ and m_dataspace >= 0);
}
} // namespace F5
diff --git a/CarpetDev/CarpetIOF5/src/tensor_component.hh b/CarpetDev/CarpetIOF5/src/tensor_component.hh
index f659c0076..8a95d6faa 100644
--- a/CarpetDev/CarpetIOF5/src/tensor_component.hh
+++ b/CarpetDev/CarpetIOF5/src/tensor_component.hh
@@ -1,10 +1,11 @@
#ifndef TENSOR_COMPONENT_HH
#define TENSOR_COMPONENT_HH
+#include <string>
+
#include <hdf5.h>
-#include "physical_quantity.hh"
-#include "utils.hh"
+#include "data_region.hh"
@@ -14,12 +15,14 @@ namespace CarpetIOF5 {
class tensor_component_t {
- physical_quantity_t & m_physical_quantity;
+ data_region_t & m_data_region;
int const m_variable;
string m_name;
- hid_t m_hdf5_tensor_component;
+ hid_t m_dataspace;
+ hid_t m_properties;
+ hid_t m_dataset;
tensor_component_t ();
tensor_component_t (tensor_component_t const &);
@@ -27,27 +30,23 @@ namespace CarpetIOF5 {
public:
- tensor_component_t (physical_quantity_t & physical_quantity,
+ tensor_component_t (data_region_t & data_region,
int variable);
virtual
~ tensor_component_t ();
- physical_quantity_t &
- get_physical_quantity ()
+ data_region_t &
+ get_data_region ()
const;
hid_t
get_variable ()
const;
- hid_t
- get_hdf5_tensor_component ()
- const;
-
void
- get_link_destination (string & filename,
- string & objectname)
+ write (void const * data,
+ int cactus_datatype)
const;
virtual bool
diff --git a/CarpetDev/CarpetIOF5/src/timestep.cc b/CarpetDev/CarpetIOF5/src/timestep.cc
index 73d106a92..409f47221 100644
--- a/CarpetDev/CarpetIOF5/src/timestep.cc
+++ b/CarpetDev/CarpetIOF5/src/timestep.cc
@@ -9,6 +9,8 @@
#include "cctk.h"
#include "cctk_Functions.h"
+#include "defs.hh"
+
#include "timestep.hh"
#include "utils.hh"
@@ -42,21 +44,14 @@ namespace CarpetIOF5 {
{
// Create a string from the time without losing information
int const precision = numeric_limits<CCTK_REAL>::digits10 + 2;
- buf << setprecision (precision) << "t=" << time;
+ buf << setprecision (precision) << "T=" << time;
}
m_name = buf.str();
m_hdf5_timestep
= open_or_create_group (m_file.get_hdf5_file(), m_name.c_str());
assert (m_hdf5_timestep >= 0);
- write_or_check_attribute (m_hdf5_timestep, "time", time);
-
- if (CCTK_IsFunctionAliased ("UniqueSimulationID")) {
- cGH const * const cctkGH = get_file().get_cctkGH();
- char const * const job_id
- = static_cast<char const *> (UniqueSimulationID (cctkGH));
- write_or_check_attribute (m_hdf5_timestep, "simulation id", job_id);
- }
+ write_or_check_attribute (m_hdf5_timestep, "Time", time);
assert (invariant());
}
@@ -66,8 +61,7 @@ namespace CarpetIOF5 {
timestep_t::
~ timestep_t()
{
- herr_t const herr = H5Gclose (m_hdf5_timestep);
- assert (not herr);
+ check (not H5Gclose (m_hdf5_timestep));
}
@@ -100,21 +94,20 @@ namespace CarpetIOF5 {
void timestep_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
+ get_file().get_link_destination (proc, filename, objectname);
+ if (objectname.empty())
+ {
+ objectname = m_name;
+ }
+ else
{
- initialised = true;
- get_file().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
+ objectname += string ("/") + m_name;
}
- filename = l_filename;
- objectname = l_objectname;
}
diff --git a/CarpetDev/CarpetIOF5/src/timestep.hh b/CarpetDev/CarpetIOF5/src/timestep.hh
index 3a44ec29b..d70a00024 100644
--- a/CarpetDev/CarpetIOF5/src/timestep.hh
+++ b/CarpetDev/CarpetIOF5/src/timestep.hh
@@ -53,7 +53,8 @@ namespace CarpetIOF5 {
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
diff --git a/CarpetDev/CarpetIOF5/src/topology.cc b/CarpetDev/CarpetIOF5/src/topology.cc
index 401f65271..bc05c73a7 100644
--- a/CarpetDev/CarpetIOF5/src/topology.cc
+++ b/CarpetDev/CarpetIOF5/src/topology.cc
@@ -62,7 +62,7 @@ namespace CarpetIOF5 {
unigrid_topology_t (simulation_t & simulation)
: topology_t (simulation)
{
- char const * const name = "Vertices";
+ char const * const name = "uniform";
m_name = string (name);
m_hdf5_topology
= open_or_create_group (m_simulation.get_hdf5_simulation(), name);
@@ -94,6 +94,7 @@ namespace CarpetIOF5 {
mesh_refinement_topology_t::
mesh_refinement_topology_t (simulation_t & simulation,
int const map,
+ int const maps,
int const refinement_level,
int const max_refinement_levels,
vect<int, dim> const & level_refinement_factor,
@@ -110,7 +111,15 @@ namespace CarpetIOF5 {
assert (all (level_refinement_factor <= max_refinement_factor));
ostringstream namebuf;
- namebuf << "Vertices map=" << map << " level=" << refinement_level;
+ namebuf << "Vertices";
+ if (maps > 1)
+ {
+ namebuf << "-map" << map;
+ }
+ if (max_refinement_levels > 1)
+ {
+ namebuf << "-level" << refinement_level;
+ }
string const namestr = namebuf.str();
m_name = namestr;
char const * const name = namestr.c_str();
@@ -157,21 +166,20 @@ namespace CarpetIOF5 {
void topology_t::
- get_link_destination (string & filename,
+ get_link_destination (int const proc,
+ string & filename,
string & objectname)
const
{
- static bool initialised = false;
- static string l_filename;
- static string l_objectname;
- if (not initialised)
+ get_simulation().get_link_destination (proc, filename, objectname);
+ if (objectname.empty())
+ {
+ objectname = m_name;
+ }
+ else
{
- initialised = true;
- get_simulation().get_link_destination (l_filename, l_objectname);
- l_objectname += string ("/") + m_name;
+ objectname += string ("/") + m_name;
}
- filename = l_filename;
- objectname = l_objectname;
}
diff --git a/CarpetDev/CarpetIOF5/src/topology.hh b/CarpetDev/CarpetIOF5/src/topology.hh
index df841107b..e179e71db 100644
--- a/CarpetDev/CarpetIOF5/src/topology.hh
+++ b/CarpetDev/CarpetIOF5/src/topology.hh
@@ -45,7 +45,8 @@ namespace CarpetIOF5 {
const;
void
- get_link_destination (string & filename,
+ get_link_destination (int proc,
+ string & filename,
string & objectname)
const;
@@ -97,6 +98,7 @@ namespace CarpetIOF5 {
mesh_refinement_topology_t (simulation_t & simulation,
int map,
+ int maps,
int refinement_level,
int max_refinement_levels,
vect<int, dim> const & level_refinement_factors,
diff --git a/CarpetDev/CarpetIOF5/src/utils.cc b/CarpetDev/CarpetIOF5/src/utils.cc
index b57e06a9e..d311f0992 100644
--- a/CarpetDev/CarpetIOF5/src/utils.cc
+++ b/CarpetDev/CarpetIOF5/src/utils.cc
@@ -1,11 +1,23 @@
#include <cassert>
#include <complex>
#include <cstring>
+#include <sstream>
#include <vector>
+// force HDF5 1.8.x installations to use the new API
+#define H5Acreate_vers 2
+#define H5Gcreate_vers 2
+#define H5Gopen_vers 2
+#define H5Tarray_create_vers 2
+
+#include <hdf5.h>
+
#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "bbox.hh"
#include "defs.hh"
+#include "vect.hh"
#include "utils.hh"
@@ -175,28 +187,96 @@ namespace CarpetIOF5 {
+ template <typename T, int D>
+ string
+ name_from_ivect (vect <T, D> const & ivect)
+ {
+ ostringstream buf;
+ for (int d = 0; d < dim; ++ d)
+ {
+ if (d > 0)
+ {
+ buf << ":";
+ }
+ buf << ivect[d];
+ }
+ return buf.str ();
+ }
+
+ template
+ string
+ name_from_ivect (vect <int, dim> const & ivect);
+
+ template
+ string
+ name_from_ivect (vect <CCTK_REAL, dim> const & ivect);
+
+
+
+ template <typename T, int D>
+ string
+ name_from_ibbox (bbox <T, D> const & ibbox)
+ {
+ ostringstream buf;
+ buf << name_from_ivect (ibbox.lower ())
+ << "-"
+ << name_from_ivect (ibbox.upper ())
+ << "-"
+ << name_from_ivect (ibbox.stride ());
+ return buf.str ();
+ }
+
+ template
+ string
+ name_from_ibbox (bbox <int, dim> const & ivect);
+
+
+
hid_t
open_or_create_group (hid_t const where,
char const * const name)
{
+ DECLARE_CCTK_PARAMETERS;
+
assert (where >= 0);
assert (name != 0);
+ // bool group_exists;
+ // H5E_BEGIN_TRY {
+ // H5G_stat_t statbuf;
+ // herr_t const herr = H5Gget_objinfo (where, name, true, & statbuf);
+ // group_exists = herr == 0;
+ // } H5E_END_TRY;
bool group_exists;
H5E_BEGIN_TRY {
- H5G_stat_t statbuf;
+ H5G_info_t groupinfo;
herr_t const herr
- = H5Gget_objinfo (where, name, true, & statbuf);
+ = H5Gget_info_by_name (where, name, & groupinfo, H5P_DEFAULT);
group_exists = herr == 0;
} H5E_END_TRY;
+ if (veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "Group \"%s\" %s",
+ name,
+ group_exists ? "exists" : "does not exist");
+ }
hid_t group;
if (group_exists)
{
+ if (veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING, "H5Gopen (name=\"%s\")", name);
+ }
group = H5Gopen (where, name, H5P_DEFAULT);
}
else
{
+ if (veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING, "H5Gcreate (name=\"%s\")", name);
+ }
group = H5Gcreate (where, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
}
diff --git a/CarpetDev/CarpetIOF5/src/utils.hh b/CarpetDev/CarpetIOF5/src/utils.hh
index ae7cb65a1..8d9d0a925 100644
--- a/CarpetDev/CarpetIOF5/src/utils.hh
+++ b/CarpetDev/CarpetIOF5/src/utils.hh
@@ -1,24 +1,6 @@
#ifndef UTILS_HH
#define UTILS_HH
-// force HDF5 1.8.x installations to use the new API
-#ifdef H5Gopen_vers
-#undef H5Gopen_vers
-#endif
-#ifdef H5Gcreate_vers
-#undef H5Gcreate_vers
-#endif
-#ifdef H5Acreate_vers
-#undef H5Acreate_vers
-#endif
-#ifdef H5Tarray_create_vers
-#undef H5Tarray_create_vers
-#endif
-#define H5Gopen_vers 2
-#define H5Gcreate_vers 2
-#define H5Acreate_vers 2
-#define H5Tarray_create_vers 2
-
#include <hdf5.h>
#include "cctk.h"
@@ -69,6 +51,16 @@ namespace CarpetIOF5 {
+ template <typename T, int D>
+ string
+ name_from_ivect (vect <T, D> const & ivect);
+
+ template <typename T, int D>
+ string
+ name_from_ibbox (bbox <T, D> const & ibbox);
+
+
+
hid_t
open_or_create_group (hid_t where,
char const * name);
diff --git a/CarpetDev/CarpetIOF5/src/writer-old.cc b/CarpetDev/CarpetIOF5/src/writer-old.cc
new file mode 100644
index 000000000..4c4f639a8
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/src/writer-old.cc
@@ -0,0 +1,511 @@
+#include <cstdlib>
+#include <sstream>
+#include <string>
+
+#include <hdf5.h>
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "carpet.hh"
+
+#include "data_region.hh"
+#include "file.hh"
+#include "meta_data_region.hh"
+#include "physical_quantity.hh"
+#include "simulation.hh"
+#include "tensor_component.hh"
+#include "timestep.hh"
+#include "topology.hh"
+#include "writer.hh"
+
+
+
+namespace CarpetIOF5 {
+
+ writer_t::
+ writer_t (cGH const * const cctkGH,
+ int const variable)
+ : m_cctkGH (cctkGH),
+ m_variable (variable)
+ {
+ }
+
+
+
+ void writer_t::
+ write (F5::file_t & file)
+ const
+ {
+ write_meta (file);
+ }
+
+
+
+ void writer_t::
+ write_meta (F5::file_t & file)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_meta");
+ }
+
+ F5::timestep_t timestep (file, m_cctkGH->cctk_time);
+
+ if (Carpet::is_meta_mode())
+ {
+ for (Carpet::mglevel_iterator mglevel_iter (m_cctkGH);
+ not mglevel_iter.done();
+ mglevel_iter.step())
+ {
+ write_one_mglevel (timestep);
+ }
+ }
+ else
+ {
+ write_one_mglevel (timestep);
+ }
+ }
+
+
+
+ void writer_t::
+ write_one_mglevel (F5::timestep_t & timestep)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_mglevel mglevel=%d",
+ Carpet::mglevel);
+ }
+
+ // ostringstream namebuf;
+ // namebuf << sim_id;
+ // if (m_cctkGH->cctk_convlevel != 0)
+ // {
+ // namebuf << "-convlevel" << m_cctkGH->cctk_convlevel;
+ // }
+ // string const name = namebuf.str();
+ // F5::simulation_t simulation (timestep, name.c_str());
+
+ int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
+ assert (grouptype >= 0);
+ switch (grouptype)
+ {
+ case CCTK_ARRAY:
+ case CCTK_SCALAR:
+ {
+ if (Carpet::is_global_mode())
+ {
+ int const rl = 0;
+ enter_level_mode (m_cctkGH, rl);
+ write_global_reflevel (timestep);
+ leave_level_mode (m_cctkGH);
+ }
+ else
+ {
+ if (Carpet::do_global_mode)
+ {
+ write_global_reflevel (timestep);
+ }
+ }
+ }
+ break;
+ case CCTK_GF:
+ {
+ if (Carpet::is_global_mode())
+ {
+ for (Carpet::reflevel_iterator reflevel_iter (m_cctkGH);
+ not reflevel_iter.done();
+ reflevel_iter.step())
+ {
+ write_one_reflevel (timestep);
+ }
+ }
+ else
+ {
+ write_one_reflevel (simulation);
+ }
+ }
+ break;
+ default:
+ assert (0);
+ }
+ }
+
+
+
+ void writer_t::
+ write_global_reflevel (F5::timestep_t & timestep)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global_reflevel");
+ }
+
+ if (Carpet::is_level_mode())
+ {
+ for (Carpet::map_iterator map_iter (m_cctkGH, grouptype);
+ not map_iter.done();
+ map_iter.step())
+ {
+ write_global_map (timestep);
+ }
+ }
+ else
+ {
+ write_global_map (timestep);
+ }
+ }
+
+
+
+ void writer_t::
+ write_global_map (F5::timestep_t & timestep)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global_map");
+ }
+
+ write_global_component (timestep);
+ }
+
+
+
+ void writer_t::
+ write_global_component (F5::timestep_t & timestep)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global_component");
+ }
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ cGroup groupdata;
+ check (not CCTK_GropuData (group, & groupdata));
+ assert (groupdata.grouptype == CCTK_SCALAR
+ or groupdata.grouptype == CCTK_ARRAY);
+
+ for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
+ not component_iter.done();
+ component_iter.step())
+
+
+
+ int const myproc = CCTK_MyProc (m_cctkGH);
+ if (groupdata.disttype == CCTK_DISTRIB_CONSTANT and myproc != 0)
+ {
+ // Output DISTRIB=constant groups only on the root processor
+ return;
+ }
+
+ // Name the grid after the variable group
+ char * const c_name = CCTK_GroupNameFromVarI (m_variable);
+ string const name = c_name;
+ free (c_name);
+ F5::simulation_t simulation (timestep, name.c_str());
+
+ F5::unigrid_topology_t topology (simulation);
+
+ vect<CCTK_REAL, dim> const level_origin (0.0), level_delta (1.0);
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ int const map = 0;
+ int const reflevel = 0;
+ dh * const dd = Carpet::arrdata.at(group).at(map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+
+ F5::file_t & file = timestep.get_file();
+ bool const have_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (have_metafile)
+ {
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+
+
+
+ void writer_t::
+ write_global (F5::timestep_t & timestep)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global");
+ }
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ cGroup groupdata;
+ check (not CCTK_GropuData (group, & groupdata));
+ assert (groupdata.grouptype == CCTK_SCALAR
+ or groupdata.grouptype == CCTK_ARRAY);
+
+ for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
+ not component_iter.done();
+ component_iter.step())
+
+
+
+ int const myproc = CCTK_MyProc (m_cctkGH);
+ if (groupdata.disttype == CCTK_DISTRIB_CONSTANT and myproc != 0)
+ {
+ // Output DISTRIB=constant groups only on the root processor
+ return;
+ }
+
+ // Name the grid after the variable group
+ char * const c_name = CCTK_GroupNameFromVarI (m_variable);
+ string const name = c_name;
+ free (c_name);
+ F5::simulation_t simulation (timestep, name.c_str());
+
+ F5::unigrid_topology_t topology (simulation);
+
+ vect<CCTK_REAL, dim> const level_origin (0.0), level_delta (1.0);
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ int const map = 0;
+ int const reflevel = 0;
+ dh * const dd = Carpet::arrdata.at(group).at(map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+
+ F5::file_t & file = timestep.get_file();
+ bool const have_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (have_metafile)
+ {
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+
+
+
+ void writer_t::
+ write_one_map (F5::simulation_t & simulation)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_map map=%d", Carpet::map);
+ }
+
+ F5::mesh_refinement_topology_t topology
+ (simulation, Carpet::map, Carpet::reflevel, Carpet::maxreflevels,
+ Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
+
+ vect<CCTK_REAL, dim> level_origin, level_delta;
+ for (int d=0; d<dim; ++d)
+ {
+ cGH const * const cctkGH = m_cctkGH;
+ DECLARE_CCTK_ARGUMENTS;
+ level_origin[d] = CCTK_ORIGIN_SPACE(d);
+ level_delta[d] = CCTK_DELTA_SPACE(d);
+ }
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ if (Carpet::is_singlemap_mode())
+ {
+ int const grouptype = CCTK_GroupTypeI (group);
+ assert (grouptype >= 0);
+
+ for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
+ not component_iter.done();
+ component_iter.step())
+ {
+ write_one_component (physical_quantity);
+ }
+ }
+ else
+ {
+ write_one_component (physical_quantity);
+ }
+ }
+
+
+
+ void writer_t::
+ write_one_reflevel (F5::simulation_t & simulation)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_reflevel reflevel=%d",
+ Carpet::reflevel);
+ }
+
+ int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
+ assert (grouptype >= 0);
+ assert (grouptype == CCTK_GF);
+
+ if (Carpet::is_level_mode())
+ {
+ for (Carpet::map_iterator map_iter (m_cctkGH, grouptype);
+ not map_iter.done();
+ map_iter.step())
+ {
+ write_one_map (simulation);
+ }
+ }
+ else
+ {
+ write_one_map (simulation);
+ }
+ }
+
+
+
+ void writer_t::
+ write_one_component (F5::physical_quantity_t & physical_quantity)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_component component=%d",
+ Carpet::component);
+ }
+
+ F5::file_t & file
+ = (physical_quantity.get_coordinate_system().get_topology()
+ .get_simulation().get_timestep().get_file());
+ bool const have_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ bool const is_local = hh->is_local (Carpet::reflevel, Carpet::component);
+ if (have_metafile or is_local)
+ {
+ dh * const dd = Carpet::vdd.at(Carpet::map);
+ bbox<int, dim> const & region
+ = (dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel)
+ .at(Carpet::component).exterior);
+
+ if (have_metafile)
+ {
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+
+ if (is_local)
+ {
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+ }
+ }
+
+
+
+ bbox<int,dim> const & writer_t::
+ determine_region (dh::dboxes const & boxes)
+ const
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ // TODO: use superregions instead of regions (? only if the
+ // regions are on the same processor?)
+
+ bbox<int,dim> dh::dboxes::* boxptr;
+ if (CCTK_EQUALS (output_regions, "exterior"))
+ {
+ boxptr = & dh::dboxes::exterior;
+ }
+ else if (CCTK_EQUALS (output_regions, "owned"))
+ {
+ boxptr = & dh::dboxes::owned;
+ }
+ else if (CCTK_EQUALS (output_regions, "interior"))
+ {
+ boxptr = & dh::dboxes::interior;
+ }
+ else
+ {
+ assert (0);
+ }
+
+ return boxes.*boxptr;
+ }
+
+} // namespace CarpetIOF5
diff --git a/CarpetDev/CarpetIOF5/src/writer.cc b/CarpetDev/CarpetIOF5/src/writer.cc
index df1949369..cf00271a0 100644
--- a/CarpetDev/CarpetIOF5/src/writer.cc
+++ b/CarpetDev/CarpetIOF5/src/writer.cc
@@ -1,22 +1,29 @@
+#include <cstdlib>
#include <sstream>
+#include <string>
+
+#include <hdf5.h>
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
#include "carpet.hh"
+#include "modes.hh"
#include "data_region.hh"
#include "file.hh"
#include "meta_data_region.hh"
+#include "physical_quantity.hh"
#include "simulation.hh"
#include "tensor_component.hh"
#include "timestep.hh"
#include "topology.hh"
+#include "utils.hh"
#include "writer.hh"
-
+
namespace CarpetIOF5 {
writer_t::
@@ -33,20 +40,18 @@ namespace CarpetIOF5 {
write (F5::file_t & file)
const
{
- write_meta (file, file.get_have_metafile());
+ write_meta (file);
}
void writer_t::
- write_meta (F5::file_t & file,
- bool const have_metafile)
+ write_meta (F5::file_t & file)
const
{
DECLARE_CCTK_PARAMETERS;
- if (verbose or veryverbose)
- {
+ if (verbose or veryverbose) {
CCTK_VInfo (CCTK_THORNSTRING,
"OutputVarAs/write_meta");
}
@@ -55,24 +60,22 @@ namespace CarpetIOF5 {
if (Carpet::is_meta_mode())
{
- for (Carpet::mglevel_iterator mglevel_iter (m_cctkGH);
- not mglevel_iter.done();
- mglevel_iter.step())
+ BEGIN_MGLEVEL_LOOP (m_cctkGH)
{
- write_one_mglevel (timestep, have_metafile);
+ write_one_mglevel (timestep);
}
+ END_MGLEVEL_LOOP;
}
else
{
- write_one_mglevel (timestep, have_metafile);
+ write_one_mglevel (timestep);
}
}
void writer_t::
- write_one_mglevel (F5::timestep_t & timestep,
- bool const have_metafile)
+ write_one_mglevel (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -84,12 +87,6 @@ namespace CarpetIOF5 {
Carpet::mglevel);
}
- ostringstream namebuf;
- namebuf << "convlevel=" << m_cctkGH->cctk_convlevel;
- string const namestr = namebuf.str();
- char const * const name = namestr.c_str();
- F5::simulation_t simulation (timestep, name);
-
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
assert (grouptype >= 0);
switch (grouptype)
@@ -97,9 +94,20 @@ namespace CarpetIOF5 {
case CCTK_ARRAY:
case CCTK_SCALAR:
{
- if (Carpet::do_global_mode)
+ if (Carpet::is_global_mode())
{
- write_global (simulation, have_metafile);
+ ENTER_LEVEL_MODE (m_cctkGH, 0)
+ {
+ write_global (timestep);
+ }
+ LEAVE_LEVEL_MODE;
+ }
+ else
+ {
+ if (Carpet::do_global_mode)
+ {
+ write_global (timestep);
+ }
}
}
break;
@@ -107,16 +115,15 @@ namespace CarpetIOF5 {
{
if (Carpet::is_global_mode())
{
- for (Carpet::reflevel_iterator reflevel_iter (m_cctkGH);
- not reflevel_iter.done();
- reflevel_iter.step())
+ BEGIN_REFLEVEL_LOOP (m_cctkGH)
{
- write_one_reflevel (simulation, have_metafile);
+ write_one_reflevel (timestep);
}
+ END_REFLEVEL_LOOP;
}
else
{
- write_one_reflevel (simulation, have_metafile);
+ write_one_reflevel (timestep);
}
}
break;
@@ -128,69 +135,96 @@ namespace CarpetIOF5 {
void writer_t::
- write_global (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_global (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
if (verbose or veryverbose)
{
- CCTK_INFO ("OutputVarAs/write_global");
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_global");
}
- F5::unigrid_topology_t topology (simulation);
-
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
- assert (grouptype >= 0);
assert (grouptype == CCTK_SCALAR or grouptype == CCTK_ARRAY);
- vect<CCTK_REAL, dim> level_origin, level_delta;
- for (int d=0; d<dim; ++d)
- {
- level_origin[d] = 0.0;
- level_delta[d] = 1.0;
- }
- F5::Cartesian_coordinate_system_t coordinate_system
- (topology, level_origin, level_delta);
-
- int const group = CCTK_GroupIndexFromVarI (m_variable);
- assert (group >= 0 and group < CCTK_NumGroups());
- F5::physical_quantity_t physical_quantity (coordinate_system, group);
-
- F5::tensor_component_t tensor_component (physical_quantity, m_variable);
-
- int const map = 0;
- int const reflevel = 0;
- int const myproc = CCTK_MyProc (m_cctkGH);
- dh * const dd = Carpet::arrdata.at(group).at(map).dd;
- dh::dboxes const & boxes
- = dd->boxes.at(Carpet::mglevel).at(reflevel).at(myproc);
- bbox<int, dim> const & region = determine_region (boxes);
-
- if (have_metafile)
+ BEGIN_MAP_LOOP (m_cctkGH, grouptype)
{
- F5::meta_data_region_t meta_data_region (tensor_component, region);
- gh * const hh = Carpet::vhh.at(Carpet::map);
- int const proc = hh->processor (Carpet::reflevel, Carpet::component);
- meta_data_region.write (proc);
+
+ // Name the grid after the variable group
+ ostringstream namebuf;
+ char * const c_name = CCTK_GroupNameFromVarI (m_variable);
+ namebuf << "Cactus-" << c_name;
+ free (c_name);
+ string const name = namebuf.str();
+ F5::simulation_t simulation (timestep, name.c_str());
+
+ F5::unigrid_topology_t topology (simulation);
+
+ vect<CCTK_REAL, dim> const level_origin (0.0), level_delta (1.0);
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ int const myproc = CCTK_MyProc (m_cctkGH);
+
+ F5::file_t & file = timestep.get_file();
+ bool const write_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (write_metafile)
+ {
+
+ BEGIN_COMPONENT_LOOP (m_cctkGH, grouptype)
+ {
+ dh * const dd = Carpet::arrdata.at(group).at(Carpet::map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+ END_COMPONENT_LOOP;
+
+ }
+ else // if not write_metafile
+ {
+
+ BEGIN_LOCAL_COMPONENT_LOOP (m_cctkGH, grouptype)
+ {
+ dh * const dd = Carpet::arrdata.at(group).at(Carpet::map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+ END_LOCAL_COMPONENT_LOOP;
+
+ } // if not write_metafile
+
}
-
- F5::data_region_t data_region (tensor_component, region);
- int const timelevel = 0;
- void const * const varptr
- = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
- assert (varptr != 0);
- int const vartype = CCTK_VarTypeI (m_variable);
- assert (vartype >= 0);
- data_region.write (varptr, vartype);
+ END_MAP_LOOP;
}
void writer_t::
- write_one_reflevel (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_one_reflevel (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -203,29 +237,26 @@ namespace CarpetIOF5 {
}
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
- assert (grouptype >= 0);
assert (grouptype == CCTK_GF);
if (Carpet::is_level_mode())
{
- for (Carpet::map_iterator map_iter (m_cctkGH, grouptype);
- not map_iter.done();
- map_iter.step())
+ BEGIN_MAP_LOOP (m_cctkGH, grouptype)
{
- write_one_map (simulation, have_metafile);
+ write_one_map (timestep);
}
+ END_MAP_LOOP;
}
else
{
- write_one_map (simulation, have_metafile);
+ write_one_map (timestep);
}
}
void writer_t::
- write_one_map (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_one_map (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -236,8 +267,19 @@ namespace CarpetIOF5 {
"OutputVarAs/write_one_map map=%d", Carpet::map);
}
+ // Name the grid after the map number
+ ostringstream namebuf;
+ namebuf << "Carpet";
+ if (Carpet::maps > 1)
+ {
+ namebuf << "-map" << Carpet::map;
+ }
+ string const name = namebuf.str();
+ F5::simulation_t simulation (timestep, name.c_str());
+
F5::mesh_refinement_topology_t topology
- (simulation, Carpet::map, Carpet::reflevel, Carpet::maxreflevels,
+ (simulation,
+ Carpet::map, Carpet::maps, Carpet::reflevel, Carpet::maxreflevels,
Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
vect<CCTK_REAL, dim> level_origin, level_delta;
@@ -255,31 +297,27 @@ namespace CarpetIOF5 {
assert (group >= 0 and group < CCTK_NumGroups());
F5::physical_quantity_t physical_quantity (coordinate_system, group);
- F5::tensor_component_t tensor_component (physical_quantity, m_variable);
-
if (Carpet::is_singlemap_mode())
{
int const grouptype = CCTK_GroupTypeI (group);
assert (grouptype >= 0);
- for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
- not component_iter.done();
- component_iter.step())
+ BEGIN_COMPONENT_LOOP (m_cctkGH, grouptype)
{
- write_one_component (tensor_component, have_metafile);
+ write_one_component (physical_quantity);
}
+ END_COMPONENT_LOOP;
}
else
{
- write_one_component (tensor_component, have_metafile);
+ write_one_component (physical_quantity);
}
}
void writer_t::
- write_one_component (F5::tensor_component_t & tensor_component,
- bool const have_metafile)
+ write_one_component (F5::physical_quantity_t & physical_quantity)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -293,30 +331,37 @@ namespace CarpetIOF5 {
gh * const hh = Carpet::vhh.at(Carpet::map);
bool const is_local = hh->is_local (Carpet::reflevel, Carpet::component);
- if (have_metafile or is_local)
+
+ F5::file_t & file
+ = (physical_quantity.get_coordinate_system().get_topology()
+ .get_simulation().get_timestep().get_file());
+ bool const write_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (write_metafile or is_local)
{
dh * const dd = Carpet::vdd.at(Carpet::map);
bbox<int, dim> const & region
= (dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel)
.at(Carpet::component).exterior);
- if (have_metafile)
+ if (write_metafile)
{
- F5::meta_data_region_t meta_data_region (tensor_component, region);
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
int const proc = hh->processor (Carpet::reflevel, Carpet::component);
meta_data_region.write (proc);
}
-
- if (is_local)
+ else if (is_local)
{
- F5::data_region_t data_region (tensor_component, region);
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
int const timelevel = 0;
void const * const varptr
= CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
assert (varptr != 0);
int const vartype = CCTK_VarTypeI (m_variable);
assert (vartype >= 0);
- data_region.write (varptr, vartype);
+ tensor_component.write (varptr, vartype);
}
}
}
@@ -325,19 +370,17 @@ namespace CarpetIOF5 {
bbox<int,dim> const & writer_t::
determine_region (dh::dboxes const & boxes)
- const
{
DECLARE_CCTK_PARAMETERS;
+ // TODO: use superregions instead of regions (? only if the
+ // regions are on the same processor?)
+
bbox<int,dim> dh::dboxes::* boxptr;
if (CCTK_EQUALS (output_regions, "exterior"))
{
boxptr = & dh::dboxes::exterior;
}
- else if (CCTK_EQUALS (output_regions, "communicated"))
- {
- boxptr = & dh::dboxes::communicated;
- }
else if (CCTK_EQUALS (output_regions, "owned"))
{
boxptr = & dh::dboxes::owned;
diff --git a/CarpetDev/CarpetIOF5/src/writer.hh b/CarpetDev/CarpetIOF5/src/writer.hh
index 94b31d3cd..77bad3915 100644
--- a/CarpetDev/CarpetIOF5/src/writer.hh
+++ b/CarpetDev/CarpetIOF5/src/writer.hh
@@ -6,10 +6,11 @@
#include "bbox.hh"
#include "defs.hh"
#include "dh.hh"
+#include "vect.hh"
#include "file.hh"
+#include "physical_quantity.hh"
#include "simulation.hh"
-#include "tensor_component.hh"
#include "timestep.hh"
#include "topology.hh"
@@ -34,38 +35,33 @@ namespace CarpetIOF5 {
private:
void
- write_meta (F5::file_t & file,
- bool have_metafile)
+ write_meta (F5::file_t & file)
const;
void
- write_one_mglevel (F5::timestep_t & timestep,
- bool have_metafile)
+ write_one_mglevel (F5::timestep_t & timestep)
const;
void
- write_global (F5::simulation_t & simulation,
- bool have_metafile)
+ write_global (F5::timestep_t & timestep)
const;
void
- write_one_reflevel (F5::simulation_t & simulation,
- bool have_metafile)
+ write_one_reflevel (F5::timestep_t & timestep)
const;
void
- write_one_map (F5::simulation_t & simulation,
- bool have_metafile)
+ write_one_map (F5::timestep_t & timestep)
const;
void
- write_one_component (F5::tensor_component_t & tensor_component,
- bool have_metafile)
+ write_one_component (F5::physical_quantity_t & physical_quantity)
const;
- bbox<int,dim> const &
- determine_region (dh::dboxes const & boxes)
- const;
+
+
+ static bbox<int,dim> const &
+ determine_region (dh::dboxes const & boxes);
};
diff --git a/CarpetExtra/ReductionTest3/README b/CarpetExtra/ReductionTest3/README
new file mode 100644
index 000000000..e7b1e569c
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/README
@@ -0,0 +1,9 @@
+CVS info : $Header:$
+
+Cactus Code Thorn ReductionTest
+Thorn Author(s) : Christian D. Ott <cott@aei.mpg.de>
+Thorn Maintainer(s) : Christian D. Ott <cott@aei.mpg.de>
+--------------------------------------------------------------------------
+
+Purpose of the thorn:
+
diff --git a/CarpetExtra/ReductionTest3/doc/documentation.tex b/CarpetExtra/ReductionTest3/doc/documentation.tex
new file mode 100644
index 000000000..2a85f9ff3
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/doc/documentation.tex
@@ -0,0 +1,144 @@
+% *======================================================================*
+% Cactus Thorn template for ThornGuide documentation
+% Author: Ian Kelley
+% Date: Sun Jun 02, 2002
+% $Header: /cactusdevcvs/Cactus/doc/ThornGuide/template.tex,v 1.12 2004/01/07 20:12:39 rideout Exp $
+%
+% Thorn documentation in the latex file doc/documentation.tex
+% will be included in ThornGuides built with the Cactus make system.
+% The scripts employed by the make system automatically include
+% pages about variables, parameters and scheduling parsed from the
+% relevant thorn CCL files.
+%
+% This template contains guidelines which help to assure that your
+% documentation will be correctly added to ThornGuides. More
+% information is available in the Cactus UsersGuide.
+%
+% Guidelines:
+% - Do not change anything before the line
+% % START CACTUS THORNGUIDE",
+% except for filling in the title, author, date, etc. fields.
+% - Each of these fields should only be on ONE line.
+% - Author names should be separated with a \\ or a comma.
+% - You can define your own macros, but they must appear after
+% the START CACTUS THORNGUIDE line, and must not redefine standard
+% latex commands.
+% - To avoid name clashes with other thorns, 'labels', 'citations',
+% 'references', and 'image' names should conform to the following
+% convention:
+% ARRANGEMENT_THORN_LABEL
+% For example, an image wave.eps in the arrangement CactusWave and
+% thorn WaveToyC should be renamed to CactusWave_WaveToyC_wave.eps
+% - Graphics should only be included using the graphicx package.
+% More specifically, with the "\includegraphics" command. Do
+% not specify any graphic file extensions in your .tex file. This
+% will allow us to create a PDF version of the ThornGuide
+% via pdflatex.
+% - References should be included with the latex "\bibitem" command.
+% - Use \begin{abstract}...\end{abstract} instead of \abstract{...}
+% - Do not use \appendix, instead include any appendices you need as
+% standard sections.
+% - For the benefit of our Perl scripts, and for future extensions,
+% please use simple latex.
+%
+% *======================================================================*
+%
+% Example of including a graphic image:
+% \begin{figure}[ht]
+% \begin{center}
+% \includegraphics[width=6cm]{MyArrangement_MyThorn_MyFigure}
+% \end{center}
+% \caption{Illustration of this and that}
+% \label{MyArrangement_MyThorn_MyLabel}
+% \end{figure}
+%
+% Example of using a label:
+% \label{MyArrangement_MyThorn_MyLabel}
+%
+% Example of a citation:
+% \cite{MyArrangement_MyThorn_Author99}
+%
+% Example of including a reference
+% \bibitem{MyArrangement_MyThorn_Author99}
+% {J. Author, {\em The Title of the Book, Journal, or periodical}, 1 (1999),
+% 1--16. {\tt http://www.nowhere.com/}}
+%
+% *======================================================================*
+
+% If you are using CVS use this line to give version information
+% $Header: /cactusdevcvs/Cactus/doc/ThornGuide/template.tex,v 1.12 2004/01/07 20:12:39 rideout Exp $
+
+\documentclass{article}
+
+% Use the Cactus ThornGuide style file
+% (Automatically used from Cactus distribution, if you have a
+% thorn without the Cactus Flesh download this from the Cactus
+% homepage at www.cactuscode.org)
+\usepackage{../../../../doc/latex/cactus}
+
+\begin{document}
+
+% The author of the documentation
+\author{Christian D. Ott \textless cott@aei.mpg.de\textgreater}
+
+% The title of the document (not necessarily the name of the Thorn)
+\title{ReductionTest}
+
+% the date your document was last changed, if your document is in CVS,
+% please use:
+% \date{$ $Date: 2004/01/07 20:12:39 $ $}
+\date{April 18 2006}
+
+\maketitle
+
+% Do not delete next line
+% START CACTUS THORNGUIDE
+
+% Add all definitions used in this documentation here
+% \def\mydef etc
+
+% Add an abstract for this thorn's documentation
+\begin{abstract}
+
+\end{abstract}
+
+% The following sections are suggestive only.
+% Remove them or add your own.
+
+\section{Introduction}
+
+\section{Physical System}
+
+\section{Numerical Implementation}
+
+\section{Using This Thorn}
+
+\subsection{Obtaining This Thorn}
+
+\subsection{Basic Usage}
+
+\subsection{Special Behaviour}
+
+\subsection{Interaction With Other Thorns}
+
+\subsection{Examples}
+
+\subsection{Support and Feedback}
+
+\section{History}
+
+\subsection{Thorn Source Code}
+
+\subsection{Thorn Documentation}
+
+\subsection{Acknowledgements}
+
+
+\begin{thebibliography}{9}
+
+\end{thebibliography}
+
+% Do not delete next line
+% END CACTUS THORNGUIDE
+
+\end{document}
diff --git a/CarpetExtra/ReductionTest3/interface.ccl b/CarpetExtra/ReductionTest3/interface.ccl
new file mode 100644
index 000000000..46ce46253
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/interface.ccl
@@ -0,0 +1,20 @@
+# Interface definition for thorn ReductionTest
+# $Header:$
+
+implements: ReductionTest3
+inherits: grid
+
+CCTK_REAL myredvar TYPE=GF TIMELEVELS=3 tags='ProlongationParameter="Whisky::Whisky_Prolongation_Type" tensortypealias="Scalar" tensorweight=+1.0 interpolator="matter"'
+
+CCTK_REAL center_of_mass_helpers TYPE=GF TIMELEVELS=3 tags='prolongation="none"'
+{
+
+ dMx,dMy,dMz
+}
+
+CCTK_REAL center_of_mass TYPE=SCALAR
+{
+
+ Mx,My,Mz,Mr
+}
+
diff --git a/CarpetExtra/ReductionTest3/par/reductiontest.par b/CarpetExtra/ReductionTest3/par/reductiontest.par
new file mode 100644
index 000000000..4b3eb6155
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/par/reductiontest.par
@@ -0,0 +1,186 @@
+#--- Base and Driver Thorns
+
+ActiveThorns = "time
+ coordbase
+ mol
+ boundary
+ spacemask
+ symbase
+ aeilocalinterp
+ nanchecker
+ constants
+ ioutil
+ initbase
+ carpet
+ carpetlib
+ carpetregrid2
+ carpetreduce
+ carpetinterp
+ loopcontrol
+ cartgrid3d
+ carpetslab
+ triggerterminationmanual
+ RotatingSymmetry90
+ ReflectionSymmetry
+ Slab
+ "
+
+#--- Output related thorns
+
+ActiveThorns = " carpetioascii
+ carpetioscalar
+ carpetiohdf5
+ carpetiobasic
+ "
+
+#--- Spacetime :-)
+
+
+ActiveThorns = "
+ ReductionTest3
+ "
+
+############################# Flesh Stuff ##################################
+Cactus::cctk_run_title = "Reduction Test"
+Cactus::cctk_full_warnings = yes
+Cactus::highlight_warning_messages = no
+#Cactus::cctk_timer_output = "full"
+Cactus::cctk_itlast = 64
+
+############################# Output Related ##################################
+IO::out_dir = $par
+IO::checkpoint_dir = $par
+IO::recover_dir = $par
+iohdf5::out_dir = $par
+IO::out_single_precision = yes
+
+#--- checkpoint recovery
+io::recover = no
+iohdf5::checkpoint = no
+io::checkpoint_every = 32
+io::checkpoint_keep = 3
+carpetiohdf5::use_reflevels_from_checkpoint = "yes"
+
+IOBasic::outInfo_vars = "Carpet::average_physical_time_per_hour"
+
+carpetioscalar::outScalar_vars = "
+ "
+carpetioascii::out0D_vars = "
+ "
+
+
+carpetioascii::out1D_vars = "
+ "
+
+iohdf5::out_vars = "
+ "
+
+#--- output frequency
+
+iohdf5::out_criterion = "divisor"
+carpetioascii::out1D_criterion = "divisor"
+carpetioascii::out2D_criterion = "divisor"
+
+carpetioascii::out0D_criterion = "divisor"
+carpetioscalar::outScalar_criterion = "divisor"
+
+#carpetioscalar::outScalar_dt = 0.203
+#carpetioscalar::out0D_dt = 0.203
+#IOASCII::out1D_dt =
+#IOASCII::out2D_dt = -1
+
+carpetioscalar::outScalar_every = 32
+carpetioascii::out0D_every = 32
+carpetioascii::out1D_every = 256
+carpetioascii::out2D_every = -1
+iohdf5::out_every = -1
+
+carpetiobasic::outInfo_every = 1
+carpetiobasic::real_min = 1.0e-2
+
+IOASCII::one_file_per_group = yes
+IOASCII::output_symmetry_points = no
+IOASCII::out1D_d = no
+############################# Driver ##################################
+# Carpet Parameters
+Carpet::domain_from_coordbase = yes
+Carpet::max_refinement_levels = 2
+
+driver::ghost_size = 3
+Carpet::use_buffer_zones = yes
+
+Carpet::prolongation_order_space = 3
+Carpet::prolongation_order_time = 2
+
+Carpet::init_fill_timelevels = yes
+
+Carpet::verbose = no
+Carpet::veryverbose = no
+
+Carpet::output_timers_every = 4096
+CarpetLib::print_timestats_every = 4096
+CarpetLib::print_memstats_every = 4096
+
+############################# Grid ##################################
+
+CoordBase::domainsize = "minmax"
+CoordBase::xmin = 0.0
+CoordBase::ymin = 0.0
+CoordBase::zmin = 0.0
+CoordBase::xmax = 40.0
+CoordBase::ymax = 40.0
+CoordBase::zmax = 40.0
+
+CoordBase::spacing = "gridspacing"
+CoordBase::dx = 1.0
+CoordBase::dy = 1.0
+CoordBase::dz = 1.0
+
+CartGrid3D::type = "coordbase"
+CartGrid3D::domain = "full"
+CartGrid3D::avoid_originx = no
+CartGrid3D::avoid_originy = no
+CartGrid3D::avoid_originz = no
+
+CoordBase::boundary_size_x_lower = 3
+CoordBase::boundary_size_y_lower = 3
+CoordBase::boundary_size_z_lower = 3
+CoordBase::boundary_shiftout_x_lower = 1
+CoordBase::boundary_shiftout_y_lower = 1
+CoordBase::boundary_shiftout_z_lower = 1
+
+ReflectionSymmetry::reflection_z = yes
+ReflectionSymmetry::avoid_origin_z = no
+
+#CoordBase::boundary_size_x_upper = 3
+#CoordBase::boundary_size_y_upper = 3
+#CoordBase::boundary_size_z_upper = 3
+
+CarpetRegrid2::min_distance = 0
+CarpetRegrid2::boundary_shiftout = -10
+CarpetRegrid2::ensure_proper_nesting = yes
+
+CarpetRegrid2::num_centres = 1
+CarpetRegrid2::num_levels_1 = 1
+CarpetRegrid2::position_x_1 = 0
+CarpetRegrid2::position_y_1 = 0
+CarpetRegrid2::position_z_1 = 0
+CarpetRegrid2::radius_1[1] = 20.0 # 1.6
+#CarpetRegrid2::radius_1[2] = 40.0 # 0.8
+#CarpetRegrid2::radius_1[3] = 20.0 # 0.4
+#CarpetRegrid2::radius_1[4] = 12.0 # 0.2
+
+CarpetRegrid2::regrid_every = 16
+CarpetRegrid2::movement_threshold_1 = 0.0e0
+CarpetRegrid2::radius_change_threshold_1 = 0.0e0
+
+############################# Time Integration ##################################
+# Time integration parameters
+MoL::ODE_Method = "RK3"
+MoL::Generic_Type = "RK"
+MoL::MoL_Intermediate_Steps = 3
+MoL::MoL_Num_Scratch_Levels = 2
+
+Time::dtfac = 0.25
+
+############################ Analysis ###############################
diff --git a/CarpetExtra/ReductionTest3/param.ccl b/CarpetExtra/ReductionTest3/param.ccl
new file mode 100644
index 000000000..160649261
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/param.ccl
@@ -0,0 +1,11 @@
+# Parameter definitions for thorn ReductionTest
+# $Header:$
+
+shares: grid
+
+USES KEYWORD domain
+
+
+
+
+
diff --git a/CarpetExtra/ReductionTest3/schedule.ccl b/CarpetExtra/ReductionTest3/schedule.ccl
new file mode 100644
index 000000000..92a70fce8
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/schedule.ccl
@@ -0,0 +1,49 @@
+# Schedule definitions for thorn ReductionTest
+# $Header:$
+
+STORAGE: center_of_mass center_of_mass_helpers[3] myredvar[3]
+
+SCHEDULE CoM3_Local AT CCTK_INITIAL AFTER Whisky_Initial
+{
+
+ LANG: C
+ SYNC: center_of_mass_helpers
+} "Setup integrands for CoM calculation"
+
+SCHEDULE CoM3_Local AT CCTK_EVOL AFTER MoL_Evolution
+{
+
+ LANG: C
+ SYNC: center_of_mass_helpers
+} "Setup integrands for CoM calculation"
+
+SCHEDULE CoM3_Local AT Postregridinitial
+{
+
+ LANG: C
+ SYNC: center_of_mass_helpers
+} "Setup integrands for CoM calculation"
+
+SCHEDULE CoM3_Local AT Postregrid
+{
+
+ LANG: C
+ SYNC: center_of_mass_helpers
+} "Setup integrands for CoM calculation"
+
+
+
+SCHEDULE CoM3 AT CCTK_ANALYSIS
+{
+
+ LANG: C
+ OPTIONS: GLOBAL
+} "CoM Reductions"
+
+
+#SCHEDULE CoM3 AT Postregrid AFTER CoM3_Local
+#{
+#
+# LANG: C
+# OPTIONS: GLOBAL
+#} "CoM Reductions"
diff --git a/CarpetExtra/ReductionTest3/src/CoM.c b/CarpetExtra/ReductionTest3/src/CoM.c
new file mode 100644
index 000000000..2347e3e9a
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/src/CoM.c
@@ -0,0 +1,99 @@
+#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "cctk_Arguments.h"
+#include "util_Table.h"
+#include <assert.h>
+#include <math.h>
+
+void CoM3_Local(CCTK_ARGUMENTS)
+{
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ int i,j,k,index;
+
+ int nx = cctk_lsh[0];
+ int ny = cctk_lsh[1];
+ int nz = cctk_lsh[2];
+
+ for (k=0;k<nz;k++)
+ for (j=0;j<ny;j++)
+ for (i=0;i<nx;i++) {
+
+ index = CCTK_GFINDEX3D(cctkGH,i,j,k);
+
+ dMx[index] = myredvar[index]*x[index];
+ dMy[index] = myredvar[index]*y[index];
+ dMz[index] = myredvar[index]*z[index];
+
+ }
+}
+
+
+void CoM3(CCTK_ARGUMENTS)
+{
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+
+ int varindex = -1;
+ int ierr = 0;
+ int cf = 1.0;
+ int reduction_handle;
+ int vartype;
+
+ CCTK_REAL d3x,tiny,denstotal;
+
+ CCTK_REAL sym_factor1,sym_factor2,sym_factor3;
+
+ if (CCTK_EQUALS(domain,"bitant")){
+ sym_factor1 = 2.0e0;
+ sym_factor2 = 2.0e0;
+ sym_factor3 = 0.0e0;
+ } else if (CCTK_EQUALS(domain,"octant")){
+ sym_factor1 = 8.0e0;
+ sym_factor2 = 0.0e0;
+ sym_factor3 = 0.0e0;
+ } else {
+ sym_factor1 = 1.0e0;
+ sym_factor2 = 1.0e0;
+ sym_factor3 = 1.0e0;
+ }
+
+
+ reduction_handle = CCTK_ReductionHandle("sum");
+
+
+ varindex = CCTK_VarIndex("ReductionTest3::myredvar");
+ assert(varindex>=0);
+ ierr = CCTK_Reduce(cctkGH, -1, reduction_handle,
+ 1, CCTK_VARIABLE_REAL, (void *)&denstotal, 1, varindex);
+ assert(!ierr);
+
+ varindex = CCTK_VarIndex("ReductionTest3::dMx");
+ assert(varindex>=0);
+ ierr = CCTK_Reduce(cctkGH, -1, reduction_handle,
+ 1, CCTK_VARIABLE_REAL, (void *)Mx, 1, varindex);
+ assert(!ierr);
+
+ varindex = CCTK_VarIndex("ReductionTest3::dMy");
+ assert(varindex>=0);
+ ierr = CCTK_Reduce(cctkGH, -1, reduction_handle,
+ 1, CCTK_VARIABLE_REAL, (void *)My, 1, varindex);
+ assert(!ierr);
+
+ varindex = CCTK_VarIndex("ReductionTest3::dMz");
+ assert(varindex>=0);
+ ierr = CCTK_Reduce(cctkGH, -1, reduction_handle,
+ 1, CCTK_VARIABLE_REAL, (void *)Mz, 1, varindex);
+ assert(!ierr);
+
+ denstotal = sym_factor1*denstotal;
+ *Mx = sym_factor2*(*Mx)/(denstotal);
+ *My = sym_factor2*(*My)/(denstotal);
+ *Mz = sym_factor3*(*Mz)/(denstotal);
+ *Mr = sqrt( (*Mx)*(*Mx)+(*My)*(*My)+(*Mz)*(*Mz) );
+
+ CCTK_VInfo(CCTK_THORNSTRING,"Mr: %15.6E Mx: %15.6E My: %15.6E Mz %15.6E",*Mr,*Mx,*My,*Mz);
+}
+
diff --git a/CarpetExtra/ReductionTest3/src/make.code.defn b/CarpetExtra/ReductionTest3/src/make.code.defn
new file mode 100644
index 000000000..6f1f90aa2
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/src/make.code.defn
@@ -0,0 +1,8 @@
+# Main make.code.defn file for thorn ReductionTest
+# $Header:$
+
+# Source files in this directory
+SRCS = CoM.c
+
+# Subdirectories containing source files
+SUBDIRS =
diff --git a/CarpetExtra/ReductionTest3/test/reductiontest.par b/CarpetExtra/ReductionTest3/test/reductiontest.par
new file mode 100644
index 000000000..85a483338
--- /dev/null
+++ b/CarpetExtra/ReductionTest3/test/reductiontest.par
@@ -0,0 +1,210 @@
+
+#--- Base and Driver Thorns
+
+ActiveThorns = " time
+ carpet
+ carpetlib
+ carpetregrid
+ carpetreduce
+ carpetslab
+ cartgrid3d
+ coordbase
+ mol
+ boundary
+ spacemask
+ carpetiobasic
+ carpetioscalar
+ carpetioascii
+ ioutil
+ symbase
+ aeilocalinterp
+ carpetinterp
+ "
+
+#--- Spacetime :-)
+
+ActiveThorns = " admbase
+ staticconformal
+ admconstraints
+ admcoupling
+ coordgauge
+ admmacros
+ bssn_mol
+ "
+
+#--- Hydrodynamics
+
+ActiveThorns = " whisky
+ whisky_init_data
+ whisky_rnsid
+ eos_base
+ eos_polytrope
+ reductiontest
+ "
+
+
+
+################## Output Related Stuff ##################################
+
+IOBasic::outInfo_vars = "whisky::rho admbase::alp"
+iobasic::outInfo_every = 1
+
+IOScalar::outScalar_vars = "whisky::rho admbase::alp"
+ioscalar::outScalar_every = 1
+
+IOASCII::out1D_vars = "whisky::rho admbase::alp"
+ioascii::out1D_every = 1
+
+
+#--- general
+
+
+#--- output directories
+IO::out_dir = $parfile
+
+#--- checkpoint recovery
+io::recover = "no"
+
+
+#--- output frequency
+
+io::out_single_precision = "yes"
+
+
+
+############################# DRIVER #####################################
+
+#--- Benchmarking
+
+carpet::constant_load_per_processor = "yes"
+
+#--- performance & infrastructure
+
+carpetlib::use_collective_communication_buffers = "yes"
+carpet::enable_all_storage = "no"
+CarpetLib::save_memory_during_regridding = "yes"
+
+#--- Carpet prolongation order settings
+
+Carpet::prolongation_order_space = 3
+Carpet::prolongation_order_time = 2
+
+
+#--- Carpet initial data setup parameters
+
+Carpet::init_3_timelevels = "yes"
+Carpet::init_each_timelevel = "no"
+
+
+#--- Grid Setup and carpet parameters
+
+
+carpet::buffer_width = 6
+
+driver::ghost_size = 3
+
+cartgrid3d::type = "box"
+cartgrid3d::domain = "full"
+cartgrid3d::avoid_origin = "no"
+
+cartgrid3d::dxyz = 1.0
+driver::global_nx = 30
+driver::global_ny = 30
+driver::global_nz = 30
+
+cactus::cctk_itlast = 128
+
+Carpet::domain_from_coordbase = "no"
+
+carpet::max_refinement_levels = 3
+carpetregrid::refinement_levels = 1
+
+carpetregrid::regrid_every = 16
+carpetregrid::num_new_levels = 1
+carpetregrid::activate_levels_on_regrid = "fixed"
+
+carpet::veryverbose = "no"
+carpet::verbose = "no"
+
+
+################## Spacetime Related Stuff #############################
+
+
+admbase::evolution_method = "adm_bssn"
+admbase::lapse_evolution_method = "1+log"
+admbase::shift_evolution_method = "static"
+
+boundary::radpower = 2
+
+admconstraints::bound = "static"
+
+bssn_mol::timelevels = 3
+
+
+######################## Hydro Related Stuff ###########################
+
+
+whisky::timelevels = 3
+
+whisky::whisky_rho_central = 1.61930347e-08
+whisky::riemann_solver = "Marquina"
+whisky::whisky_eos_type = "Polytype"
+whisky::whisky_eos_table = "2D_Polytrope"
+whisky::recon_method = "ppm"
+whisky::ppm_detect = "yes"
+whisky::whisky_stencil = 3
+whisky::bound = "none"
+
+whisky::EoS_Change = "no"
+EOS_Polytrope::eos_gamma = 2.0
+EOS_Polytrope::eos_k = 1.0
+EOS_Polytrope::use_cgs = "yes"
+EOS_Polytrope::gamma_ini = 2.0
+
+#------ Atmosphere treatment
+
+SpaceMask::use_mask = yes
+
+whisky::rho_rel_min = 1.e-5
+
+#------ Atmosphere only for
+whisky::initial_atmosphere_factor = 0.99
+
+
+
+####################### Initial Data #####################################
+
+
+admbase::initial_data = "rnsid"
+admbase::initial_lapse = "rnsid"
+admbase::initial_shift = "rnsid"
+admbase::metric_type = "physical"
+
+rnsid::axes_ratio = 1.0
+rnsid::accuracy = 1e-7
+
+rnsid::RNS_Gamma = 2.0
+rnsid::RNS_K = 100.0
+
+rnsid::recover_2Dmodel = "no"
+rnsid::save_2Dmodel = "no"
+
+#rnsid::mdiv = 151
+#rnsid::sdiv = 301
+
+
+
+
+##################### Infrastructure Related Stuff ########################
+
+#--- Time integration
+
+mol::ode_method = "icn"
+MoL::Generic_Type = "RK"
+MoL::MoL_Intermediate_Steps = 3
+time::dtfac = 0.375
+
+
+
+#---- Timer output
+cactus::cctk_timer_output = "FULL"
diff --git a/test-carpet b/test-carpet
index 079f1b33b..079f1b33b 100755..100644
--- a/test-carpet
+++ b/test-carpet