% -*- mode: latex ; coding: utf-8 -*-
%
% Copyright(C) Youhei SASAKI, Shin-ichi Takehiro, SPMODEL Development Group.
%              All rights reserved.
% $Lastupdate: 2019-03-23 17:12:28$
% License: MIT/X11
%
% 古い(obsolete)スタイルの警告を表示
\RequirePackage[l2tabu,orthodox]{nag}
\documentclass[xetex,slidetop,compress,c,12pt,cjk]{beamer}
% minted のために xelatex で typeset するためのあれこれ
\usepackage{zxjatype} % 日本語フォントの指定
\setjamainfont[BoldFont=IPAexGothic]{IPAexMincho}
\setjasansfont{IPAexGothic}
\setmonofont{Ubuntu Mono}
\setjamonofont[BoldFont=RictyDiminishedDiscord-Bold.ttf,ItalicFont=RictyDiminishedDiscord-Oblique.ttf]{RictyDiminishedDiscord-Regular.ttf}
\setbeamertemplate{navigation symbols}{}
\usepackage{amsmath,amssymb}
\usepackage[normalem]{ulem}
\usefonttheme[onlymath]{serif}
\usepackage{D6math}
% pygmentize: ソースコードの syntax highlight
\usepackage{minted}
% \usemintedstyle{}
\definecolor{mintedbg}{rgb}{0.95,0.95,0.95}
\newminted{fortran}{%
  bgcolor=mintedbg,mathescape,autogobble,fontsize=\footnotesize}
\newminted{sh}{%
  bgcolor=mintedbg,mathescape,autogobble,fontsize=\footnotesize}
