| Class | w_integral_mpi_module |
| In: |
libsrc/w_mpi_module/w_integral_mpi_module.f90
|
spml/w_integral_mpi_module モジュールは球面上での 2 次元流体運動を 球面調和函数と MPI 並列ライブラリを用いたスペクトル法によってn 数値計算するための モジュール w_mpi_module の下部モジュールであり, 積分・平均計算のための Fortran90 関数を提供する. 内部で ISPACK の SPPACK と SNPACK の Fortran77 サブルーチンを呼んでいる. スペクトルデータおよび格子点データの格納方法や変換の詳しい計算法に ついては ISPACK/SNPACK,SPPACK のマニュアルを参照されたい.
| Function : | |||
| AvrLat_v : | real(8)
| ||
| v_data(jc) : | real(8), intent(in)
|
1 次元(Y)格子点データの緯度(Y)方向平均(1 層用).
実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算し, v_Y_Weight の総和で割ることで平均している.
function AvrLat_v(v_data)
!
! 1 次元(Y)格子点データの緯度(Y)方向平均(1 層用).
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算し,
! v_Y_Weight の総和で割ることで平均している.
!
real(8), intent(in) :: v_data(jc) !(in) 1 次元緯度格子点データ
real(8) :: AvrLat_v !(out) 平均値
AvrLat_v = IntLat_v(v_data)/sum(y_Lat_weight)
end function AvrLat_v
| Function : | |||
| AvrLonLat_xv : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの全領域平均(1 層用).
実際には格子点データ各点毎に x_X_Weight, v_Y_Weight をかけた 総和を計算し, x_X_Weight*v_Y_Weight の総和で割ることで平均している.
function AvrLonLat_xv(xv_data)
!
! 2 次元緯度経度格子点データの全領域平均(1 層用).
!
! 実際には格子点データ各点毎に x_X_Weight, v_Y_Weight をかけた
! 総和を計算し, x_X_Weight*v_Y_Weight の総和で割ることで平均している.
!
real(8), intent(in) :: xv_data(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: AvrLonLat_xv
!(out) 平均値
AvrLonLat_xv = AvrLon_x(x_AvrLat_xv(xv_data))
end function AvrLonLat_xv
| Function : | |||
| IntLat_v : | real(8)
| ||
| v_data(jc) : | real(8), intent(in)
|
1 次元緯度(Y)格子点データの Y 方向積分(1 層用).
実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
function IntLat_v(v_data)
!
! 1 次元緯度(Y)格子点データの Y 方向積分(1 層用).
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
!
real(8), intent(in) :: v_data(jc) !(in) 1 次元緯度(Y)格子点データ
real(8) :: IntLat_v !(out) 積分値
real(8) :: IntLatTmp
IntLat_v = sum(v_data * v_Lat_weight)
IntLatTmp=IntLat_v
CALL MPI_ALLREDUCE(IntLatTMP,IntLat_v,1,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function IntLat_v
| Function : | |||
| IntLonLat_xv : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの全領域積分(1 層用).
実際には格子点データ各点毎に x_X_Weight, v_V_Weight をかけた 総和を計算している.
function IntLonLat_xv(xv_data)
!
! 2 次元緯度経度格子点データの全領域積分(1 層用).
!
! 実際には格子点データ各点毎に x_X_Weight, v_V_Weight をかけた
! 総和を計算している.
!
real(8), intent(in) :: xv_data(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: IntLonLat_xv
!(out) 積分値
IntLonLat_xv = IntLon_x(x_IntLat_xv(xv_data))
end function IntLonLat_xv
| Function : | |||
| v_AvrLon_xv(jc) : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの経度(X)方向平均(1 層用).
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し, x_X_Weight の総和で割ることで平均している.
function v_AvrLon_xv(xv_data)
!
! 2 次元緯度経度格子点データの経度(X)方向平均(1 層用).
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算し,
! x_X_Weight の総和で割ることで平均している.
!
real(8), intent(in) :: xv_data(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: v_AvrLon_xv(jc)
!(out) 平均された 1 次元緯度(Y)格子点
v_AvrLon_xv = v_IntLon_xv(xv_data)/sum(x_Lon_weight)
end function v_AvrLon_xv
| Function : | |||
| v_IntLon_xv(jc) : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの経度(X)方向積分(1 層用).
実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
function v_IntLon_xv(xv_data)
!
! 2 次元緯度経度格子点データの経度(X)方向積分(1 層用).
!
! 実際には格子点データ各点毎に x_X_Weight をかけた総和を計算している.
!
real(8), intent(in) :: xv_data(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: v_IntLon_xv(jc)
!(out) 積分された 1 次元緯度(Y)格子点データ
integer :: i
v_IntLon_xv = 0
do i=0,im-1
v_IntLon_xv = v_IntLon_xv + xv_data(i,:) * x_Lon_weight(i)
enddo
end function v_IntLon_xv
| Function : | |||
| x_AvrLat_xv(im) : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの緯度(Y)方向平均(1 層用).
実際には格子点データ各点毎に v_Lat_Weight をかけた総和を計算し, y_Lat_Weight の総和で割ることで平均している.
function x_AvrLat_xv(xv_data)
!
! 2 次元緯度経度格子点データの緯度(Y)方向平均(1 層用).
!
! 実際には格子点データ各点毎に v_Lat_Weight をかけた総和を計算し,
! y_Lat_Weight の総和で割ることで平均している.
!
real(8), intent(in) :: xv_data(0:im-1,jc) ! 格子点(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: x_AvrLat_xv(im)
!(out) 平均された 1 次元経度(X)格子点データ
x_AvrLat_xv = x_IntLat_xv(xv_data)/sum(y_Lat_weight)
end function x_AvrLat_xv
| Function : | |||
| x_IntLat_xv(0:im-1) : | real(8)
| ||
| xv_data(0:im-1,jc) : | real(8), intent(in)
|
2 次元緯度経度格子点データの緯度(Y)方向積分(1 層用).
実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
function x_IntLat_xv(xv_data)
!
! 2 次元緯度経度格子点データの緯度(Y)方向積分(1 層用).
!
! 実際には格子点データ各点毎に v_Y_Weight をかけた総和を計算している.
!
real(8), intent(in) :: xv_data(0:im-1,jc)
!(in) 2 次元経度緯度格子点データ(0:im-1,jc)
real(8) :: x_IntLat_xv(0:im-1)
!(out) 積分された 1 次元経度(X)格子点データ
real(8) :: x_IntLatTmp(0:im-1)
integer :: j
x_IntLat_xv = 0
do j=1,jc
x_IntLat_xv = x_IntLat_xv + xv_data(:,j) * v_Lat_weight(j)
enddo
x_IntLatTmp=x_IntLat_xv
CALL MPI_ALLREDUCE(x_IntLatTMP,x_IntLat_xv,im,MPI_REAL8, MPI_SUM,MPI_COMM_WORLD,IERR)
end function x_IntLat_xv