% 表題 地球流体電脳倶楽部 AGCM5 SMPACK 対応部分   コード
%
% 履歴
\Drireki{98/03/07  赤堀 浩司}
%

\Dchapterhead

\section{SMPACK 関連の全体の流れ}

まず, サブルーチン \verb@SETLAT@ ( \verb@admin_sm/asetl.F@) の中で
\verb@DSMINI@ (\verb@dynamics_sm/dsm.F@ 新規作成 )と
\verb@DS1INI@ (\verb@dynamics_sm/ds1.F@ 新規作成 )を呼び SMPACK を初期
化している. この直後に \verb@DSMGAU@ (\verb@dynamics_sm/dsm.F@ 新規作
成) を呼びガウス緯度・荷重を得ている\footnote{わかりやすさを考えれば
メインプログラムの中で初期化させる方が良いが, その場合には初期値作成用
ファイルや軸作成用ファイルも変更しなくてはいけなくなる. }.

次に, \verb@DSETC@ (\verb@dynamics_sm/dsetc.F@) を呼び各種定数等を設定する. 
ここでは従来とは異なり球関数関連の設定は行なっていない.
スペクトル添字順番を記憶する配列 \verb@NMO@ は, \verb@GETNMO@
(\verb@dynamics_sm/dsetc.F@) から得ている。

格子⇔スペクトルの変換は,
多層の変数は \verb@DSM???@  (\verb@dynamics_sm/dsm.F@  新規作成) で, 
1 層の変数は \verb@DS1???@ (\verb@dynamics_sm/ds1.F@ 新規作成) で行なう.
これらのルーチンの中では, 対応した SMPACK の変換ルーチンを呼んでいる.

\section{多層球関数変換}

多層用球関数変換ルーチン(\verb@dynamics_sm/dsm.F@ 新規作成)は次のよう
になっている.

\begin{verbatim}
SUBROUTINE DSMINI !" 球関数(多層)を初期化 
     CALL SMINIT
     RETURN
ENTRY DSMG2S          !" 格子→スペクトル
     CALL SMTG2S
     RETURN
ENTRY DSMV2S          !" 格子(ベクトル)→スペクトル(発散・回転)
     CALL SMTV2S
     RETURN
ENTRY DSMV1S          !" 格子(ベクトル)→スペクトル(発散)
     CALL SMTV1S
     RETURN
ENTRY DSMS2G          !" スペクトル→格子
     CALL SMTS2G
     RETURN
ENTRY DSMS2V          !" スペクトル(発散・回転)→格子(ベクトル)
     CALL SMTS2V
     RETURN
ENTRY  DSMGAU         !" ガウス緯度・ガウス荷重の取得
     RETURN

\end{verbatim}

以下に詳細を述べる. 説明中のパラメータは次のとおり.
\begin{verbatim}
      REAL      GDATA( IDIM,JDIM,KMAX )
      REAL      GDATB( IDIM,JDIM,KMAX )
      REAL      WDATA( NMDIM,KMAX )
      REAL      WDATB( NMDIM,KMAX )
      CHRACTER  HFUNC*4
\end{verbatim}

\subsection{DSMINI}

\begin{enumerate}
\item 機能 

SMPACK のサブルーチン SMINIT を呼んで球関数変換の準備をする. 
その他 SMPACK の使用条件のチェックと地球半径ファクタの準備もする.

\item 呼び出し方法

\begin{verbatim}
      CALL DSMINI
\end{verbatim}

\item 備考

(a)現在のところ \verb@src/admin_sm/asetl.F@ の中で呼んでいる.

\end{enumerate}

\subsection{DSMG2S}

\begin{enumerate}
\item 機能
 
SMPACK のサブルーチン SMTG2S を呼び, グリッドデータからスペクトルデータ
への変換を行なう. 

\item 定義

SMPACK のドキュメントを参照のこと

\item 呼び出し方法

    \begin{verbatim}
      CALL DSMG2S
     O         ( WDATA   ,
     I           GDATA    )
   \end{verbatim}

\end{enumerate}

\subsection{DSMV2S}

\begin{enumerate}
\item 機能
 
SMPACK のサブルーチン SMTV2S を呼び, 格子(ベクトル)→スペクトル(発散・
回転)への変換を行なう. 

\item 定義

入力の実空間ベクトルデータ $(u,v)$ に対して, 発散
$A$ および回転 $B$ のスペクトルデータ \verb@WDATA@ および \verb@WDATB@ 
を求める. ここで $A, B$ はそれぞれ 
\begin{equation}
A\equiv
\frac{1}{a} \left\{ \frac{\partial u}{\cos\varphi\partial\lambda}
 +\frac{\partial (v\cos\varphi)}{\cos\varphi\partial\varphi} \right\}
 = \frac{1}{a(1-\mu^2)}\frac{\partial (u\cos\varphi)}{\partial\lambda}
   + \frac{1}{a} \frac{\partial (v\cos\varphi)}{\partial\mu}
