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