| Class | max_min |
| In: |
max_min.f90
|
代数計算モジュール 1
| Subroutine : | |||
| var(:) : | real, intent(in)
| ||
| mamn : | integer, intent(inout)
| ||
| mamv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
1 次元配列用最大値, 該当配列要素番号取得ルーチン
subroutine max_val_1d(var, mamn, mamv, undef) ! 1 次元配列用最大値, 該当配列要素番号取得ルーチン
implicit none
real, intent(in) :: var(:) ! 最大値探索配列
integer, intent(inout) :: mamn ! 配列内の最大値に該当する要素番号
real, intent(inout) :: mamv ! 配列内の最大値
real, intent(in), optional :: undef ! 未定義
integer :: nx ! 配列個数(size 関数で自動計算)
integer :: i ! イタレーション用添字
logical :: undeflag
nx=size(var)
undeflag=.true.
if(present(undef))then
do i=1,nx
if(var(i)/=undef)then
if(undeflag.eqv..true.)then
undeflag=.false.
mamv=var(i)
mamn=i
else
if(var(i)>mamv)then
mamv=var(i)
mamn=i
end if
end if
end if
end do
if(undeflag.eqv..true.)then
mamn=nx+1
mamv=undef
end if
else
mamv=var(1)
mamn=1
do i=2,nx
if(var(i)>mamv)then
mamv=var(i)
mamn=i
end if
end do
end if
end subroutine max_val_1d
| Subroutine : | |||
| var(:,:) : | real, intent(in)
| ||
| mamnx : | integer, intent(inout)
| ||
| mamny : | integer, intent(inout)
| ||
| mamv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
2 次元配列用最大値, 該当配列要素番号取得ルーチン
subroutine max_val_2d(var, mamnx, mamny, mamv, undef) ! 2 次元配列用最大値, 該当配列要素番号取得ルーチン
implicit none
real, intent(in) :: var(:,:) ! 2 次元最大値探索配列
integer, intent(inout) :: mamnx ! 配列内の最大値に該当する第 1 配列要素番号
integer, intent(inout) :: mamny ! 配列内の最大値に該当する第 2 配列要素番号
real, intent(inout) :: mamv ! 配列内の最大値
real, intent(in), optional :: undef ! 未定義
integer :: nx ! 第 1 要素の配列個数(size 関数で自動計算)
integer :: ny ! 第 2 要素の配列個数(size 関数で自動計算)
integer :: j ! イタレーション用添字
real :: tmp(size(var,2)) ! 作業用配列
integer :: tmp_num(size(var,2)) ! 作業用配列
nx=size(var,1)
ny=size(var,2)
if(present(undef))then
do j=1,ny
call max_val_1d(var(:,j),tmp_num(j),tmp(j),undef)
end do
call max_val_1d(tmp,mamny,mamv,undef)
if(mamny==ny+1)then
mamnx=nx+1
else
mamnx=tmp_num(mamny)
end if
else
do j=1,ny
call max_val_1d(var(:,j),tmp_num(j),tmp(j))
end do
call max_val_1d(tmp,mamny,mamv)
mamnx=tmp_num(mamny)
end if
end subroutine max_val_2d
| Subroutine : | |||
| var(:,:,:) : | real, intent(in)
| ||
| mamnx : | integer, intent(inout)
| ||
| mamny : | integer, intent(inout)
| ||
| mamnz : | integer, intent(inout)
| ||
| mamv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
3 次元配列用最大値, 該当配列要素番号取得ルーチン
subroutine max_val_3d(var, mamnx, mamny, mamnz, mamv, undef) ! 3 次元配列用最大値, 該当配列要素番号取得ルーチン
implicit none
real, intent(in) :: var(:,:,:) ! 3 次元最大値探索配列
integer, intent(inout) :: mamnx ! 配列内の最大値に該当する第 1 配列要素番号
integer, intent(inout) :: mamny ! 配列内の最大値に該当する第 2 配列要素番号
integer, intent(inout) :: mamnz ! 配列内の最大値に該当する第 3 配列要素番号
real, intent(inout) :: mamv ! 配列内の最大値
real, intent(in), optional :: undef ! 未定義
integer :: nx ! 第 1 要素の配列個数(size 関数で自動計算)
integer :: ny ! 第 2 要素の配列個数(size 関数で自動計算)
integer :: nz ! 第 3 要素の配列個数(size 関数で自動計算)
integer :: j ! イタレーション用添字
real :: tmp(size(var,3)) ! 作業用配列
integer :: tmp_num1(size(var,3)) ! 作業用配列
integer :: tmp_num2(size(var,3)) ! 作業用配列
nx=size(var,1)
ny=size(var,2)
nz=size(var,3)
if(present(undef))then
do j=1,nz
call max_val_2d(var(:,:,j),tmp_num1(j),tmp_num2(j),tmp(j),undef)
end do
call max_val_1d(tmp,mamnz,mamv,undef)
if(mamnz==nz+1)then
mamnx=nx+1
mamny=ny+1
else
mamnx=tmp_num1(mamnz)
mamny=tmp_num2(mamnz)
end if
else
do j=1,nz
call max_val_2d(var(:,:,j),tmp_num1(j),tmp_num2(j),tmp(j))
end do
call max_val_1d(tmp,mamnz,mamv)
mamnx=tmp_num1(mamnz)
mamny=tmp_num2(mamnz)
end if
end subroutine max_val_3d
| Subroutine : | |||
| var(:) : | real, intent(in)
| ||
| mimn : | integer, intent(inout)
| ||
| mimv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
subroutine min_val_1d(var, mimn, mimv, undef)
implicit none
real, intent(in) :: var(:) ! 最小値探索配列
integer, intent(inout) :: mimn ! 配列内の最小値に該当する要素番号
real, intent(inout) :: mimv ! 配列内の最小値
real, intent(in), optional :: undef ! 未定義値
integer :: nx ! 配列個数(size 関数で自動計算)
integer :: i ! イタレーション用添字
logical :: undeflag
nx=size(var)
undeflag=.true.
if(present(undef))then
do i=1,nx
if(var(i)/=undef)then
if(undeflag.eqv..true.)then
undeflag=.false.
mimv=var(i)
mimn=i
else
if(var(i)<mimv)then
mimv=var(i)
mimn=i
end if
end if
end if
end do
if(undeflag.eqv..true.)then
mimn=nx+1
mimv=undef
end if
else
mimv=var(1)
mimn=1
do i=2,nx
if(var(i)<mimv)then
mimv=var(i)
mimn=i
end if
end do
end if
end subroutine min_val_1d
| Subroutine : | |||
| var(:,:) : | real, intent(in)
| ||
| mimnx : | integer, intent(inout)
| ||
| mimny : | integer, intent(inout)
| ||
| mimv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
2 次元配列用最小値, 該当配列要素番号取得ルーチン
subroutine min_val_2d(var, mimnx, mimny, mimv, undef) ! 2 次元配列用最小値, 該当配列要素番号取得ルーチン
implicit none
real, intent(in) :: var(:,:) ! 2 次元最小値探索配列
integer, intent(inout) :: mimnx ! 配列内の最小値に該当する第 1 配列要素番号
integer, intent(inout) :: mimny ! 配列内の最小値に該当する第 2 配列要素番号
real, intent(inout) :: mimv ! 配列内の最小値
real, intent(in), optional :: undef ! 未定義値
integer :: nx ! 第 1 要素の配列個数(size 関数で自動計算)
integer :: ny ! 第 2 要素の配列個数(size 関数で自動計算)
integer :: j ! イタレーション用添字
real :: tmp(size(var,2)) ! 作業用配列
integer :: tmp_num(size(var,2)) ! 作業用配列
nx=size(var,1)
ny=size(var,2)
if(present(undef))then
do j=1,ny
call min_val_1d(var(:,j),tmp_num(j),tmp(j),undef)
end do
call min_val_1d(tmp,mimny,mimv,undef)
if(mimny==ny+1)then
mimnx=nx+1
else
mimnx=tmp_num(mimny)
end if
else
do j=1,ny
call min_val_1d(var(:,j),tmp_num(j),tmp(j))
end do
call min_val_1d(tmp,mimny,mimv)
mimnx=tmp_num(mimny)
end if
end subroutine min_val_2d
| Subroutine : | |||
| var(:,:,:) : | real, intent(in)
| ||
| mimnx : | integer, intent(inout)
| ||
| mimny : | integer, intent(inout)
| ||
| mimnz : | integer, intent(inout)
| ||
| mimv : | real, intent(inout)
| ||
| undef : | real, intent(in), optional
|
3 次元配列用最小値, 該当配列要素番号取得ルーチン
subroutine min_val_3d(var, mimnx, mimny, mimnz, mimv, undef) ! 3 次元配列用最小値, 該当配列要素番号取得ルーチン
implicit none
real, intent(in) :: var(:,:,:) ! 3 次元最小値探索配列
integer, intent(inout) :: mimnx ! 配列内の最小値に該当する第 1 配列要素番号
integer, intent(inout) :: mimny ! 配列内の最小値に該当する第 2 配列要素番号
integer, intent(inout) :: mimnz ! 配列内の最小値に該当する第 3 配列要素番号
real, intent(inout) :: mimv ! 配列内の最小値
real, intent(in), optional :: undef ! 未定義値
integer :: nx ! 第 1 要素の配列個数(size 関数で自動計算)
integer :: ny ! 第 2 要素の配列個数(size 関数で自動計算)
integer :: nz ! 第 3 要素の配列個数(size 関数で自動計算)
integer :: j ! イタレーション用添字
real :: tmp(size(var,3)) ! 作業用配列
integer :: tmp_num1(size(var,3)) ! 作業用配列
integer :: tmp_num2(size(var,3)) ! 作業用配列
nx=size(var,1)
ny=size(var,2)
nz=size(var,3)
if(present(undef))then
do j=1,nz
call min_val_2d(var(:,:,j),tmp_num1(j),tmp_num2(j),tmp(j),undef)
end do
call min_val_1d(tmp,mimnz,mimv,undef)
if(mimnz==nz+1)then
mimnx=nx+1
mimny=ny+1
else
mimnx=tmp_num1(mimnz)
mimny=tmp_num2(mimnz)
end if
else
do j=1,nz
call min_val_2d(var(:,:,j),tmp_num1(j),tmp_num2(j),tmp(j))
end do
call min_val_1d(tmp,mimnz,mimv)
mimnx=tmp_num1(mimnz)
mimny=tmp_num2(mimnz)
end if
end subroutine min_val_3d