| Class | gt4_historyauto_h | 
| In: | gt4_historyauto_h.f90 | 
module gt4_history のアプリケーション. 変数毎に時・空間に自由にサンプリングを設定できる. 長くなりそうな出力の時分割や並列化に対応.
その他の特徴
| HistoryAutoCreate : | . | 
| HistoryAutoCopyCreate : | . | 
| HistoryAutoPut : | . | 
| HistoryAutoWhetherPutNow : | . | 
| GT4_ATTRIBUTE ( init_gt4_attribute ) : | . | 
| GT4_REAL1D ( init_gt4_real1d ) : | . | 
| GT4_NAMED_REALARY ( init_gt4_named_realary ) : | . | 
| Derived Type : | |
| name : | character(len=TOKEN) | 
| rval(:) =>null() : | real,pointer | 
| ival(:) =>null() : | integer,pointer | 
| cval : | character(len=STRING) | 
属性を名前と値の組で入れる
| Derived Type : | |||
| rank : | integer | ||
| name : | character(len=TOKEN) | ||
| dims(3) : | character(len=TOKEN) 
 | ||
| longname : | character(len=STRING) | ||
| units : | character(len=STRING) | ||
| ary(:) =>null() : | real,pointer | 
名前, 次元名, longname, units を持つ実数配列. 配列データは 1 次元で保持
| Derived Type : | |
| ary(:) => null() : | real,pointer | 
to make an array of 1D arrays
配列の配列をつくるための型 (実数)
| Subroutine : | |
| name : | character(len=*), intent(in) | 
| longname : | character(len=*), intent(in) | 
| units : | character(len=*), intent(in) | 
| file : | character(len=*), intent(in),optional | 
use the result of the latest call of HistoryAutoCreate
直前の HistoryAutoCreate を使って, 格子及び出力の空間・時間 サンプリングが同じ出力を定義する. file を省略すれば 同じファイルを使う.
  subroutine HistoryAutoCopyCreate( name, longname, units, file )
    !
    ! use the result of the latest call of HistoryAutoCreate
    !
    ! 直前の HistoryAutoCreate を使って, 格子及び出力の空間・時間
    ! サンプリングが同じ出力を定義する. file を省略すれば
    ! 同じファイルを使う.
    !
    character(len=*), intent(in)          :: name
    character(len=*), intent(in)          :: longname
    character(len=*), intent(in)          :: units
    character(len=*), intent(in),optional :: file
    !
    type(HIST_EACHVAR)              :: hist
    type(HIST_EACHVAR),pointer      :: histpt
    character(len = *), parameter:: subname = 'HistoryAutoCopyCreate'
    !
    call BeginSub(subname)
    histpt => histpl_last(HISTPOOL)
    hist = histpt         ! copy the contents
    if(present_and_not_empty(file)) then
      hist%file = file
      allocate(hist%h)       ! always new allocation
      nullify(hist%h%hs)
    else
      hist%h => histpt%h
    endif
    hist%name = name
    hist%longname = longname
    hist%units = units
    call histpl_push(HISTPOOL, hist)
    call EndSub(subname)
  end subroutine HistoryAutoCopyCreate
          | Subroutine : | |||
| name : | character(len=*), intent(in) | ||
| longname : | character(len=*), intent(in) | ||
| units : | character(len=*), intent(in) | ||
| file : | character(len=*), intent(in) | ||
| slfst(*) : | integer, intent(in) 
 | ||
| sllst(*) : | integer, intent(in) 
 | ||
| slstp(*) : | integer, intent(in) 
 | ||
| time_to_start : | real, intent(in) 
 | ||
| put_interval : | real, intent(in) 
 | ||
| dt : | real, intent(in) 
 | ||
| newfile_interval : | real, intent(in) 
 | ||
| attrs(:) : | type(GT4_ATTRIBUTE),intent(in),optional | ||
| aryshape(:) : | integer, intent(in) 
 | ||
| dims(*) : | character(len=*), intent(in) 
 | ||
| axlongnames(*) : | character(len=*), intent(in) 
 | ||
| axunits(*) : | character(len=*), intent(in) 
 | ||
