| Class | eee_mpi_module |
| In: |
libsrc/eee_mpi_module/eee_mpi_module.f90
|
| Authors: | Shin-ichi Takehiro, Youhei SASAKI |
| Version: | $Id: eee_mpi_module.f90 598 2013-08-20 03:23:44Z takepiro $ |
| Copyright&License: | See COPYRIGHT |
spml/eee_module モジュールは周期境界条件の下での 3 次元矩形領域の 流体運動をスペクトル法により数値計算するための Fortran90 関数を 提供する.
内部で ISPACK/P3PACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法については ISPACK/P3PACK のマニュアルを参照されたい.
| eef_ : | スペクトルデータ (第 1,2 3 次元がそれぞれ Z,Y,X 方向波数(X について分割配置)) |
| ee2f : | 2 つのスペクトルデータの並んだもの |
| zxv_ : | 3 次元格子点データ (第 1,2 3 次元がそれぞれ Z,X,Y 方向の格子点(Y について分割配置) |
| xv_ : | XY 方向 2 次元格子点データ, zv_ : YZ 方向 2 次元格子点データ |
| zx_ : | XZ 方向 2 次元格子点データ |
| x_ : | X 方向 1 次元格子点データ, v_ : Y 方向 1 次元格子点データ |
| z_ : | Z 方向 1 次元格子点データ |
_eef :: スペクトルデータ _eef_eef :: 2 つのスペクトルデータ _ee2f :: 2 つのスペクトルデータの並んだもの _zxv :: 3 次元格子点データ _x :: X 方向 1 次元格子点データ _v :: Y 方向 1 次元格子点データ.
| eee_Initial : | スペクトル変換の格子点数, 切断波数の設定 |
| eee_ChangeResolution : | 解像度設定の変更 |
| lf_l : | X 方向波数の位置情報 |
| x_X, v_Y, z_Z : | 格子点座標(X,Y座標)を格納した 1 次元配列 |
| x_X_Weight, v_Y_Weight, z_Z_Weight : | 重み座標を格納した 1 次元配列 |
| zxv_X, zxv_Y, zxv_Z : | 格子点データの XYZ 座標(X,Y,Z) (格子点データ型 3 次元配列) |
| zxv_eef : | スペクトルデータから格子データへの変換 |
| eef_zxv : | 格子データからスペクトルデータへの変換 |
| xyz_zxv : | 分散格子点データの集積 |
| eee2_ee2f : | 分散スペクトルデータの集積 |
| ee2f_eee2 : | 集積スペクトルデータの分散 |
| eef_Lapla_eef : | スペクトルデータにラプラシアンを作用させる |
| eef_LaplaInv_eef : | スペクトルデータにラプラシアンの逆変換を作用させる |
| eef_Dx_eef : | スペクトルデータに X 微分を作用させる |
| eef_Dy_eef : | スペクトルデータに Y 微分を作用させる |
| eef_Dz_eef : | スペクトルデータに Z 微分を作用させる |
| ee2f_RotVelxVor_ee2f : | Euler 方程式の非線形項を計算する |
| eef_VorFromZeta_ee2f : | 渦度 2 成分(ζ_1, ζ_2)ら渦度の 1 成分を計算する |
| eef_VelFromZeta_ee2f : | 渦度 2 成分(ζ_1, ζ_2)ら速度の 1 成分を計算する |
| ee2f_ZetaFromVor_eef_eef_eef : | 渦度から渦度 2 成分(ζ_1, ζ_2)を計算する |
| IntZXV_zxv, AvrZXV_zxv : | 3 次元格子点データの全領域積分および平均 |
| z_IntXV_zxv, z_AvrXV_zxv : | 3 次元格子点データの X,Y 方向積分および平均 |
| x_IntZV_zxv, x_AvrZV_zxv : | 3 次元格子点データの Y,Z 方向積分および平均 |
| y_IntZX_zxv, y_AvrZX_zxv : | 3 次元格子点データの Z,X 方向積分および平均 |
| zv_IntX_zxv, zv_AvrX_zxv : | 3 次元格子点データの X 方向積分および平均 |
| zx_IntY_zxv, zx_AvrY_zxv : | 3 次元格子点データの Y 方向積分および平均 |
| vx_IntZ_zxv, vx_AvrZ_zxv : | 3 次元格子点データの Z 方向積分および平均 |
| IntXV_xv, AvrXV_xv : | 2 次元(XY)格子点データの X,Y 方向積分および平均 |
| v_IntX_xv, v_AvrX_xv : | 2 次元(XY)格子点データの X 方向積分および平均 |
| x_IntV_xv, x_AvrV_xv : | 2 次元(XY)格子点データの Y 方向積分および平均 |
| IntZX_zx, AvrZX_zx : | 2 次元(ZX)格子点データの Z,X 方向積分および平均 |
| z_IntX_zx, z_AvrX_zx : | 2 次元(ZX)格子点データの X 方向積分および平均 |
| x_IntZ_zx, x_AvrZ_zx : | 2 次元(ZX)格子点データの Z 方向積分および平均 |
| IntZV_zv, AvrZV_zv : | 2 次元(YZ)格子点データの Y,Z 方向積分および平均 |
| v_IntZ_zv, v_AvrZ_zv : | 2 次元(YZ)格子点データの Z 方向積分および平均 |
| z_IntV_zv, z_AvrV_zv : | 2 次元(YZ)格子点データの Y 方向積分および平均 |
| IntX_x, AvrX_x : | 1 次元(X)格子点データの X 方向積分および平均 |
| IntV_v, AvrV_v : | 1 次元(Y)格子点データの Y 方向積分および平均 |
| IntZ_z, AvrZ_z : | 1 次元(Z)格子点データの Z 方向積分および平均 |
| EnergyHelicityFromZeta_ee2f : | 全エネルギーと全ヘリシティーを計算する. |
| ESpectralFromZeta : | エネルギースペクトルを計算する. |
| Function : | |||
| AvrV_v : | real(8)
| ||
| v : | real(8), dimension(js(ip):je(ip)), intent(IN)
|
1 次元(Y)格子点データの Y 方向平均
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.
function AvrV_v(v)
!
! 1 次元(Y)格子点データの Y 方向平均
!
! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し,
! y_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(js(ip):je(ip)), intent(IN) :: v
!(in) 1 次元格子点データ
real(8) :: AvrV_v !(out) 平均値
real(8) :: Length, LengthTMP
integer :: ierr
! 作業変数
LengthTMP = sum(v_Y_weight)
CALL MPI_ALLREDUCE(LengthTMP,Length,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
AvrV_v = IntV_v(v)/Length
end function AvrV_v
| Function : | |||
| AvrXV_xv : | real(8)
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元格子点データの全領域平均
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算し, x_X_Weight*y_Y_Weight の総和で割ることで平均している.
function AvrXV_xv(xv)
!
! 2 次元格子点データの全領域平均
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた
! 総和を計算し, x_X_Weight*y_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元格子点データ
real(8) :: AvrXV_xv
!(out) 平均値
real(8) :: Area, AreaTMP
integer :: ierr
! 作業変数
AreaTMP = sum(x_X_weight)*sum(v_Y_weight)
CALL MPI_ALLREDUCE(AreaTMP,Area,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
AvrXV_xv = IntXV_xv(xv)/Area
end function AvrXV_xv
| Function : | |||
| AvrX_x : | real(8)
| ||
| x : | real(8), dimension(0:im-1), intent(IN)
|
1 次元(X)格子点データの X 方向平均
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し, x_X_Weight の総和で割ることで平均している.
function AvrX_x(x)
!
! 1 次元(X)格子点データの X 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し,
! x_X_Weight の総和で割ることで平均している.
!
real(8), dimension(0:im-1), intent(IN) :: x !(in) 1 次元格子点データ
real(8) :: AvrX_x !(out) 平均値
AvrX_x = IntX_x(x)/sum(x_X_weight)
end function AvrX_x
| Function : | |||
| AvrZV_zv : | real(8)
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZV)格子点データの全領域平均
実際には格子点データ各点毎に z_Z_Weight, y_Y_Weight をかけた 総和を計算し, z_Z_Weight*v_Y_Weight の総和で割ることで平均している.
function AvrZV_zv(zv)
!
! 2 次元(ZV)格子点データの全領域平均
!
! 実際には格子点データ各点毎に z_Z_Weight, y_Y_Weight をかけた
! 総和を計算し, z_Z_Weight*v_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元(ZY)格子点データ
real(8) :: AvrZV_zv
!(out) 平均値
real(8) :: Area, AreaTMP
integer :: ierr
! 作業変数
AreaTMP = sum(z_Z_weight)*sum(v_Y_weight)
CALL MPI_ALLREDUCE(AreaTMP,Area,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
AvrZV_zv = IntZV_zv(zv)/Area
end function AvrZV_zv
| Function : | |||
| AvrZXV_zxv : | real(8)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元格子点データの全領域平均.
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight, z_Z_Weight を かけた総和を計算し, x_X_Weight*y_Y_Weight*z_Z_Weight の総和で割る ことで平均している.
function AvrZXV_zxv(zxv)
!
! 2 次元格子点データの全領域平均.
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight, z_Z_Weight を
! かけた総和を計算し, x_X_Weight*y_Y_Weight*z_Z_Weight の総和で割る
! ことで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 3 次元格子点データ
real(8) :: AvrZXV_zxv
!(out) 積分値
real(8) :: Vol, VolTMP
integer :: ierr
! 作業変数
VolTMP=sum(x_X_weight)*sum(v_Y_weight)*sum(z_Z_weight)
CALL MPI_ALLREDUCE(VolTMP,Vol,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
AvrZXV_zxv = IntZXV_zxv(zxv)/Vol
end function AvrZXV_zxv
| Function : | |||
| AvrZX_zx : | real(8)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの全領域平均
実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた 総和を計算し, x_X_Weight*z_Z_Weight の総和で割ることで平均している.
function AvrZX_zx(zx)
!
! 2 次元(ZX)格子点データの全領域平均
!
! 実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた
! 総和を計算し, x_X_Weight*z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元(ZX)格子点データ
real(8) :: AvrZX_zx
!(out) 平均値
AvrZX_zx = IntZX_zx(zx)/(sum(x_X_weight)*sum(z_Z_weight))
end function AvrZX_zx
| Function : | |||
| AvrZ_z : | real(8)
| ||
| z : | real(8), dimension(0:km-1), intent(IN)
|
1 次元(Z)格子点データの Z 方向平均
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し, z_Z_Weight の総和で割ることで平均している.
function AvrZ_z(z)
!
! 1 次元(Z)格子点データの Z 方向平均
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し,
! z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1), intent(IN) :: z !(in) 1 次元格子点データ
real(8) :: AvrZ_z !(out) 平均値
AvrZ_z = IntZ_z(z)/sum(z_Z_weight)
end function AvrZ_z
| Subroutine : | |||
| esp : | real(8), dimension(:), intent(OUT)
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in)
|
渦度成分(ζ_1, ζ_2)からエネルギースペクトルを計算する.
* esp のサイズで求められる波数範囲が定められる
* esp の総和が EFFromZeta で求められるエネルギー
(全領域平均値)に等しい
subroutine ESpectralFromZeta(esp,ee2f)
!
! 渦度成分(ζ_1, ζ_2)からエネルギースペクトルを計算する.
!
! * esp のサイズで求められる波数範囲が定められる
! * esp の総和が EFFromZeta で求められるエネルギー
! (全領域平均値)に等しい
!
real(8), dimension(:), intent(OUT) :: esp
! エネルギースペクトル
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in) :: ee2f
! 渦度成分(ζ_1, ζ_2)
integer kmax
! 作業変数
real(8), allocatable :: wesp(:)
kmax=size(esp)
allocate(wesp(kmax))
call p3empt(nm,mm,lm,kmax,ee2f,esp,wesp)
deallocate(wesp)
end subroutine ESpectralFromZeta
| Function : | |||
| EnergyHelicityFromZeta_ee2f : | real(8), dimension(2)
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in)
|
渦度成分(ζ_1, ζ_2)から全領域平均エネルギーとヘリシティーを計算する.
function EnergyHelicityFromZeta_ee2f(ee2f)
!
! 渦度成分(ζ_1, ζ_2)から全領域平均エネルギーとヘリシティーを計算する.
!
real(8), dimension(2) :: EnergyHelicityFromZeta_ee2f
! エネルギーヘリシティー
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in) :: ee2f
! 渦度成分(ζ_1, ζ_2)
real(8) :: E, H ! エネルギー, ヘリシティー
call p3cmsv(nm,mm,lm,ee2f,E,H)
EnergyHelicityFromZeta_ee2f(1) = E
EnergyHelicityFromZeta_ee2f(2) = H
end function EnergyHelicityFromZeta_ee2f
| Function : | |||
| IntV_v : | real(8)
| ||
| v : | real(8), dimension(js(ip):je(ip))
|
1 次元(Y)格子点データの Y 方向積分
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
function IntV_v(v)
!
! 1 次元(Y)格子点データの Y 方向積分
!
! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
!
real(8), dimension(js(ip):je(ip)) :: v !(in) 1 次元格子点データ
real(8) :: IntV_v !(out) 積分値
real(8) :: IntVTMP
integer :: ierr
IntV_v = sum(v*v_Y_Weight)
IntVTMP=IntV_v
CALL MPI_ALLREDUCE(IntVTMP,IntV_v,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function IntV_v
| Function : | |||
| IntXV_xv : | real(8)
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元(XY)格子点データの全領域積分
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算している.
function IntXV_xv(xv)
!
! 2 次元(XY)格子点データの全領域積分
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元(YX)格子点データ
real(8) :: IntXV_xv
!(out) 積分値
real(8) :: IntXVTMP
integer :: i, j
integer :: ierr
! 作業変数
IntXV_xv = 0.0d0
do j=js(ip),je(ip)
do i=0,im-1
IntXV_xv = IntXV_xv + xv(i,j) * v_Y_Weight(j) * x_X_Weight(i)
enddo
enddo
IntXVTMP=IntXV_xv
CALL MPI_ALLREDUCE(IntXVTMP,IntXV_xv,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function IntXV_xv
| Function : | |||
| IntX_x : | real(8)
| ||
| x : | real(8), dimension(0:im-1)
|
1 次元(X)格子点データの X 方向積分
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
function IntX_x(x)
!
! 1 次元(X)格子点データの X 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
!
real(8), dimension(0:im-1) :: x !(in) 1 次元格子点データ
real(8) :: IntX_x !(out) 積分値
IntX_x = sum(x*x_X_Weight)
end function IntX_x
| Function : | |||
| IntZV_zv : | real(8)
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZY)格子点データの全領域積分および平均.
実際には格子点データ各点毎に z_Z_Weight, y_Y_Weight をかけた 総和を計算している.
function IntZV_zv(zv)
!
! 2 次元(ZY)格子点データの全領域積分および平均.
!
! 実際には格子点データ各点毎に z_Z_Weight, y_Y_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元(ZY)格子点データ
real(8) :: IntZV_zv
!(out) 積分値
real(8) :: IntZVTMP
integer :: j, k
integer :: ierr
! 作業変数
IntZV_zv = 0.0d0
do j=js(ip),je(ip)
do k=0,km-1
IntZV_zv = IntZV_zv + zv(k,j) * v_Y_Weight(j) * z_Z_Weight(k)
enddo
enddo
IntZVTMP=IntZV_zv
CALL MPI_ALLREDUCE(IntZVTMP,IntZV_zv,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function IntZV_zv
| Function : | |||
| IntZXV_zxv : | real(8)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの全領域積分
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight, z_Z_Weight をかけた 総和を計算している.
function IntZXV_zxv(zxv)
!
! 3 次元格子点データの全領域積分
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight, z_Z_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 3 次元格子点データ
real(8) :: IntZXV_zxv
!(out) 積分値
real(8) :: IntZXVTMP
integer :: i, j, k
integer :: ierr
! 作業変数
IntZXV_zxv = 0.0d0
do j=js(ip),je(ip)
do i=0,im-1
do k=0,km-1
IntZXV_zxv = IntZXV_zxv + zxv(k,i,j) * z_Z_Weight(k) * v_Y_Weight(j) * x_X_Weight(i)
enddo
enddo
end do
IntZXVTMP=IntZXV_zxv
CALL MPI_ALLREDUCE(IntZXVTMP,IntZXV_zxv,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function IntZXV_zxv
| Function : | |||
| IntZX_zx : | real(8)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの全領域積分および平均.
実際には格子点データ各点毎に z_Z_Weight, x_X_Weight をかけた 総和を計算している.
function IntZX_zx(zx)
!
! 2 次元(ZX)格子点データの全領域積分および平均.
!
! 実際には格子点データ各点毎に z_Z_Weight, x_X_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元(ZX)格子点データ
real(8) :: IntZX_zx
!(out) 積分値
integer :: i, k
! 作業変数
IntZX_zx = 0.0d0
do i=0,im-1
do k=0,km-1
IntZX_zx = IntZX_zx + zx(k,i) * x_X_Weight(i) * z_Z_Weight(k)
enddo
enddo
end function IntZX_zx
| Function : | |||
| IntZ_z : | real(8)
| ||
| z : | real(8), dimension(0:km-1)
|
1 次元(Z)格子点データの Z 方向積分
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
function IntZ_z(z)
!
! 1 次元(Z)格子点データの Z 方向積分
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
!
real(8), dimension(0:km-1) :: z !(in) 1 次元格子点データ
real(8) :: IntZ_z !(out) 積分値
IntZ_z = sum(z*z_Z_Weight)
end function IntZ_z
| Function : | |||
| ee2f_RotVelxVor_ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip))
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in)
|
渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから Euler 方程式の非線形項
▽x(u x ω)
の 2 成分を計算する.
(ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
function ee2f_RotVelxVor_ee2f(ee2f)
!
! 渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから Euler 方程式の非線形項
!
! ▽x(u x ω)
!
! の 2 成分を計算する.
!
! (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
!
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)) :: ee2f_RotVelxVor_ee2f
!(out) 非線形項のスペクトルデータの 2 つの成分
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in) :: ee2f
!(in) 入力スペクトルデータ. 渦度の 2 成分(ζ_1, ζ_2)
call p3emnl(nm,mm,lm,km,jm,im,ee2f,ee2f_RotVelxVor_ee2f, wg,itk,tk,itj,tj,iti,ti)
end function ee2f_RotVelxVor_ee2f
| Function : | |||
| ee2f_ZetaFromVor_eef_eef_eef : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip))
| ||
| eef_1 : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
| ||
| eef_2 : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
| ||
| eef_3 : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
渦度のスペクトルから渦度 2 成分(ζ_1, ζ_2)を計算する. (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
function ee2f_ZetaFromVor_eef_eef_eef(eef_1,eef_2,eef_3)
!
! 渦度のスペクトルから渦度 2 成分(ζ_1, ζ_2)を計算する.
!
! (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
!
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)) :: ee2f_ZetaFromVor_eef_eef_eef
!(out) 渦度の 2 成分(ζ_1, ζ_2)
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef_1, eef_2, eef_3
!(in) 渦度スペクトルデータの各成分
integer :: l,m,n
ee2f_ZetaFromVor_eef_eef_eef = 0.0D0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
if ( l /= 0 ) then
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_2(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_3(n,m,lf_l(l))
elseif( m /= 0 ) then
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_3(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_1(n,m,lf_l(l))
else
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_1(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_2(n,m,lf_l(l))
endif
enddo
enddo
enddo
do l=-le(ip),-ls(ip)
do m=-mm,mm
do n=-nm,nm
if ( l /= 0 ) then
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_2(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_3(n,m,lf_l(l))
elseif( m /= 0 ) then
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_3(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_1(n,m,lf_l(l))
else
ee2f_ZetaFromVor_eef_eef_eef(n,m,1,lf_l(l)) = eef_1(n,m,lf_l(l))
ee2f_ZetaFromVor_eef_eef_eef(n,m,2,lf_l(l)) = eef_2(n,m,lf_l(l))
endif
enddo
enddo
enddo
end function ee2f_ZetaFromVor_eef_eef_eef
| Function : | |||
| ee2f_eee2 : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip))
| ||
| eee2 : | real(8), dimension(-nm:nm,-mm:mm,-lm:lm,2), intent(IN)
|
スペクトルデータを分散する
function ee2f_eee2(eee2)
!
! スペクトルデータを分散する
!
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)) :: ee2f_eee2
!(out) スペクトルデータ
real(8), dimension(-nm:nm,-mm:mm,-lm:lm,2), intent(IN) :: eee2
!(in) 分散スペクトルデータ
! 作業データ
integer :: l
do l=ls(ip),le(ip)
ee2f_eee2(:,:,:,l-ls(ip)+1) = eee2(:,:,l,:)
ee2f_eee2(:,:,:,2*lc(ip)-(l-ls(ip))) = eee2(:,:,-l,:)
enddo
end function ee2f_eee2
| Function : | |||
| eee2_ee2f : | real(8), dimension(-nm:nm,-mm:mm,-lm:lm,2)
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)),intent(IN)
|
分散スペクトルデータを集積する
function eee2_ee2f(ee2f)
!
! 分散スペクトルデータを集積する
!
real(8), dimension(-nm:nm,-mm:mm,-lm:lm,2) :: eee2_ee2f
!(out) スペクトルデータ
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)),intent(IN) :: ee2f
!(in) 分散スペクトルデータ
real(8), dimension(-nm:nm,-mm:mm,2,0:2*sum(lc)-1) :: ee2e
! 作業データ
integer, dimension(0:np-1) :: nm2ls
integer :: ierr, iip
integer :: l
nm2ls(0) = 0
do iip=1,np-1
nm2ls(iip) = nm2ls(iip-1) + (2*nm+1)*(2*mm+1)*2*2*lc(iip-1)
enddo
call MPI_ALLGATHERV(ee2f,(2*nm+1)*(2*mm+1)*2*2*lc(ip),MPI_REAL8, ee2e,(2*nm+1)*(2*mm+1)*2*2*lc,nm2ls, MPI_REAL8,MPI_COMM_WORLD,IERR)
do l=ls(0),le(0)
eee2_ee2f(:,:,l,:) = ee2e(:,:,:,l-ls(0))
if ( l /= 0 ) then
eee2_ee2f(:,:,-l,:) = ee2e(:,:,:,2*lc(0)-(l-ls(0)+1))
endif
enddo
do iip=1,np-1
do l=ls(iip),le(iip)
eee2_ee2f(:,:,l,:) = ee2e(:,:,:,2*sum(lc(0:iip-1))+(l-ls(iip)))
eee2_ee2f(:,:,-l,:) = ee2e(:,:,:,2*sum(lc(0:iip))-(l-ls(iip)+1))
enddo
enddo
end function eee2_ee2f
| Subroutine : | |
| id : | integer, intent(in) |
解像度設定の変更. eee_Initial で設定する際に かえってくるオプショナル引数 id の値を用いる.
subroutine eee_ChangeResolution(id)
!
! 解像度設定の変更. eee_Initial で設定する際に
! かえってくるオプショナル引数 id の値を用いる.
!
integer, intent(in) :: id
if (id .gt. nparams .or. id .lt. 1) then
write(*,*)"id is invalid"
end if
im = params(id)%im
jm = params(id)%jm
km = params(id)%km
lm = params(id)%lm
mm = params(id)%mm
nm = params(id)%nm
ls => params(id)%ls
le => params(id)%le
lc => params(id)%lc
js => params(id)%js
je => params(id)%je
jc => params(id)%jc
itk => params(id)%itk
tk => params(id)%tk
itj => params(id)%itj
tj => params(id)%tj
iti => params(id)%iti
ti => params(id)%ti
x_X => params(id)%x_X
v_Y => params(id)%v_Y
z_Z => params(id)%z_Z
x_X_Weight => params(id)%x_X_Weight
v_Y_Weight => params(id)%v_Y_Weight
z_Z_Weight => params(id)%z_Z_Weight
zxv_X => params(id)%zxv_X
zxv_Y => params(id)%zxv_Y
zxv_Z => params(id)%zxv_Z
w => params(id)%w
ws => params(id)%ws
wg => params(id)%wg
sgwork => params(id)%sgwork
end subroutine eee_ChangeResolution
| Subroutine : | |||
| i : | integer,intent(in)
| ||
| j : | integer,intent(in)
| ||
| k : | integer,intent(in)
| ||
| l : | integer,intent(in)
| ||
| m : | integer,intent(in)
| ||
| n : | integer,intent(in)
| ||
| id : | integer, intent(out), optional
|
スペクトル変換の格子点数, 波数を設定する. 領域の範囲は [0,2pi]x[0,2pi]x[0,2pi] に決め打ち
他の関数や変数を呼ぶ前に, 最初にこのサブルーチンを呼んで 初期設定をしなければならない.
オプショナル引数 id を用いて異なる解像度, 領域を同時に 扱うことができる. eee_Initial を解像度, 領域ごとに呼んで 引数 id をキープし, eee_ChangeResolution で切替える.
subroutine eee_mpi_Initial(i,j,k,l,m,n,id)
!
! スペクトル変換の格子点数, 波数を設定する.
! 領域の範囲は [0,2pi]x[0,2pi]x[0,2pi] に決め打ち
!
! 他の関数や変数を呼ぶ前に, 最初にこのサブルーチンを呼んで
! 初期設定をしなければならない.
!
! オプショナル引数 id を用いて異なる解像度, 領域を同時に
! 扱うことができる. eee_Initial を解像度, 領域ごとに呼んで
! 引数 id をキープし, eee_ChangeResolution で切替える.
!
integer,intent(in) :: i ! 格子点数(X)
integer,intent(in) :: j ! 格子点数(Y)
integer,intent(in) :: k ! 格子点数(Z)
integer,intent(in) :: l ! 切断波数(X)
integer,intent(in) :: m ! 切断波数(Y)
integer,intent(in) :: n ! 切断波数(X)
integer, intent(out), optional :: id ! 解像度領域情報番号
character(len=3) cid
integer :: ii, jj, kk
integer :: lls, lle, llc, jjs, jje, jjc
integer :: iip
integer :: lp, jp
integer :: ierr
im = i
jm = j
km = k
lm = l
mm = m
nm = n
if ( nparams .ge. nparams_max ) then
call MessageNotify('W','eee_initial', 'too many call of eee_Initial, nothing was done.')
if ( present(id) ) id = -1
return
end if
CALL MPI_COMM_RANK(MPI_COMM_WORLD,IP,IERR)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NP,IERR)
lp=lm/np+1
lls=lp*ip
lle=min(lp*(ip+1)-1,lm)
if(lle.ge.lls) then
llc=lle-lls+1
else
llc=0
lls=0
lle=0
end if
jp=(jm-1)/np+1
jjs=jp*ip
jje=min(jp*(ip+1)-1,jm-1)
if(jje.ge.jjs) then
jjc=jje-jjs+1
else
jjc=0
jjs=0
jje=0
end if
nparams = nparams + 1
params(nparams)%im = im
params(nparams)%jm = jm
params(nparams)%km = km
params(nparams)%lm = lm
params(nparams)%mm = mm
params(nparams)%nm = nm
allocate(params(nparams)%ls(0:np-1))
allocate(params(nparams)%le(0:np-1))
allocate(params(nparams)%lc(0:np-1))
allocate(params(nparams)%js(0:np-1))
allocate(params(nparams)%je(0:np-1))
allocate(params(nparams)%jc(0:np-1))
allocate(params(nparams)%itk(5))
allocate(params(nparams)%itj(5))
allocate(params(nparams)%iti(5))
allocate(params(nparams)%tk(km*2))
allocate(params(nparams)%tj(jm*2))
allocate(params(nparams)%ti(im*2))
allocate(params(nparams)%w(km*max(im*((jm-1)/np+1),jm*2*(lm/np+1))))
allocate(params(nparams)%ws((2*mm+1)*(2*nm+1)*2*2*(lm+1)))
allocate(params(nparams)%wg(4*km*max(im*((jm-1)/np+1),jm*2*(lm/np+1))))
allocate(params(nparams)%sgwork(km*max(im*((jm-1)/np+1),jm*2*(lm/np+1))))
allocate(params(nparams)%x_X(0:im-1))
allocate(params(nparams)%x_X_Weight(0:im-1))
allocate(params(nparams)%v_Y(jjs:jje))
allocate(params(nparams)%v_Y_Weight(jjs:jje))
allocate(params(nparams)%z_Z(0:km-1))
allocate(params(nparams)%z_Z_Weight(0:km-1))
allocate(params(nparams)%zxv_X(0:km-1,0:im-1,jjs:jje))
allocate(params(nparams)%zxv_Y(0:km-1,0:im-1,jjs:jje))
allocate(params(nparams)%zxv_Z(0:km-1,0:im-1,jjs:jje))
call eee_ChangeResolution(nparams)
call p3init(km,jm,im,itk,tk,itj,tj,iti,ti)
do iip=0,np-1
lp=lm/np+1
ls(iip)=lp*iip
le(iip)=min(lp*(iip+1)-1,lm)
if(le(iip).ge.ls(iip)) then
lc(iip)=le(iip)-ls(iip)+1
else
lc(iip)=0
ls(iip)=0
le(iip)=0
end if
jp=(jm-1)/np+1
js(iip)=jp*iip
je(iip)=min(jp*(iip+1)-1,jm-1)
if(je(iip).ge.js(iip)) then
jc(iip)=je(iip)-js(iip)+1
else
jc(iip)=0
js(iip)=0
je(iip)=0
end if
enddo
do ii=0,im-1
x_X(ii) = 2*pi/im*ii
enddo
x_X_Weight = 2*pi/im
do jj=js(ip),je(ip)
v_Y(jj) = 2*pi/jm*jj
enddo
v_Y_Weight = 2*pi/jm
do kk=0,km-1
z_Z(kk) = 2*pi/km*kk
enddo
z_Z_Weight = 2*pi/km
zxv_X = spread(spread(x_X,1,km),3,jc(ip))
zxv_Y = spread(spread(v_Y,1,im),1,km)
zxv_Z = spread(spread(z_Z,2,im),3,jc(ip))
if ( present(id) ) id = nparams
write(cid,'(I3)') nparams
call MessageNotify('M','eee_mpi_initial','eee_mpi_module is initialized')
call MessageNotify('M','eee_mpi_initial', 'Resolution ID is '//trim(adjustl(cid)))
end subroutine eee_mpi_Initial
| Function : | |||
| eef_Dx_eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
入力スペクトルデータに X 微分(∂x)を作用する.
スペクトルデータの X 微分とは, 対応する格子点データに X 微分を 作用させたデータのスペクトル変換のことである.
実際にはスペクトルデータに X 方向波数 l をかけて 実部 <-> 虚部成分に入れ換える計算を行っている.
function eef_Dx_eef(eef)
!
! 入力スペクトルデータに X 微分(∂x)を作用する.
!
! スペクトルデータの X 微分とは, 対応する格子点データに X 微分を
! 作用させたデータのスペクトル変換のことである.
!
! 実際にはスペクトルデータに X 方向波数 l をかけて
! 実部 <-> 虚部成分に入れ換える計算を行っている.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_Dx_eef
!(out) スペクトルデータの X 微分
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) 入力スペクトルデータ
integer l,m,n
! 作業変数
eef_Dx_eef = 0.0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dx_eef(n,m,lf_l(l)) = -l*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
do l=-le(ip),-ls(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dx_eef(n,m,lf_l(l)) = -l*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
end function eef_Dx_eef
| Function : | |||
| eef_Dy_eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
入力スペクトルデータに Y 微分(∂y)を作用する.
スペクトルデータの Y 微分とは, 対応する格子点データに Y 微分を 作用させたデータのスペクトル変換のことである.
実際にはスペクトルデータに Y 方向波数 m をかけて 実部 <-> 虚部成分に入れ換える計算を行っている.
function eef_Dy_eef(eef)
!
! 入力スペクトルデータに Y 微分(∂y)を作用する.
!
! スペクトルデータの Y 微分とは, 対応する格子点データに Y 微分を
! 作用させたデータのスペクトル変換のことである.
!
! 実際にはスペクトルデータに Y 方向波数 m をかけて
! 実部 <-> 虚部成分に入れ換える計算を行っている.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_Dy_eef
!(out) スペクトルデータの X 微分
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) 入力スペクトルデータ
integer l,m,n
! 作業変数
eef_Dy_eef = 0.0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dy_eef(n,m,lf_l(l)) = -m*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
do l=-le(ip),-ls(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dy_eef(n,m,lf_l(l)) = -m*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
end function eef_Dy_eef
| Function : | |||
| eef_Dz_eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
入力スペクトルデータに Z 微分(∂z)を作用する.
スペクトルデータの Z 微分とは, 対応する格子点データに Z 微分を 作用させたデータのスペクトル変換のことである.
実際にはスペクトルデータに Z 方向波数 n をかけて 実部 <-> 虚部成分に入れ換える計算を行っている.
function eef_Dz_eef(eef)
!
! 入力スペクトルデータに Z 微分(∂z)を作用する.
!
! スペクトルデータの Z 微分とは, 対応する格子点データに Z 微分を
! 作用させたデータのスペクトル変換のことである.
!
! 実際にはスペクトルデータに Z 方向波数 n をかけて
! 実部 <-> 虚部成分に入れ換える計算を行っている.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_Dz_eef
!(out) スペクトルデータの X 微分
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) 入力スペクトルデータ
integer l,m,n
! 作業変数
eef_Dz_eef = 0.0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dz_eef(n,m,lf_l(l)) = -n*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
do l=-le(ip),-ls(ip)
do m=-mm,mm
do n=-nm,nm
eef_Dz_eef(n,m,lf_l(l)) = -n*eef(-n,-m,lf_l(-l))
enddo
enddo
enddo
end function eef_Dz_eef
| Function : | |||
| eef_LaplaInv_eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
入力スペクトルデータに逆ラプラシアン(∂xx+∂yy+∂zz)**(-1)を作用する.
スペクトルデータの逆ラプラシアンとは, 対応する格子点データに 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
実際にはスペクトルデータに全波数 (l**2 + m**2 + n**2) で割る 計算を行っている. l=m=n=0 成分には 0 を代入している.
function eef_LaplaInv_eef(eef)
!
! 入力スペクトルデータに逆ラプラシアン(∂xx+∂yy+∂zz)**(-1)を作用する.
!
! スペクトルデータの逆ラプラシアンとは, 対応する格子点データに
! 逆ラプラシアンを作用させたデータのスペクトル変換のことである.
!
! 実際にはスペクトルデータに全波数 (l**2 + m**2 + n**2) で割る
! 計算を行っている. l=m=n=0 成分には 0 を代入している.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_LaplaInv_eef
!(out) スペクトルデータの逆ラプラシアン
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) スペクトルデータ
integer l,m,n
eef_LaplaInv_eef = 0.0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
if ( l.ne.0 .or. m.ne.0 .or. n.ne.0 ) then
eef_LaplaInv_eef(n,m,lf_l(l)) = -eef(n,m,lf_l(l))/(l**2+m**2+n**2)
eef_LaplaInv_eef(n,m,lf_l(-l)) = -eef(n,m,lf_l(-l))/(l**2+m**2+n**2)
endif
enddo
enddo
enddo
end function eef_LaplaInv_eef
| Function : | |||
| eef_Lapla_eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
入力スペクトルデータにラプラシアン(∂xx+∂yy+∂zz)を作用する.
スペクトルデータのラプラシアンとは, 対応する格子点データに ラプラシアンを作用させたデータのスペクトル変換のことである.
実際にはスペクトルデータに全波数 (l**2 + m**2 + n**2) をかける 計算を行っている.
function eef_Lapla_eef(eef)
!
! 入力スペクトルデータにラプラシアン(∂xx+∂yy+∂zz)を作用する.
!
! スペクトルデータのラプラシアンとは, 対応する格子点データに
! ラプラシアンを作用させたデータのスペクトル変換のことである.
!
! 実際にはスペクトルデータに全波数 (l**2 + m**2 + n**2) をかける
! 計算を行っている.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_Lapla_eef
!(out) スペクトルデータのラプラシアン
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) 入力スペクトルデータ
integer l,m,n
! 作業変数
eef_Lapla_eef = 0.0
do l=ls(ip),le(ip)
do m=-mm,mm
do n=-nm,nm
eef_Lapla_eef(n,m,lf_l(l)) = -(l**2+m**2+n**2)*eef(n,m,lf_l(l))
eef_Lapla_eef(n,m,lf_l(-l)) = -(l**2+m**2+n**2)*eef(n,m,lf_l(-l))
enddo
enddo
enddo
end function eef_Lapla_eef
| Function : | |||
| eef_VelFromZeta_ee2f : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in)
| ||
| isw : | integer, intent(IN)
|
渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから速度スペクトルの 1 成分 を計算する. (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
function eef_VelFromZeta_ee2f(ee2f,isw)
!
! 渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから速度スペクトルの 1 成分
! を計算する.
!
! (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_VelFromZeta_ee2f
!(out) 非線形項のスペクトルデータの 2 つの成分
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in) :: ee2f
!(in) 入力スペクトルデータ. 渦度の 2 成分(ζ_1, ζ_2)
integer, intent(IN) :: isw
!(in) 出力する渦度の成分のインデックス(1,2,3)
call p3gmtu(nm,mm,lm,ee2f,eef_VelFromZeta_ee2f,isw)
end function eef_VelFromZeta_ee2f
| Function : | |||
| eef_VorFromZeta_ee2f : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| ee2f : | real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in)
| ||
| isw : | integer, intent(IN)
|
渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから渦度のスペクトルの 1 成分 を計算する. (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
function eef_VorFromZeta_ee2f(ee2f,isw)
!
! 渦度 2 成分(ζ_1, ζ_2)のスペクトルデータから渦度のスペクトルの 1 成分
! を計算する.
!
! (ζ_1, ζ_2) と渦度 ω との関係は ISPACK/P3PACK のマニュアルを参照
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_VorFromZeta_ee2f
!(out) 非線形項のスペクトルデータの 2 つの成分
real(8), dimension(-nm:nm,-mm:mm,2,2*lc(ip)), intent(in) :: ee2f
!(in) 入力スペクトルデータ. 渦度の 2 成分(ζ_1, ζ_2)
integer, intent(IN) :: isw
!(in) 出力する渦度の成分のインデックス(1,2,3)
call p3gmto(nm,mm,lm,ee2f,eef_VorFromZeta_ee2f,isw)
end function eef_VorFromZeta_ee2f
| Function : | |||
| eef_zxv : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(in)
|
格子データからスペクトルデータへ変換する.
function eef_zxv(zxv)
!
! 格子データからスペクトルデータへ変換する.
!
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)) :: eef_zxv
!(out) スペクトルデータ
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(in) :: zxv
!(in) 格子点データ
sgwork(1:im*jc(ip)*km) = reshape(zxv,(/im*jc(ip)*km/))
call p3gmsb(nm,mm,lm,km,jm,im,sgwork,w,itk,tk,itj,tj,iti,ti)
eef_zxv = reshape(sgwork(1:(2*nm+1)*(2*mm+1)*2*lc(ip)), (/2*nm+1,2*mm+1,2*lc(ip)/))
end function eef_zxv
| Function : | |||
| lf_l : | integer
| ||
| l : | integer, intent(IN)
|
スペクトルデータ eef(-nm:nm,-mm,mm,2*lc) での X 方向波数 L の位置情報(第 3 添え字)を調べる.
X 方向波数については ls,ls+1,… le, -le,-le+1,…,-ls の順に格納されている(ISPACK/P3PACK マニュアル参照のこと)
function lf_l(l)
!
! スペクトルデータ eef(-nm:nm,-mm,mm,2*lc) での
! X 方向波数 L の位置情報(第 3 添え字)を調べる.
!
! X 方向波数については ls,ls+1,... le, -le,-le+1,...,-ls
! の順に格納されている(ISPACK/P3PACK マニュアル参照のこと)
!
integer, intent(IN) :: l ! X 方向波数
integer :: lf_l ! スペクトルデータ第 3 添え字
if ( abs(l) < ls(ip) .OR. le(ip) < abs(l) ) then
call MessageNotify('E','l_l','Input wavenumber out of range')
endif
if ( l >= 0 ) then
lf_l = l-ls(ip)+1
else
lf_l = ls(ip)+2*lc(ip)-abs(l)
endif
end function lf_l
| Function : | |||
| v_AvrX_xv : | real(8), dimension(js(ip):je(ip))
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元格子点データの X 方向平均
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し, x_X_Weight の総和で割ることで平均している.
function v_AvrX_xv(xv)
!
! 2 次元格子点データの X 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し,
! x_X_Weight の総和で割ることで平均している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元格子点データ
real(8), dimension(js(ip):je(ip)) :: v_AvrX_xv
!(out) 平均された 1 次元(Y)格子点データ
v_AvrX_xv = v_IntX_xv(xv)/sum(x_X_weight)
end function v_AvrX_xv
| Function : | |||
| v_AvrZX_zxv : | real(8), dimension(js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X,Z 方向平均
実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた 総和を計算し, x_X_Weight*z_Z_Weight の総和で割ることで平均している.
function v_AvrZX_zxv(zxv)
!
! 3 次元格子点データの X,Z 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた
! 総和を計算し, x_X_Weight*z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(js(ip):je(ip)) :: v_AvrZX_zxv
!(out) 積分された 1 次元(Y)格子点データ
v_AvrZX_zxv = v_IntZX_zxv(zxv)/(sum(x_X_weight)*sum(z_Z_weight))
end function v_AvrZX_zxv
| Function : | |||
| v_AvrZ_zv : | real(8), dimension(js(ip):je(ip))
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZY)格子点データの Z 方向平均
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し, z_Z_Weight の総和で割ることで平均している.
function v_AvrZ_zv(zv)
!
! 2 次元(ZY)格子点データの Z 方向平均
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し,
! z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元(ZY)格子点データ
real(8), dimension(js(ip):je(ip)) :: v_AvrZ_zv
!(out) 平均された 1 次元(X)格子点データ
v_AvrZ_zv = v_IntZ_zv(zv)/sum(z_Z_weight)
end function v_AvrZ_zv
| Function : | |||
| v_IntX_xv : | real(8), dimension(js(ip):je(ip))
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元(XV)格子点データの X 方向積分
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
function v_IntX_xv(xv)
!
! 2 次元(XV)格子点データの X 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元(YX)格子点データ
real(8), dimension(js(ip):je(ip)) :: v_IntX_xv
!(out) 積分された 1 次元(Y)格子点データ
integer :: i
! 作業変数
v_IntX_xv = 0.0d0
do i=0,im-1
v_IntX_xv(:) = v_IntX_xv(:) + xv(i,:) * x_X_Weight(i)
enddo
end function v_IntX_xv
| Function : | |||
| v_IntZX_zxv : | real(8), dimension(js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X,Z 方向積分
実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた 総和を計算している.
function v_IntZX_zxv(zxv)
!
! 3 次元格子点データの X,Z 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight, z_Z_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(js(ip):je(ip)) :: v_IntZX_zxv
!(out) 積分された 1 次元(Y)格子点データ
integer :: i, k
! 作業変数
v_IntZX_zxv = 0.0d0
do i=0,im-1
do k=0,km-1
v_IntZX_zxv(:) = v_IntZX_zxv(:) + zxv(k,i,:) * x_X_Weight(i)* z_Z_Weight(k)
enddo
enddo
end function v_IntZX_zxv
| Function : | |||
| v_IntZ_zv : | real(8), dimension(js(ip):je(ip))
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZY)格子点データの Z 方向積分
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
function v_IntZ_zv(zv)
!
! 2 次元(ZY)格子点データの Z 方向積分
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元(ZY)格子点データ
real(8), dimension(js(ip):je(ip)) :: v_IntZ_zv
!(out) 積分された 1 次元(Y)格子点データ
integer :: k
! 作業変数
v_IntZ_zv = 0.0d0
do k=0,km-1
v_IntZ_zv(:) = v_IntZ_zv(:) + zv(k,:) * z_Z_Weight(k)
enddo
end function v_IntZ_zv
| Variable : | |||
| v_Y_Weight => null() : | real(8), dimension(:), pointer
|
| Function : | |||
| x_AvrV_xv : | real(8), dimension(0:im-1)
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元格子点データの Y 方向平均
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し, y_Y_Weight の総和で割ることで平均している.
function x_AvrV_xv(xv)
!
! 2 次元格子点データの Y 方向平均
!
! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算し,
! y_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元格子点データ
real(8), dimension(0:im-1) :: x_AvrV_xv
!(out) 平均された 1 次元(X)格子点データ
real(8) :: Length, LengthTMP
integer :: ierr
! 作業変数
LengthTMP = sum(v_Y_weight)
CALL MPI_ALLREDUCE(LengthTMP,Length,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
x_AvrV_xv = x_IntV_xv(xv)/Length
end function x_AvrV_xv
| Function : | |||
| x_AvrZV_zxv : | real(8), dimension(0:im-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Y,Z 方向平均
実際には格子点データ各点毎に y_Y_Weight, z_Z_Weight をかけた 総和を計算し, y_Y_Weight*z_Z_Weight の総和で割ることで平均している.
function x_AvrZV_zxv(zxv)
!
! 3 次元格子点データの Y,Z 方向平均
!
! 実際には格子点データ各点毎に y_Y_Weight, z_Z_Weight をかけた
! 総和を計算し, y_Y_Weight*z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:im-1) :: x_AvrZV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8) :: Area, AreaTMP
integer :: ierr
! 作業変数
AreaTMP = sum(z_Z_weight)*sum(v_Y_weight)
CALL MPI_ALLREDUCE(AreaTMP,Area,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
x_AvrZV_zxv = x_IntZV_zxv(zxv)/Area
end function x_AvrZV_zxv
| Function : | |||
| x_AvrZ_zx : | real(8), dimension(0:im-1)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの Z 方向平均
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し, z_Z_Weight の総和で割ることで平均している.
function x_AvrZ_zx(zx)
!
! 2 次元(ZX)格子点データの Z 方向平均
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算し,
! z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元(ZX)格子点データ
real(8), dimension(0:im-1) :: x_AvrZ_zx
!(out) 平均された 1 次元(X)格子点データ
x_AvrZ_zx = x_IntZ_zx(zx)/sum(z_Z_weight)
end function x_AvrZ_zx
| Function : | |||
| x_IntV_xv : | real(8), dimension(0:im-1)
| ||
| xv : | real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN)
|
2 次元(YX)格子点データの Y 方向積分
実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
function x_IntV_xv(xv)
!
! 2 次元(YX)格子点データの Y 方向積分
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
!
real(8), dimension(0:im-1,js(ip):je(ip)), intent(IN) :: xv
!(in) 2 次元(XV)格子点データ
real(8), dimension(0:im-1) :: x_IntV_xv
!(out) 積分された 1 次元(X)格子点データ
real(8), dimension(0:im-1) :: x_IntVTMP
integer :: j
integer :: ierr
! 作業変数
x_IntV_xv = 0.0d0
do j=js(ip),je(ip)
x_IntV_xv(:) = x_IntV_xv(:) + xv(:,j) * v_Y_Weight(j)
enddo
x_IntVTMP=x_IntV_xv
CALL MPI_ALLREDUCE(x_IntVTMP,x_IntV_xv,im,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function x_IntV_xv
| Function : | |||
| x_IntZV_zxv : | real(8), dimension(0:im-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Y,Z 方向積分
実際には格子点データ各点毎に y_Y_Weight, z_Z_Weight をかけた 総和を計算している.
function x_IntZV_zxv(zxv)
!
! 3 次元格子点データの Y,Z 方向積分
!
! 実際には格子点データ各点毎に y_Y_Weight, z_Z_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:im-1) :: x_IntZV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8), dimension(0:im-1) :: x_IntZVTMP
integer :: j, k
integer :: ierr
! 作業変数
x_IntZV_zxv = 0.0d0
do j=js(ip),je(ip)
do k=0,km-1
x_IntZV_zxv(:) = x_IntZV_zxv(:) + zxv(k,:,j) * v_Y_Weight(j)* z_Z_Weight(k)
enddo
enddo
x_IntZVTMP=x_IntZV_zxv
CALL MPI_ALLREDUCE(x_IntZVTMP,x_IntZV_zxv,im,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function x_IntZV_zxv
| Function : | |||
| x_IntZ_zx : | real(8), dimension(0:im-1)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの Z 方向積分
実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
function x_IntZ_zx(zx)
!
! 2 次元(ZX)格子点データの Z 方向積分
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた総和を計算している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元(ZX)格子点データ
real(8), dimension(0:im-1) :: x_IntZ_zx
!(out) 積分された 1 次元(Y)格子点データ
integer :: k
! 作業変数
x_IntZ_zx = 0.0d0
do k=0,km-1
x_IntZ_zx(:) = x_IntZ_zx(:) + zx(k,:) * z_Z_Weight(k)
enddo
end function x_IntZ_zx
| Variable : | |||
| x_X_Weight => null() : | real(8), dimension(:), pointer
|
| Function : | |||
| xv_AvrZ_zxv : | real(8), dimension(0:im-1,js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Z 方向平均
実際には格子点データ各点毎に z_Z_Weight をかけた 総和を計算し, z_Z_Weight の総和で割ることで平均している.
function xv_AvrZ_zxv(zxv)
!
! 3 次元格子点データの Z 方向平均
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた
! 総和を計算し, z_Z_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:im-1,js(ip):je(ip)) :: xv_AvrZ_zxv
!(out) 積分された 1 次元(YX)格子点データ
xv_AvrZ_zxv = xv_IntZ_zxv(zxv)/sum(z_Z_weight)
end function xv_AvrZ_zxv
| Function : | |||
| xv_IntZ_zxv : | real(8), dimension(0:im-1,js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Z 方向積分
実際には格子点データ各点毎に z_Z_Weight をかけた 総和を計算している.
function xv_IntZ_zxv(zxv)
!
! 3 次元格子点データの Z 方向積分
!
! 実際には格子点データ各点毎に z_Z_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:im-1,js(ip):je(ip)) :: xv_IntZ_zxv
!(out) 積分された 1 次元(YX)格子点データ
integer :: k
! 作業変数
xv_IntZ_zxv = 0.0d0
do k=0,km-1
xv_IntZ_zxv(:,:) = xv_IntZ_zxv(:,:) + zxv(k,:,:) * z_Z_Weight(k)
enddo
end function xv_IntZ_zxv
| Function : | |||
| xyz_zxv : | real(8), dimension(0:im-1,0:jm-1,0:km-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(in)
|
分散格子データの集積
function xyz_zxv(zxv)
!
! 分散格子データの集積
!
real(8), dimension(0:im-1,0:jm-1,0:km-1) :: xyz_zxv
!(out) 格子点データ
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(in) :: zxv
!(in) 格子点データ
real(8), dimension(0:km-1,0:im-1,0:jm-1) :: zxy
! 作業変数
integer :: i,j,k
integer :: ierr
call MPI_ALLGATHERV(zxv,km*im*jc(ip),MPI_REAL8, zxy,km*im*jc,km*im*js,MPI_REAL8, MPI_COMM_WORLD,IERR)
do k=0,km-1
do j=0,jm-1
do i=0,im-1
xyz_zxv(i,j,k) = zxy(k,i,j)
enddo
enddo
enddo
end function xyz_zxv
| Function : | |||
| z_AvrV_zv : | real(8), dimension(0:km-1)
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZY)格子点データの Y 方向平均
実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算し, v_Y_Weight の総和で割ることで平均している.
function z_AvrV_zv(zv)
!
! 2 次元(ZY)格子点データの Y 方向平均
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算し,
! v_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元(ZV)格子点データ
real(8), dimension(0:km-1) :: z_AvrV_zv
!(out) 平均された 1 次元(Z)格子点データ
real(8) :: Length, LengthTMP
integer :: ierr
! 作業変数
LengthTMP = sum(v_Y_weight)
CALL MPI_ALLREDUCE(LengthTMP,Length,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
z_AvrV_zv = z_IntV_zv(zv)/Length
end function z_AvrV_zv
| Function : | |||
| z_AvrXV_zxv : | real(8), dimension(0:km-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X,Y 方向平均
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算し, x_X_Weight*y_Y_Weight の総和で割ることで平均している.
function z_AvrXV_zxv(zxv)
!
! 3 次元格子点データの X,Y 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた
! 総和を計算し, x_X_Weight*y_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1) :: z_AvrXV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8) :: Area, AreaTMP
integer :: ierr
! 作業変数
AreaTMP = sum(x_X_weight)*sum(v_Y_weight)
CALL MPI_ALLREDUCE(AreaTMP,Area,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
z_AvrXV_zxv = z_IntXV_zxv(zxv)/Area
end function z_AvrXV_zxv
| Function : | |||
| z_AvrX_zx : | real(8), dimension(0:km-1)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの X 方向平均
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し, x_X_Weight の総和で割ることで平均している.
function z_AvrX_zx(zx)
!
! 2 次元(ZX)格子点データの X 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し,
! x_X_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元(ZX)格子点データ
real(8), dimension(0:km-1) :: z_AvrX_zx
!(out) 平均された 1 次元(Z)格子点データ
z_AvrX_zx = z_IntX_zx(zx)/sum(x_X_weight)
end function z_AvrX_zx
| Function : | |||
| z_IntV_zv : | real(8), dimension(0:km-1)
| ||
| zv : | real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN)
|
2 次元(ZY)格子点データの Y 方向積分
実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
function z_IntV_zv(zv)
!
! 2 次元(ZY)格子点データの Y 方向積分
!
! 実際には格子点データ各点毎に y_Y_Weight をかけた総和を計算している.
!
real(8), dimension(0:km-1,js(ip):je(ip)), intent(IN) :: zv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1) :: z_IntV_zv
!(out) 積分された 1 次元(X)格子点データ
real(8), dimension(0:km-1) :: z_IntVTMP
integer :: j
integer :: ierr
! 作業変数
z_IntV_zv = 0.0d0
do j=js(ip),je(ip)
z_IntV_zv(:) = z_IntV_zv(:) + zv(:,j) * v_Y_Weight(j)
enddo
z_IntVTMP=z_IntV_zv
CALL MPI_ALLREDUCE(z_IntVTMP,z_IntV_zv,km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function z_IntV_zv
| Function : | |||
| z_IntXV_zxv : | real(8), dimension(0:km-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X,Y 方向積分
実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた 総和を計算している.
function z_IntXV_zxv(zxv)
!
! 3 次元格子点データの X,Y 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight, y_Y_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1) :: z_IntXV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8), dimension(0:km-1) :: z_IntXVTmp
integer :: i, j
integer :: ierr
! 作業変数
z_IntXV_zxv = 0.0d0
do i=0,im-1
do j=js(ip),je(ip)
z_IntXV_zxv(:) = z_IntXV_zxv(:) + zxv(:,i,j) * x_X_Weight(i)* v_Y_Weight(j)
enddo
enddo
z_IntXVTMP=z_IntXV_zxv
CALL MPI_ALLREDUCE(z_IntXVTMP,z_IntXV_zxv,km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function z_IntXV_zxv
| Function : | |||
| z_IntX_zx : | real(8), dimension(0:km-1)
| ||
| zx : | real(8), dimension(0:km-1,0:im-1), intent(IN)
|
2 次元(ZX)格子点データの X 方向積分
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
function z_IntX_zx(zx)
!
! 2 次元(ZX)格子点データの X 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
!
real(8), dimension(0:km-1,0:im-1), intent(IN) :: zx
!(in) 2 次元格子点データ
real(8), dimension(0:km-1) :: z_IntX_zx
!(out) 積分された 1 次元(X)格子点データ
integer :: i
! 作業変数
z_IntX_zx = 0.0d0
do i=0,im-1
z_IntX_zx(:) = z_IntX_zx(:) + zx(:,i) * x_X_Weight(i)
enddo
end function z_IntX_zx
| Variable : | |||
| z_Z_Weight => null() : | real(8), dimension(:), pointer
|
| Function : | |||
| zv_AvrX_zxv : | real(8), dimension(0:km-1,js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X 方向平均
実際には格子点データ各点毎に x_X_Weight をかけた 総和を計算し, x_X_Weight の総和で割ることで平均している.
function zv_AvrX_zxv(zxv)
!
! 3 次元格子点データの X 方向平均
!
! 実際には格子点データ各点毎に x_X_Weight をかけた
! 総和を計算し, x_X_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1,js(ip):je(ip)) :: zv_AvrX_zxv
!(out) 積分された 2 次元(ZY)格子点データ
zv_AvrX_zxv = zv_IntX_zxv(zxv)/sum(x_X_weight)
end function zv_AvrX_zxv
| Function : | |||
| zv_IntX_zxv : | real(8), dimension(0:km-1,js(ip):je(ip))
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの X 方向積分
実際には格子点データ各点毎に x_X_Weight をかけた 総和を計算している.
function zv_IntX_zxv(zxv)
!
! 3 次元格子点データの X 方向積分
!
! 実際には格子点データ各点毎に x_X_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1,js(ip):je(ip)) :: zv_IntX_zxv
!(out) 積分された 2 次元(ZY)格子点データ
integer :: i
! 作業変数
zv_IntX_zxv = 0.0d0
do i=0,im-1
zv_IntX_zxv(:,:) = zv_IntX_zxv(:,:) + zxv(:,i,:) * x_X_Weight(i)
enddo
end function zv_IntX_zxv
| Function : | |||
| zx_AvrV_zxv : | real(8), dimension(0:km-1,0:im-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Y 方向平均
実際には格子点データ各点毎に v_Y_Weight をかけた 総和を計算し, v_Y_Weight の総和で割ることで平均している.
function zx_AvrV_zxv(zxv)
!
! 3 次元格子点データの Y 方向平均
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた
! 総和を計算し, v_Y_Weight の総和で割ることで平均している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1,0:im-1) :: zx_AvrV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8) :: Length, LengthTMP
integer :: ierr
! 作業変数
LengthTMP = sum(v_Y_weight)
CALL MPI_ALLREDUCE(LengthTMP,Length,1,MPI_REAL8,MPI_SUM,MPI_COMM_WORLD,IERR)
zx_AvrV_zxv = zx_IntV_zxv(zxv)/Length
end function zx_AvrV_zxv
| Function : | |||
| zx_IntV_zxv : | real(8), dimension(0:km-1,0:im-1)
| ||
| zxv : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN)
|
3 次元格子点データの Y 方向積分
実際には格子点データ各点毎に y_Y_Weight をかけた 総和を計算している.
function zx_IntV_zxv(zxv)
!
! 3 次元格子点データの Y 方向積分
!
! 実際には格子点データ各点毎に y_Y_Weight をかけた
! 総和を計算している.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)), intent(IN) :: zxv
!(in) 2 次元格子点データ
real(8), dimension(0:km-1,0:im-1) :: zx_IntV_zxv
!(out) 積分された 1 次元(Y)格子点データ
real(8), dimension(0:km-1,0:im-1) :: zx_IntVTMP
integer :: j
integer :: ierr
! 作業変数
zx_IntV_zxv = 0.0d0
do j=js(ip),je(ip)
zx_IntV_zxv(:,:) = zx_IntV_zxv(:,:) + zxv(:,:,j) * v_Y_Weight(j)
enddo
zx_IntVTMP=zx_IntV_zxv
CALL MPI_ALLREDUCE(zx_IntVTMP,zx_IntV_zxv,im*km,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function zx_IntV_zxv
| Variable : | |||
| zxv_X => null() : | real(8), dimension(:,:,:), pointer
|
| Variable : | |||
| zxv_Y => null() : | real(8), dimension(:,:,:), pointer
|
| Variable : | |||
| zxv_Z => null() : | real(8), dimension(:,:,:), pointer
|
| Function : | |||
| zxv_eef : | real(8), dimension(0:km-1,0:im-1,js(ip):je(ip))
| ||
| eef : | real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in)
|
スペクトルデータから格子データへ変換する.
function zxv_eef(eef)
!
! スペクトルデータから格子データへ変換する.
!
real(8), dimension(0:km-1,0:im-1,js(ip):je(ip)) :: zxv_eef
!(out) 格子点データ
real(8), dimension(-nm:nm,-mm:mm,2*lc(ip)), intent(in) :: eef
!(in) スペクトルデータ
sgwork(1:(2*nm+1)*(2*mm+1)*2*lc(ip)) = reshape(eef,(/(2*nm+1)*(2*mm+1)*2*lc(ip)/))
call p3smgb(nm,mm,lm,km,jm,im,sgwork,w,itk,tk,itj,tj,iti,ti)
zxv_eef = reshape(sgwork(1:im*km*jc(ip)),(/km,im,jc(ip)/))
end function zxv_eef