FrontISTR【伝熱解析での変数の追加】

力学解析(fstrSOLID)ではユーザーサブルーチンが使用でき、ユーザー定義の材料定数(matl)や内部変数(fstat)を使えますが、伝熱解析(fstrHEAT)には該当する変数がないので追加しました。

目標

  • パラメータを定義し、.cntファイルから読み込むこと。
  • 要素のガウス点上で内部変数を定義すること。

追加での変数の設定(内部変数)

@lib/m_fstr.f90

type fstr_heat
    real(kind=kreal), pointer :: parameters(:)
    real(kind=kreal), pointer :: phi(:,:,:)
end type fstr_heat

パラメータ(parameters)と内部変数(Φ)を定義しています。

パラメータの読み込み部分

@common/fstr_setup.f90

      else if( header_name == '!USERHEAT') then
        call fstr_setup_USERHEAT( ctrl, P )
  subroutine fstr_setup_USERHEAT( ctrl, P )

    integer(kind=kint) :: ctrl
    type(fstr_param_pack) :: P

    integer(kind=kint) :: rcode

    call reallocate_real( P%HEAT%parameters, 8 )

    P%HEAT%parameters(:) = 0.0d0
    rcode = fstr_ctrl_get_USERHEAT( ctrl, P%HEAT%parameters )

    if( rcode /= 0 ) then
      call fstr_ctrl_err_stop
    end if

  end subroutine fstr_setup_USERHEAT

ほかにいろいろとヘッダ行読み込み部分があるので、参考にして近くにつっ込みます。

@common/fstr_ctrl_heat

 
  function fstr_ctrl_get_USERHEAT( ctrl, parameters )

    implicit none
    integer(kind=kint) :: ctrl
    real(kind=kreal),pointer :: parameters(:)
    integer(kind=kint) :: fstr_ctrl_get_USERHEAT

    fstr_ctrl_get_USERHEAT = -1

    ! JP-7
    if( fstr_ctrl_get_data_array_ex( ctrl, 'rrrrrrrr ', &
     parameters(1), parameters(2), parameters(3), parameters(4), &
     parameters(5), parameters(6), parameters(7), parameters(8)  )/= 0) return

    fstr_ctrl_get_USERHEAT = 0

  end function fstr_ctrl_get_USERHEAT

.cntのファイルから読み込み用のプログラムを作成しました。拡張性を考えて、とりあえず最大8変数を読み込めるようにしました。.cntファイルへの記述例は次の通り。

!USERHEAT
-5e4, 1000e0, 100e0

追加した内部変数の初期化、allocate

@analysis/heat/heat_init.f90

subroutine heat_init()

    nelem = hecMESH%n_elem
    maxng = 0
    do i = 1, nelem
      maxng = max( maxng, NumOfQuadPoints( hecMESH%elem_type(i) ) )
    enddo
    allocate( fstrHEAT%phi(3,maxng,nelem), source=0.0d0 )
    fstrHEAT%phi(2,:,:) = -1.0d0

endsubroutine

内部変数の初期化です。ガウス点上に割り当てたかったので、内部変数の数×ガウス点の数×要素数で定義しました。

メモ:現在は各要素に対して積分点の数は1対1対応のようです。