| Class | gt4_history |
| In: |
gt4_history.f90
|
gt4_history モジュールは, 数値モデルの結果を gtool4 netCDF 規約 に基づくデータ形式 (以降, gtool4 データと呼びます) で出力するためのインターフェースです. 主に時間積分の結果を等時間間隔で出力することを念頭においてます. このモジュールを用いれば, Fortran90 で書かれたプログラムの計算結果を gtool4 データで出力することが簡単に実現できます.
なお, Fortran77 用のインターフェースとして, HSPACK も用意しています.
以下の use 文を Fortran 90 プログラムの先頭に書き込んでください. 本 gt4_history モジュール内の手続きと構造型変数が 利用できるようになります.
use gt4_history
【出力用】
| HistoryCreate : | gtool4 データ出力用初期設定 |
| HistoryAddVariable : | 変数定義 |
| HistoryCopyVariable : | 変数定義 (別ファイルの変数コピー) |
| HistoryPut : | データ出力 |
| HistoryAddAttr : | 変数に属性付加 |
| HistoryClose : | 終了処理 |
| HistorySetTime : | 時刻指定 |
【入力用】
| HistoryGet : | データ入力 (固定長配列用) |
| HistoryGetPointer : | データ入力 (ポインタ配列用) |
【その他】
| HistoryInquire : | GT_HISTORY 型変数への問い合わせ |
| HistoryCopy : | GT_HISTORY 型変数のコピー |
| HistoryPutLine : | GT_HISTORY 型変数の印字 |
| HistoryInitialized : | GT_HISTORY 型変数の初期設定をチェック |
| HistoryAxisCreate : | 作成 (初期設定) |
| HistoryAxisCopy : | コピー |
| HistoryAxisAddAttr : | 属性付加 |
| HistoryAxisInquire : | 問い合わせ |
| HistoryAxisClear : | 終了処理 |
| HistoryVarinfoCreate : | 作成 (初期設定) |
| HistoryVarinfoCopy : | コピー |
| HistoryVarinfoAddAttr : | 属性付加 |
| HistoryVarinfoInquire : | 問い合わせ |
| HistoryVarinfoClear : | 終了処理 |
| HistoryVarinfoInitialized : | 初期設定チェック |
| GT_HISTORY : | gtool4 データ出力用 |
| GT_HISTORY_AXIS : | gtool4 データ座標軸情報 |
| GT_HISTORY_VARINFO : | gtool4 データ変数情報 |
バージョン gtool4_netCDF_version に対応しています。
出力するデータには以下の大域属性を必ず与えます。
| netCDF属性: | 与えられる値 |
| Conventions : | ユーザによる指定が無い限り gtool4_netCDF_Conventions が与えられます. |
| gt_version : | ユーザによる指定が無い限り gtool4_netCDF_version が与えられます. |
| title : | ユーザによって指定されます. |
| source : | ユーザによって指定されます. |
| institution : | ユーザによって指定されます. |
| history : | "unknown 2005-08-05T21:48:37+09:00> gt4_history: HistoryCreate\n" といった値が与えられます. "unknown" の部分には, 環境変数 USER から取得される ユーザ名が与えられます. その後ろにはファイルの生成を 開始した時刻が与えられます. |
出力するデータの変数には以下の属性を必ず与えます.
| netCDF属性: | 与えられる値 |
| long_name : | ユーザによって指定されます. |
| units : | ユーザによって指定されます. |
この他の属性に関して HistoryAddAttr などによって任意に与えることは 可能です. 禁止の属性に関しては警告を発するべきですが, 現在は チェックを行っていません.
原則的に, 現在の gt4_history は全ての属性の解釈を行ないません. 本来ならば, HistoryGet は scale_factor, add_offset, valid_range などの属性を解釈すべきかも知れません. ただし, HistoryCopyVariable は変数コピーの際, 変数に属する全ての属性と その値を引き継ぎます.
| Subroutine : | |||
| axis_dest : | type(GT_HISTORY_AXIS),intent(out)
| ||
| axis_src : | type(GT_HISTORY_AXIS),intent(in)
| ||
| err : | logical, intent(out), optional | ||
| name : | character(*) , intent(in), optional
| ||
| length : | integer, intent(in), optional
| ||
| longname : | character(*) , intent(in), optional
| ||
| units : | character(*) , intent(in), optional
| ||
| xtype : | character(*) , intent(in), optional
|
GT_HISTORY_AXIS 型の変数 axis_src を axis_dest にコピーします。 axis_src は HistoryAxisCreate によって初期設定されている必要が あります。 さらに属性を付加する場合には HistoryAxisAddAttr を用いてください。
err を与えておくと、コピーの際何らかの不具合が生じても 終了せずに err が真になって返ります。
err 以降の引数は、コピーの際に上書きする値です。
subroutine HistoryAxisCopy1(axis_dest, axis_src, err, name, length, longname, units, xtype)
!
!== GT_HISTORY_AXIS 型変数コピー
!
! GT_HISTORY_AXIS 型の変数 *axis_src* を
! *axis_dest* にコピーします。
! *axis_src* は HistoryAxisCreate によって初期設定されている必要が
! あります。
! さらに属性を付加する場合には HistoryAxisAddAttr
! を用いてください。
!
! *err* を与えておくと、コピーの際何らかの不具合が生じても
! 終了せずに err が真になって返ります。
!
! *err* 以降の引数は、コピーの際に上書きする値です。
!
use dc_trace, only: BeginSub, EndSub, DbgMessage
use dc_present,only: present_select
implicit none
type(GT_HISTORY_AXIS),intent(out) :: axis_dest ! コピー先 GT_HISTORY_AXIS
type(GT_HISTORY_AXIS),intent(in) :: axis_src ! コピー元 GT_HISTORY_AXIS
logical, intent(out), optional :: err
character(*) , intent(in), optional:: name ! 次元変数名
integer, intent(in), optional:: length ! 次元長 (配列サイズ)
character(*) , intent(in), optional:: longname ! 次元変数の記述的名称
character(*) , intent(in), optional:: units ! 次元変数の単位
character(*) , intent(in), optional:: xtype ! 次元変数の型
character(STRING), parameter:: subname = "HistoryAxisCopy1"
continue
call BeginSub(subname)
axis_dest % name = present_select('', axis_src % name, name)
axis_dest % length = present_select(.false., axis_src % length, length)
axis_dest % longname = present_select('', axis_src % longname, longname)
axis_dest % units = present_select('', axis_src % units, units)
axis_dest % xtype = present_select('', axis_src % xtype, xtype)
if (associated( axis_src % attrs ) ) then
allocate( axis_dest % attrs( size( axis_src % attrs) ) )
call HistoryAttrCopy( from = axis_src % attrs, to = axis_dest % attrs, err = err)
end if
call EndSub(subname)
end subroutine HistoryAxisCopy1
| Subroutine : | |
| hist_dest : | type(GT_HISTORY), intent(out), target |
| file : | character(*), intent(in) |
| hist_src : | type(GT_HISTORY), intent(in), optional, target |
| title : | character(*), intent(in), optional |
| source : | character(*), intent(in), optional |
| institution : | character(*), intent(in), optional |
| origin : | real, intent(in), optional |
| interval : | real, intent(in), optional |
| conventions : | character(*), intent(in), optional |
| gt_version : | character(*), intent(in), optional |
引数 hist_src の内容にコピーし, hist_dest へ返します. hist_src が与えられない場合は, 引数 history を与えずに呼び出した HistoryCreate の設定内容が参照されます. HistoryCreate と同様に, 出力の初期設定を行います. file は必ず与えなければならず, hist_src と同じファイルへ出力 しようとする場合はエラーを生じます. HistoryAddVariable で設定される内容に関してはコピーされません.
それ以降の引数を与えることで, hist_src の設定を 上書きすることが可能です.
subroutine HistoryCopy1(hist_dest, file, hist_src, title, source, institution, origin, interval, conventions, gt_version)
!
! 引数 *hist_src* の内容にコピーし, *hist_dest* へ返します. *hist_src*
! が与えられない場合は, 引数 *history* を与えずに呼び出した
! HistoryCreate の設定内容が参照されます.
! HistoryCreate と同様に, 出力の初期設定を行います. *file*
! は必ず与えなければならず, *hist_src* と同じファイルへ出力
! しようとする場合はエラーを生じます.
! HistoryAddVariable で設定される内容に関してはコピーされません.
!
! それ以降の引数を与えることで, hist_src の設定を
! 上書きすることが可能です.
!
use gtdata_generic, only: Inquire, Get_Attr, Copy_Attr, Get, Put
! use dc_url, only:
use dc_error, only: StoreError, DC_NOERR, GT_EARGSIZEMISMATCH
! use dc_string, only:
use dc_present, only: present_select
use dc_types, only: string, token
implicit none
type(GT_HISTORY), intent(out), target :: hist_dest
character(*), intent(in) :: file
type(GT_HISTORY), intent(in), optional, target:: hist_src
character(*), intent(in), optional:: title, source, institution
!!!$ type(GT_HISTORY_AXIS), intent(in),optional :: axes(:)
!!!$ type(GT_HISTORY_AXIS), intent(in),optional :: addaxes(:)
!!!$ character(*), intent(in), optional:: dims(:)
!!!$ integer, intent(in), optional:: dimsizes(:)
!!!$ character(*), intent(in), optional:: longnames(:)
!!!$ character(*), intent(in), optional:: units(:)
real, intent(in), optional:: origin, interval
!!!$ character(*), intent(in), optional:: xtypes(:)
character(*), intent(in), optional:: conventions, gt_version
! Internal Work
type(GT_HISTORY), pointer:: src =>null()
character(STRING) :: title_src, source_src, institution_src
character(STRING) :: conventions_src, gt_version_src
character(STRING), pointer:: dims(:) => null()
integer , pointer:: dimsizes(:) => null()
character(STRING), pointer:: longnames(:) => null()
character(STRING), pointer:: units(:) => null()
character(STRING), pointer:: xtypes(:) => null()
integer :: i, numdims
logical :: err
real(DP),pointer :: dimvalue(:) => null()
character(len = *),parameter:: subname = "HistoryCopy1"
continue
call BeginSub(subname, 'file=<%c>', c1=trim(file))
if (present(hist_src)) then
src => hist_src
else
src => default
endif
numdims = size(src % dimvars)
call HistoryInquire1(history=src, title=title_src, source=source_src, institution=institution_src, dims=dims, dimsizes=dimsizes, longnames=longnames, units=units, xtypes=xtypes, conventions=conventions_src, gt_version=gt_version_src)
call HistoryCreate1(file=trim(file), title=trim(present_select('', title_src, title)), source=trim(present_select('', source_src, source)), institution=trim(present_select('', institution_src, institution)), dims=dims, dimsizes=dimsizes, longnames=longnames, units=units, origin=present_select(.false., src % origin, origin), interval=present_select(0.0, src % interval, interval), xtypes=xtypes, history=hist_dest, conventions=trim(present_select('', conventions_src, conventions)), gt_version=trim(present_select('', gt_version_src, gt_version)) )
!
! 次元変数が属性を持っている場合のことも考え, 最後に直接
! hist_dst % dimvars へ copy_attr (gtvarcopyattrall) をかける.
!
do i = 1, numdims
call Copy_Attr(hist_dest % dimvars(i), src % dimvars (i), global=.false.)
end do
! dimvars を Get してみて, 値を持っているようならデータを与えてしまう.
do i = 1, numdims
if (dimsizes(i) == 0) cycle
call Get(src % dimvars(i), dimvalue, err)
if (err) cycle
call HistoryPutDoubleEx(dims(i), dimvalue, size(dimvalue), hist_dest)
deallocate(dimvalue)
end do
deallocate(dims, dimsizes, longnames, units, xtypes)
call EndSub(subname)
end subroutine HistoryCopy1
| Subroutine : | |||
| varinfo_dest : | type(GT_HISTORY_VARINFO),intent(out) | ||
| varinfo_src : | type(GT_HISTORY_VARINFO),intent(in) | ||
| err : | logical, intent(out), optional | ||
| name : | character(*) , intent(in), optional
| ||
| dims(:) : | character(*) , intent(in), optional, target
| ||
| longname : | character(*) , intent(in), optional
| ||
| units : | character(*) , intent(in), optional
| ||
| xtype : | character(*) , intent(in), optional
|
GT_HISTORY_VARINFO 型の変数 varinfo_src を varinfo_dest にコピーします。 varinfo_src は HistoryVarinfoCreate によって初期設定されている必要が あります。 さらに属性を付加する場合には HistoryVarinfoAddAttr を用いてください。
err を与えておくと、コピーの際何らかの不具合が生じても 終了せずに err が真になって返ります。
err 以降の引数は、コピーの際に上書きする値です。
subroutine HistoryVarinfoCopy1(varinfo_dest, varinfo_src, err, name, dims, longname, units, xtype )
!
!== GT_HISTORY_VARINFO 型変数コピー
!
! GT_HISTORY_VARINFO 型の変数 *varinfo_src* を
! *varinfo_dest* にコピーします。
! *varinfo_src* は HistoryVarinfoCreate によって初期設定されている必要が
! あります。
! さらに属性を付加する場合には HistoryVarinfoAddAttr
! を用いてください。
!
! *err* を与えておくと、コピーの際何らかの不具合が生じても
! 終了せずに err が真になって返ります。
!
! *err* 以降の引数は、コピーの際に上書きする値です。
!
use dc_trace, only: BeginSub, EndSub, DbgMessage
use dc_present,only: present_select
use dc_string, only: JoinChar
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, DC_EALREADYINIT
implicit none
type(GT_HISTORY_VARINFO),intent(out) :: varinfo_dest
type(GT_HISTORY_VARINFO),intent(in) :: varinfo_src
logical, intent(out), optional :: err
character(*) , intent(in), optional:: name ! 次元変数名
character(*) , intent(in), optional, target:: dims(:) ! 依存する次元
character(*) , intent(in), optional:: longname ! 次元変数の記述的名称
character(*) , intent(in), optional:: units ! 次元変数の単位
character(*) , intent(in), optional:: xtype ! 次元変数の型
integer:: i, stat
character(STRING):: cause_c
character(TOKEN), pointer :: srcdims(:) =>null() ! 依存する次元
character(*), parameter:: subname = "HistoryVarinfoCopy1"
continue
call BeginSub(subname)
stat = DC_NOERR
cause_c = ''
if ( .not. varinfo_src % initialized ) then
stat = DC_ENOTINIT
cause_c = 'GT_HISTORY_VARINFO'
goto 999
end if
if ( varinfo_dest % initialized ) then
stat = DC_EALREADYINIT
cause_c = 'GT_HISTORY_VARINFO'
goto 999
end if
varinfo_dest % name = present_select('', varinfo_src % name, name)
varinfo_dest % longname = present_select('', varinfo_src % longname, longname)
varinfo_dest % units = present_select('', varinfo_src % units, units)
varinfo_dest % xtype = present_select('', varinfo_src % xtype, xtype)
if (present(dims)) then
srcdims => dims
else
srcdims => varinfo_src % dims
endif
call DbgMessage('srcdims=<%c>', c1=trim(JoinChar(srcdims)))
allocate( varinfo_dest % dims( size( srcdims ) ) )
do i = 1, size(srcdims)
varinfo_dest % dims(i) = srcdims(i)
end do
call DbgMessage('varinfo_dest %% dims=<%c>', c1=trim(JoinChar(varinfo_dest % dims)))
if (associated( varinfo_src % attrs ) ) then
allocate( varinfo_dest % attrs( size( varinfo_src % attrs) ) )
call HistoryAttrCopy( from = varinfo_src % attrs, to = varinfo_dest % attrs, err = err)
end if
varinfo_dest % initialized = .true.
999 continue
call StoreError( stat, subname, err, cause_c )
call EndSub(subname)
end subroutine HistoryVarinfoCopy1
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(out) | ||
| name : | character(*) , intent(in)
| ||
| size : | integer, intent(in)
| ||
| longname : | character(*) , intent(in)
| ||
| units : | character(*) , intent(in)
| ||
| xtype : | character(*) , intent(in)
|
GT_HISTORY_AXIS 型変数を作成します。 このサブルーチンによる設定の後、 HistoryCreate の axes に与えます。 さらに属性を付加する場合には HistoryAxisAddAttr を用いてください。
Constructor of GT_HISTORY_AXIS
subroutine HistoryAxisCreate1( axis, name, size, longname, units, xtype)
!
!== GT_HISTORY_AXIS 型変数作成
!
! GT_HISTORY_AXIS 型変数を作成します。
! このサブルーチンによる設定の後、
! HistoryCreate の *axes* に与えます。
! さらに属性を付加する場合には HistoryAxisAddAttr
! を用いてください。
!
! Constructor of GT_HISTORY_AXIS
!
use dc_types, only: STRING, TOKEN, DP
use dc_trace, only: BeginSub, EndSub, DbgMessage
implicit none
type(GT_HISTORY_AXIS),intent(out) :: axis
character(*) , intent(in):: name ! 次元変数名
integer, intent(in):: size ! 次元長 (配列サイズ)
character(*) , intent(in):: longname ! 次元変数の記述的名称
character(*) , intent(in):: units ! 次元変数の単位
character(*) , intent(in):: xtype ! 次元変数の型
character(len = *), parameter:: subname = "HistoryAxisCreate1"
continue
call BeginSub(subname)
axis % name = name
axis % length = size
axis % longname = longname
axis % units = units
axis % xtype = xtype
call EndSub(subname)
end subroutine HistoryAxisCreate1
| Subroutine : | |||
| varinfo : | type(GT_HISTORY_VARINFO),intent(inout) | ||
| name : | character(*), intent(in)
| ||
| dims(:) : | character(*), intent(in)
| ||
| longname : | character(*), intent(in)
| ||
| units : | character(*), intent(in)
| ||
| xtype : | character(*), intent(in), optional
| ||
| time_average : | logical, intent(in), optional
| ||
| average : | logical, intent(in), optional
| ||
| err : | logical, intent(out), optional
|
GT_HISTORY_VARINFO 型変数を作成します。 このサブルーチンによる設定の後、 HistoryAddVariable の varinfo に与えます。 さらに属性を付加する場合には HistoryVarinfoAddAttr を用いてください。
Constructor of GT_HISTORY_VARINFO
subroutine HistoryVarinfoCreate1( varinfo, name, dims, longname, units, xtype, time_average, average, err )
!
!== GT_HISTORY_VARINFO 型変数作成
!
! GT_HISTORY_VARINFO 型変数を作成します。
! このサブルーチンによる設定の後、
! HistoryAddVariable の *varinfo* に与えます。
! さらに属性を付加する場合には HistoryVarinfoAddAttr
! を用いてください。
!
! Constructor of GT_HISTORY_VARINFO
!
use dc_types, only: STRING, TOKEN, DP
use dc_trace, only: BeginSub, EndSub, DbgMessage
use dc_message, only: MessageNotify
use dc_error, only: StoreError, DC_NOERR, DC_EALREADYINIT
implicit none
type(GT_HISTORY_VARINFO),intent(inout) :: varinfo
character(*), intent(in):: name ! 変数名
character(*), intent(in):: dims(:) ! 依存する次元
character(*), intent(in):: longname ! 変数の記述的名称
character(*), intent(in):: units ! 変数の単位
character(*), intent(in), optional:: xtype
! 変数の型
logical, intent(in), optional:: time_average
! 時間平均
logical, intent(in), optional:: average
! 時間平均 (後方互換用)
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
! Internal Work
integer:: i, numdims, stat
character(STRING):: cause_c
character(*), parameter:: subname = "HistoryVarinfoCreate1"
continue
call BeginSub(subname)
stat = DC_NOERR
cause_c = ''
if ( varinfo % initialized ) then
stat = DC_EALREADYINIT
cause_c = 'GT_HISTORY_VARINFO'
goto 999
end if
varinfo % name = name
varinfo % longname = longname
varinfo % units = units
if ( present(xtype) ) varinfo % xtype = xtype
if ( present(time_average) ) varinfo % time_average = time_average
if ( present(average) ) varinfo % time_average = average
numdims = size(dims)
allocate(varinfo % dims(numdims))
do i = 1, numdims
varinfo % dims(i) = dims(i)
if (len(trim(dims(i))) > TOKEN) then
call MessageNotify('W', subname, 'dimension name <%c> is trancated to <%c>', c1=trim(dims(i)), c2=trim(varinfo % dims(i)))
end if
end do
varinfo % initialized = .true.
999 continue
call StoreError( stat, subname, err, cause_c )
call EndSub(subname)
end subroutine HistoryVarinfoCreate1
| Derived Type : |
この型の変数は HistoryCreate によって初期設定される必要があります。 初期設定後、データ出力用の複数のサブルーチンによって利用されます。 最終的には HistoryClose によって終了処理してください。
この構造体の内部の要素は非公開になっています。 問い合わせの際には HistoryInquire を利用してください。
Data entity of this type represents a netCDF dataset controlled by gt4f90io library. It must be initialized by HistoryCreate , then used in many subroutines, and must be finalized by HistoryClose . Note that the resultant file is undefined if you forget to finalize it.
Users are recommended to retain the object of this type returned by HistoryCreate, to use it as the last argument called history for all following subroutine calls. However, it is not mandatory. When you are going to write ONLY one dataset, argument history of all subroutine calls can be omitted, and the history entity will be internally managed within this module.
| Derived Type : |
この型の変数は HistoryAxisCreate, HistoryAxisCopy, HistoryInquire によって初期設定される必要があります。 初期設定後、HistoryCreate の axes に与えます。
問い合わせは HistoryAxisInquire によって行います。 属性の付加は HistoryAxisAddAttr によって行います。 初期化は HistoryAxisClear によって行います。
This type may be used as a argument axes of HistoryCreate to define features of axes of a history dataset. Typically, a constant array of this type will be used for fixed specification.
| Derived Type : |
この型の変数は HistoryVarinfoCreate, HistoryVarinfoCopy, HistoryInquire によって初期設定される必要があります。 初期設定後、HistoryAddVariable の varinfo に与えます。
問い合わせは HistoryVarinfoInquire によって行います。 属性の付加は HistoryVarinfoAddAttr によって行います。 初期化は HistoryVarinfoClear によって行います。
This type may be used as a argument varinfo of HistoryAddVariable to define features of variable of a history dataset.
| Subroutine : | |||
| varname : | character(*), intent(in)
| ||
| attrname : | character(*), intent(in)
| ||
| value : | character(*), intent(in)
| ||
| history : | type(GT_HISTORY), intent(inout),
target, optional
|
gtool4 データおよびそのデータ内の変数に属性を付加します。 このサブルーチンを用いる前に、 HistoryCreate による初期設定が 必要です。
属性名 attrname の先頭にプラス "+" を付加する 場合は、gtool4 データ自体の属性 (大域属性) として属性が付加されます この場合、varname は無視されますが、その場合でも varname へは 引数の解説にもある通り有効な値を与えてください。
HistoryAddAttr は複数のサブルーチンの総称名です。value には いくつかの型を与えることが可能です。 下記のサブルーチンを参照ください。
subroutine HistoryAddAttrChar0( varname, attrname, value, history)
!
!
!== gtool4 データ内の変数への属性付加
!
! gtool4 データおよびそのデータ内の変数に属性を付加します。
! このサブルーチンを用いる前に、 HistoryCreate による初期設定が
! 必要です。
!
! 属性名 *attrname* の先頭にプラス "<b><tt>+</tt></b>" を付加する
! 場合は、gtool4 データ自体の属性 (大域属性) として属性が付加されます
! この場合、*varname* は無視されますが、その場合でも *varname* へは
! 引数の解説にもある通り有効な値を与えてください。
!
! *HistoryAddAttr* は複数のサブルーチンの総称名です。*value* には
! いくつかの型を与えることが可能です。
! 下記のサブルーチンを参照ください。
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
! 変数の名前。
!
! ここで指定するものは、
! HistoryCreateの *dims* 、
! または HistoryAddVariable の
! *varname* で既に指定されてい
! なければなりません。
!
character(*), intent(in):: attrname
! 変数またはファイル全体に付
! 加する属性の名前
!
! "<b><tt>+</tt></b>" (プラ
! ス) を属性名の先頭につける
! 場合には、ファイル全体に属
! 性を付加します。
! ファイル全体へ属性を付加
! する場合でも、 HistoryCreate
! の *dims* 、または
! HistoryAddVariable の
! *varname* で既に指定されてい
! る変数を *varname* に指定する
! 必要があります。
!
character(*), intent(in):: value
! 属性の値
!
type(GT_HISTORY), intent(inout), target, optional:: history
! 出力ファイルの設定に関する情報を
! 格納した構造体
!
! ここに指定するものは、
! HistoryCreate によって初期設定
! されていなければなりません。
!
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrChar0"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(value))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, value)
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, value)
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value : | integer, intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrInt0( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
integer, intent(in):: value
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrInt0"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value : | logical, intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrLogical0( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
logical, intent(in):: value
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrLogical0"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, value)
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, value)
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value : | real(DP), intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrDouble0( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
real(DP), intent(in):: value
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrDouble0"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value : | real, intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrReal0( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
real, intent(in):: value
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrReal0"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value(:) : | integer, intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrInt1( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
integer, intent(in):: value(:)
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrInt1"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value(:) : | real(DP), intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrDouble1( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
real(DP), intent(in):: value(:)
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrDouble1"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |
| varname : | character(*), intent(in) |
| attrname : | character(*), intent(in) |
| value(:) : | real, intent(in) |
| history : | type(GT_HISTORY), intent(inout), target, optional |
subroutine HistoryAddAttrReal1( varname, attrname, value, history)
!
!
use gtdata_generic, only: Put_Attr
use dc_string, only: toChar, JoinChar
use dc_url, only: GT_PLUS
use dc_error, only: DC_NOERR
implicit none
character(*), intent(in):: varname
character(*), intent(in):: attrname
real, intent(in):: value(:)
type(GT_HISTORY), intent(inout), target, optional:: history
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE):: var
integer:: v_ord
logical:: err
character(len = *), parameter:: subname = "HistoryAddAttrReal1"
continue
call BeginSub(subname, 'varname=<%c> attrname=<%c>, value=<%c>', c1=trim(varname), c2=trim(attrname), c3=trim(toChar(value)))
! 操作対象決定
if (present(history)) then
hst => history
else
hst => default
endif
if (varname == "") then
! とりあえず無駄だが大域属性を何度もつける
do, v_ord = 1, size(hst % vars)
call Put_Attr(hst % vars(v_ord), GT_PLUS // attrname, (/value/))
enddo
else
call lookup_var_or_dim(hst, varname, var, err)
if (.not. err) then
call Put_Attr(var, attrname, (/value/))
endif
endif
call EndSub(subname)
end subroutine
| Subroutine : | |||
| varinfo : | type(GT_HISTORY_VARINFO),
intent(in)
| ||
| history : | type(GT_HISTORY), intent(inout),
optional
| ||
| err : | logical, intent(out), optional
|
gtool4 データ内の変数の定義を行います。このサブルーチンを 用いる前に、 HistoryCreate による初期設定が必要です。
既に gtool4 データが存在し、そのデータ内の変数と全く同じ 構造の変数を定義したい場合は HistoryCopyVariable を利用すると 便利です。
HistoryAddVariable というサブルーチン名は 2 つの別々の サブルーチンの総称名です。下記のサブルーチンも参照ください。
subroutine HistoryAddVariable2( varinfo, history, err )
!
!== 変数定義
!
! gtool4 データ内の変数の定義を行います。このサブルーチンを
! 用いる前に、 HistoryCreate による初期設定が必要です。
!
! 既に gtool4 データが存在し、そのデータ内の変数と全く同じ
! 構造の変数を定義したい場合は HistoryCopyVariable を利用すると
! 便利です。
!
! *HistoryAddVariable* というサブルーチン名は 2 つの別々の
! サブルーチンの総称名です。下記のサブルーチンも参照ください。
!
use dc_string, only: JoinChar
implicit none
type(GT_HISTORY_VARINFO), intent(in) :: varinfo
! 変数情報を格納した構造体
!
! ここに指定するものは、
! HistoryVarinfoCreate によって
! 初期設定されていなければなりません。
!
type(GT_HISTORY), intent(inout), optional:: history
! 出力ファイルの設定に関する情報を
! 格納した構造体
!
! ここに指定するものは、
! HistoryCreate によって初期設定
! されていなければなりません。
!
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
character(len = *), parameter:: subname = "HistoryAddVariable2"
continue
call BeginSub(subname, 'varname=<%c>, dims=<%c>, longname=<%c>', c1=trim(varinfo % name), c2=trim(JoinChar(varinfo % dims)), c3=trim(varinfo % longname) )
call HistoryAddVariable1( history = history, varname = varinfo % name, dims = varinfo % dims, longname = varinfo % longname, units = varinfo % units, xtype = varinfo % xtype, time_average = varinfo % time_average, err = err ) ! (out) optional
if (associated( varinfo % attrs )) then
call HistoryAttrAdd( varinfo % name, varinfo % attrs, history )
end if
call EndSub(subname)
end subroutine HistoryAddVariable2
| Subroutine : | recursive | ||
| varname : | character(len = *), intent(in)
| ||
| dims(:) : | character(len = *), intent(in)
| ||
| longname : | character(len = *), intent(in)
| ||
| units : | character(len = *), intent(in)
| ||
| xtype : | character(len = *), intent(in), optional
| ||
| time_average : | logical, intent(in), optional
| ||
| average : | logical, intent(in), optional
| ||
| history : | type(GT_HISTORY), intent(inout),
optional, target
| ||
| err : | logical, intent(out), optional
|
gtool4 データ内の変数の定義を行います。このサブルーチンを 用いる前に、 HistoryCreate による初期設定が必要です。
既に gtool4 データが存在し、そのデータ内の変数と全く同じ 構造の変数を定義したい場合は HistoryCopyVariable を利用すると便利です。
HistoryAddVariable というサブルーチン名は 2 つの別々の サブルーチンの総称名です。上記のサブルーチンも参照ください。
recursive subroutine HistoryAddVariable1( varname, dims, longname, units, xtype, time_average, average, history, err )
!
!== 変数定義
!
! gtool4 データ内の変数の定義を行います。このサブルーチンを
! 用いる前に、 HistoryCreate による初期設定が必要です。
!
! 既に gtool4 データが存在し、そのデータ内の変数と全く同じ
! 構造の変数を定義したい場合は HistoryCopyVariable を利用すると便利です。
!
! *HistoryAddVariable* というサブルーチン名は 2 つの別々の
! サブルーチンの総称名です。上記のサブルーチンも参照ください。
!
use netcdf_f77, only: NF_EBADDIM
use dc_error, only: StoreError, DC_NOERR, DC_ENOTINIT, HST_ENODEPENDTIME
use dc_string, only: CPrintf, JoinChar, StoA
use gtdata_generic, only: Inquire, Create, Slice, Put_Attr, Get_Attr, Put, PutLine
use dc_url, only: GT_ATMARK, UrlResolve
use dc_present, only: present_and_true
use dc_types, only: STRING
implicit none
character(len = *), intent(in):: varname
! 定義する変数の名前
!
! 最大文字数は dc_type#TOKEN
!
character(len = *), intent(in):: dims(:)
! 変数が依存する次元の名前
!
! 時間の次元は配列の最後に指定
! しなければならない。
! ここで指定するものは、
! HistoryCreate にて dims で指定
! されていなければならない。
!
! もしもスカラー変数を作成
! する場合には, サイズが 1 で
! 中身が空の文字型配列,
! すなわち <tt> (/''/) </tt>
! を与えること.
!
character(len = *), intent(in):: longname
! 変数の記述的名称
!
! 最大文字数は dc_types#STRING
!
character(len = *), intent(in):: units
! 変数の単位
!
! 最大文字数は dc_types#STRING
!
character(len = *), intent(in), optional:: xtype
! 変数のデータ型
!
! デフォルトはfloat (単精度実数型)
! である。 有効なのは、
! double (倍精度実数型)、 int
! (整数型)である。 指定しない
! 場合や、無効な型を指定した
! 場合には、 float (単精度実数型)
! となる。
!
logical, intent(in), optional:: time_average
! 出力データを時間平均する場合には
! .true. を与えます。
! デフォルトは .false. です。
!
! If output data is averaged in time direction,
! specify ".true.".
! Default is ".false.".
!
logical, intent(in), optional:: average
! time_average の旧版.
! Old version of "time_average"
type(GT_HISTORY), intent(inout), optional, target:: history
! 出力ファイルの設定に関する情報を
! 格納した構造体
!
! ここに指定するものは、
! HistoryCreate によって初期設定
! されていなければなりません。
!
logical, intent(out), optional:: err
! 例外処理用フラグ.
! デフォルトでは, この手続き内でエラーが
! 生じた場合, プログラムは強制終了します.
! 引数 *err* が与えられる場合,
! プログラムは強制終了せず, 代わりに
! *err* に .true. が代入されます.
!
! Exception handling flag.
! By default, when error occur in
! this procedure, the program aborts.
! If this *err* argument is given,
! .true. is substituted to *err* and
! the program does not abort.
type(GT_HISTORY), pointer:: hst =>null()
type(GT_VARIABLE), pointer:: vwork(:) =>null(), dimvars(:) =>null()
character(STRING):: fullname, url, cause_c
integer, pointer:: count_work(:) =>null()
integer, pointer:: var_avr_count_work(:) =>null()
integer:: var_avr_length
type(GT_HISTORY_AVRDATA), pointer:: var_avr_data_work(:) =>null()
character(STRING):: time_name, time_xtype, time_url, time_units
type(GT_VARIABLE), pointer:: dimvars_work(:)
logical, pointer:: dim_value_written_work(:)
integer:: dimvars_size
logical:: nv_exist, bnds_exist
character(STRING):: nv_name_check, bnds_name_check
character(*), parameter:: nv_suffix = '_nv'
character(*), parameter:: bnds_suffix = '_bnds'
type(GT_VARIABLE), pointer:: timevar
integer:: nvars, numdims, i, dimord, stat
character(*), parameter:: subname = "HistoryAddVariable1"
continue
call BeginSub(subname, 'name=<%a>, dims=<%a>, longname=<%a>, units=<%a>', ca=StoA(varname, JoinChar(dims), longname, units))
stat = DC_NOERR
cause_c = ''
!----- 操作対象決定 -----
if (present(history)) then
hst => history
else
hst => default
endif
!-----------------------------------------------------------------
! 初期設定のチェック
! Check initialization
!-----------------------------------------------------------------
if ( .not. hst % initialized ) then
stat = DC_ENOTINIT
cause_c = 'GT_HISTORY'
goto 999
end if
!----- 変数表拡張 -----
if (associated(hst % vars)) then
nvars = size(hst % vars(:))
vwork => hst % vars
count_work => hst % count
var_avr_count_work => hst % var_avr_count
nullify(hst % vars, hst % count, hst % var_avr_count)
allocate(hst % vars(nvars + 1), hst % count(nvars + 1), hst % var_avr_count(nvars + 1))
hst % vars(1:nvars) = vwork(1:nvars)
hst % count(1:nvars) = count_work(1:nvars)
hst % var_avr_count(1:nvars) = var_avr_count_work(1:nvars)
deallocate(vwork, count_work, var_avr_count_work)
count_work => hst % growable_indices
nullify(hst % growable_indices)
allocate(hst % growable_indices(nvars + 1))
hst % growable_indices(1:nvars) = count_work(1:nvars)
deallocate(count_work)
!
! 平均値出力のための変数表コピー
! Copy table of variables for average value output
!
var_avr_data_work => hst % var_avr_data
nullify(hst % var_avr_data)
allocate(hst % var_avr_data(nvars + 1))
do i = 1, nvars
hst % var_avr_data(i) % length = var_avr_data_work(i) % length
allocate(hst % var_avr_data(i) % a_DataAvr(var_avr_data_work(i) % length))
hst % var_avr_data(i) % a_DataAvr = var_avr_data_work(i) % a_DataAvr
end do
else
! トリッキーだが、ここで count だけ 2 要素確保するのは、
! HistorySetTime による巻き戻しに備えるため。
allocate(hst % vars(1), hst % count(2), hst % growable_indices(1))
allocate(hst % var_avr_count(1), hst % var_avr_data(1))
hst % count(2) = 0
endif
nvars = size(hst % vars(:))
hst % growable_indices(nvars) = 0
hst % count(nvars) = 0
! スカラー変数作成への対応
if (size(dims) == 1 .and. trim(dims(1)) == '') then
numdims = 0
allocate(dimvars(numdims))
else
numdims = size(dims)
allocate(dimvars(numdims))
end if
!----- 変数添字次元を決定 -----
do, i = 1, numdims
! hst 内で, 次元変数名 dim(i) に当たる次元変数の ID である
! hst % dimvar(i) を dimvars(i) に, 添字を dimord に
dimvars(i) = lookup_dimension( hst, dims(i), ord = dimord ) ! (out)
if (dimord == 0) then
stat = NF_EBADDIM
cause_c = CPrintf('"%c" dimension is not found.', c1=trim(dims(i)))
goto 999
end if
! 無制限次元の添字と一致する場合に,
! その添字を hst % growable_indices(nvars) に
if (dimord == hst % unlimited_index) then
hst % growable_indices(nvars) = i
endif
call Inquire(hst % dimvars(1), url=url)
enddo
!----- 変数作成 -----
call Inquire(hst % dimvars(1), url=url)
fullname = UrlResolve((GT_ATMARK // trim(varname)), trim(url))
call Create(hst % vars(nvars), trim(fullname), dimvars, xtype=xtype)
! 拡張可能次元があったらそれをサイズ 1 に拡張しておく
if (hst % growable_indices(nvars) /= 0) then
call Slice(hst % vars(nvars), hst % growable_indices(nvars), start=1, count=1, stride=1)
endif
call Put_Attr(hst % vars(nvars), 'long_name', longname)
call Put_Attr(hst % vars(nvars), 'units', units)
deallocate(dimvars)
!-----------------------------------------------------------------
! 平均処理に関する情報管理
!-----------------------------------------------------------------
if ( present_and_true( time_average ) .or. present_and_true( average ) ) then
hst % var_avr_count(nvars) = 0
!-------------------------
! 割り付け
call Inquire(hst % vars(nvars), size = var_avr_length )
hst % var_avr_data(nvars) % length = var_avr_length
allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
hst % var_avr_data(nvars) % a_DataAvr = 0.0_DP
!-----------------------
! 時間次元情報の取得
if ( hst % growable_indices(nvars) < 1 ) then
stat = HST_ENODEPENDTIME
cause_c = trim(varname)
goto 999
end if
timevar => hst % dimvars( hst % unlimited_index )
call Inquire( var = timevar, name = time_name, url = time_url, xtype = time_xtype ) ! (out)
call Get_Attr( var = timevar, name = 'units', default = '', value = time_units ) ! (out)
!-----------------------
! 時間次元への属性 "bounds" の追加
call Put_Attr( var = timevar, name = 'bounds', value = trim(time_name) // bnds_suffix ) ! (in)
!-----------------------
! 変数 "varname" への属性 "cell_methods" の追加
call Put_Attr( var = hst % vars(nvars), name = 'cell_methods', value = trim(time_name) // ': mean' ) ! (in)
!-----------------------
! "time_nv" 次元の作成 (既に作成されていたら何もしない)
dimvars_size = size( hst % dimvars )
nv_exist = .false.
do i = 1, dimvars_size
call Inquire( var = hst % dimvars(i), name = nv_name_check ) ! (out)
if ( trim(time_name) // trim(nv_suffix) == trim(nv_name_check) ) then
nv_exist = .true.
exit
end if
end do
if ( .not. nv_exist ) then
dimvars_work => hst % dimvars
dim_value_written_work => hst % dim_value_written
nullify(hst % dimvars, hst % dim_value_written)
allocate(hst % dimvars(dimvars_size + 1))
allocate(hst % dim_value_written(dimvars_size + 1))
hst % dimvars(1:dimvars_size) = dimvars_work(1:dimvars_size)
hst % dim_value_written(1:dimvars_size) = dim_value_written_work(1:dimvars_size)
deallocate(dimvars_work)
deallocate(dim_value_written_work)
call Create( var = hst % dimvars(dimvars_size + 1), url = trim(time_url) // trim(nv_suffix), length = 2, xtype = 'integer' ) ! (in)
call Put_Attr( var = hst % dimvars(dimvars_size + 1), name = 'long_name', value = 'number of vertices of time') ! (in)
call Put_Attr( var = hst % dimvars(dimvars_size + 1), name = 'units', value = '1' ) ! (in)
call Put( var = hst % dimvars(dimvars_size + 1), value = (/1, 2/) ) ! (in)
hst % dim_value_written(dimvars_size + 1) = .true.
end if
!-----------------------
! "time_bnds" 変数の作成 (既に作成されていたら何もしない)
bnds_exist = .false.
do i = 1, nvars
call Inquire( var = hst % vars(i), name = bnds_name_check ) ! (out)
if ( trim(time_name) // trim(bnds_suffix) == trim(bnds_name_check) ) then
bnds_exist = .true.
exit
end if
end do
if ( .not. bnds_exist ) then
call HistoryAddVariable( history = hst, varname = trim(time_name) // trim(bnds_suffix), dims = StoA( trim(time_name) // trim(nv_suffix), trim(time_name) ), longname = 'bounds of time', units = time_units, xtype = time_xtype ) ! (in)
end if
else
hst % var_avr_count(nvars) = -1
!-------------------------
! 割り付け
var_avr_length = 1
hst % var_avr_data(nvars) % length = var_avr_length
allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
hst % var_avr_data(nvars) % a_DataAvr = 0.0_DP
end if
!-----------------------------------------------------------------
! 終了処理, 例外処理
! Termination and Exception handling
!-----------------------------------------------------------------
999 continue
call StoreError(stat, subname, err, cause_c)
call EndSub(subname)
end subroutine HistoryAddVariable1
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value : | character(*), intent(in)
|
GT_HISTORY_AXIS 型の変数 axis へ属性を付加します。
HistoryAxisAddAttr は複数のサブルーチンの総称名です。 value には様々な型の引数を与えることが可能です。 下記のサブルーチンを参照ください。
subroutine HistoryAxisAddAttrChar0( axis, attrname, value)
!
!
!== GT_HISTORY_AXIS 型変数への属性付加
!
! GT_HISTORY_AXIS 型の変数 *axis* へ属性を付加します。
!
! *HistoryAxisAddAttr* は複数のサブルーチンの総称名です。
! value には様々な型の引数を与えることが可能です。
! 下記のサブルーチンを参照ください。
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
character(*), intent(in):: value
! 属性に与えられる値
!
! 配列の場合でも、数値型以外
! では配列の 1 つ目の要素のみ
! 値として付加されます。
!
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrChar0"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(value))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Char'
axis % attrs(attrs_num) % array = .false.
axis % attrs(attrs_num) % Charvalue = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrChar0
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value : | integer, intent(in) |
subroutine HistoryAxisAddAttrInt0( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
integer, intent(in):: value
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrInt0"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Int'
axis % attrs(attrs_num) % array = .false.
axis % attrs(attrs_num) % Intvalue = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrInt0
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value : | logical, intent(in) |
subroutine HistoryAxisAddAttrLogical0( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
logical, intent(in):: value
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrLogical0"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Logical'
axis % attrs(attrs_num) % array = .false.
axis % attrs(attrs_num) % Logicalvalue = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrLogical0
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value : | real(DP), intent(in) |
subroutine HistoryAxisAddAttrDouble0( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
real(DP), intent(in):: value
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrDouble0"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Double'
axis % attrs(attrs_num) % array = .false.
axis % attrs(attrs_num) % Doublevalue = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrDouble0
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value : | real, intent(in) |
subroutine HistoryAxisAddAttrReal0( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
real, intent(in):: value
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrReal0"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Real'
axis % attrs(attrs_num) % array = .false.
axis % attrs(attrs_num) % Realvalue = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrReal0
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value(:) : | integer, intent(in) |
subroutine HistoryAxisAddAttrInt1( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
integer, intent(in):: value(:)
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrInt1"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Int'
axis % attrs(attrs_num) % array = .true.
allocate( axis % attrs(attrs_num) % Intarray( size(value) ) )
axis % attrs(attrs_num) % Intarray = value
call EndSub(subname)
end subroutine HistoryAxisAddAttrInt1
| Subroutine : | |||
| axis : | type(GT_HISTORY_AXIS),intent(inout) | ||
| attrname : | character(*), intent(in)
| ||
| value(:) : | real(DP), intent(in) |
subroutine HistoryAxisAddAttrDouble1( axis, attrname, value)
!
!
use gtdata_generic, only: Put_Attr
use dc_string , only: toChar, JoinChar
use dc_url , only: GT_PLUS
implicit none
type(GT_HISTORY_AXIS),intent(inout) :: axis
character(*), intent(in):: attrname ! 属性の名前
real(DP), intent(in):: value(:)
type(GT_HISTORY_ATTR), pointer:: attrs_tmp(:)
integer:: attrs_num
character(STRING) :: name
character(*), parameter:: subname = "HistoryAxisAddAttrDouble1"
continue
call BeginSub(subname, 'attrname=<%c>, value=<%c>', c1=trim(attrname), c2=trim(toChar(value)))
call HistoryAxisInquire1( axis, name )
call DbgMessage('axis name=<%c>', c1=trim(name))
! これまでの属性を保持しつつ配列を1つ増やす
if ( .not. associated(axis % attrs) ) then
allocate( axis % attrs(1) )
attrs_num = 1
else
attrs_num = size( axis % attrs ) + 1
! 配列データの領域確保
allocate( attrs_tmp(attrs_num - 1) )
call HistoryAttrCopy( from = axis % attrs(1:attrs_num - 1), to = attrs_tmp(1:attrs_num - 1))
deallocate( axis % attrs )
allocate( axis % attrs(attrs_num) )
call HistoryAttrCopy( from = attrs_tmp(1:attrs_num - 1), to = axis % attrs(1:attrs_num - 1))
deallocate( attrs_tmp )
endif
axis % attrs(attrs_num) % attrname = attrname
axis % attrs(attrs_num) % attrtype = 'Double'
axis % attrs(attrs_num) % array = .true.
allocate( axis % attrs(attrs_num) % Doublearray( size(value) ) )
axi