\end{equation}
\begin{equation}
B\equiv
\frac{1}{a} \left\{ \frac{\partial v}{\cos\varphi\partial\lambda}
 -\frac{\partial (u\cos\varphi)}{\cos\varphi\partial\varphi}
\right\}
= \frac{1}{a(1-\mu^2)} \frac{\partial (v\cos\varphi)}{\partial\lambda}
 -\frac{1}{a}\frac{\partial (u\cos\varphi)}{\partial\mu}
\end{equation}
と定義する. $a$ は地球半径.

\item 呼び出し方法

    \begin{verbatim}
      CALL DSMV2S
     O         ( WDATA , WDATB,
     I           GDATA , GDATB,
     I           HFUNC  )
   \end{verbatim}

\item 備考

(a)  HFUNC の 1 文字目が空白のとき, 入力として$(u,v)=$(\verb@GDATA,
GDATB@) を用いる. 空白でないときは入力として 
$(u\cos\phi,v\cos\phi)$=(\verb@GDATA, GDATB@) を用いる. 

\end{enumerate}

\subsection{DSMV1S}

\begin{enumerate}
\item 機能
 
SMPACK のサブルーチン SMTV1S を呼び, 格子(ベクトル)→スペクトル(発散)
への変換を行なう. 

\item 定義

入力の実空間ベクトルデータ $(u,v)$ に対して, 発散
$A$ のスペクトル \verb@WDATA@ を求める. ここで $A$ は
\begin{equation}
A\equiv
\frac{1}{a} \left\{ \frac{\partial u}{\cos\varphi\partial\lambda}
 +\frac{\partial (v\cos\varphi)}{\cos\varphi\partial\varphi} \right\}
 = \frac{1}{a(1-\mu^2)}\frac{\partial (u\cos\varphi)}{\partial\lambda}
   + \frac{1}{a} \frac{\partial (v\cos\varphi)}{\partial\mu}
\end{equation}
と定義する. $a$ は地球半径.

\item 呼び出し方法
    \begin{verbatim}
      CALL DSMV1S
     M         ( WDATA ,
     I           GDATA , GDATB,
     I           HFUNC  )
   \end{verbatim}

\item 備考

(a)  HFUNC の 1 文字目が空白のとき, 入力として$(u,v)=$(\verb@GDATA,
GDATB@) を用いる. 
ただし, 空白の場合の演算は AGCM のソースコードでは行なっていない. 
空白でないときは入力として 
$(u\cos\phi,v\cos\phi)$=(\verb@GDATA, GDATB@) を用いる. 

(b)  HFUNC の 4 文字目が {\tt S} のとき, (出力の {\tt WDATA}の値) $=$
(入力の {\tt WDATA} の値 ) $-$ (変換で得た値) となる. {\tt S} 以外のと
きは変換で得た値を出力する. ただし, {\tt S} 以外の演算は AGCM のソース
コードでは行なっていない.

\end{enumerate}

\subsection{DSMS2G}

\begin{enumerate}
\item 機能 

SMPACK のサブルーチン SMTS2G を呼び, スペクトル→格子の変換を行なう.

\item 定義

SMPACK のドキュメントを参照のこと

\item 呼び出し方法

    \begin{verbatim}
      CALL DSMS2G
     O         ( GDATA ,
     I           WDATA  )
   \end{verbatim}

\end{enumerate}

\subsection{DSMS2V}

\begin{enumerate}

\item 機能
 
SMPACK のサブルーチン SMTS2V を呼び, スペクトル(発散・回転)→格子(ベク
トル)の変換を行なう. 

\item 定義

入力の 2 つのスペクトルデータ \verb@WDATA@ (発散に対応) および
\verb@DATB@ (渦度に対応) の逆変換 $A$, $B$ 
に対して, 実空間のベクトル $(u,v)$を出力する. 
ここで $u, v$ はそれぞれ
\begin{equation}
u\equiv
a \left\{ \frac1{\cos\varphi}\frac{\partial (\nabla^{-2} A)}{\partial\lambda}
-\frac{\partial (\nabla^{-2} B)}{\partial\varphi} \right\}
= 
\frac{1}{a\cos\varphi} \left\{ \frac{\partial (a^2 \nabla^{-2}
A)}{\partial\lambda} -(1-\mu^2) \frac{\partial (a^2 \nabla^{-2}
B)}{\partial\mu} \right\}
\end{equation}
\begin{equation}
v\equiv
a \left\{ \frac{\partial (\nabla^{-2} A)}{\partial\varphi}
+\frac1{\cos\varphi}\frac{\partial (\nabla^{-2} B)}
{\partial\lambda} \right\}
= \frac{1}{a\cos\varphi} \left\{ (1-\mu^2) \frac{\partial (a^2 \nabla^{-2}
A)}{\partial \mu} + \frac{\partial (a^2 \nabla^{-2} B)}{\partial
\lambda} \right\}
\end{equation}
と定義する. また $\nabla^2$ 演算子を次のように定義する.
\begin{equation}
\nabla^2 \equiv 
\frac{\partial^2}{\cos^2\varphi\partial\lambda^2}
+\frac{\partial}{\cos\varphi\partial\varphi}
\left(\cos\varphi\frac{\partial}{\partial\varphi}\right)
=\frac{1}{1-\mu^2}\frac{\partial^2}{\partial\lambda^2}
+\frac{\partial}{\partial \mu} \left\{ (1-\mu^2)
\frac{\partial}{\partial \mu} \right\}
\end{equation}

