Class max_min
In: max_min.f90

代数計算モジュール 1

Methods

Public Instance methods

Subroutine :
var(:) :real, intent(in)
: 最大値探索配列
mamn :integer, intent(inout)
: 配列内の最大値に該当する要素番号
mamv :real, intent(inout)
: 配列内の最大値
undef :real, intent(in), optional
: 未定義

1 次元配列用最大値, 該当配列要素番号取得ルーチン

[Source]

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)
: 2 次元最大値探索配列
mamnx :integer, intent(inout)
: 配列内の最大値に該当する第 1 配列要素番号
mamny :integer, intent(inout)
: 配列内の最大値に該当する第 2 配列要素番号
mamv :real, intent(inout)
: 配列内の最大値
undef :real, intent(in), optional
: 未定義

2 次元配列用最大値, 該当配列要素番号取得ルーチン

[Source]

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)
: 3 次元最大値探索配列
mamnx :integer, intent(inout)
: 配列内の最大値に該当する第 1 配列要素番号
mamny :integer, intent(inout)
: 配列内の最大値に該当する第 2 配列要素番号
mamnz :integer, intent(inout)
: 配列内の最大値に該当する第 3 配列要素番号
mamv :real, intent(inout)
: 配列内の最大値
undef :real, intent(in), optional
: 未定義

3 次元配列用最大値, 該当配列要素番号取得ルーチン

[Source]

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
: 未定義値

[Source]

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)
: 2 次元最小値探索配列
mimnx :integer, intent(inout)
: 配列内の最小値に該当する第 1 配列要素番号
mimny :integer, intent(inout)
: 配列内の最小値に該当する第 2 配列要素番号
mimv :real, intent(inout)
: 配列内の最小値
undef :real, intent(in), optional
: 未定義値

2 次元配列用最小値, 該当配列要素番号取得ルーチン

[Source]

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)
: 3 次元最小値探索配列
mimnx :integer, intent(inout)
: 配列内の最小値に該当する第 1 配列要素番号
mimny :integer, intent(inout)
: 配列内の最小値に該当する第 2 配列要素番号
mimnz :integer, intent(inout)
: 配列内の最小値に該当する第 3 配列要素番号
mimv :real, intent(inout)
: 配列内の最小値
undef :real, intent(in), optional
: 未定義値

3 次元配列用最小値, 該当配列要素番号取得ルーチン

[Source]

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