aboutsummaryrefslogtreecommitdiff
path: root/Carpet/Carpet/doc/threelev_initdata.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/Carpet/doc/threelev_initdata.tex')
-rw-r--r--Carpet/Carpet/doc/threelev_initdata.tex107
1 files changed, 107 insertions, 0 deletions
diff --git a/Carpet/Carpet/doc/threelev_initdata.tex b/Carpet/Carpet/doc/threelev_initdata.tex
new file mode 100644
index 000000000..db59176b1
--- /dev/null
+++ b/Carpet/Carpet/doc/threelev_initdata.tex
@@ -0,0 +1,107 @@
+\documentclass{article}
+
+\usepackage{epsf}
+\topmargin -0.5in
+\textheight 9.9in
+\oddsidemargin -0.3in
+\leftmargin -1in
+\textwidth 7in
+
+
+\begin{document}
+
+\title{Getting Three Timelevels of FMR Initial Data}
+\author{Scott Hawley}
+\date{June 6, 2002}
+\maketitle
+
+For parabolic interpolation in time, one needs three timelevels worth
+of data on the coarse grid in order to provide boundary data on the
+finer grid. Here we describe one scheme for obtaining these extra
+timelevels of data at the initial time. Essentially, we evolve
+each grid backwards in time by two steps, but we do so rather carefully.
+
+The following diagram shows the scheme. We start with initial
+data for all grids being specified at the current time (Step 1, not
+shown). We then evolve the coarse grid forward one step (Step 2) by
+the timestep $\Delta t$;
+in so doing we first move the coarse grid storage from the current
+timelevel (denoted by `` '' on the right of the first pane in the
+diagram, because variables at the current time receive no suffix
+in Cactus) to the previous timelevel (denoted by ``\_p'') before
+evolving. We then ``flip'' all the timelevels for the coarse grid (l=0),
+meaning
+that we exchange the data on the `` '' and \_p\_p timelevels,
+thus turning the picture upside down.
+We then evolve the coarse grid ``backward'' --- which is really
+just forward but with a timestep of $-\Delta t$. Then we move on
+to the finer grid, evolving and flipping...
+
+Take a look at the diagram. (We use $\tau$ instead of $t$ to denote
+the time, simply because it was easier to do that in the
+drawing program.) After the diagram we give a
+listing of pseudo-code which implements this scheme.
+\begin{center}
+ \epsfxsize=5.5in
+ \epsffile{threelev_initdata.eps}
+\end{center}
+
+\begin{center}
+ \epsfxsize=5.5in
+ \epsffile{threelev_initdata_2.eps}
+\end{center}
+
+Diagram finished.
+
+\pagebreak
+
+Here's some pseudo-code:
+\begin{verbatim}
+
+ int time_dir = 1; //Positive = forward (+t), Negative = backward (-t)
+ int lev;
+
+ // At this point we assume that we have initial data given on
+ // one timelevel, and we want to get data on the other timelevels
+
+ do lev = 0 to MaxLevels-1
+ // Evolve "forward" (which may be backward for lev=1,3,5,7...)
+ Evolve(lev, time_dir*dt(lev))
+
+ flip_timelevels_on_lev_and_coarser(lev)
+ // Keep track of which direction (in time) we're integrating
+ time_dir = -time_dir
+
+ // Evolve in the opposite time-direction
+ Evolve(lev, time_dir*dt(lev))
+ end do
+
+ // Make sure we're pointed backwards, in order to get 2 "previous"
+ // timelevels. We could change the if statement to
+ // "if (mod(MaxLevels,2) == 0)", but I prefer to check time_dir
+ // explicitly, because it's easier to follow and I don't have to
+ // worry about having made a mistake
+ if (time_dir > 0) then
+ flip_timelevels_on_lev_and_coarser(MaxLevels-1)
+ time_dir = -time_dir
+ end if
+
+ // Evolve each level backwards one more timestep
+ do lev = MaxLevels-1 to 0
+ Evolve(lev,-dt(lev))
+ if (lev>0) then
+ Restrict(lev -> lev-1)
+ end if
+ end do
+
+ // Here's where a user can add in extra evolution code if they want
+ // to be extra-careful ("anal"), but remember that you'll be
+ // overwriting the t=0 data so you'll need to re-load it if you do
+ // this.
+
+ // Finally, one last flip to point us forward again
+ flip_all_timelevels()
+ time_dir = -time_dir
+\end{verbatim}
+
+\end{document}