\item 呼び出し方法

    \begin{verbatim}
      CALL DSMS2V
     O         ( GDATA , GDATB,
     I           WDATA , WDATB,
     I           HFUNC          )
   \end{verbatim}

\item 備考

(a) HFUNC の 1 文字目が空白のとき (\verb@GDATA, GDATB@)$=(u,v)$ を出力
する. 空白でないときは 
(\verb@GDATA,GDATB@)$=(u\cos\varphi,v\cos\varphi)$
を出力する. ただし, 空白でない場合の演算は, AGCM のソースコー
ドでは行なっていない. 

\end{enumerate}


\section{1 層球関数変換}

1 層用球関数変換ルーチン(\verb@dynamics_sm/ds1.F@ 新規作成)は次のよう
になっている.

\begin{verbatim}
SUBROUTINE DS1INI     !" 球関数( 1 層)を初期化 
     CALL SMINIT
     RETURN
ENTRY DS1G2S            !" 格子→スペクトル
     CALL SMTG2S
     RETURN
ENTRY DS1S2G            !" スペクトル→格子
     CALL SMTS2G
     RETURN
ENTRY DS1S1V            !" スペクトル→格子(ベクトル)
     CALL SMTS1V
     RETURN
\end{verbatim}

以下に詳細を述べる. 説明中のパラメータは次のとおり.
\begin{verbatim}
      REAL      GDATA( IDIM,JDIM )
      REAL      GDATB( IDIM,JDIM )
      REAL      WDATA( NMDIM )
      CHRACTER  HFUNC*4
\end{verbatim}

\subsection{DS1INI}

\begin{enumerate}
\item 機能 

SMPACK のサブルーチン SMINIT を呼んで球関数変換の準備をする. 

\item 呼び出し方法

\begin{verbatim}
      CALL DS1INI
\end{verbatim}

\item 備考

(a)現在のところ \verb@src/admin_sm/asetl.F@ の中で呼んでいる.

\end{enumerate}

\subsection{DS1G2S}

\begin{enumerate}
\item 機能
 
SMPACK のサブルーチン SMTG2S を呼び, グリッドデータからスペクトルデータ
への変換を行なう. 

\item 定義

SMPACK のドキュメントを参照のこと

\item 呼び出し方法

    \begin{verbatim}
      CALL DS1G2S
     O         ( WDATA   ,
     I           GDATA    )
   \end{verbatim}

\end{enumerate}

\subsection{DS1S2G}

\begin{enumerate}
\item 機能 

SMPACK のサブルーチン SMTS2G を呼び, スペクトル→格子の変換を行なう.

\item 定義

SMPACK のドキュメントを参照のこと

\item 呼び出し方法

    \begin{verbatim}
      CALL DS1S2G
     O         ( GDATA ,
     I           WDATA  )
   \end{verbatim}

\end{enumerate}

\subsection{DS1S1V}

\begin{enumerate}

\item 機能
 
SMPACK のサブルーチン SMTS1V を呼び, スペクトル→格子(ベクトル)の変換
を行なう. 

\item 定義

入力の 1 つのスペクトルデータ \verb@WDATA@ の逆変換 $A$ に対して, 
実空間のベクトル $(u,v)$ を次のように定義する. 
\begin{equation}
(u,v)\equiv
\left(\frac1{\cos\varphi}\frac{\partial A}{\partial\lambda},
 \frac{\partial A}{\partial\varphi}\right)
\end{equation}

\item 呼び出し方法

    \begin{verbatim}
      CALL DS1S1V
     O         ( GDATA , GDATB,
     I           WDATA , WDATB,
     I           HFUNC          )
   \end{verbatim}

\item 備考

(a) HFUNC の 1 文字目が空白のとき, 出力は (\verb@GDATA,GDATB@)$=(u,v)$ 
となる. ただし, AGCM5 コードではこのような演算を行なっていない. 
HFUNC の 1 文字目が空白ではないとき, 出力は 
(\verb@GDATA,GDATB@)$=(u\cos\varphi,v\cos\varphi)$ となる. 

\end{enumerate}