\newmintinline{fortran}{fontsize=\footnotesize}
\newmintinline{sh}{fontsize=\footnotesize}
%% theme
\newenvironment{exampleenv}{\begin{altenv}{\usebeamertemplate{example text begin}\usebeamercolor[fg]{example text}\usebeamerfont{example text}}{\usebeamertemplate{example text end}}{\color{.}}{}}{\end{altenv}}
\newcommand<>{\example}[1]{\begin{exampleenv}#2\relax#1\end{exampleenv}}
\usetheme{Madrid}
% hyperref: set link color
\definecolor{links}{HTML}{FF7F7F}
\hypersetup{colorlinks,linkcolor=,urlcolor=links}
% titlepage のフォントの大きさ
\setbeamerfont{title}{size=\Large}
\setbeamerfont{author}{size=\normalsize}
% frametitle の centering
\setbeamertemplate{frametitle}[default][center]
% \setbeamercolor{frametitle}{fg=black}
% itemize の indent 調整
\setlength{\leftmargini}{1em}
\setlength{\leftmarginii}{.5em}
\setlength{\leftmarginiii}{.5em}
% itemize/enumerate の文章のサイズ
\setbeamerfont{itemize/enumerate body}{size=\normalsize}
\setbeamerfont{itemize/enumerate subbody}{size=\small}
\setbeamerfont{itemize/enumerate subsubbody}{size=\footnotesize}
\setbeamertemplate{itemize item}{\scriptsize\raise1.25pt\hbox{\donotcoloroutermaths$\blacktriangleright$}}
\setbeamertemplate{itemize subitem}{\tiny\raise1.5pt\hbox{\donotcoloroutermaths$\bullet$}}
\setbeamertemplate{itemize subsubitem}{\tiny\raise1.5pt\hbox{\donotcoloroutermaths$-$}}
\setbeamertemplate{enumerate item}{\insertenumlabel.}
\setbeamertemplate{enumerate subitem}{\insertenumlabel.\insertsubenumlabel}
\setbeamertemplate{enumerate subsubitem}{\insertenumlabel.\insertsubenumlabel.\insertsubsubenumlabel}
\setbeamertemplate{enumerate mini template}{\insertenumlabel}
% 余白調整
\setbeamersize{text margin left=.025\paperwidth}
\setbeamersize{text margin right=.025\paperwidth}
% →, ←
\newcommand{\RArrow}{\textbf{$\Rightarrow$}}
\newcommand{\LArrow}{\textbf{$\rightarrow$}}

\title[dcmodel/davisチュートリアル]{階層的地球流体スペクトルモデル集SPMODEL}
% \subtitle{$\sim$dcmodel/davis チュートリアル$\sim$}
\author[佐々木 \& 竹広 with 地球流体電脳倶楽部]{%
  佐々木洋平(京大・数学), 竹広真一(京大・数理研)
  \newline%
  with%
  \newline 地球流体電脳倶楽部%
  \newline SPMODEL プロジェクト%
  \newline dcmodel プロジェクト%
  \newline davis プロジェクト
}
\date[2019/03/29]{\small{2019年3月29日}}

\begin{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[c]
  \titlepage
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{はじめに}
\begin{frame}[c]
  \frametitle{本日のお題}

  \centering
  {\Large{\alert{数式を書くようにプログラミング!!}}}
  \\ \vspace{.8em}
  しかも
  \\ \vspace{.8em}
  {\Large{\structure{スペクトル法で!!}}}
  \\ \vspace{.8em}
  さらに
  \\ \vspace{.8em}
  {\Large{\example{簡単に計算データの出力\&描画を!!}}}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{まずは使ってみよう!}
\begin{frame}[c]
  \frametitle{例題: 一次元移流方程式}
  \vspace{-2em}
  {\Large{%
      \begin{align*}
        \DP{\zeta}{t} = -c \DP{\zeta}{x}
      \end{align*}
    }}
  \begin{itemize}
  \item 一次元周期境界条件: $\zeta(x+L, t) = \zeta(x, t)$
  \item 初期条件: $\zeta(x,t) = \zeta_{0}(x)$
  \item ちなみに解析解は $\zeta(x,t) = \zeta_{0}(x - ct)$
  \item サンプルプログラムその1: \example{\texttt{advect.f90}}
  \end{itemize}
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile,c]
  \frametitle{まずは使ってみよう!}
  \begin{itemize}
  \item コンパイル
    \begin{shcode}
% spmfrt -o advect.out advect.f90
    \end{shcode}
    \begin{flushright}
      {\footnotesize{\RArrow \example{\texttt{advect.out}} が生成される}}
    \end{flushright}
  \item 実行
    \begin{shcode}
% ./advect.out
    \end{shcode}
    \begin{flushright}
      {\footnotesize{\RArrow \example{\texttt{advect.nc}} が出力される}}
    \end{flushright}
  \item 結果表示
    \begin{shcode}
% gplist advect.nc
% gpview --anim t advect.nc@zeta
% gpview --range 0:1.5e3 --anim t --Gaw advect.nc@zeta
    \end{shcode}
  \end{itemize}
\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}[fragile,c]
  \frametitle{用いているテクニックとライブラリ}
  \begin{itemize}
  \item Fortran($>=$90)の配列演算記法: \alert{配列を返す関数}
    \begin{columns}
      \begin{column}{.45\textwidth}
        \begin{fortrancode}
DO I=1,IM
   A(I) = B(I) + C(I)
