User: rhaas Date: 2013/07/26 08:04 AM
Modified: /et_intro_details/ et_intro_details.tex
Log: add wavetoy example
File Changes:
Directory: /et_intro_details/ =============================
File [modified]: et_intro_details.tex Delta lines: +684 -7 =================================================================== --- et_intro_details/et_intro_details.tex 2013-07-26 13:04:35 UTC (rev 14) +++ et_intro_details/et_intro_details.tex 2013-07-26 13:04:44 UTC (rev 15) @@ -153,7 +153,9 @@
\begin{itemize} \item $\sim 100$ thorns used for simulation -\item Thorns come from a variety of sources: \texttt{git}, \texttt{svn}, \texttt{cvs}, \texttt{darcs}, \ldots +\item Thorns come from a variety of sources: core Cactus thorns, ET thorns, + AEIthorns, LSUThorn, Carpet, github.com, bitbucket.org +\item Thorns come in a variety of formats: \texttt{git}, \texttt{svn}, \texttt{cvs}, \texttt{darcs}, \ldots \item Multiple access levels: publicly available, password required \item Multiple thorns per repository? Separate documentation? Example files? \item Specific code version, release date @@ -175,15 +177,16 @@ \end{frame}
\begin{frame}[containsverbatim] \frametitle{GetComponents -- how?} -\scriptsize\begin{alltt} -!CRL_VERSION = 1.0 +\scriptsize% +\begin{alltt} +!CRL_VERSION = 1.0
!DEFINE ROOT = Cactus !DEFINE ARR = $ROOT/arrangements
!TARGET = $ROOT !TYPE = svn -!AUTH_URL = https://svn.cactuscode.org/flesh/trunk +!AUTH_URL = https://svn.cactuscode.org/flesh/trunk !CHECKOUT = Cactus !NAME = .
@@ -201,20 +204,694 @@ The Simulation Factory: \begin{columns} \column{0.25\textwidth} - \includegraphics[width=\textwidth]{pics/factory.png} + \includegraphics[width=\textwidth]{factory.png} \column{0.75\textwidth} \begin{itemize} \item Command-line tools for setting up Cactus distribution and managing simulations on a variety of supercomputers, - including most of the TeraGrid machines. + including most of the \texttt{XSEDE} machines. \end{itemize} \end{columns} \begin{itemize} \item Captures the best practices of experienced users, ensuring repeatable and well-documented scientific results. \item Developed by Erik Schnetter and Michael Thomas. - \item Included in Cactus-OS distro: {\tt Cactus/simfactory}. + \item Included in virtual machine: {\tt Cactus/simfactory}. \item For more, see: {\tt http://simfactory.org%7D \end{itemize} + More on \texttt{Simfactory} in the hands-on session. \end{frame} + +\begin{frame} \frametitle{Example: solving scalar wave equation} + For a given source function $S(x,y,t)$ find a scalar wave + field $\varphi(x,y,t)$ inside the domain $\mathcal{D}$ + with a boundary condition: + \begin{columns}[t] + \column{.3\textwidth} + \begin{figure}[!htp] + \begin{center} + \begin{tikzpicture}[rotate=5,scale=1.2] + \filldraw[fill=green!60!white, draw=green!50!black, thick] + (-1,-1) rectangle (1,1); + \draw (0,0) node {{\large $\mathcal{D}$}}; + \draw (1.4,0.2) node {$\partial\mathcal{D}$}; + \draw[->,thick,color=red] (1.1,0.2) -- (1,0.2); + \end{tikzpicture} + \end{center} + \end{figure} + + \column{.6\textwidth} + \begin{itemize} + \item inside $\mathcal{D}$: + \begin{equation*} + \frac{\partial^2\varphi}{\partial t^2} = c^2\Delta\varphi + S + \end{equation*} + \item on the boundary $\partial\mathcal{D}$: + \begin{equation*} + \varphi_{|\partial\mathcal{D}} = 0 + \end{equation*} + \end{itemize} + \end{columns} +\end{frame} + +\frame{ \frametitle{WaveToy Thorn: Discretization} + Discretization: \ + approximating continuous function $\varphi(x,y,t)$ + with a grid function $\varphi^{(n)}_{i,j}$: + \begin{columns}[t] + \column{.2\textwidth} + \begin{figure}[!htp] + \begin{center} + \begin{tikzpicture}[scale=1.1] + \draw (-1,0) -- (1,0); + \draw (-1,1) -- (1,1); + \draw (-1,-1) -- (1,-1); + \scope[fill=green!50!blue, draw=black] + \filldraw (0,0) circle (0.07cm); + \filldraw (1,0) circle (0.07cm); + \filldraw (-1,0) circle (0.07cm); + \filldraw (0,1) circle (0.07cm); + \filldraw (1,1) circle (0.07cm); + \filldraw (-1,1) circle (0.07cm); + \filldraw (0,-1) circle (0.07cm); + \filldraw (1,-1) circle (0.07cm); + \filldraw (-1,-1) circle (0.07cm); + \endscope + \scope[xshift=0.45cm,yshift=0.25cm] + \draw (0,0) node {{\tiny $\varphi^{(n)}_{i}$}}; + \draw (1,0) node {{\tiny $\varphi^{(n)}_{i+1}$}}; + \draw (-1,0) node {{\tiny $\varphi^{(n)}_{i}$}}; + \draw (0,1) node {{\tiny $\varphi^{(n+1)}_{i}$}}; + \draw (1,1) node {{\tiny $\varphi^{(n+1)}_{i+1}$}}; + \draw (-1,1) node {{\tiny $\varphi^{(n+1)}_{i}$}}; + \draw (0,-1) node {{\tiny $\varphi^{(n+1)}_{i}$}}; + \draw (1,-1) node {{\tiny $\varphi^{(n+1)}_{i+1}$}}; + \draw (-1,-1) node {{\tiny $\varphi^{(n+1)}_{i}$}}; + \endscope + \end{tikzpicture} + \end{center} + \end{figure} + + \column{.8\textwidth} + \begin{gather*} + \ + \frac{\partial^2\varphi}{\partial t^2} = + c^2 (\partial_x^2\varphi + \partial_y^2\varphi) + + S \ + \Downarrow (c\equiv1)\ + \begin{aligned} + %\text{\makebox[0pt][l]{\framebox{\parbox{4cm}{Semi-descretization for Method of Lines}}}} + \frac{\partial \phi_{i,j}}{\partial t} = & \psi_{i,j} \ + \frac{\partial \psi_{i,j}}{\partial t} = & + \frac{\varphi_{i+1,j} - 2\varphi_{i,j}+\varphi_{i-1,j}} + {2\Delta x^2} + \ + & \frac{\varphi_{i,j+1} - 2\varphi_{i,j}+\varphi_{i,j-1}} + {2\Delta y^2} + S_{i,j} + \end{aligned} + \end{gather*} + \end{columns} +} + +\frame{ \frametitle{WaveToyMoL Thorn} + Thorn structure: + + \begin{columns}[t] + \column{.4\textwidth} + \begin{exampleblock}{interface.ccl} + \begin{itemize} + \item grid function {\color{blue}phi[3]}: + \end{itemize} + \begin{figure}[!htp] + \begin{center} + \begin{tikzpicture} + \scope[fill=white!90!green, draw=black] + \filldraw (-1.5,-1) -- (0.5,-1) -- (1.5,-0.2) -- (-0.5,-0.2) -- cycle; + \filldraw (-1.5,-0.4) -- (0.5,-0.4) -- (1.5,0.4) -- (-0.5,0.4) -- cycle; + \filldraw (-1.5,0.2) -- (0.5,0.2) -- (1.5,1) -- (-0.5,1) -- cycle; + \endscope + \scope[fill=green!50!blue, draw=black, dashed, very thin] + \draw (-0.6,0) -- (0.6,0); + \draw (0,-0.6) -- (0,0.6); + \draw (-0.35,-0.3) -- (0.35,0.3); + \filldraw (0,0) circle (0.07cm); + \filldraw (0.6,0) circle (0.07cm); + \filldraw (0,0.6) circle (0.07cm); + \filldraw (-0.6,0) circle (0.07cm); + \filldraw (0,-0.6) circle (0.07cm); + \filldraw (-0.35,-0.3) circle (0.07cm); + \filldraw (0.35,0.3) circle (0.07cm); + \endscope + \scope[left=2pt,yshift=0.2cm] + \draw (-1.5,-1) node {\color{blue}phi_p_p}; + \draw (-1.5,-0.4) node {\color{blue}phi_p}; + \draw (-1.5, 0.2) node {\color{blue}phi}; + \endscope + \scope[xshift=0.6cm,yshift=0.2cm] + \draw (-1.5,-1) node {{\tiny $\varphi^{(n-2)}$}}; + \draw (-1.5,-0.4) node {{\tiny $\varphi^{(n-1)}$}}; + \draw (-1.5, 0.2) node {{\tiny $\varphi^{(n)}$}}; + \endscope + %\includegraphics[height=0.3\textheight]{time_levels} + \end{tikzpicture} + \end{center} + \end{figure} + \begin{itemize} + \item {\small Boundary_SelectVarForBC} + \end{itemize} + \end{exampleblock} + + \column{.4\textwidth} + \begin{exampleblock}{param.ccl} + \begin{itemize} + \item Parameters of initial Gaussian pulse: + amplitude {\color{brown}$A$}, + radius {\color{brown}$R$}, + width {\color{brown}$\sigma$} + \end{itemize} + \end{exampleblock} + + \begin{exampleblock}{schedule.ccl} + \begin{itemize} + \item WaveToy_InitialData + \item WaveToy_Evolution + \item WaveToy_Boundaries + \end{itemize} + \end{exampleblock} + \end{columns} +} + +% \frame{ \frametitle{WaveToy Thorn} +% \begin{itemize} +% \item Choose initial values $\Phi_{i,j,k,0}$; +% \item Loop: +% \begin{itemize} +% \item Calculate field at current time based on discretized wave equation +% \item On boundary points, where derivatives may not be present, apply chosen +% boundary conditions +% \end{itemize} +% \end{itemize} +% } + +\frame{ \frametitle{WaveToy Thorn: Algorithm Illustration} + \begin{columns}[t] + \column{.7\textwidth} + \begin{figure}[!htp] + \begin{center} + \begin{tikzpicture} + + %\draw[->] (0,0) -- (1,1); + % Step 1: axes and grid + \draw[->,very thin] (-.6,-.4) -- (6,-.4); + \draw[->,very thin] (-.4,-.6) -- (-.4,3); + \draw[left=2pt] (-.4,2.5) node {$t$}; + \draw[above=2pt] (5.8,-0.4) node {$x$}; + + \uncover<1>{ + \draw[xstep=.6cm,ystep=.4cm,gray,dashed] + (0,0) grid(5.4cm,2.6cm); + }% + + % Step 2: splitting between two processors + \uncover<2->{ + \draw (0,2.8) -- (.6,3.2) -- (2.4,3.2) -- (3,2.8); + \draw[above=1pt] (1.4,3.2) node {\emph{PROC0}}; + + \draw[xshift=2.4cm] (0,2.8) -- (.6,3.2) -- (2.4,3.2) -- (3,2.8); + \draw[above=1pt] (3.8,3.2) node {\emph{PROC1}}; + }% + \uncover<2-4>{ + \draw[xstep=.6cm,ystep=.4cm,gray,dashed] + (0,0) grid (3.0cm,2.6cm); + \draw[xstep=.6cm,ystep=.4cm,gray,dashed,xshift=0.05cm,yshift=0.05cm] + (2.4,0) grid (5.4cm,2.6cm); + }% + + % Step 3: memory "allocations" + \uncover<3>{ + \draw[color=blue] (1.5,-0.6) node {\tiny x, phi, phi_p, phi_p_p}; + \draw[color=blue] (4.2,-0.6) node {\tiny x, phi, phi_p, phi_p_p}; + }% + + % Step 4: CoordBase / CartGrid3D + \uncover<4->{ + \foreach \x in {0.0,0.6,1.2,1.8,2.4,3.0,3.6,4.2,4.8,5.4} + \draw (\x cm,-0.4cm) node[anchor=south] {{\tiny $\x$}}; + \draw[very thick,color=brown,xstep=0.6cm,ystep=1cm,yshift=-0.4cm] + (0cm,-1pt) grid (3.0cm,1pt); + \draw[color=blue] (1.5,-0.6) node {\small x}; + + \draw[very thick,color=brown,xstep=0.6cm,ystep=1cm,xshift=2.45cm,yshift=-0.35cm] + (0cm,-1pt) grid (3.0cm,1pt); + \draw[color=blue] (4.2,-0.6) node {\small x}; + } + \uncover<4-5>{ + \draw[color=blue] (1.5,-1.0) node {\tiny phi, phi_p, phi_p_p}; + \draw[color=blue] (4.2,-1.0) node {\tiny phi, phi_p, phi_p_p}; + }% + + % Step 5: Time + \uncover<5->{ + \draw[xstep=.6cm,ystep=.4cm,gray,dashed] + (0,0) grid (3.0cm,2.6cm); + \draw[xstep=.6cm,ystep=.4cm,gray,dashed,xshift=0.05cm,yshift=0.05cm] + (2.4,0) grid (5.4cm,2.6cm); + }% + \uncover<5>{ + \scope[color=red,thick,fill=white] + \draw (-0.5,0.4) -- (0.0,0.4); + \draw (-0.5,0.8) -- (0.0,0.8); + \draw[->] (-0.1,1.2) -- (-0.1,0.8); + \draw[<-] (-0.1,0.4) -- (-0.1,0.0); + \endscope + \draw (0,0.6) node[anchor=west,fill=white] {$\Delta t = \lambda\Delta x_{\min}$}; + } + + % Step 6: Initial data routines + \uncover<6>{ + \scope[very thick,color=green,xstep=0.6cm,ystep=1cm] + \draw[xshift=0cm,yshift=0cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.05cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=0.4cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.45cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=0.8cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.85cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \endscope + \scope[color=blue] + \draw (-0.5,0.4) node[anchor=east] {\small phi_p}; + \draw (-0.5,0.8) node[anchor=east] {\small phi}; + \draw (-0.5,0.0) node[anchor=east] {\small phi_p_p}; + \endscope + } + + % Step 7: Layers rotation + \uncover<7->{ + \scope[very thick,color=green,xstep=0.6cm,ystep=1cm] + \draw[xshift=0cm,yshift=0cm,color=gray] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.05cm,color=gray] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=0.4cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.45cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=0.8cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.85cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=1.2cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=1.25cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \endscope + }% + \uncover<7>{ + %\draw[thick,color=red,->] (-0.5,-0.1) arc (-25:25:1.1cm); + \draw[thick,color=red,->] (-1.8, 0.0) arc (205:155:1.5cm); + } + \uncover<7-11>{ + \scope[color=blue] + \draw (-0.5,0.4) node[anchor=east] {\small phi_p_p}; + \draw (-0.5,0.8) node[anchor=east] {\small phi_p}; + \draw (-0.5,1.2) node[anchor=east] {\small phi}; + \endscope + } + + % Step 8: Evaluation of RHS + \uncover<8>{ + \scope[draw=red,thick,fill=green] + \draw (0.0,0.8) -- (1.2,0.8); + \draw[->] (0.6,0.8) -- (0.6,1.1); + \filldraw (0.6,1.2) circle (0.1cm); + \filldraw (0.6,0.4) circle (0.1cm); + \filldraw (0.0,0.8) circle (0.1cm); + \filldraw (0.6,0.8) circle (0.1cm); + \filldraw (1.2,0.8) circle (0.1cm); + + % second processor: + \scope[xshift=0.05cm,yshift=0.05cm] + \fill (3.0,0.8) circle (0.05cm); + \fill (3.6,0.8) circle (0.05cm); + \scope[xshift=3.6cm] + \draw (0.0,0.8) -- (1.2,0.8); + \draw[->] (0.6,0.8) -- (0.6,1.1); + \filldraw (0.6,1.2) circle (0.1cm); + \filldraw (0.6,0.4) circle (0.1cm); + \filldraw (0.0,0.8) circle (0.1cm); + \filldraw (0.6,0.8) circle (0.1cm); + \filldraw (1.2,0.8) circle (0.1cm); + \endscope + \endscope + \endscope + }% + + % Step 9: Ghost zones + \uncover<9>{ + \scope[very thick,color=green,xstep=0.6cm,ystep=1cm] + \draw[xshift=0.6cm,yshift=1.2cm] (0cm,-1pt) grid (1.8cm,1pt); + \draw[xshift=3.05cm,yshift=1.25cm] (0cm,-1pt) grid (1.8cm,1pt); + \draw[->,color=red] (2.4,1.1) -- (2.4,1.3); + \draw[->,color=red] (3.05,1.3) -- (3.05,1.1); + \endscope + }% + + % Step 10: Boundary conditions + \uncover<10>{ + \scope[very thick,color=green,xstep=0.6cm,ystep=1cm] + \draw[xshift=0.6cm,yshift=1.2cm] (0cm,-1pt) grid (2.4cm,1pt); + \draw[xshift=2.45cm,yshift=1.25cm] (0cm,-1pt) grid (2.4cm,1pt); + \draw[->,color=red] (-0.4,1.2) -- (0.0,1.2); + \draw[->,color=red] (5.85,1.25) -- (5.45,1.25); + \endscope + }% + + % Step 11: Output data + \uncover<11->{ + \scope[very thick,color=green,xstep=0.6cm,ystep=1cm] + \draw[xshift=0cm,yshift=1.2cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=1.25cm] (0cm,-1pt) grid (3.0cm,1pt); + \endscope + } + + % Step 12: Advance to the next time level + \uncover<12>{ + \draw[thick,color=red,->] (-1.8, 0.4) arc (205:155:1.5cm); + \scope[very thick,color=green,xstep=0.6cm,ystep=1.4cm] + \draw[xshift=0cm,yshift=1.6cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=1.65cm,color=black] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=1.2cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=1.25cm] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=0cm,yshift=0.4cm,color=gray] (0cm,-1pt) grid (3.0cm,1pt); + \draw[xshift=2.45cm,yshift=0.45cm,color=gray] (0cm,-1pt) grid (3.0cm,1pt); + \endscope + \scope[color=blue] + \draw (-0.5,0.8) node[anchor=east] {\small phi_p_p}; + \draw (-0.5,1.2) node[anchor=east] {\small phi_p}; + \draw (-0.5,1.6) node[anchor=east] {\small phi}; + \endscope + } + + \end{tikzpicture} + \end{center} + \end{figure} + + + \column{.3\textwidth} + \begin{figure}[!htp] + \begin{center} + \vspace{-1cm} + \begin{tikzpicture} + \draw (0,7) node + [anchor=north,right,text width=3cm,rounded corners,fill=green!20,draw=blue!50!black] %,inner sep=1ex] + (begin) + {\begin{footnotesize} + \begin{itemize} + \item[] \hspace{-0.5cm} {\color<2>{blue}Grid structure} + \item[] \hspace{-0.5cm} {\color<3>{blue}GF allocation} + \end{itemize} + \end{footnotesize}}; + + \draw (0,5.3) node + [anchor=north,right,text width=3cm,rounded corners,fill=green!20,draw=blue!50!black] %,inner sep=1ex] + (init) + {\begin{footnotesize} + \begin{itemize} + \item[] \hspace{-0.5cm} {\color<4>{blue}Set up coords} + \item[] \hspace{-0.5cm} {\color<5>{blue}Compute $\Delta t$} + \item[] \hspace{-0.5cm} {\color<6>{blue}Initial data} + \end{itemize} + \end{footnotesize} }; + + \draw[->,thick,draw=blue!50!black] (0,2.15) -- (-0.3,2.15) -- (-0.3,3.8) -- (-0.05,3.8); + + \draw (0,3) node + [anchor=north,right,text width=3cm,rounded corners,fill=green!20,draw=blue!50!black] %,inner sep=1ex] + (evol) + {\begin{footnotesize} + \begin{itemize} + \item[]\hspace{-0.5cm} {\color<7,12>{blue}Rotate timelevels} + \item[]\hspace{-0.5cm} {\color<8>{blue}Evolve GF}, {\color<9>{blue}sync} + \item[]\hspace{-0.5cm} {\color<10>{blue}Apply BCs} + \item[]\hspace{-0.5cm} {\color<11>{blue}Output data} + \end{itemize} + \end{footnotesize} }; + + \scope[color=blue!50!black,thick] + \draw[->,shorten >=2pt] (begin.south) -- (init.north); + \draw[->,shorten >=2pt] (init.south) -- (evol.north); + \endscope + \end{tikzpicture} + \end{center} + \end{figure} + \end{columns} +} + +%\frame[containsverbatim]{ \frametitle{WaveToy Thorn} +% Implemented in \verb|CactusWave/WaveToy|: +% \begin{itemize} +% \item \href{http://www.cct.lsu.edu/~bentivegna/WaveToy/interface.ccl%7D%7Binterface.ccl%... +% \item \href{http://www.cct.lsu.edu/~bentivegna/WaveToy/schedule.ccl%7D%7Bschedule.ccl%7D +% \item \href{http://www.cct.lsu.edu/~bentivegna/WaveToy/param.ccl%7D%7Bparam.ccl%7D +% \item \href{http://www.cct.lsu.edu/~bentivegna/WaveToy/src%7D%7Bsrc/ directory} +% \end{itemize} +%} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn} + Directory structure: + \begin{alltt} +WaveToy/ +|-- COPYRIGHT +|-- README +|-- configuration.ccl +|-- doc +| `-- documentation.tex +|-- interface.ccl +|-- schedule.ccl +|-- param.ccl +`-- src + |-- WaveToy.c + `-- make.code.defn +\end{alltt} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn} + Directory structure: + \begin{alltt} +WaveToy/ +|-- COPYRIGHT +|-- README +|-- configuration.ccl +|-- doc +| `-- documentation.tex +\textcolor{blue}{|-- interface.ccl +|-- schedule.ccl +|-- param.ccl} +`-- src + |-- WaveToy.c + `-- make.code.defn +\end{alltt} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn} + \begin{itemize} + \item \verb|interface.ccl|: + \tiny\begin{verbatim} + IMPLEMENTS: wavetoy_simple + INHERITS: grid + + PUBLIC: + + CCTK_REAL scalarevolve TYPE=gf TIMELEVELS=3 + { + phi + } "The evolved scalar field" + + CCTK_INT FUNCTION Boundary_SelectVarForBC( \ + CCTK_POINTER_TO_CONST IN GH, CCTK_INT IN faces, \ + CCTK_INT IN boundary_width, CCTK_INT IN table_handle, \ + CCTK_STRING IN var_name, CCTK_STRING IN bc_name) + + REQUIRES FUNCTION Boundary_SelectVarForBC\end{verbatim} + \end{itemize} +} +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + \begin{itemize} + \item \verb|schedule.ccl|: + \tiny\begin{verbatim} + STORAGE: scalarevolve[3] + + SCHEDULE WaveToy_InitialData AT CCTK_INITIAL + { + LANG: C + } "Initial data for 3D wave equation" + + SCHEDULE WaveToy_Evolution AT CCTK_EVOL + { + LANG: C + SYNC: scalarevolve + } "Evolution of 3D wave equation" + + SCHEDULE WaveToy_Boundaries AT CCTK_EVOL AFTER WaveToy_Evolution + { + LANG: C + } "Select boundary conditions for the evolved scalar" + + SCHEDULE GROUP ApplyBCs as WaveToy_ApplyBCs AT CCTK_EVOL AFTER WaveToy_Boundaries + { + } "Apply boundary conditions"\end{verbatim} + \end{itemize} +} +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + \begin{itemize} + \item \verb|param.ccl|: + \tiny\begin{verbatim} + CCTK_REAL amplitude "The amplitude of the waves" + { + *:* :: "Anything" + } 1.0 + + CCTK_REAL radius "The radius of the gaussian wave" + { + 0:* :: "Positive" + } 0.0 + + CCTK_REAL sigma "The sigma for the gaussian wave" + { + 0:* :: "Positive" + } 0.1\end{verbatim} + \end{itemize} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + Directory structure: + \begin{alltt} +WaveToy/ +|-- COPYRIGHT +|-- README +|-- configuration.ccl +|-- doc +| `-- documentation.tex +|-- interface.ccl +|-- schedule.ccl +|-- param.ccl +`-- src +\textcolor{blue}{ |-- WaveToy.c + `-- make.code.defn} +\end{alltt} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + \begin{itemize} + \item \verb|WaveToy.c|: + \tiny\begin{alltt} +void WaveToy_Evolution(\textcolor{BurntOrange}{CCTK_ARGUMENTS}) { + \textcolor{BurntOrange}{DECLARE_CCTK_ARGUMENTS;} + + CCTK_REAL dt2,dx2i,dy2i,dz2i; + + dt2 = CCTK_DELTA_TIME*CCTK_DELTA_SPACE(2); + dx2i = 1.0/(CCTK_DELTA_SPACE(0)*CCTK_DELTA_SPACE(0)); + dy2i = 1.0/(CCTK_DELTA_SPACE(1)*CCTK_DELTA_SPACE(1)); + dz2i = 1.0/(CCTK_DELTA_SPACE(2)*CCTK_DELTA_SPACE(2)); + + /* Do the evolution */ + \textcolor{Green}{for (int k=1; k<cctk_lsh[2]-1; k++) { + for (int j=1; j<cctk_lsh[1]-1; j++) { + for (int i=1; i<cctk_lsh[0]-1; i++) {} + \textcolor{blue}{phi[CCTK_GFINDEX3D(cctkGH,i,j,k)] = 2*(1 - (dt2)*(dx2i + dy2i + dz2i)) * + phi_p[CCTK_GFINDEX3D(cctkGH,i,j,k)] - phi_p_p[CCTK_GFINDEX3D(cctkGH,i,j,k)] + + (dt2) * + ( ( phi_p[CCTK_GFINDEX3D(cctkGH,i+1,j ,k )] + +phi_p[CCTK_GFINDEX3D(cctkGH,i-1,j ,k )] )*dx2i + +( phi_p[CCTK_GFINDEX3D(cctkGH,i ,j+1,k )] + +phi_p[CCTK_GFINDEX3D(cctkGH,i ,j-1,k )] )*dy2i + +( phi_p[CCTK_GFINDEX3D(cctkGH,i ,j ,k+1)] + +phi_p[CCTK_GFINDEX3D(cctkGH,i ,j, k-1)] )*dz2i);} + \textcolor{Green}{} + } + }} +} +\end{alltt} + \end{itemize} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + \begin{itemize} + \item \verb|WaveToy.c cont.|: + \tiny\begin{alltt} +void WaveToy_InitialData(\textcolor{BurntOrange}{CCTK_ARGUMENTS}) { + \textcolor{BurntOrange}{DECLARE_CCTK_ARGUMENTS; + DECLARE_CCTK_PARAMETERS;} + + \textcolor{Green}{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 vindex = CCTK_GFINDEX3D(cctkGH,i,j,k); + CCTK_REAL dt = CCTK_DELTA_TIME; + CCTK_REAL X = x[vindex]; + CCTK_REAL Y = y[vindex]; + CCTK_REAL Z = z[vindex]; + CCTK_REAL R = sqrt(X*X + Y*Y + Z*Z); + + \textcolor{blue}{phi[vindex] = amplitude*exp( - SQ( (R - radius) / sigma ) );} + + if (R == 0.0) { + phi_p[vindex] = amplitude*(1.0 - 2.0*dt*dt/sigma)*exp(-dt*dt/sigma); + } else { + phi_p[vindex] = amplitude/2.0*(R-dt)/R* + exp( - SQ( (R - radius - dt)/ sigma ) ) + + amplitude/2.0*(R+dt)/R* + exp( - SQ( (R - radius + dt)/ sigma ) ); + \textcolor{Green}{} + } + }} + } +} +\end{alltt} + \end{itemize} +} + +\frame[containsverbatim]{ \frametitle{WaveToy Thorn cont.} + \begin{itemize} + \item \verb|WaveToy.c|: + \tiny\begin{alltt} +void WaveToy_Boundaries(\textcolor{BurntOrange}{CCTK_ARGUMENTS}) { + \textcolor{BurntOrange}{DECLARE_CCTK_ARGUMENTS;} + + /* Uses all default arguments, so invalid table handle -1 can be passed */ + if (\textcolor{blue}{Boundary_SelectVarForBC (cctkGH, CCTK_ALL_FACES, 1, -1, + "wavetoy_simple::phi", "scalar")} < 0) { + CCTK_WARN (0, "WaveToy_Boundaries: Error selecting boundary condition"); + } +} +\end{alltt} + \item \verb|make.config.defn|: + \tiny\begin{verbatim} +SRCS = WaveToy.c +\end{verbatim} + \end{itemize} +} + + +\frame[containsverbatim]{ \frametitle{Parameter file} + \begin{itemize} + \item Example parameter file: + \tiny\begin{verbatim} +Cactus::cctk_run_title = "Simple WaveToy" + +ActiveThorns = "Time Boundary Carpet CarpetLib CartGrid3D CoordBase IOUtil + CarpetIOBasic CarpetIOASCII CarpetIOHDF5 SymBase WaveToy" + +Cactus::cctk_itlast = 10000 +Time::dtfac = 0.5 + +IO::out_dir = $parfile +IOBasic::outInfo_every = 1 +IOASCII::out1D_every = 10 +IOASCII::out1D_vars = "wavetoy_simple::phi" + +IOHdf5::out_every = 100 +IOHdf5::out_vars = "wavetoy_simple::phi" +\end{verbatim} + \end{itemize} +} + +\frame{\frametitle{Exercise: compute wave energy} +\begin{itemize} +\item compute energy density $\rho_E = \phi^2 , \mathrm{d}x , \mathrm{d}y , \mathrm{d}z$ +\item compute integral as '\texttt{sum}' reduction of \texttt{IOScalar::out_reductions} during output +\end{itemize} +} + \end{document}