| axxtypes(*) : | character(len=*), intent(in) | ||
| spcoordvars(*) : | type(GT4_REAL1D),
intent(in) 
 | ||
| ancilcrdvars(:) : | type(GT4_NAMED_REALARY),intent(in),optional | ||
| title : | character(len=*), intent(in),optional | ||
| source : | character(len=*), intent(in),optional | ||
| institution : | character(len=*), intent(in),optional | ||
| conventions : | character(len=*), intent(in),optional | ||
| gt_version : | character(len=*), intent(in),optional | ||
| proc : | character(len=*), intent(in),optional | ||
| domain_div : | logical, intent(in),optional | ||
| subdomfst(*) : | integer, intent(in),optional 
 | 
ヒストリファイル初期化情報の設定. 実際のファイル初期化は 必要に応じて HistoryAutoPut が行う (時分割するときは適宜 クローズと初期化を繰り返さないとならないので, そういう 構造になる). なお, 一つのファイルへの出力に対して このサブルーチンを 2 回以上呼んではならない. 複数の 変数を一つのファイルに出したい場合は, HistoryAutoCopyCreate を利用せよ. 時・空間に自由にサンプリングを設定できる. 但し, いずれも等間隔. 長い時間積分によって, ファイルが 大きくなり過ぎることに対応するため, 一定の時間間隔で 分割することが可能. また, 並列化を念頭に各ノードを特定する 文字列を挿入することができる.
  subroutine HistoryAutoCreateH1( name, longname, units, file, slfst, sllst, slstp, time_to_start, put_interval, dt, newfile_interval, attrs, aryshape, dims, axlongnames, axunits, axxtypes, spcoordvars, ancilcrdvars, title, source, institution, conventions, gt_version, proc, domain_div, subdomfst )
    !
    ! ヒストリファイル初期化情報の設定. 実際のファイル初期化は
    ! 必要に応じて HistoryAutoPut が行う (時分割するときは適宜
    ! クローズと初期化を繰り返さないとならないので, そういう
    ! 構造になる). なお, 一つのファイルへの出力に対して
    ! このサブルーチンを 2 回以上呼んではならない. 複数の
    ! 変数を一つのファイルに出したい場合は, HistoryAutoCopyCreate
    ! を利用せよ.
    ! 時・空間に自由にサンプリングを設定できる.
    ! 但し, いずれも等間隔. 長い時間積分によって, ファイルが
    ! 大きくなり過ぎることに対応するため, 一定の時間間隔で
    ! 分割することが可能. また, 並列化を念頭に各ノードを特定する
    ! 文字列を挿入することができる.
    !
    use dc_error, only: USR_ERRNO, StoreError
    implicit none
    character(len=*), intent(in)     :: name
    character(len=*), intent(in)     :: longname
    character(len=*), intent(in)     :: units
    character(len=*), intent(in)     :: file
    integer, intent(in)              :: slfst(*)     ! size == sprank
                              ! 空間データのスライス (開始点の指定. 
                              ! 指定はデータの値ではなく, 格子点添字)
    integer, intent(in)              :: sllst(*)     ! size == sprank
                              ! 空間データのスライス (終了点の指定. 
                              ! 指定はデータの値ではなく, 格子点添字). 
                              ! 0 を指定する場合には, データの最後尾を
                              ! 終了点とする. 
    integer, intent(in)              :: slstp(*)     ! size == sprank
                              ! 空間データのスライス (刻み幅の指定. 
                              ! 指定はデータの値ではなく, 格子点添字). 
    real,             intent(in)     :: time_to_start
                              ! 出力開始時刻
    real,             intent(in)     :: put_interval
                              ! データ出力間隔
    real,             intent(in)     :: dt
                              ! モデルのΔt (時刻を自動で進めるためではなく, 
                              ! 時刻の許容誤差を測るためのもの). 
    real, intent(in)                 :: newfile_interval
                              ! ファイルを分割する時間間隔. 
                              ! 負の値を与えると分割を行わない. 
    type(GT4_ATTRIBUTE),intent(in),optional  :: attrs(:)
    integer, intent(in)              :: aryshape(:) ! size <= 3 (--> sprank)
                              ! 次元サイズの指定
    character(len=*), intent(in)     :: dims(*)           !size == sprank+1
    character(len=*), intent(in)     :: axlongnames(*)    !size == sprank+1
    character(len=*), intent(in)     :: axunits(*)        !size == sprank+1
    character(len=*), intent(in)     :: axxtypes(*)
    type(GT4_REAL1D), intent(in)         :: spcoordvars(*)    ! size == sprank
    type(GT4_NAMED_REALARY),intent(in),optional  :: ancilcrdvars(:)
    character(len=*), intent(in),optional  :: proc
    character(len=*), intent(in),optional  :: title, source, institution
    character(len=*), intent(in),optional  :: conventions, gt_version
    logical, intent(in),optional :: domain_div
    integer, intent(in),optional :: subdomfst(*) ! For domain-dividing comp.
    ! first indx relative in the whole dom. (size == sprank)
    !
    type(HIST_EACHVAR)            :: hist
    integer                       :: sprank,i,slf
    character(len = *),parameter  :: subname = "HistoryAutoCreate1"
    
    call BeginSub(subname)
    
    !< initialize hist except hist%h -- actual creation is deferred >
    
    hist%time_last = -1e35 ! time_last_inival
    allocate(hist%h)       ! always new allocation
    nullify(hist%h%hs)
    
    hist%name = name
    hist%longname = longname
    hist%units = units
    
    sprank = min( size(aryshape), 3 )
    hist%sprank = sprank
    
    
    if ( present_and_true(domain_div) ) then
      hist%domain_div = .true.
      if (.not. present(subdomfst)) call StoreError(USR_ERRNO, subname, cause_c='When domain_div is present and true, subdomfst '// 'must also be present.')
    else
      hist%domain_div = .false.
    end if
    
    if (hist%domain_div .and. (minval(slfst(1:sprank)).le.0 .or. minval(sllst(1:sprank)).lt.0) ) then
      call StoreError(USR_ERRNO, subname, cause_c='When the domain is divided, output-domain '// 'limiting from the end by using negative indices is not '// 'available, since the whole domain size is not known. '// 'Use a postive number (or zero for sllst to express the'// ' last grid point).')
    endif
    
    hist%size = 1
    hist%out_of_domain = .false.   ! Init. May be true in domain division.
    
    do i=1,sprank
      hist%aryshape(i) = aryshape(i)
      if(slstp(i) > 0) then
        hist%slstp(i) = slstp(i)
      else
        hist%slstp(i) = 1
      endif
      if (.not.hist%domain_div) then
        if(slfst(i) > 0) then
          hist%slfst(i) = slfst(i)
        else
          hist%slfst(i) = slfst(i) + aryshape(i)
        endif
        if(sllst(i) > 0) then
          hist%sllst(i) = sllst(i)
        else
          hist%sllst(i) = sllst(i) + aryshape(i)
        endif
      else
        slf = slfst(i) - subdomfst(i) + 1
        if (slf.le.0) then
          slf = modulo(slf-1,hist%slstp(i)) + 1
        else if(slf.gt.aryshape(i)) then
          hist%out_of_domain = .true.
        endif
        hist%slfst(i) = slf
        if (sllst(i).eq.0) then
          hist%sllst(i) = aryshape(i)
        else
          hist%sllst(i) = min( sllst(i) - subdomfst(i) + 1, aryshape(i) )
          if (hist%sllst(i).le.0) then
            hist%out_of_domain = .true.
          endif
        endif
      endif
      hist%dimsizes(i) = (hist%sllst(i)-hist%slfst(i))/hist%slstp(i) + 1
      if (.not.hist%domain_div) then
        if (hist%slfst(i)<=0 .or. hist%slfst(i)>aryshape(i)) call StoreError(USR_ERRNO, subname, cause_c= 'str not within the index range for dim:',cause_i=i)
        if (hist%sllst(i)<=0 .or. hist%sllst(i)>aryshape(i)) call StoreError(USR_ERRNO, subname, cause_c= 'end not within the index range for dim:',cause_i=i)
        if (hist%slstp(i)<=0) call StoreError(USR_ERRNO, subname, cause_c='step not positive for dim:', cause_i=i)
        if (hist%dimsizes(i)<=0) call StoreError(USR_ERRNO, subname, cause_c='negative dimsize for dim:', cause_i=i)
      endif
      hist%size = hist%size * hist%dimsizes(i)
    enddo
    hist%dimsizes(sprank+1) = 0   ! unlimited dimension
    
    hist%file = file
    hist%newfile_interval = newfile_interval
    hist%dims(1:sprank+1) = dims(1:sprank+1)
    hist%axlongnames(1:sprank+1) = axlongnames(1:sprank+1)
    hist%axunits(1:sprank+1) = axunits(1:sprank+1)
    hist%time_to_start = time_to_start
    hist%put_interval = put_interval
    hist%dt = dt
    hist%axxtypes(1:sprank+1) = axxtypes(1:sprank+1)
    if(present(title)) then
      hist%title = title
    else
      hist%title = com_title
    endif
    if(present(source)) then
      hist%source = source
    else
      hist%source = com_source
    endif
    if(present(institution)) then
      hist%institution = institution
    else
      hist%institution = com_institution
    endif
    if(present(conventions)) then
      hist%conventions = conventions
    else
      hist%conventions = com_conventions
    endif
    if(present(gt_version)) then
      hist%gt_version = gt_version
    else
      hist%gt_version = com_gt_version
    endif
    if(present(proc)) then
      hist%proc = proc
    else
      hist%proc = com_proc
    endif
    
    hist%spcoordvars(1:sprank) = spcoordvars(1:sprank)
    if(.not. present(ancilcrdvars)) then
      nullify(hist%ancilcrdvars)
    else if ( size(ancilcrdvars)==0 )then
      nullify(hist%ancilcrdvars)
    else
      allocate(hist%ancilcrdvars(size(ancilcrdvars))) ! always new alloc
      hist%ancilcrdvars = ancilcrdvars
    endif
    
    if(.not. present(attrs)) then
      nullify(hist%attrs)
    else if ( size(attrs)==0 )then
      nullify(hist%attrs)
    else
      allocate(hist%attrs(size(attrs))) ! always new alloc
      hist%attrs = attrs
    endif
    
    call histpl_push(HISTPOOL, hist)
    
    call EndSub(subname)
  end subroutine HistoryAutoCreateH1
          | Subroutine : | |||
| name : | character(len=*), intent(in) | ||
| longname : | character(len=*), intent(in) | ||
| units : | character(len=*), intent(in) | ||
| file : | character(len=*), intent(in) | ||
| slfst(*) : | integer, intent(in) 
 | ||
| sllst(*) : | integer, intent(in) 
 | ||
| slstp(*) : | integer, intent(in) 
 | ||
| time_to_start : | real, intent(in) | ||
| put_interval : | real, intent(in) | ||
| dt : | real, intent(in) | ||
| newfile_interval : | real, intent(in) | ||
| attrs(:) : | type(GT4_ATTRIBUTE),intent(in),optional | ||
| grid_label : | character(len=*), intent(in) 
 | ||
| title : | character(len=*), intent(in),optional | ||
| source : | character(len=*), intent(in),optional | ||
| institution : | character(len=*), intent(in),optional | ||
| conventions : | character(len=*), intent(in),optional | ||
| gt_version : | character(len=*), intent(in),optional | ||
| proc : | character(len=*), intent(in),optional | 
  subroutine HistoryAutoCreateH2( name, longname, units, file, slfst, sllst, slstp, time_to_start, put_interval, dt, newfile_interval, attrs, grid_label, title, source, institution, conventions, gt_version, proc )
    use dc_error, only: USR_ERRNO, USR_ERRNO, StoreError
    implicit none
    character(len=*), intent(in)     :: name
    character(len=*), intent(in)     :: longname
    character(len=*), intent(in)     :: units
    character(len=*), intent(in)     :: file
    integer, intent(in)              :: slfst(*)     ! size == sprank
    integer, intent(in)              :: sllst(*)     ! size == sprank
    integer, intent(in)              :: slstp(*)     ! size == sprank
    real,             intent(in)     :: time_to_start, put_interval, dt
    real, intent(in)                 :: newfile_interval
    type(GT4_ATTRIBUTE),intent(in),optional  :: attrs(:)
    character(len=*), intent(in)     :: grid_label  ! <-- HistoryAutoSetGrid
    character(len=*), intent(in),optional  :: proc
    character(len=*), intent(in),optional  :: title, source, institution
    character(len=*), intent(in),optional  :: conventions, gt_version
    !
    type(HIST_EACHVAR),pointer    :: hist
    integer                       :: ith
    character(len = *),parameter  :: subname = "HistoryAutoCreate2"
    
    call BeginSub(subname)
    ith = 1
    if (.not.histpl_find(HISTGRIDPOOL, grid_label, ith, hist)) then
      call StoreError(USR_ERRNO, subname, cause_c='grid '//trim(subname)//' not found')
    endif
    
    call HistoryAutoCreate1( name, longname, units, file, slfst, sllst, slstp, time_to_start, put_interval, dt, newfile_interval, attrs, hist%aryshape(1:hist%sprank), hist%dims(1:hist%sprank+1), hist%axlongnames(1:hist%sprank+1), hist%axunits(1:hist%sprank+1), hist%axxtypes(1:hist%sprank+1), hist%spcoordvars, hist%ancilcrdvars, title, source, institution, conventions, gt_version, proc, hist%domain_div, hist%subdomfst )
    
    call EndSub(subname)
  end subroutine HistoryAutoCreateH2
          | Subroutine : | |
| name : | character(len=*), intent(in) | 
| vals(*) : | real | 
| time : | real | 
変数の出力を行う. タイミングは内部で制御するので, 全タイム ステップで呼べば良い. なお, 下記の HistoryAutoWhetherPutNow を使って呼ぶタイミングを制御しても良い.
  subroutine HistoryAutoPutH0(name, vals, time)
    !
    ! 変数の出力を行う. タイミングは内部で制御するので, 全タイム
    ! ステップで呼べば良い. なお, 下記の HistoryAutoWhetherPutNow
    ! を使って呼ぶタイミングを制御しても良い.
    !
    implicit none
    character(len=*), intent(in)     :: name
    real                             :: vals(*)
    real                             :: time
    !
    type(HIST_EACHVAR),pointer      :: hst
    integer                         :: ith, j, rank
    character(len=STRING)           :: file_actual
    real                            :: eps=3e-7, newest
    type(GT_HISTORY),pointer        :: hist
    logical                         :: put_now
    integer                         :: arysize
    real,pointer                    :: subset(:)
    character(len = *), parameter:: subname = 'HistoryAutoPut'
    !
    call BeginSub(subname, 'name=<%c>, time=<%r>', c1=trim(name), r=(/time/))
    ith = 1
    do while( histpl_find(HISTPOOL, name, ith, hst) )
      put_now = whether_to_put_now( time, hst%time_last, hst%time_to_start, hst%put_interval, hst%dt )
      if ( put_now .and. .not.hst%out_of_domain ) then
        if ( associated(hst%h%hs) ) then
          call HistoryInquire(hst%h%hs, newest=newest)
          if ( hst%newfile_interval > 0 .and. time >= hst%time_to_start+hst%newfile_interval*(1.0-eps) .and. newest < time) then
            ! to make a new file
            hst%time_to_start = hst%time_to_start + hst%newfile_interval
            call HistoryClose(hst%h%hs)
            nullify(hst%h%hs)
          endif
        endif
        if (.not.associated(hst%h%hs)) then
          if (hst%newfile_interval > 0) then
            file_actual = merge_file_proc_time(hst%file,hst%proc, hst%time_to_start)
          else
            file_actual = merge_file_proc_time(hst%file,hst%proc)
          endif
          rank = hst%sprank + 1
          allocate(hist)   ! always new allocataion
          call HistoryCreate( file_actual, trim(hst%title), trim(hst%source), trim(hst%institution), hst%dims(1:rank), hst%dimsizes(1:rank), hst%axlongnames(1:rank), hst%axunits(1:rank), hst%time_to_start, hst%put_interval, hst%axxtypes(1:rank), hist, trim(hst%conventions),  trim(hst%gt_version))
          hst%h%hs => hist
          call HistoryAddVariable(name, hst%dims(1:rank), trim(hst%longname), trim(hst%units), history=hst%h%hs)
          if (associated(hst%attrs)) then
            do j=1,size(hst%attrs)
              call add_gt4_attribute(hst, hst%attrs(j))
            enddo
          endif
          if (associated(hst%ancilcrdvars)) then
            do j=1,size(hst%ancilcrdvars)
              call add_ancilcrdvar(hst, hst%ancilcrdvars(j))
            enddo
          endif
          do j=1,hst%sprank
            subset => make_slice(hst%spcoordvars(j)%ary, 1, (/hst%aryshape(j)/), (/hst%slfst(j)/), (/hst%sllst(j)/), (/hst%slstp(j)/) )
            if (associated(subset)) then
              call HistoryPut(hst%dims(j), subset, hst%h%hs)
            else
              call HistoryPut(hst%dims(j), hst%spcoordvars(j)%ary, hst%h%hs)
            endif
          enddo
          if (associated(hst%ancilcrdvars)) then
            do j=1,size(hst%ancilcrdvars)
              call put_ancilcrdvar(hst, hst%ancilcrdvars(j))
            enddo
          endif
          
          call HistorySetTime(time, hst%h%hs)
        else
          rank = hst%sprank + 1
          if ( .not. HistoryHasVariable(hst%h%hs, name) ) then
            call HistoryAddVariable(name, hst%dims(1:rank), trim(hst%longname), trim(hst%units), history=hst%h%hs)
            !" ここで HistorySetTime すると問題が起きるので前回に従う
            if (associated(hst%attrs)) then
              do j=1,size(hst%attrs)
                call add_gt4_attribute(hst, hst%attrs(j))
              enddo
            endif
          else
            call HistorySetTime(time, hst%h%hs)
          endif
        endif
        
        arysize = product(hst%aryshape(1:hst%sprank))
        subset => make_slice(vals(1:arysize), hst%sprank, (/hst%aryshape/), (/hst%slfst/), (/hst%sllst/), (/hst%slstp/))
        if (associated(subset)) then
          call HistoryPut(name, subset, hst%h%hs)
        else
          call HistoryPut(name, vals(1:hst%size), hst%h%hs)
        endif
        hst%time_last = time
        
      endif
    enddo
    call EndSub(subname)
  end subroutine HistoryAutoPutH0
          | Subroutine : | |||
| grid_label : | character(len=*), intent(in) | ||
| aryshape(:) : | integer, intent(in) 
 | ||
| dims(:) : | character(len=*), intent(in) 
 | ||
| axlongnames(:) : | character(len=*), intent(in) 
 | ||
| axunits(:) : | character(len=*), intent(in) 
 | ||
| axxtypes(:) : | character(len=*), intent(in) | ||
| coord1(:) : | real, intent(in),optional 
 | ||
| coord2(:) : | real, intent(in),optional 
 | ||
| coord3(:) : | real, intent(in),optional 
 | ||
| ancilcrdvars(:) : | type(GT4_NAMED_REALARY),intent(in),optional | ||
| subdomfst(:) : | integer, intent(in),optional 
 | 
  subroutine HistoryAutoSetGrid( grid_label, aryshape, dims, axlongnames, axunits, axxtypes, coord1, coord2, coord3, ancilcrdvars, subdomfst )
    use dc_error, only: USR_ERRNO, StoreError
    implicit none
    character(len=*), intent(in)     :: grid_label
    integer, intent(in)              :: aryshape(:) ! size <= 3 (--> sprank)
    character(len=*), intent(in)     :: dims(:)           !size == sprank+1
    character(len=*), intent(in)     :: axlongnames(:)    !size == sprank+1
    character(len=*), intent(in)     :: axunits(:)        !size == sprank+1
    character(len=*), intent(in)     :: axxtypes(:)
    real, intent(in),optional        :: coord1(:) ! must present if sprank>=1
    real, intent(in),optional        :: coord2(:) ! must present if sprank>=2
    real, intent(in),optional        :: coord3(:) ! must present if sprank>=3
    type(GT4_NAMED_REALARY),intent(in),optional  :: ancilcrdvars(:)
    integer, intent(in),optional :: subdomfst(:) ! For domain-dividing comp.
    ! first indx relative in the whole dom. (size == sprank)
    !
    type(HIST_EACHVAR)            :: hist
    integer                       :: sprank
    character(len = *),parameter  :: subname = "HistoryAutoSetGrid"
    continue
    call BeginSub(subname)
    
    sprank = min( size(aryshape), 3 )
    
    hist%sprank = sprank
    hist%name = grid_label
    hist%aryshape(1:sprank) = aryshape(1:sprank)
    hist%dims(1:sprank+1) = dims(1:sprank+1)
    hist%axlongnames(1:sprank+1) = axlongnames(1:sprank+1)
    hist%axunits(1:sprank+1) = axunits(1:sprank+1)
    hist%axxtypes(1:sprank+1) = axxtypes(1:sprank+1)
    if (present(subdomfst)) then
      hist%domain_div = .true.
      hist%subdomfst(1:sprank) = subdomfst(1:sprank)
    else
      hist%domain_div = .false.
    endif
    
    if (sprank >= 1) hist%spcoordvars(1) = init_gt4_real1d( coord1 )
    if (sprank >= 2) hist%spcoordvars(2) = init_gt4_real1d( coord2 )
    if (sprank >= 3) hist%spcoordvars(3) = init_gt4_real1d( coord3 )
    
    if(.not. present(ancilcrdvars)) then
      nullify(hist%ancilcrdvars)
    else if ( size(ancilcrdvars)==0 )then
      nullify(hist%ancilcrdvars)
    else
      allocate(hist%ancilcrdvars(size(ancilcrdvars))) ! always new alloc
      hist%ancilcrdvars = ancilcrdvars
    endif
    
    call histpl_push(HISTGRIDPOOL, hist)
    call EndSub(subname)
  end subroutine HistoryAutoSetGrid
          | Subroutine : | |
| title : | character(len=*), intent(in), optional | 
| source : | character(len=*), intent(in), optional | 
| institution : | character(len=*), intent(in), optional | 
| proc : | character(len=*), intent(in), optional | 
| conventions : | character(len=*), intent(in), optional | 
| gt_version : | character(len=*), intent(in), optional | 
  subroutine HistoryAutoSetRunInfo( title, source, institution, proc, conventions, gt_version  )
    use dc_error, only: USR_ERRNO, StoreError
    implicit none
    character(len=*), intent(in), optional     :: title, source, institution
    character(len=*), intent(in), optional     :: proc
    character(len=*), intent(in), optional     :: conventions, gt_version
    !
    character(len = *),parameter  :: subname = "HistoryAutoSetRunInfo"
    continue
    call BeginSub(subname)
    
    if (present(title)) com_title = title
    if (present(source)) com_source = source
    if (present(institution)) com_institution = institution
    if (present(proc)) com_proc = proc
    if (present(conventions)) com_conventions = conventions
    if (present(gt_version)) com_gt_version = gt_version
    
    call EndSub(subname)
  end subroutine HistoryAutoSetRunInfo
          | Function : | |
| result : | logical | 
| name : | character(len=*), intent(in) | 
| time : | real, intent(in) | 
name の名を持つ出力項目に関し, 現在がファイルに出力するタイミ ングかどうかを返す. 同名で複数の出力をする場合, どれか一つでも 出力するタイミングなら .true. を返す. 出力のために特別に計算を を要するようなケースに使うと良い. (ほとんどのステップで無駄に なる計算をするのを避けられる)
  function HistoryAutoWhetherPutNow( name, time ) result(result)
    !
    ! name の名を持つ出力項目に関し, 現在がファイルに出力するタイミ
    ! ングかどうかを返す. 同名で複数の出力をする場合, どれか一つでも
    ! 出力するタイミングなら .true. を返す. 出力のために特別に計算を
    ! を要するようなケースに使うと良い. (ほとんどのステップで無駄に
    ! なる計算をするのを避けられる)
    !
    implicit none
    logical                         :: result
    character(len=*), intent(in)    :: name
    real, intent(in)                :: time
    !
    integer                      :: ith
    type(HIST_EACHVAR),pointer   :: hst
    character(len = *), parameter:: subname = 'HistoryAutoWhetherPutNow'
    logical                      :: put_now
    !
    call BeginSub(subname)
    result = .false.
    ith = 1
    do while( histpl_find(HISTPOOL, name, ith, hst) )
      put_now = whether_to_put_now( time, hst%time_last, hst%time_to_start, hst%put_interval, hst%dt )
      if (put_now) then
        result = .true.
        exit
      endif
    enddo
    call EndSub(subname)
  end function HistoryAutoWhetherPutNow
          | Function : | |
| result : | type(GT4_ATTRIBUTE) | 
| name : | character(len=*),intent(in) | 
| rval(:) : | real,intent(in),optional | 
| ival(:) : | integer,intent(in),optional | 
| cval : | character(len=*),intent(in),optional | 
ATTRIBUTEのコンストラクター. 名前 & (実数配列 or 整数配列 or 文字列) を与える
  function init_gt4_attribute(name,rval,ival,cval) result(result)
    !
    ! ATTRIBUTEのコンストラクター. 
    ! 名前 & (実数配列 or 整数配列 or 文字列) を与える
    !
    implicit none
    type(GT4_ATTRIBUTE)                       :: result
    character(len=*),intent(in)           :: name
    real,intent(in),optional              :: rval(:)
    integer,intent(in),optional           :: ival(:)
    character(len=*),intent(in),optional  :: cval
    result%name = name
    if(present(rval)) then
      allocate(result%rval(size(rval)))
      result%rval = rval
      nullify(result%ival)
    else if (present(ival)) then
      allocate(result%ival(size(ival)))
      result%ival = ival
      nullify(result%rval)
    else if (present(cval)) then
      nullify(result%rval)
      nullify(result%ival)
      result%cval = cval
    endif
  end function init_gt4_attribute
          | Function : | |
| result : | type(GT4_NAMED_REALARY) | 
| name : | character(len=*),intent(in) | 
| rank : | integer,intent(in) | 
| dims(rank) : | character(len = *),intent(in) | 
| length : | integer,intent(in) | 
| ary(length) : | real,intent(in) | 
| longname : | character(len=*),intent(in) | 
| units : | character(len=*),intent(in) | 
GT4_NAMED_REALARYのコンストラクター.
  function init_gt4_named_realary(name,rank,dims,length,ary,longname,units) result(result)
    ! GT4_NAMED_REALARYのコンストラクター. 
    use dc_error, only: USR_ERRNO, StoreError
    implicit none
    type(GT4_NAMED_REALARY)            :: result
    !
    character(len=*),intent(in)    :: name
    integer,intent(in)             :: rank
    character(len = *),intent(in)  :: dims(rank)
    integer,intent(in)             :: length
    real,intent(in)                :: ary(length)
    character(len=*),intent(in)    :: longname
    character(len=*),intent(in)    :: units
    !
    character(len = *), parameter:: subname = 'init_gt4_named_realary'
    !
    call BeginSub(subname)
    if(rank>3 .or. rank<0) call StoreError(USR_ERRNO, subname, cause_c='rank must be <= 3 and >=1')
    result%rank = rank
    result%name = name
    result%dims(1:rank) = dims(1:rank)
    allocate(result%ary(length))     ! always new allocation
    result%ary(1:length) = ary(1:length)
    result%longname = longname
    result%units = units
    call EndSub(subname)
  end function init_gt4_named_realary
          | Function : | |
| result : | type(GT4_REAL1D) | 
| ary(:) : | real,intent(in) | 
REAL1Dのコンストラクター.
  function init_gt4_real1d(ary) result(result)
    !
    ! REAL1Dのコンストラクター. 
    !
    implicit none
    type(GT4_REAL1D)      :: result
    real,intent(in)   :: ary(:)
    if(associated(result%ary)) deallocate(result%ary)
    allocate(result%ary(size(ary)))
    result%ary = ary
  end function init_gt4_real1d