Class | dc_scaledsec |
In: |
dc_utils/dc_scaledsec.f90
|
assignment(=) : | 代入 |
operator(+) : | 加算 |
operator(-) : | 減算 |
operator(*) : | 乗算 |
operator(/) : | 除算 |
mod : | 余り |
modulo : | 剰余 |
operator(==) : | 比較 |
operator(>) : | 比較 |
operator(<) : | 比較 |
abs : | 絶対値の算出 |
int : | 整数の算出 (小数点以下切捨て) |
sign : | 符号の設定 |
floor : | 整数の算出 (対象の数値以下で最大の整数) |
ceiling : | 整数の算出 (対象の数値以上で最小の整数) |
Subroutine : | |||
sclsec : | type(DC_SCALED_SEC), intent(in) | ||
unit : | integer, intent(in), optional
| ||
indent : | character(*), intent(in), optional
|
引数 sclsec に設定されている情報を印字します. デフォルトではメッセージは標準出力に出力されます. unit に装置番号を指定することで, 出力先を変更することが可能です.
Print information of sclsec. By default messages are output to standard output. Unit number for output can be changed by unit argument.
subroutine DCScaledSecPutLine( sclsec, unit, indent ) ! ! 引数 *sclsec* に設定されている情報を印字します. ! デフォルトではメッセージは標準出力に出力されます. ! *unit* に装置番号を指定することで, 出力先を変更することが可能です. ! ! Print information of *sclsec*. ! By default messages are output to standard output. ! Unit number for output can be changed by *unit* argument. ! use dc_string, only: Printf, toChar use dc_trace, only: BeginSub, EndSub use dc_types, only: STDOUT, STRING implicit none type(DC_SCALED_SEC), intent(in) :: sclsec integer, intent(in), optional :: unit ! 出力先の装置番号. ! デフォルトの出力先は標準出力. ! ! Unit number for output. ! Default value is standard output. character(*), intent(in), optional:: indent ! 表示されるメッセージの字下げ. ! ! Indent of displayed messages. integer :: out_unit, sec_ary_rev(imin:imax) integer:: indent_len character(STRING):: indent_str character(1):: sign character(*), parameter:: subname = 'DCScaledSecPutLine' continue !call BeginSub(subname) if (present(unit)) then out_unit = unit else out_unit = STDOUT end if indent_len = 0 indent_str = '' if ( present(indent) ) then if ( len(indent) /= 0 ) then indent_len = len(indent) indent_str(1:indent_len) = indent end if end if sec_ary_rev(imin:imax) = sclsec % sec_ary(imax:imin:-1) if ( sclsec % flag_negative ) then sign = '-' else sign = '+' end if if ( imax - imin + 1 == 6 ) then call Printf(out_unit, indent_str(1:indent_len) // '#<DC_SCALED_SEC:: @sign=%c @yotta=%d @exa=%d @tera=%d @mega=%d @base=%d @micro=%d>', i = sec_ary_rev, c1 = sign ) elseif ( imax - imin + 1 == 11 ) then call Printf(out_unit, indent_str(1:indent_len) // '#<DC_SCALED_SEC:: @sign=%c @yotta=%d @zetta=%d @exa=%d @peta=%d @tera=%d', i = sec_ary_rev(imin:imin+4), c1 = sign ) call Printf(out_unit, indent_str(1:indent_len) // ' @giga=%d @mega=%d @kilo=%d @base=%d @milli=%d @micro=%d>', i = sec_ary_rev(imax-5:imax) ) else call Printf(out_unit, indent_str(1:indent_len) // '#<DC_SCALED_SEC:: @sign=%c @sec_ary=%*d>', i = sec_ary_rev, n = (/ imax - imin + 1 /), c1 = sign ) end if 999 continue !call EndSub(subname) end subroutine DCScaledSecPutLine
Derived Type : | |
sec_ary(imin:imax) = 0 : | integer |
flag_negative = .false. : | logical |
dummy = .false. : | logical |
小数点以下の「秒」や, 整数型では表現できないほど大きい数を 正確に演算するための型.
Derived type for precise operations of "seconds" after the decimal point, and large number more than integer type.
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の絶対値を返す.
Return an absolute value of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_abs_s(sclsec) result(result) ! ! DC_SCALED_SEC 型変数の絶対値を返す. ! ! Return an absolute value of a "DC_SCALED_SEC" variable ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec continue result = sclsec if ( result % flag_negative ) result % flag_negative = .false. end function dcscaledsec_abs_s
Subroutine : | |
sclsec : | type(DC_SCALED_SEC), intent(out) |
sec : | real, intent(in) |
subroutine DCScaledSecCreateR(sclsec, sec) implicit none type(DC_SCALED_SEC), intent(out):: sclsec real, intent(in):: sec continue call DCScaledSecCreateD(sclsec, real( sec, DP )) end subroutine DCScaledSecCreateR
Subroutine : | |
sclsec : | type(DC_SCALED_SEC), intent(out) |
sec : | real(DP), intent(in) |
subroutine DCScaledSecCreateD(sclsec, sec) use dc_message, only: MessageNotify use dc_error, only: StoreError, DC_NOERR, DC_ETOOLARGETIME use dc_trace, only: BeginSub, EndSub use dc_types, only: DP, STRING implicit none type(DC_SCALED_SEC), intent(out):: sclsec real(DP), intent(in):: sec real(DP):: work_sec, print_sec integer:: i, cd, move_up, work_sec_scl_nint integer :: stat character(STRING) :: cause_c character(*), parameter:: subname = 'dc_scaledsec' continue !call BeginSub(subname, 'sec=<%f>', d = (/ sec /) ) stat = DC_NOERR cause_c = '' cd = 0 if ( sec < 0.0_DP ) then sclsec % flag_negative = .true. work_sec = - sec else sclsec % flag_negative = .false. work_sec = sec end if if ( work_sec > scale_factor_xx (imax + 1) ) then call MessageNotify( 'W', subname, 'input number (%f) is too large.', d = (/ sec /) ) stat = DC_ETOOLARGETIME goto 999 end if sclsec % sec_ary = 0 do i = imax, imin, -1 work_sec_scl_nint = nint( work_sec * scale_factor_xx(-i) ) if ( .not. work_sec < scale_factor_xx(i) .or. ( i == imin .and. work_sec_scl_nint >= 1 ) ) then if ( i < 0 ) then sclsec % sec_ary(i) = work_sec_scl_nint else sclsec % sec_ary(i) = int( work_sec / scale_factor_xx(i) ) end if work_sec = work_sec - sclsec % sec_ary(i) * scale_factor_xx(i) cd = cd + count_digit( sclsec % sec_ary(i) ) end if if ( cd > 5 ) then if ( .not. abs( work_sec ) < scale_factor_xx(i-1) ) then print_sec = sclsec !!$ call MessageNotify( 'W', subname, & !!$ & 'input number (%f) is truncated to (%f).', & !!$ & d = (/ sec, print_sec /) ) end if exit end if end do move_up = 0 do i = imin, imax sclsec % sec_ary(i) = sclsec % sec_ary(i) + move_up move_up = 0 do while ( sclsec % sec_ary(i) >= scale_factor_int ) move_up = move_up + 1 sclsec % sec_ary(i) = sclsec % sec_ary(i) - scale_factor_int end do end do 999 continue call StoreError(stat, subname, cause_c=cause_c) !call EndSub(subname) end subroutine DCScaledSecCreateD
Subroutine : | |
sclsec : | type(DC_SCALED_SEC), intent(out) |
sec : | integer, intent(in) |
subroutine DCScaledSecCreateI(sclsec, sec) implicit none type(DC_SCALED_SEC), intent(out):: sclsec integer, intent(in):: sec continue call DCScaledSecCreateD(sclsec, real( sec, DP )) end subroutine DCScaledSecCreateI
Subroutine : | |
sec : | real, intent(out) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
subroutine DCScaledSecToNumR(sec, sclsec) use dc_types, only: DP implicit none real, intent(out):: sec type(DC_SCALED_SEC), intent(in):: sclsec real(DP):: secd continue call DCScaledSecToNumD(secd, sclsec) sec = real( secd ) end subroutine DCScaledSecToNumR
Subroutine : | |
sec : | real(DP), intent(out) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
subroutine DCScaledSecToNumD(sec, sclsec) use dc_types, only: DP implicit none real(DP), intent(out):: sec type(DC_SCALED_SEC), intent(in):: sclsec integer:: i continue sec = 0.0_DP do i = imax, imin, -1 sec = sec + ( sclsec % sec_ary(i) * scale_factor_xx(i) ) end do if ( sclsec % flag_negative ) sec = - sec end subroutine DCScaledSecToNumD
Subroutine : | |
sec : | integer, intent(out) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
subroutine DCScaledSecToNumI(sec, sclsec) use dc_types, only: DP implicit none integer, intent(out):: sec type(DC_SCALED_SEC), intent(in):: sclsec real(DP):: secd continue call DCScaledSecToNumD(secd, sclsec) sec = nint( secd ) end subroutine DCScaledSecToNumI
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の整数値 (対象の数値以上で最小の整数) を返す.
Return an integer value (minimum integer over the given value) of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_ceiling_s(sclsec) result(result) ! ! DC_SCALED_SEC 型変数の整数値 (対象の数値以上で最小の整数) を返す. ! ! Return an integer value (minimum integer over the given value) ! of a "DC_SCALED_SEC" variable ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer:: i logical:: flag_after_decimal continue result = sclsec flag_after_decimal = .false. do i = -1, imin, -1 if ( result % sec_ary(i) /= 0 ) flag_after_decimal = .true. result % sec_ary(i) = 0 end do if ( flag_after_decimal .and. .not. result % flag_negative ) then result = result + 1 end if end function dcscaledsec_ceiling_s
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の整数値 (対象の数値以下で最大の整数) を返す.
Return an integer value (maximum integer under the given value) of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_floor_s(sclsec) result(result) ! ! DC_SCALED_SEC 型変数の整数値 (対象の数値以下で最大の整数) を返す. ! ! Return an integer value (maximum integer under the given value) ! of a "DC_SCALED_SEC" variable ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer:: i logical:: flag_after_decimal continue result = sclsec flag_after_decimal = .false. do i = -1, imin, -1 if ( result % sec_ary(i) /= 0 ) flag_after_decimal = .true. result % sec_ary(i) = 0 end do if ( flag_after_decimal .and. result % flag_negative ) then result = result - 1 end if end function dcscaledsec_floor_s
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の整数値 (小数点以下切捨て) を返す.
Return an integer value (fractional parts are truncated) of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_int_s(sclsec) result(result) ! ! DC_SCALED_SEC 型変数の整数値 (小数点以下切捨て) を返す. ! ! Return an integer value (fractional parts are truncated) of a "DC_SCALED_SEC" variable ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer:: i continue result = sclsec do i = -1, imin, -1 result % sec_ary(i) = 0 end do end function dcscaledsec_int_s
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
DC_SCALED_SEC 型変数を割った際の余りを計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mod_si(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の余りを計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = mod( sclsec, factor_scl ) end function dcscaledsec_mod_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
DC_SCALED_SEC 型変数を割った際の余りを計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mod_sd(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の余りを計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = mod( sclsec, factor_scl ) end function dcscaledsec_mod_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
DC_SCALED_SEC 型変数を割った際の余りを計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mod_sr(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の余りを計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = mod( sclsec, factor_scl ) end function dcscaledsec_mod_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数を割った際の余りを計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mod_ss(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の余りを計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec, factor type(DC_SCALED_SEC):: factor_scl real(DP):: sec_ary_mod(imin+imin:imax) integer:: i, move_down_index real(DP):: move_down real(DP):: factor_dp type(DC_SCALED_SEC):: zero_sec continue ! frt, ifort などでは, 1.0e+23 などの実数とすると, ! 9.9999e+22 などとなってしまうため, ! factor として指定するものは 10e+12 までとする. (うーむ, 汚い対応だな....) ! (morikawa 2008/09/01) ! if ( .not. all( factor % sec_ary (imax-4:imax) == (/ 0, 0, 0, 0, 0 /) ) ) then call MessageNotify( 'E', 'dc_scaledsec#mod', 'factor must be smaller than 10^12' ) end if if ( sclsec == factor ) then result = zero_sec return end if factor_scl % sec_ary(imin:-1) = 0 factor_scl % sec_ary(imin-imin:imax) = factor % sec_ary(imin:imax+imin) factor_scl % flag_negative = factor % flag_negative factor_dp = factor_scl move_down = 0.0_DP do i = imax, imin + imin, -1 move_down_index = i if ( move_down /= 0.0_DP ) then if ( abs(factor_dp) > ( move_down + scale_factor ) * scale_factor_xx( i - imin ) ) exit end if if ( i > imin - 1 ) then sec_ary_mod(i) = mod( ( sclsec % sec_ary(i) + move_down ), factor_dp ) else sec_ary_mod(i) = mod( move_down, factor_dp ) end if if ( sec_ary_mod(i) /= 0.0_DP ) then move_down = sec_ary_mod(i) * scale_factor else move_down = 0.0_DP end if end do result = move_down * scale_factor_xx(move_down_index) if ( move_down_index > imin - 1 ) then result % sec_ary(imin:move_down_index) = sclsec % sec_ary(imin:move_down_index) end if result % flag_negative = sclsec % flag_negative end function dcscaledsec_mod_ss
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
DC_SCALED_SEC 型変数を割った際の剰余を計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_modulo_si(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の剰余を計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = modulo( sclsec, factor_scl ) end function dcscaledsec_modulo_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
DC_SCALED_SEC 型変数を割った際の剰余を計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_modulo_sd(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の剰余を計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = modulo( sclsec, factor_scl ) end function dcscaledsec_modulo_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
DC_SCALED_SEC 型変数を割った際の剰余を計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_modulo_sr(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の剰余を計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = modulo( sclsec, factor_scl ) end function dcscaledsec_modulo_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数を割った際の剰余を計算.
Calculate of remainder by division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_modulo_ss(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数を割った際の剰余を計算. ! ! Calculate of remainder by division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec, factor type(DC_SCALED_SEC):: factor_scl real(DP):: sec_ary_mod(imin+imin:imax) integer:: i, move_down_index real(DP):: move_down real(DP):: factor_dp type(DC_SCALED_SEC):: zero_sec continue ! frt, ifort などでは, 1.0e+23 などの実数とすると, ! 9.9999e+22 などとなってしまうため, ! factor として指定するものは 10e+12 までとする. (うーむ, 汚い対応だな....) ! (morikawa 2008/09/01) ! if ( .not. all( factor % sec_ary (imax-4:imax) == (/ 0, 0, 0, 0, 0 /) ) ) then call MessageNotify( 'E', 'dc_scaledsec#modulo', 'factor must be smaller than 10^12' ) end if if ( sclsec == factor ) then result = zero_sec return end if factor_scl % sec_ary(imin:-1) = 0 factor_scl % sec_ary(imin-imin:imax) = factor % sec_ary(imin:imax+imin) factor_scl % flag_negative = factor % flag_negative factor_dp = factor_scl move_down = 0.0_DP do i = imax, imin + imin, -1 move_down_index = i if ( move_down /= 0.0_DP ) then if ( abs(factor_dp) > ( move_down + scale_factor ) * scale_factor_xx( i - imin ) ) exit end if if ( i > imin - 1 ) then sec_ary_mod(i) = mod( ( sclsec % sec_ary(i) + move_down ), factor_dp ) else sec_ary_mod(i) = mod( move_down, factor_dp ) end if if ( sec_ary_mod(i) /= 0.0_DP ) then move_down = sec_ary_mod(i) * scale_factor else move_down = 0.0_DP end if end do result = move_down * scale_factor_xx(move_down_index) if ( move_down_index > imin - 1 ) then result % sec_ary(imin:move_down_index) = sclsec % sec_ary(imin:move_down_index) end if result % flag_negative = .false. if ( .not. result == zero_sec ) then if ( .not. sclsec % flag_negative .and. factor % flag_negative ) then result = - factor - result result % flag_negative = .not. sclsec % flag_negative elseif ( sclsec % flag_negative .and. .not. factor % flag_negative ) then result = factor - result result % flag_negative = .not. sclsec % flag_negative else result % flag_negative = sclsec % flag_negative end if end if end function dcscaledsec_modulo_ss
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_is(factor, sclsec) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec continue result = sclsec * factor end function dcscaledsec_mul_is
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real(DP), intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_ds(factor, sclsec) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none real(DP), intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec continue result = sclsec * factor end function dcscaledsec_mul_ds
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_rs(factor, sclsec) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none real, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec continue result = sclsec * factor end function dcscaledsec_mul_rs
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_si(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor integer:: factor_abs type(DC_SCALED_SEC):: zero_sec real(DP):: sec_ary_dp(imin:imax) integer:: i, move_up continue if ( sclsec == zero_sec .or. factor == 0 ) then result = zero_sec return end if if ( sclsec % flag_negative ) then result % flag_negative = .not. factor < 0 else result % flag_negative = factor < 0 end if factor_abs = abs(factor) move_up = 0 sec_ary_dp(:) = 0.0_DP do i = imin, imax sec_ary_dp(i) = sclsec % sec_ary(i) * factor_abs + move_up if ( .not. sec_ary_dp(i) < scale_factor ) then move_up = int( sec_ary_dp(i) / scale_factor ) sec_ary_dp(i) = sec_ary_dp(i) - move_up * scale_factor else move_up = 0 end if end do if ( move_up /= 0 ) then call MessageNotify( 'E', 'dc_scaledsec#operator(*)', 'DC_SCALED_SEC must be smaller than 10^24' ) end if result % sec_ary(imin:imax) = sec_ary_dp(imin:imax) end function dcscaledsec_mul_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_sd(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec * factor_scl end function dcscaledsec_mul_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_sr(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec * factor_scl end function dcscaledsec_mul_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec1 : | type(DC_SCALED_SEC), intent(in), target |
sclsec2 : | type(DC_SCALED_SEC), intent(in), target |
DC_SCALED_SEC 型変数の乗算.
Multiplication of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_mul_ss(sclsec1, sclsec2) result(result) ! ! DC_SCALED_SEC 型変数の乗算. ! ! Multiplication of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in), target:: sclsec1, sclsec2 integer:: sec_ary_int(imin:imax,imin:imax) ! real(DP):: sec_ary_int(imin:imax,imin:imax) integer:: i, j, move_up type(DC_SCALED_SEC):: zero_sec continue if ( sclsec1 == zero_sec .or. sclsec2 == zero_sec ) then result = zero_sec return end if if ( sclsec1 % flag_negative ) then result % flag_negative = .not. sclsec2 % flag_negative else result % flag_negative = sclsec2 % flag_negative end if move_up = 0 sec_ary_int(:,:) = 0 do i = imin, imax do j = imin, imax sec_ary_int(i,j) = sclsec1 % sec_ary(j) * sclsec2 % sec_ary(i) + move_up if ( i + j > imax .and. sec_ary_int(i,j) /= 0 ) then call MessageNotify( 'E', 'dc_scaledsec#operator(*)', 'DC_SCALED_SEC must be smaller than 10^24' ) end if if ( .not. sec_ary_int(i,j) < scale_factor ) then move_up = int( sec_ary_int(i,j) / scale_factor_int ) sec_ary_int(i,j) = sec_ary_int(i,j) - move_up * scale_factor_int else move_up = 0 end if end do end do result % sec_ary = 0 do i = imin, imax do j = imin, imax if ( i + j < imin ) cycle if ( i + j > imax ) cycle result % sec_ary(i+j) = result % sec_ary(i+j) + sec_ary_int(i,j) end do end do move_up = 0 do i = imin, imax result % sec_ary(i) = result % sec_ary(i) + move_up move_up = 0 do while ( .not. result % sec_ary(i) < scale_factor_int ) if ( i == imax ) then call MessageNotify( 'E', 'dc_scaledsec#operator(*)', 'DC_SCALED_SEC must be smaller than 10^24' ) end if result % sec_ary(i) = result % sec_ary(i) - scale_factor_int move_up = move_up + 1 end do end do end function dcscaledsec_mul_ss
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = factor_scl + sclsec end function dcscaledsec_add_is
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real(DP), intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_ds(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none real(DP), intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec + factor_scl end function dcscaledsec_add_ds
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_rs(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none real, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec + factor_scl end function dcscaledsec_add_rs
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec + factor_scl end function dcscaledsec_add_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_sd(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec + factor_scl end function dcscaledsec_add_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_sr(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec + factor_scl end function dcscaledsec_add_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の加算.
Addition of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_add_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の加算. ! ! Addition of two "DC_SCALED_SEC" variables ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 integer:: i, move_up logical:: both_negative, sclsec2_flag_negative type(DC_SCALED_SEC):: sclsec1_opsign, sclsec2_opsign continue move_up = 0 both_negative = .false. ! 負の値の処理 ! Handle negative value ! sclsec2_flag_negative = sclsec2 % flag_negative if ( sclsec1 % flag_negative ) then both_negative = .true. sclsec2_flag_negative = .not. sclsec2_flag_negative end if if ( sclsec2_flag_negative ) then sclsec1_opsign = sclsec1 sclsec1_opsign % flag_negative = .false. sclsec2_opsign = sclsec2 sclsec2_opsign % flag_negative = .false. result = sclsec1_opsign - sclsec2_opsign if ( both_negative ) then result % flag_negative = .not. result % flag_negative end if return end if ! 加算 ! Addition ! do i = imin, imax result % sec_ary(i) = sclsec1 % sec_ary(i) + sclsec2 % sec_ary(i) + move_up if ( .not. result % sec_ary(i) < scale_factor_int ) then if ( i == imax ) then call MessageNotify( 'E', 'dc_scaledsec#operator(*)', 'DC_SCALED_SEC must be smaller than 10^24' ) end if move_up = result % sec_ary(i) / scale_factor_int result % sec_ary(i) = mod( result % sec_ary(i), scale_factor_int ) else move_up = 0 end if end do if ( both_negative ) then result % flag_negative = .true. else result % flag_negative = .false. end if end function dcscaledsec_add_ss
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = factor_scl - sclsec end function dcscaledsec_sub_is
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real(DP), intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_ds(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none real(DP), intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = factor_scl - sclsec end function dcscaledsec_sub_ds
Function : | |
result : | type(DC_SCALED_SEC) |
factor : | real, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_rs(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none real, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = factor_scl - sclsec end function dcscaledsec_sub_rs
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の符号を逆にする.
Inverse sign of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_sub_s(sclsec) result(result) ! ! DC_SCALED_SEC 型変数の符号を逆にする. ! ! Inverse sign of a "DC_SCALED_SEC" variable ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec continue result % flag_negative = .not. sclsec % flag_negative result % sec_ary = sclsec % sec_ary end function dcscaledsec_sub_s
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec - factor_scl end function dcscaledsec_sub_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_sd(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec - factor_scl end function dcscaledsec_sub_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_sr(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: factor_scl continue factor_scl = factor result = sclsec - factor_scl end function dcscaledsec_sub_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の減算.
Subtraction of two "DC_SCALED_SEC" variables
type(DC_SCALED_SEC) function dcscaledsec_sub_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の減算. ! ! Subtraction of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 integer:: i, move_down logical:: both_negative, sclsec2_flag_negative type(DC_SCALED_SEC):: sclsec1_opsign, sclsec2_opsign type(DC_SCALED_SEC):: sclsec1_nosign, sclsec2_nosign type(DC_SCALED_SEC):: large, small continue both_negative = .false. ! 負の値の処理 ! Handle negative value ! sclsec2_flag_negative = sclsec2 % flag_negative if ( sclsec1 % flag_negative ) then both_negative = .true. sclsec2_flag_negative = .not. sclsec2_flag_negative end if if ( sclsec2_flag_negative ) then sclsec1_opsign = sclsec1 sclsec1_opsign % flag_negative = .false. sclsec2_opsign = sclsec2 sclsec2_opsign % flag_negative = .false. result = sclsec1_opsign + sclsec2_opsign if ( both_negative ) then result % flag_negative = .not. result % flag_negative end if return end if ! 絶対値の比較 ! Compare absolute values ! sclsec1_nosign = sclsec1 sclsec1_nosign % flag_negative = .false. sclsec2_nosign = sclsec2 sclsec2_nosign % flag_negative = .false. if ( sclsec1_nosign > sclsec2_nosign ) then result % flag_negative = .false. large = sclsec1_nosign small = sclsec2_nosign elseif ( sclsec1_nosign < sclsec2_nosign ) then result % flag_negative = .true. large = sclsec2_nosign small = sclsec1_nosign else result = 0 return end if move_down = 0 do i = imin, imax result % sec_ary(i) = large % sec_ary(i) - small % sec_ary(i) + move_down if ( result % sec_ary(i) < 0 ) then move_down = ( result % sec_ary(i) / scale_factor_int ) - 1 result % sec_ary(i) = mod( result % sec_ary(i), scale_factor_int ) + scale_factor_int else move_down = 0 end if end do if ( both_negative ) then result % flag_negative = .not. result % flag_negative end if end function dcscaledsec_sub_ss
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
DC_SCALED_SEC 型変数の除算.
Division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_div_si(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の除算. ! ! Division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor continue result = sclsec / real( factor, DP ) end function dcscaledsec_div_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
DC_SCALED_SEC 型変数の除算.
Division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_div_sd(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の除算. ! ! Division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor integer:: i real(DP):: factor_abs, move_down, sec_ary_mod(imin+imin:imax) !logical:: flag_approximate continue if ( sclsec % flag_negative ) then result % flag_negative = .not. factor < 0.0_DP else result % flag_negative = factor < 0.0_DP end if factor_abs = abs(factor) * scale_factor_xx(2) ! flag_approximate = .false. move_down = 0.0_DP do i = imax, imin + imin, -1 if ( i > imax + imin ) then sec_ary_mod(i) = sclsec % sec_ary(i) elseif ( i > imin - 1 ) then result % sec_ary(i-imin) = int( ( sclsec % sec_ary(i) + move_down ) / factor_abs ) sec_ary_mod(i) = mod( ( sclsec % sec_ary(i) + move_down ), factor_abs ) else result % sec_ary(i-imin) = int( move_down / factor_abs ) sec_ary_mod(i) = mod( move_down, factor_abs ) end if if ( sec_ary_mod(i) /= 0.0_DP ) then !if ( i < imin ) flag_approximate = .true. move_down = sec_ary_mod(i) * scale_factor else move_down = 0.0_DP end if end do !!$ if ( flag_approximate ) then !!$ call MessageNotify( 'W', 'dc_scaledsec#operator(/)', & !!$ & 'result may be calculated approximately' ) !!$ end if end function dcscaledsec_div_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
DC_SCALED_SEC 型変数の除算.
Division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_div_sr(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の除算. ! ! Division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor continue result = sclsec / real( factor, DP ) end function dcscaledsec_div_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | type(DC_SCALED_SEC), intent(in) |
DC_SCALED_SEC 型変数の除算.
Division of a "DC_SCALED_SEC" variable
type(DC_SCALED_SEC) function dcscaledsec_div_ss(sclsec, factor) result(result) ! ! DC_SCALED_SEC 型変数の除算. ! ! Division of a "DC_SCALED_SEC" variable ! use dc_message, only: MessageNotify implicit none type(DC_SCALED_SEC), intent(in):: sclsec, factor real(DP):: factor_abs continue ! frt, ifort などでは, 1.0e+23 などの実数とすると, ! 9.9999e+22 などとなってしまうため, ! factor として指定するものは 10e+12 までとする. (うーむ, 汚い対応だな....) ! (morikawa 2008/09/01) ! if ( .not. all( factor % sec_ary (imax-4:imax) == (/ 0, 0, 0, 0, 0 /) ) ) then call MessageNotify( 'E', 'dc_scaledsec#mod', 'factor must be smaller than 10^12' ) end if factor_abs = factor result = sclsec / factor_abs end function dcscaledsec_div_ss
Function : | |
result : | logical |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_lt_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl integer:: i, sec1, factor_abs logical:: both_negative continue if ( sclsec % flag_negative .and. .not. factor < 0 ) then result = .false. return elseif ( .not. sclsec % flag_negative .and. factor < 0 ) then result = .true. return elseif ( sclsec % flag_negative .and. factor < 0 ) then both_negative = .true. else both_negative = .false. end if factor_abs = abs(factor) if ( factor_abs > scale_factor_int_xx(3) ) then factor_scl = factor result = factor_scl < sclsec return else if ( .not. all( sclsec % sec_ary(3:imax) == (/0, 0, 0, 0, 0, 0/) ) ) then result = .true. else sec1 = sclsec % sec_ary(0) do i = 1, 2 sec1 = sec1 + sclsec % sec_ary(i) * scale_factor_int_xx(i) end do if ( sec1 == factor_abs ) then result = .not. all( sclsec % sec_ary(imin:-1) == (/0, 0/) ) else result = factor_abs < sec1 end if end if if ( both_negative ) result = .not. result end if end function dcscaledsec_lt_is
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_lt_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl integer:: i, sec1, factor_abs logical:: both_negative continue if ( sclsec % flag_negative .and. .not. factor < 0 ) then result = .true. return elseif ( .not. sclsec % flag_negative .and. factor < 0 ) then result = .false. return elseif ( sclsec % flag_negative .and. factor < 0 ) then both_negative = .true. else both_negative = .false. end if factor_abs = abs(factor) if ( factor_abs > scale_factor_int_xx(3) ) then factor_scl = factor result = sclsec < factor_scl return else if ( .not. all( sclsec % sec_ary(3:imax) == (/0, 0, 0, 0, 0, 0/) ) ) then result = .false. else sec1 = sclsec % sec_ary(0) do i = 1, 2 sec1 = sec1 + sclsec % sec_ary(i) * scale_factor_int_xx(i) end do if ( sec1 == factor_abs ) then result = .false. else result = sec1 < factor_abs end if end if if ( both_negative ) result = .not. result end if end function dcscaledsec_lt_si
Function : | |
result : | logical |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_lt_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 integer:: i logical:: both_negative, flag_equal continue result = .false. flag_equal = .true. if ( sclsec1 % flag_negative .and. .not. sclsec2 % flag_negative ) then result = .true. return elseif ( .not. sclsec1 % flag_negative .and. sclsec2 % flag_negative ) then result = .false. return elseif ( sclsec1 % flag_negative .and. sclsec2 % flag_negative ) then both_negative = .true. else both_negative = .false. end if do i = imax, imin, -1 if ( sclsec1 % sec_ary(i) > sclsec2 % sec_ary(i) ) then result = .false. flag_equal = .false. exit elseif ( sclsec1 % sec_ary(i) < sclsec2 % sec_ary(i) ) then result = .true. flag_equal = .false. exit end if end do if ( .not. flag_equal .and. both_negative ) result = .not. result end function dcscaledsec_lt_ss
Function : | |
result : | logical |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_le_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec continue result = .not. factor > sclsec end function dcscaledsec_le_is
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_le_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor continue result = .not. sclsec > factor end function dcscaledsec_le_si
Function : | |
result : | logical |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_le_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 continue result = .not. sclsec1 > sclsec2 end function dcscaledsec_le_ss
Function : | |
result : | logical |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_eq_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 integer:: i continue if ( sclsec1 % flag_negative .and. .not. sclsec2 % flag_negative ) then result = .false. return elseif ( .not. sclsec1 % flag_negative .and. sclsec2 % flag_negative ) then result = .false. return end if do i = imax, imin, -1 if ( .not. sclsec1 % sec_ary(i) == sclsec2 % sec_ary(i) ) then result = .false. return end if end do result = .true. end function dcscaledsec_eq_ss
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
sec : | integer, intent(in) |
logical function dcscaledsec_eq_si(sclsec, sec) result(result) implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: sec type(DC_SCALED_SEC):: sclsec2 integer:: i, sec1 continue if ( sclsec % flag_negative .and. .not. sec < 0 ) then result = .false. return elseif ( .not. sclsec % flag_negative .and. sec < 0 ) then result = .false. return end if if ( abs(sec) > scale_factor_int_xx(3) ) then sclsec2 = sec result = sclsec == sclsec2 else if ( .not. all( sclsec % sec_ary(imin:-1) == (/0, 0/) ) .or. .not. all( sclsec % sec_ary(3:imax) == (/0, 0, 0, 0, 0, 0/) ) ) then result = .false. return end if sec1 = sclsec % sec_ary(0) do i = 1, 2 sec1 = sec1 + sclsec % sec_ary(i) * scale_factor_int_xx(i) end do result = sec1 == sec end if end function dcscaledsec_eq_si
Function : | |
result : | logical |
sec : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
logical function dcscaledsec_eq_is(sec, sclsec) result(result) implicit none integer, intent(in):: sec type(DC_SCALED_SEC), intent(in):: sclsec continue result = sclsec == sec end function dcscaledsec_eq_is
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
sec : | real, intent(in) |
logical function dcscaledsec_eq_sr(sclsec, sec) result(result) implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: sec type(DC_SCALED_SEC):: sclsec2 continue sclsec2 = sec result = sclsec == sclsec2 end function dcscaledsec_eq_sr
Function : | |
result : | logical |
sec : | real, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
logical function dcscaledsec_eq_rs(sec, sclsec) result(result) implicit none real, intent(in):: sec type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: sclsec2 continue sclsec2 = sec result = sclsec == sclsec2 end function dcscaledsec_eq_rs
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
sec : | real(DP), intent(in) |
logical function dcscaledsec_eq_sd(sclsec, sec) result(result) implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: sec type(DC_SCALED_SEC):: sclsec2 continue sclsec2 = sec result = sclsec == sclsec2 end function dcscaledsec_eq_sd
Function : | |
result : | logical |
sec : | real(DP), intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
logical function dcscaledsec_eq_ds(sec, sclsec) result(result) implicit none real(DP), intent(in):: sec type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: sclsec2 continue sclsec2 = sec result = sclsec == sclsec2 end function dcscaledsec_eq_ds
Function : | |
result : | logical |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_gt_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec type(DC_SCALED_SEC):: factor_scl integer:: i, sec1, factor_abs logical:: both_negative continue if ( sclsec % flag_negative .and. .not. factor < 0 ) then result = .true. return elseif ( .not. sclsec % flag_negative .and. factor < 0 ) then result = .false. return elseif ( sclsec % flag_negative .and. factor < 0 ) then both_negative = .true. else both_negative = .false. end if factor_abs = abs(factor) if ( factor_abs > scale_factor_int_xx(3) ) then factor_scl = factor result = factor_scl > sclsec return else if ( .not. all( sclsec % sec_ary(3:imax) == (/0, 0, 0, 0, 0, 0/) ) ) then result = .false. else sec1 = sclsec % sec_ary(0) do i = 1, 2 sec1 = sec1 + sclsec % sec_ary(i) * scale_factor_int_xx(i) end do if ( sec1 == factor_abs ) then result = .false. else result = factor_abs > sec1 end if end if if ( both_negative ) result = .not. result end if end function dcscaledsec_gt_is
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_gt_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: factor_scl integer:: i, sec1, factor_abs logical:: both_negative continue if ( sclsec % flag_negative .and. .not. factor < 0 ) then result = .false. return elseif ( .not. sclsec % flag_negative .and. factor < 0 ) then result = .true. return elseif ( sclsec % flag_negative .and. factor < 0 ) then both_negative = .true. else both_negative = .false. end if factor_abs = abs(factor) if ( factor_abs > scale_factor_int_xx(3) ) then factor_scl = factor result = sclsec > factor_scl return else if ( .not. all( sclsec % sec_ary(3:imax) == (/0, 0, 0, 0, 0, 0/) ) ) then result = .true. else sec1 = sclsec % sec_ary(0) do i = 1, 2 sec1 = sec1 + sclsec % sec_ary(i) * scale_factor_int_xx(i) end do if ( sec1 == factor_abs ) then result = .not. all( sclsec % sec_ary(imin:-1) == (/0, 0/) ) else result = sec1 > factor_abs end if end if if ( both_negative ) result = .not. result end if end function dcscaledsec_gt_si
Function : | |
result : | logical |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_gt_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 integer:: i logical:: both_negative, flag_equal continue result = .false. flag_equal = .true. if ( sclsec1 % flag_negative .and. .not. sclsec2 % flag_negative ) then result = .false. return elseif ( .not. sclsec1 % flag_negative .and. sclsec2 % flag_negative ) then result = .true. return elseif ( sclsec1 % flag_negative .and. sclsec2 % flag_negative ) then both_negative = .true. else both_negative = .false. end if do i = imax, imin, -1 if ( sclsec1 % sec_ary(i) > sclsec2 % sec_ary(i) ) then result = .true. flag_equal = .false. exit elseif ( sclsec1 % sec_ary(i) < sclsec2 % sec_ary(i) ) then result = .false. flag_equal = .false. exit end if end do if ( .not. flag_equal .and. both_negative ) result = .not. result end function dcscaledsec_gt_ss
Function : | |
result : | logical |
factor : | integer, intent(in) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_ge_is(factor, sclsec) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none integer, intent(in):: factor type(DC_SCALED_SEC), intent(in):: sclsec continue result = .not. factor < sclsec end function dcscaledsec_ge_is
Function : | |
result : | logical |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_ge_si(sclsec, factor) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor continue result = .not. sclsec < factor end function dcscaledsec_ge_si
Function : | |
result : | logical |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
2 つの DC_SCALED_SEC 型変数の比較
Comparison of two "DC_SCALED_SEC" variables
logical function dcscaledsec_ge_ss(sclsec1, sclsec2) result(result) ! ! 2 つの DC_SCALED_SEC 型変数の比較 ! ! Comparison of two "DC_SCALED_SEC" variables ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 continue result = .not. sclsec1 < sclsec2 end function dcscaledsec_ge_ss
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | integer, intent(in) |
sclsec の絶対値に factor の符号をつけたものを返す.
Return an absolute value of "sclsec" with sign of "factor".
type(DC_SCALED_SEC) function dcscaledsec_sign_si(sclsec, factor) result(result) ! ! sclsec の絶対値に factor の符号をつけたものを返す. ! ! Return an absolute value of "sclsec" with sign of "factor". ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec integer, intent(in):: factor type(DC_SCALED_SEC):: sclsec_work continue sclsec_work = factor result = sign( sclsec, sclsec_work ) end function dcscaledsec_sign_si
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real(DP), intent(in) |
sclsec の絶対値に factor の符号をつけたものを返す.
Return an absolute value of "sclsec" with sign of "factor".
type(DC_SCALED_SEC) function dcscaledsec_sign_sd(sclsec, factor) result(result) ! ! sclsec の絶対値に factor の符号をつけたものを返す. ! ! Return an absolute value of "sclsec" with sign of "factor". ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real(DP), intent(in):: factor type(DC_SCALED_SEC):: sclsec_work continue sclsec_work = factor result = sign( sclsec, sclsec_work ) end function dcscaledsec_sign_sd
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec : | type(DC_SCALED_SEC), intent(in) |
factor : | real, intent(in) |
sclsec の絶対値に factor の符号をつけたものを返す.
Return an absolute value of "sclsec" with sign of "factor".
type(DC_SCALED_SEC) function dcscaledsec_sign_sr(sclsec, factor) result(result) ! ! sclsec の絶対値に factor の符号をつけたものを返す. ! ! Return an absolute value of "sclsec" with sign of "factor". ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec real, intent(in):: factor type(DC_SCALED_SEC):: sclsec_work continue sclsec_work = factor result = sign( sclsec, sclsec_work ) end function dcscaledsec_sign_sr
Function : | |
result : | type(DC_SCALED_SEC) |
sclsec1 : | type(DC_SCALED_SEC), intent(in) |
sclsec2 : | type(DC_SCALED_SEC), intent(in) |
sclsec1 の絶対値に sclsec2 の符号をつけたものを返す.
Return an absolute value of "sclsec1" with sign of "sclsec2".
type(DC_SCALED_SEC) function dcscaledsec_sign_ss(sclsec1, sclsec2) result(result) ! ! sclsec1 の絶対値に sclsec2 の符号をつけたものを返す. ! ! Return an absolute value of "sclsec1" with sign of "sclsec2". ! implicit none type(DC_SCALED_SEC), intent(in):: sclsec1, sclsec2 continue result = sclsec1 result % flag_negative = sclsec2 % flag_negative end function dcscaledsec_sign_ss