Class dc_scaledsec
In: dc_utils/dc_scaledsec.f90
assignment(=) :代入
operator(+) :加算
operator(-) :減算
operator(*) :乗算
operator(/) :除算
mod :余り
modulo :剰余
operator(==) :比較
operator(>) :比較
operator(<) :比較
abs :絶対値の算出
int :整数の算出 (小数点以下切捨て)
sign :符号の設定
floor :整数の算出 (対象の数値以下で最大の整数)
ceiling :整数の算出 (対象の数値以上で最小の整数)

Methods

Included Modules

dc_types dc_message dc_error dc_trace dc_string

Public Instance methods

Subroutine :
sclsec :type(DC_SCALED_SEC), intent(in)
unit :integer, intent(in), optional
: 出力先の装置番号. デフォルトの出力先は標準出力.

Unit number for output. Default value is standard output.

indent :character(*), intent(in), optional
: 表示されるメッセージの字下げ.

Indent of displayed messages.

引数 sclsec に設定されている情報を印字します. デフォルトではメッセージは標準出力に出力されます. unit に装置番号を指定することで, 出力先を変更することが可能です.

Print information of sclsec. By default messages are output to standard output. Unit number for output can be changed by unit argument.

[Source]

  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
DC_SCALED_SEC
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

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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)

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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

[Source]

  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".

[Source]

  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".

[Source]

  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".

[Source]

  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".

[Source]

  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