ENDDO
        \end{fortrancode}
      \end{column}
      \begin{column}{.025\textwidth}
        \footnotesize{\RArrow}
      \end{column}
      \begin{column}{.4\textwidth}
        \hspace{-1em}
        \begin{minted}[%
          bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
A = B + C
        \end{minted}
      \end{column}
    \end{columns}
    \begin{columns}
      \begin{column}{.45\textwidth}
        \begin{fortrancode}
DO I=1,IM
   DATA(I) = EXP(-X(I)**2)
ENDDO
        \end{fortrancode}
      \end{column}
      \begin{column}{.025\textwidth}
        \footnotesize{\RArrow}
      \end{column}
      \begin{column}{.4\textwidth}
        \begin{minted}[bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
DATA = EXP(-X**2)
        \end{minted}
      \end{column}
    \end{columns}
  \item \structure{spmodel library}(spml): 正/逆変換, 空間微分などを提供
  \item 結果出力: \example{gtool5 library}
  \item 結果表示: Dennou Ruby 製品群(GPhys, \example{gpview} $\cdots$)
  \end{itemize}
\end{frame}

\begin{frame}[c]
  \frametitle{スペクトル法による数値計算}
  \begin{enumerate}
  \item 境界条件を満たす関数系で展開
    {\small{%
        \begin{align*}
          \zeta(x_{j},t) = \sum_{k=-K}^{K} \tilde{\zeta}_{k}(t) e^{i \frac{2\pi k x_{j}}{L}},
          \quad %
          \tilde{\zeta}_{k}(t) = \frac{1}{J}\sum_{j=0}^{J-1} \zeta(x_{j},t)e^{- i \frac{2\pi k x_{j}}{L}}
        \end{align*}
      }}
  \item 方程式に代入すると常微分方程式になる
    {\small{%
        \begin{align*}
          \DD{\zeta_{k}}{t} = - c i \frac{2\pi k}{L} \tilde{\zeta}_{k}
        \end{align*}
      }}
  \item 適当な初期値から離散化して時間積分
    {\small{%
        \begin{align*}
          \tilde{\zeta}_{k}(t+\Delta t) = \tilde{\zeta}_{k}(t) - c i \frac{2\pi k}{L} \tilde{\zeta}_{k}~\Delta t
        \end{align*}
      }}
  \item 実空間の変数に戻す
    {\small{%
        \begin{align*}
          \zeta(x_{j},t) = \sum_{k=-K}^{K} \tilde{\zeta}_{k}(t) e^{i \frac{2\pi k x_{j}}{L}},
        \end{align*}
      }}
  \end{enumerate}
\end{frame}

\begin{frame}[fragile,c,shrink=5]
  \frametitle{数値計算の手順}
  \begin{enumerate}
  \item 使用するモジュールの宣言
    \begin{fortrancode}
use ae_module
    \end{fortrancode}
  \item 変数宣言
    \begin{fortrancode}
real(kind(1.0D0)) :: g_Zeta(0:im-1)  ! 格子点データ
real(kind(1.0D0)) :: e_Zeta(-km:km)  ! スペクトルデータ
    \end{fortrancode}
  \item スペクトル変換の初期化
    \begin{fortrancode}
call ae_Initial(im,km,xmin,xmax)
    \end{fortrancode}
  \item 初期値を与える
    \begin{fortrancode}
g_Zeta = U1*sech((g_X-X1)/sqrt(12/u1))**2   &
     & + U2*sech((g_X-X2)/sqrt(12/u2))**2
    \end{fortrancode}
  \item スペクトルデータに変換
    \begin{fortrancode}
e_Zeta = e_g(g_Zeta)
    \end{fortrancode}
  \item スペクトルデータを時間積分
    \begin{fortrancode}
e_Zeta = e_Zeta + dt*( - c *e_Dx_e(e_Zeta))
    \end{fortrancode}
  \item 実空間データに戻して出力
    \begin{fortrancode}
g_Zeta = g_e(e_Zeta)
    \end{fortrancode}
  \end{enumerate}
\end{frame}

\begin{frame}[fragile]
  \frametitle{spml/ae\_module}
  {\centering{スペクトル計算のためのサブルーチン・関数を提供}}
  \begin{itemize}
  \item 初期化
    \begin{fortrancode}
subroutine ae_Initial(im, km, xmin, xmax)
    \end{fortrancode}
  \item スペクトル正変換/逆変換
    \begin{fortrancode}
e_g(g_Data)   ! 格子点 $\to$ スペクトルデータ
g_e(e_Data)   ! スペクトルデータ $\to$ 格子点データ
    \end{fortrancode}
  \item 微分計算
    \begin{fortrancode}
e_Dx_e(e_Data) ! X 微分
    \end{fortrancode}
  \item 積分・平均演算
    \begin{fortrancode}
Int_g(g_Data)  ! 全領域積分
Avr_g(g_Data)  ! 全領域平均
    \end{fortrancode}
  \end{itemize}
\end{frame}

\begin{frame}[c,fragile]
  \frametitle{spml/ae\_module}
  \begin{itemize}
  \item その中身は?
    \begin{itemize}
    \item ISPACK(石岡, 2015)を Fortran90 の関数でくるんだもの
    \item FFT用の変換テーブル, 領域の大きさ→微分計算に使用
    \item 座標変数の設定: \fortraninline|g_X, g_X_weight|
    \item 微分演算→波数のかけ算: \fortraninline|e_Dx_e(k) = - 2*pi*(k/L)*e_Data(-k)|
    \end{itemize}
  \item 御利益: \alert{数式の如くプログラムが書ける}
    \begin{columns}
      \begin{column}{.2\textwidth}
        \begin{align*}
          f = \DP{\zeta}{x} \quad \Rightarrow
        \end{align*}
      \end{column}
      \begin{column}[c]{.65\textwidth}
        \vspace{.8em}
        \begin{minted}[bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
  e_f = e_Dx_e(e_Zeta)
        \end{minted}
      \end{column}
    \end{columns}
    \begin{columns}
      \begin{column}{.2\textwidth}
        \begin{align*}
          f = \DP[2]{\zeta}{x} \quad \Rightarrow
        \end{align*}
      \end{column}
      \begin{column}[c]{.65\textwidth}
        \vspace{1em}
        \begin{minted}[bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
  e_f = e_Dx_e(e_Dx_e(e_Zeta))
        \end{minted}
      \end{column}
    \end{columns}
  \end{itemize}
\end{frame}

\begin{frame}[c,fragile]
  \frametitle{spml プログラミング書法}
  \begin{itemize}
  \item 先頭の文字で変数の種類を区別:
  \item 実空間格子点データ: \fortraninline|g_| で始める
  \item スペクトルデータ: \fortraninline|e_| で始める
  \item spmlの関数名の命名規則:
    \begin{center}
      \alert{(出力の型)\_(機能)\_(入力の型)}
    \end{center}
  \item 縮約の如くプログラムを書けば型を間違えにくい
    \begin{minted}[bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
g_Data = g_e(e_Dx_e(e_g(g_Data1)))
    \end{minted}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{練習問題(1)}
  \begin{itemize}
  \item 移流方程式に拡散項を付け加えてみよう
    {\Large{%
        \begin{align*}
          \DP{\zeta}{t} = -c \DP{\zeta}{x} + \textcolor{red}{\uwave{\textcolor{black}{\DP[2]{\zeta}{x}}}}
        \end{align*}
      }}
  \item Euler scheme だとこんな感じ..?
    \begin{minted}[bgcolor=mintedbg,mathescape,autogobble,fontsize=\normalsize]{fortran}
e_Zeta = e_Zeta                              &
       & + dt * ( - c * e_Dx_e(e_Zeta)       &
       &          + e_Dx_e(e_Dx_e(e_Zeta)) )
     \end{minted}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{非線型項の取り扱い(変換法)}
  \begin{itemize}
  \item 移流項が非線型 $\displaystyle{\zeta\DP{\zeta}{x}}$ である場合には
    \begin{center}
      \structure{スペクトル変数を一度実空間に戻してから積を取る}
    \end{center}
  \end{itemize}
  \begin{itemize}
  \item spml の関数を用いると一行で書ける
    \begin{fortrancode}
g_e(e_Zeta) * g_e(e_Dx_e(e_Zeta))
    \end{fortrancode}
  \end{itemize}
\end{frame}

\begin{frame}[fragile,c]
  \frametitle{練習問題(2)}
  \begin{itemize}
  \item \texttt{advect\_lf.f90} を元に KdV方程式のプログラムを書いてみよう
    \begin{align*}
      \DP{\zeta}{t} = - \zeta \DP{\zeta}{x} - \textcolor{red}{\uwave{\textcolor{black}{\DP[3]{\zeta}{x}}}}
    \end{align*}
  \item Leap frog scheme だとこんな感じ..?
  \end{itemize}
  \begin{fortrancode}
e_Zeta = e_Zeta0                                                 &
     & + 2 * dt * ( - e_g(g_e(e_Zeta1) * g_e(e_Dx_e(e_Zeta1)))   &
     &              - e_Dx_e(e_Dx_e(e_Dx_e(e_Zeta1)))          ) &
e_Zeta0 = e_Zeta1 ; e_Zeta1 = e_Zeta
  \end{fortrancode}
  \begin{itemize}
  \item 切断波数の取り方に注意
    \begin{itemize}
    \item 変数の積から高波数成分が生成される \\
      \RArrow J$\sim$2K+1の格子点数では十分に表現できない
    \item 2次の非線型項なら格子点数は J $\ge$ 3K+1 に増やしておく
    \end{itemize}
  \end{itemize}
\end{frame}

\section{SPMODELプログラミング}

\begin{frame}[fragile,c,shrink=10]
  \frametitle{SPMODELプログラミング}
  \begin{enumerate}
  \item 領域と境界条件に適合したモジュールを選択
  \item 支配方程式を形式的にスペクトル変換
    \begin{align*}
      \DP{\tilde{\zeta}_{m}}{t}
      = - \left[ \zeta \DP{\tilde{\zeta}}{x} \right] - \left[ \DP[3]{\tilde{\zeta}_{m}}{x} \right]
  \end{align*}
\item 適当なスキームで時間に関して差分化
  \begin{align*}
    \tilde{\zeta}^{\tau+1}_{m} = \tilde{\zeta}^{\tau}_{m} +\Delta t \times \left\{ - \left[ \zeta \DP{\tilde{\zeta}}{x} \right] - \left[ \DP[3]{\tilde{\zeta}_{m}}{x} \right] \right\}
  \end{align*}
\item 2,3 に従ってプログラムを書く
  \begin{fortrancode}
e_Zeta = e_Zeta                                             &
     & + dt * ( - e_g(g_e(e_Zeta) * g_e(e_Dx_e(e_Zeta)))    &
     &          - e_Dx_e(e_Dx_e(e_Dx_e(e_Zeta)))          )
  \end{fortrancode}
  \end{enumerate}
\end{frame}

\begin{frame}[fragile]
  \frametitle{もっとおすすめの方法}
  \begin{itemize}
  \item サンプル・デモプログラムを元に改造
    \begin{itemize}
    \item 計算したい領域形状に即したモジュールのサンプル
    \item (たいてい)拡散方程式用のプログラムが用意されている
    \item 必要に応じて変数を追加, 演算を変更
    \item 時間積分部分を改造
    \end{itemize}
  \item サンプルの置き場所:
    \begin{itemize}
    \item Web: \url{http://www.gfd-dennou.org/library/spmodel/}
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{一般的注意}
  \begin{itemize}
  \item ライブラリ・サンプルプログラムは無保証
    \begin{itemize}
    \item 必ず自分でテストしてみること
    \item できれば解析解と比較してみる
    \end{itemize}
  \item マニュアルを見よう
    \begin{itemize}
    \item 気分でプログラムを書くのは危険
    \item マニュアルで確認しつつ書くこと\\
      \structure{spml のマニュアルを見てみよう!}\\
      \structure{モジュールと計算領域・境界条件に注目!}
      \begin{itemize}
      \item local: \url{http://localhost/spmodel/reference/}
      \item Web: \url{http://www.gfd-dennou.org/library/spmodel/}
      \end{itemize}
    \end{itemize}
  \item できればソースも見てみよう
  \end{itemize}
\end{frame}

\section{お手軽出力\&データ解析}

\begin{frame}[fragile,c]
  \frametitle{出力操作: gtool5 library}
  \begin{itemize}
  \item モジュールの宣言
    \begin{fortrancode}
use gtool_history
    \end{fortrancode}
  \item 出力ファイルの作成、次元の定義
    \begin{fortrancode}
call HistoryCreate(...
    \end{fortrancode}
  \item 変数の定義
    \begin{fortrancode}
call HistoryAddVariable(...
    \end{fortrancode}
  \item 出力
    \begin{fortrancode}
call HistoryPut(...
    \end{fortrancode}
  \item 終了
    \begin{fortrancode}
call HistoryClose
    \end{fortrancode}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{練習問題(3): 出力変数の追加}
  \begin{itemize}
  \item \texttt{advect.f90} を使って $\displaystyle{\DP{\zeta}{x}}$ を $x,t$ の2次元データとして出力してみる
  \item 変数定義の追加
    \begin{fortrancode}
call HistoryAddVariable(                     &
       varname='dzetadx', dims=(/'x','t'/),  &
       longname='derivative of displacement',&
       units='1', xtype='double')
     \end{fortrancode}
  \item 出力ルーチンの追加
     \begin{fortrancode}
call HistoryPut('dzetadx',g_e(e_Dx_e(e_Zeta)))
     \end{fortrancode}
   \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{練習問題(4): 出力変数の追加}
  \begin{itemize}
  \item $\displaystyle{\int_{0}^{L} \zeta^{2}\Dd x}$ を $t$ の1次元データとして出力してみる
    \begin{itemize}
    \item 変数定義の追加(次元に注意)
      \begin{fortrancode}
call HistoryAddVariable(                      &
       varname='z2int', dims=(/'t'/),         &
       longname='Integral of square of zeta', &
       units='1', xtype='double')
     \end{fortrancode}
   \item 出力ルーチンの追加
     \begin{fortrancode}
call HistoryPut('z2int',Int_g(g_e(e_Zeta)*g_e(e_Zeta)))
     \end{fortrancode}
   \item \example{gpprint} コマンドで数字を出力してみる
    \begin{shcode}
% gpprint advect.nc@z2int
    \end{shcode}
  \end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile,c]
  \frametitle{例題: 2次元拡散方程式}
  \begin{itemize}
  \item 2次元周期境界条件の下で解いてみる
    \begin{align*}
      \DP{\zeta}{t} = \nu \left( \DP[2]{\zeta}{x} + \DP[2]{\zeta}{y} \right)
    \end{align*}
  \item サンプルプログラム: \texttt{diffuse\_2d.f90}
  \end{itemize}
  \begin{center}
  \structure{コンパイルして実行してみよう} \\
  \structure{ソースファイルを眺めてみよう}
  \end{center}
\end{frame}

\begin{frame}[fragile]
  \frametitle{gpview の便利なオプション}
  \begin{itemize}
  \item 範囲指定
    \begin{shcode}
% gpview --range 0:1 --anim t diffuse_2d.nc@zeta
    \end{shcode}
  \item データ切出し
    \begin{shcode}
% gpview --anim t diffuse_2d.nc@zeta,x=0.5
% gpview diffuse_2d.nc@zeta,x=0.5,y=0.5
    \end{shcode}
  \item 平均操作
    \begin{shcode}
% gpview --mean x --anim t diffuse_2d.nc@zeta
    \end{shcode}
  \item その他のオプション
    \begin{shcode}
% gpview --help
% man gpview
    \end{shcode}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{その他の例題}
  \begin{itemize}
  \item 2次元ベータ面:モドン
  \item 2次元チャネル領域:熱対流問題
  \item 2次元球面領域:ロスビー波\\
    $\cdots$
  \item Web を見てみよう
    \begin{itemize}
    \item Web:\\
      \url{http://www.nagare.or.jp/mm/2006/spmodel/}\\
      \url{http://www.gfd-dennou.org/library/spmodel/}
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{練習問題(5)}
  \begin{itemize}
  \item 移流方程式に変えてみよう
    \begin{align*}
      \DP{\zeta}{t} = - c_{x} \DP{\zeta}{x} - c_{y} \DP{\zeta}{y}
    \end{align*}
  \item Euler scheme だとこんな感じ?
    \begin{fortrancode}
ee_Zeta = ee_Zeta                           &
      & + dt *( - cx * ee_Dx_ee(ee_Zeta)    &
      &         - cy * ee_Dy_ee(ee_Zeta)   )
    \end{fortrancode}
  \item Leap frog scheme の方が安定性がよろしい
    \begin{fortrancode}
ee_Zeta = ee_Zeta0                           &
      & + dt * ( - cx * ee_Dx_ee(ee_Zeta1)   &
      &          - cy * ee_Dy_ee(ee_Zeta1) )
ee_Zeta0 = ee_Zeta1; ee_Zeta1=ee_Zeta2
    \end{fortrancode}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{練習問題(6)}
  \begin{itemize}
  \item 線型$\beta$面順圧方程式に変えてみよう
    \begin{align*}
      \DP{\zeta}{t} = - \beta \DP{\psi}{x}, \quad \Dlapla[2]\psi = \zeta
    \end{align*}
  \item Euler scheme だとこんな感じ?
    \begin{fortrancode}
ee_Zeta = ee_Zeta + dt * ( - beta*ee_Dx_ee(ee_Psi) )
ee_Psi  = ee_LaplaInv_ee(ee_Zeta)
    \end{fortrancode}
  \item (余力があれば)非線型ベータ面順圧方程式に挑戦
    \begin{align*}
      \DP{\zeta}{t} = - J(\psi, \zeta) - \beta \DP{\psi}{x}, \quad%
      \Dlapla[2]\psi = \zeta
    \end{align*}
  \end{itemize}
\end{frame}

\end{document}
