Subroutine : |
|
name : | character(*), intent(in)
: | このサブルーチンを呼び出すモジュールの名称. Module name calling this
subroutine
|
|
array(:) : | real(DP), intent(in)
: | 検証すべき配列データ. Checked array data
|
|
array_name : | character(*), intent(in)
: | 検証すべき配列データの名前. Name of checked array data
|
|
need_num : | integer, intent(in)
: | 必要なデータ数. 0 未満の数を与えるとエラーを生じます.
Number of needed data. If number less than 0, an error is occurred.
|
|
need_num_name : | character(*), intent(in)
: | 必要なデータ数を示す変数の名前. Name of a variable that indicates number
of needed data
|
|
valid_limit : | real(DP), intent(in), optional
: | 有効下限値 (デフォルトは 0.0). Lower limit of validation (defalt is 0.0)
|
|
デフォルトでは, 正の値を有効と扱います. 無効であると検証された場合には,
エラーを発生させます.
Check validation of array data loaded from NAMELIST.
By defaut, positive values are treated as valid values. If invalidation is
checked, an error is occurred.
subroutine NmlutilAryValid( name, array, array_name, need_num, need_num_name, valid_limit )
!
! NAMELIST から読み込んだ配列型データの妥当性を
! チェックします.
!
! デフォルトでは, 正の値を有効と扱います.
! 無効であると検証された場合には, エラーを発生させます.
!
! Check validation of array data loaded from NAMELIST.
!
! By defaut, positive values are treated as valid values.
! If invalidation is checked, an error is occurred.
!
! モジュール引用 ; USE statements
!
! 種別型パラメタ
! Kind type parameter
!
use dc_types, only: DP ! 倍精度実数型. Double precision.
! 宣言文 ; Declaration statements
!
implicit none
character(*), intent(in):: name
! このサブルーチンを呼び出すモジュールの名称.
! Module name calling this subroutine
real(DP), intent(in):: array(:)
! 検証すべき配列データ.
! Checked array data
character(*), intent(in):: array_name
! 検証すべき配列データの名前.
! Name of checked array data
integer, intent(in):: need_num
! 必要なデータ数.
! 0 未満の数を与えるとエラーを生じます.
!
! Number of needed data.
! If number less than 0, an error is occurred.
character(*), intent(in):: need_num_name
! 必要なデータ数を示す変数の名前.
! Name of a variable that indicates number of needed data
real(DP), intent(in), optional:: valid_limit
! 有効下限値 (デフォルトは 0.0).
! Lower limit of validation (defalt is 0.0)
! 作業変数
! Work variables
!
real(DP):: valid_limit_work
! 有効下限値 (デフォルトは 0.0).
! Lower limit of validation (defalt is 0.0)
integer:: valid_count ! 配列データの有効値の数.
! Number of valid values in an array
integer:: size_array ! 配列データのサイズ
! Size of array data
! 実行文 ; Executable statement
!
! need_num が負ではないことをチェック
! Check that "need_num" is not negative
!
if ( need_num < 0 ) then
call MessageNotify( 'E', name, '%c=<%d> must not be negative.', c1 = trim(need_num_name), i = (/ need_num /) )
end if
! array のサイズが十分であることをチェック
! Check that size of "array" is enough
!
size_array = size(array)
if ( need_num > size_array ) then
call MessageNotify( 'E', name, 'Maximum size=<%d> of "%c" is too smaller than %c=<%d>. ' // 'Please search for a statement "MaxNmlArySize = %d" in ' // '"namelist_util.f90", and change it into "MaxNmlArySize = %d".', i = (/ size_array, need_num, MaxNmlArySize, need_num /), c1 = trim(array_name), c2 = trim(need_num_name) )
end if
! array をチェック
! Check "array"
!
if ( need_num > 0 ) then
valid_limit_work = 0.0_DP
if ( present( valid_limit ) ) valid_limit_work = valid_limit
if ( any( array(1:need_num) < valid_limit_work ) ) then
valid_count = count( .not. ( array(1:need_num) < valid_limit_work ) )
if ( valid_count > 0 ) then
call MessageNotify( 'E', name, 'Number of valid data of %c=<%*f> is %d. ' // 'Valid data is %c=<%d> necessary.', c1 = trim( array_name ), c2 = trim( need_num_name ), d = array(1:valid_count), n = (/ valid_count /), i = (/ valid_count, need_num /) )
else
call MessageNotify( 'E', name, 'Valid data of %c is nothing. ' // 'Valid data is %c=<%d> necessary.', c1 = trim( array_name ), c2 = trim( need_num_name ), i = (/ need_num /) )
end if
end if
end if
end subroutine NmlutilAryValid