gtool5 Fortran 90/95 ライブラリ 1.0.0-rc5
English
Loading...
Searching...
No Matches
historyaddvariable.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

recursive subroutine historyaddvariable1 (varname, dims, longname, units, xtype, time_average, average, history, err)
subroutine historyaddvariable2 (varinfo, history, err)

Function/Subroutine Documentation

◆ historyaddvariable1()

recursive subroutine historyaddvariable1 ( character(len = *), intent(in) varname,
character(len = *), dimension(:), intent(in) dims,
character(len = *), intent(in) longname,
character(len = *), intent(in) units,
character(len = *), intent(in), optional xtype,
logical, intent(in), optional time_average,
logical, intent(in), optional average,
type(gt_history), intent(inout), optional, target history,
logical, intent(out), optional err )

Definition at line 70 of file historyaddvariable.f90.

73 !
80 & put, putline
81 use gtdata_types, only: gt_variable
82 use netcdf, only: nf90_ebaddim
85 use dc_string, only: cprintf, joinchar, stoa
86 use dc_url, only: gt_atmark, urlresolve
88 use dc_date, only: dcdifftimecreate
89 use dc_date_types, only: dc_difftime
90 use dc_message, only: messagenotify
91 use dc_trace, only: beginsub, endsub
92 use dc_types, only: string, dp
93 use mpi
94 implicit none
95 character(len = *), intent(in):: varname
96 ! 定義する変数の名前
97 !
98 ! 最大文字数は dc_types::TOKEN
99 !
100 character(len = *), intent(in):: dims(:)
101 ! 変数が依存する次元の名前
102 !
103 ! 時間の次元は配列の最後に指定
104 ! しなければならない。
105 ! ここで指定するものは、
106 ! HistoryCreate にて dims で指定
107 ! されていなければならない。
108 !
109 ! もしもスカラー変数を作成
110 ! する場合には, サイズが 1 で
111 ! 中身が空の文字型配列,
112 ! すなわち <tt> (/''/) </tt>
113 ! を与えること.
114 !
115 character(len = *), intent(in):: longname
116 ! 変数の記述的名称
117 !
118 ! 最大文字数は dc_types::STRING
119 !
120 character(len = *), intent(in):: units
121 ! 変数の単位
122 !
123 ! 最大文字数は dc_types::STRING
124 !
125 character(len = *), intent(in), optional:: xtype
126 ! 変数のデータ型
127 !
128 ! デフォルトはfloat (単精度実数型)
129 ! である。 有効なのは、
130 ! double (倍精度実数型)、 int
131 ! (整数型)、char (文字型)である。
132 ! 指定しない場合や、無効な型を指定した
133 ! 場合には、 float (単精度実数型)
134 ! となる。
135 !
136 logical, intent(in), optional:: time_average
137 ! 出力データを時間平均する場合には
138 ! .true. を与えます。
139 ! デフォルトは .false. です。
140 !
141 ! If output data is averaged in time direction,
142 ! specify ".true.".
143 ! Default is ".false.".
144 !
145 logical, intent(in), optional:: average
146 ! time_average の旧版.
147 ! Old version of "time_average"
148 type(GT_HISTORY), intent(inout), optional, target:: history
149 ! 出力ファイルの設定に関する情報を
150 ! 格納した構造体
151 !
152 ! ここに指定するものは、
153 ! HistoryCreate によって初期設定
154 ! されていなければなりません。
155 !
156 logical, intent(out), optional:: err
157 ! 例外処理用フラグ.
158 ! デフォルトでは, この手続き内でエラーが
159 ! 生じた場合, プログラムは強制終了します.
160 ! 引数 *err* が与えられる場合,
161 ! プログラムは強制終了せず, 代わりに
162 ! *err* に .true. が代入されます.
163 !
164 ! Exception handling flag.
165 ! By default, when error occur in
166 ! this procedure, the program aborts.
167 ! If this *err* argument is given,
168 ! .true. is substituted to *err* and
169 ! the program does not abort.
170 type(GT_HISTORY), pointer:: hst =>null()
171 type(GT_VARIABLE), pointer:: vwork(:) =>null(), dimvars(:) =>null()
172 character(STRING):: fullname, url, cause_c
173 integer, pointer:: count_work(:) =>null()
174 integer, pointer:: var_avr_count_work(:) =>null()
175 integer:: var_avr_length
176 type(GT_HISTORY_AVRDATA), pointer:: var_avr_data_work(:) =>null()
177 logical, pointer:: var_avr_firstput_work(:) =>null()
178 real(DP), pointer:: var_avr_coefsum_work(:) =>null()
179 real(DP), pointer:: var_avr_baseint_work(:) =>null()
180 real(DP), pointer:: var_avr_prevtime_work(:) =>null()
181!!$ type(DC_DIFFTIME), pointer:: var_avr_baseint_work(:) =>null()
182!!$ type(DC_DIFFTIME), pointer:: var_avr_prevtime_work(:) =>null()
183 character(STRING):: time_name, time_xtype, time_url
184 type(GT_VARIABLE), pointer:: dimvars_work(:) =>null()
185 logical, pointer:: dim_value_written_work(:) =>null()
186 integer:: dimvars_size
187 logical:: nv_exist, bnds_exist
188 character(STRING):: nv_name_check, bnds_name_check
189 character(*), parameter:: nv_suffix = '_nv'
190 character(*), parameter:: bnds_suffix = '_bnds'
191 integer, pointer:: dimord(:) =>null()
192 integer:: nvars, numdims, i, stat
193 integer:: err_mpi
194 type(GT_HISTORY_VARINFO), pointer:: work_mpi_varinfo(:) =>null()
195 type(GT_HISTORY_MPIVARINDEX), pointer:: work_mpi_vars_index(:) =>null()
196 character(*), parameter:: subname = "HistoryAddVariable1"
197 continue
198 call beginsub(subname, 'name=<%a>, dims=<%a>, longname=<%a>, units=<%a>', &
199 & ca=stoa(varname, joinchar(dims), longname, units))
200 stat = dc_noerr
201 cause_c = ''
202 ! 操作対象決定
203 !
204 if (present(history)) then
205 hst => history
206 else
207 hst => default
208 endif
209 ! 初期設定のチェック
210 ! Check initialization
211 !
212 if ( .not. hst % initialized ) then
213 stat = dc_enotinit
214 cause_c = 'GT_HISTORY'
215 goto 999
216 end if
217 ! HistoryPutAxisMPI が既に呼ばれていることをチェック
218 ! Check that "HistoryPutAxisMPI" is already called
219 !
220 if ( hst % mpi_gather .and. hst % mpi_myrank == 0 .and. &
221 & .not. hst % mpi_fileinfo % already_output ) then
222 call messagenotify('W', subname, &
223 & 'Specify data of axes in whole area by "HistoryPutAxisMPI" explicitly ' // &
224 & 'before "call HistoryAddVariable".' )
225 stat = hst_empinoaxisdata
226 goto 999
227 end if
228 ! 変数表拡張 (MPI, ファイル統合版)
229 !
230 if ( hst % mpi_gather ) then
231 if ( associated(hst % mpi_varinfo) ) then
232 nvars = size(hst % mpi_varinfo(:))
233 work_mpi_varinfo => hst % mpi_varinfo
234 nullify( hst % mpi_varinfo )
235 allocate( hst % mpi_varinfo(nvars + 1) )
236 hst % mpi_varinfo(1:nvars) = work_mpi_varinfo
237 deallocate( work_mpi_varinfo )
238 nvars = size(hst % mpi_vars_index(:))
239 work_mpi_vars_index => hst % mpi_vars_index
240 nullify( hst % mpi_vars_index )
241 allocate( hst % mpi_vars_index(nvars + 1) )
242 hst % mpi_vars_index(1:nvars) = work_mpi_vars_index
243 deallocate( work_mpi_vars_index )
244 else
245 nvars = 0
246 allocate( hst % mpi_varinfo(nvars + 1) )
247 allocate( hst % mpi_vars_index(nvars + 1) )
248 end if
250 & hst % mpi_varinfo(nvars + 1), & ! (out)
251 & varname, dims, longname, units, xtype, & ! (in)
252 & time_average, average ) ! (in) optional
253 end if
254 ! 変数表拡張
255 !
256 if (associated(hst % vars)) then
257 nvars = size(hst % vars(:))
258 vwork => hst % vars
259 count_work => hst % count
260 nullify(hst % vars, hst % count)
261 allocate(hst % vars(nvars + 1), hst % count(nvars + 1))
262 hst % vars(1:nvars) = vwork(1:nvars)
263 hst % count(1:nvars) = count_work(1:nvars)
264 deallocate(vwork, count_work)
265 count_work => hst % growable_indices
266 nullify(hst % growable_indices)
267 allocate(hst % growable_indices(nvars + 1))
268 hst % growable_indices(1:nvars) = count_work(1:nvars)
269 deallocate(count_work)
270 ! 平均値出力のための変数表コピー
271 ! Copy table of variables for average value output
272 !
273 var_avr_count_work => hst % var_avr_count
274 nullify( hst % var_avr_count )
275 allocate( hst % var_avr_count(nvars + 1) )
276 hst % var_avr_count(1:nvars) = var_avr_count_work(1:nvars)
277 deallocate( var_avr_count_work )
278 var_avr_data_work => hst % var_avr_data
279 nullify(hst % var_avr_data)
280 allocate(hst % var_avr_data(nvars + 1))
281 do i = 1, nvars
282 hst % var_avr_data(i) % length = var_avr_data_work(i) % length
283 allocate(hst % var_avr_data(i) % &
284 & a_dataavr(var_avr_data_work(i) % length))
285 hst % var_avr_data(i) % a_DataAvr = var_avr_data_work(i) % a_DataAvr
286 deallocate( var_avr_data_work(i) % a_DataAvr )
287 end do
288 deallocate( var_avr_data_work )
289 var_avr_firstput_work => hst % var_avr_firstput
290 nullify( hst % var_avr_firstput )
291 allocate( hst % var_avr_firstput(nvars + 1) )
292 hst % var_avr_firstput(1:nvars) = var_avr_firstput_work(1:nvars)
293 deallocate( var_avr_firstput_work )
294 var_avr_coefsum_work => hst % var_avr_coefsum
295 nullify( hst % var_avr_coefsum )
296 allocate( hst % var_avr_coefsum(nvars + 1) )
297 hst % var_avr_coefsum(1:nvars) = var_avr_coefsum_work(1:nvars)
298 deallocate( var_avr_coefsum_work )
299 var_avr_baseint_work => hst % var_avr_baseint
300 nullify( hst % var_avr_baseint )
301 allocate( hst % var_avr_baseint(nvars + 1) )
302 hst % var_avr_baseint(1:nvars) = var_avr_baseint_work(1:nvars)
303 deallocate( var_avr_baseint_work )
304 var_avr_prevtime_work => hst % var_avr_prevtime
305 nullify( hst % var_avr_prevtime )
306 allocate( hst % var_avr_prevtime(nvars + 1) )
307 hst % var_avr_prevtime(1:nvars) = var_avr_prevtime_work(1:nvars)
308 deallocate( var_avr_prevtime_work )
309 else
310 ! トリッキーだが, ここで count だけ 2 要素確保するのは,
311 ! HistorySetTime による巻き戻しに備えるため.
312 !
313 allocate(hst % vars(1), hst % count(2), hst % growable_indices(1))
314 hst % count(2) = 0
315 allocate(hst % var_avr_count(1), hst % var_avr_data(1))
316 allocate(hst % var_avr_firstput(1), hst % var_avr_coefsum(1))
317 allocate(hst % var_avr_baseint(1), hst % var_avr_prevtime(1))
318 endif
319 nvars = size(hst % vars(:))
320 hst % growable_indices(nvars) = 0
321 if ( nvars < 2 ) then
322 hst % count(nvars) = 0
323 else
324 hst % count(nvars) = hst % count(1)
325 end if
326 ! スカラー変数作成への対応
327 !
328 if (size(dims) == 1 .and. trim(dims(1)) == '') then
329 numdims = 0
330 else
331 numdims = size(dims)
332 end if
333 allocate( dimvars(numdims) )
334 allocate( dimord(numdims) )
335 if ( .not. hst % mpi_gather &
336 & .or. ( hst % mpi_gather .and. hst % mpi_myrank == 0 ) ) then
337 ! 次元の ID の取得
338 !
339 do, i = 1, numdims
340 ! hst 内で, 次元変数名 dim(i) に当たる次元変数の ID である
341 ! hst % dimvar(i) を dimvars(i) に, 添字を dimord に
342 !
343 dimvars(i) = lookup_dimension( hst, dims(i), & ! (in)
344 & ord = dimord(i) ) ! (out)
345 if (dimord(i) == 0) then
346 stat = nf90_ebaddim
347 cause_c = cprintf('"%c" dimension is not found.', c1=trim(dims(i)))
348 goto 999
349 end if
350 end do
351 if ( hst % mpi_gather ) then
352 call mpi_bcast( dimord, numdims, mpi_integer, 0, mpi_comm_world, err_mpi )
353 end if
354 elseif ( hst % mpi_gather .and. hst % mpi_myrank /= 0 ) then
355 call mpi_bcast( dimord, numdims, mpi_integer, 0, mpi_comm_world, err_mpi )
356 end if
357 ! 変数添字次元を決定
358 !
359 do, i = 1, numdims
360 ! 無制限次元の添字と一致する場合に,
361 ! その添字を hst % growable_indices(nvars) に
362 !
363 if (dimord(i) == hst % unlimited_index) then
364 hst % growable_indices(nvars) = i
365 endif
366 enddo
367 if ( .not. hst % mpi_gather &
368 & .or. ( hst % mpi_gather .and. hst % mpi_myrank == 0 ) ) then
369 ! 変数作成
370 !
371 call inquire(hst % dimvars(1), url=url)
372 fullname = urlresolve((gt_atmark // trim(varname)), trim(url))
373 call create(hst % vars(nvars), trim(fullname), dimvars, xtype=xtype)
374 if ( associated(dimvars) ) deallocate( dimvars )
375 ! 拡張可能次元があったらそれをサイズ 1 に拡張しておく
376 !
377 if (hst % growable_indices(nvars) /= 0) then
378 call slice(hst % vars(nvars), hst % growable_indices(nvars), &
379 & start=1, count=1, stride=1)
380 endif
381 call put_attr(hst % vars(nvars), 'long_name', longname)
382 call put_attr(hst % vars(nvars), 'units', units)
383 end if
384 ! 平均処理に関する情報管理
385 !
386 if ( present_and_true( time_average ) &
387 & .or. present_and_true( average ) ) then
388 hst % var_avr_count(nvars) = 0
389 if ( .not. hst % mpi_gather &
390 & .or. ( hst % mpi_gather .and. hst % mpi_myrank == 0 ) ) then
391 ! 情報の取得
392 ! Get Information
393 !
394 call inquire( &
395 & var = hst % dimvars( hst % unlimited_index ), & ! (in)
396 & name = time_name, url = time_url, & ! (out)
397 & xtype = time_xtype ) ! (out)
398 if ( hst % mpi_gather ) then
399 call mpi_bcast( time_name, string, mpi_character, 0, mpi_comm_world, err_mpi )
400 call mpi_bcast( time_url, string, mpi_character, 0, mpi_comm_world, err_mpi )
401 call mpi_bcast( time_xtype, string, mpi_character, 0, mpi_comm_world, err_mpi )
402 end if
403 elseif ( hst % mpi_gather .and. hst % mpi_myrank /= 0 ) then
404 call mpi_bcast( time_name, string, mpi_character, 0, mpi_comm_world, err_mpi )
405 call mpi_bcast( time_url, string, mpi_character, 0, mpi_comm_world, err_mpi )
406 call mpi_bcast( time_xtype, string, mpi_character, 0, mpi_comm_world, err_mpi )
407 end if
408 ! 変数のデータ数の取得
409 !
410 if ( .not. hst % mpi_gather ) then
411 call inquire(hst % vars(nvars), size = var_avr_length )
412 else
413 var_avr_length = 1
414 do i = 1, numdims
415 if ( hst % unlimited_index == dimord(i) ) cycle
416 var_avr_length = &
417 & var_avr_length * hst % mpi_dimdata_each( dimord(i) ) % length
418 end do
419 end if
420 ! 割り付け
421 !
422 hst % var_avr_data(nvars) % length = var_avr_length
423 allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
424 hst % var_avr_data(nvars) % a_DataAvr = 0.0_dp
425 ! デフォルト値設定
426 !
427 hst % var_avr_firstput = .true.
428 hst % var_avr_coefsum(nvars) = 0.0_dp
429 hst % var_avr_baseint(nvars) = 0.0_dp
430!!$ call DCDiffTimeCreate( &
431!!$ & hst % var_avr_baseint(nvars), & ! (out)
432!!$ & sec = 0.0_DP ) ! (in)
433 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
434 ! 時間次元情報の取得
435 !
436 if ( hst % growable_indices(nvars) < 1 ) then
437 stat = hst_enodependtime
438 cause_c = trim(varname)
439 goto 999
440 end if
441 if ( .not. hst % mpi_gather &
442 & .or. ( hst % mpi_gather .and. hst % mpi_myrank == 0 ) ) then
443 ! 時間次元への属性 "bounds" の追加
444 !
445 call put_attr( var = hst % dimvars( hst % unlimited_index ), & ! (inout)
446 & name = 'bounds', & ! (in)
447 & value = trim(time_name) // bnds_suffix ) ! (in)
448 ! 変数 "varname" への属性 "cell_methods" の追加
449 !
450 call put_attr( var = hst % vars(nvars), & ! (inout)
451 & name = 'cell_methods', & ! (in)
452 & value = trim(time_name) // ': mean' ) ! (in)
453 ! "time_nv" 次元の作成 (既に作成されていたら何もしない)
454 !
455 dimvars_size = size( hst % dimvars )
456 nv_exist = .false.
457 do i = 1, dimvars_size
458 call inquire( &
459 & var = hst % dimvars(i), & ! (in)
460 & name = nv_name_check ) ! (out)
461 if ( trim(time_name) // trim(nv_suffix) == trim(nv_name_check) ) then
462 nv_exist = .true.
463 exit
464 end if
465 end do
466 if ( .not. nv_exist ) then
467 dimvars_work => hst % dimvars
468 dim_value_written_work => hst % dim_value_written
469 nullify(hst % dimvars, hst % dim_value_written)
470 allocate(hst % dimvars(dimvars_size + 1))
471 allocate(hst % dim_value_written(dimvars_size + 1))
472 hst % dimvars(1:dimvars_size) = dimvars_work(1:dimvars_size)
473 hst % dim_value_written(1:dimvars_size) = dim_value_written_work(1:dimvars_size)
474 deallocate(dimvars_work)
475 deallocate(dim_value_written_work)
476 call create( &
477 & var = hst % dimvars(dimvars_size + 1), & ! (out)
478 & url = trim(time_url) // trim(nv_suffix), & ! (in)
479 & length = 2, xtype = 'integer' ) ! (in)
480 hst % time_nv_index = dimvars_size + 1
481 call put_attr( var = hst % dimvars(dimvars_size + 1), & ! (inout)
482 & name = 'long_name', & ! (in)
483 & value = 'number of vertices of time') ! (in)
484 call put_attr( var = hst % dimvars(dimvars_size + 1), & ! (inout)
485 & name = 'units', value = '1' ) ! (in)
486 call put( var = hst % dimvars(dimvars_size + 1), & ! (inout)
487 & value = (/1, 2/) ) ! (in)
488 hst % dim_value_written(dimvars_size + 1) = .true.
489 end if
490 ! "time_bnds" 変数の作成 (既に作成されていたら何もしない)
491 !
492 bnds_exist = .false.
493 do i = 1, nvars
494 call inquire( &
495 & var = hst % vars(i), & ! (in)
496 & name = bnds_name_check ) ! (out)
497 if ( trim(time_name) // trim(bnds_suffix) == trim(bnds_name_check) ) then
498 bnds_exist = .true.
499 exit
500 end if
501 end do
502 if ( hst % mpi_gather ) then
503 call mpi_bcast( hst % time_nv_index, 1, mpi_integer, 0, mpi_comm_world, err_mpi )
504 call mpi_bcast( bnds_exist, 1, mpi_logical, 0, mpi_comm_world, err_mpi )
505 end if
506 elseif ( hst % mpi_gather .and. hst % mpi_myrank /= 0 ) then
507 call mpi_bcast( hst % time_nv_index, 1, mpi_integer, 0, mpi_comm_world, err_mpi )
508 call mpi_bcast( bnds_exist, 1, mpi_logical, 0, mpi_comm_world, err_mpi )
509 end if
510 if ( associated(dimord) ) deallocate( dimord )
511 if ( .not. bnds_exist ) then
512 call historyaddvariable( &
513 & history = hst, & ! (inout)
514 & varname = trim(time_name) // trim(bnds_suffix), &
515 & dims = stoa( trim(time_name) // trim(nv_suffix), &
516 & trim(time_name) ), & ! (in)
517 & longname = 'bounds of time', & ! (in)
518 & units = hst % unlimited_units, & ! (in)
519 & xtype = time_xtype ) ! (in)
520 end if
521 ! 平均処理が不要な場合
522 !
523 else
524 hst % var_avr_count(nvars) = -1
525 ! 割り付け
526 !
527 var_avr_length = 1
528 hst % var_avr_data(nvars) % length = var_avr_length
529 allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
530 hst % var_avr_data(nvars) % a_DataAvr = 0.0_dp
531 ! デフォルト値設定
532 !
533 hst % var_avr_firstput = .true.
534 hst % var_avr_coefsum(nvars) = 0.0_dp
535 hst % var_avr_baseint(nvars) = 0.0_dp
536!!$ call DCDiffTimeCreate( &
537!!$ & hst % var_avr_baseint(nvars), & ! (out)
538!!$ & sec = 0.0_DP ) ! (in)
539 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
540 end if
541 ! 終了処理, 例外処理
542 ! Termination and Exception handling
543 !
544999 continue
545 if ( associated(dimvars) ) deallocate( dimvars )
546 if ( associated(dimord) ) deallocate( dimord )
547 call storeerror(stat, subname, err, cause_c)
548 call endsub(subname)
日付・時刻に関する構造データ型と定数
日付および時刻に関する手続きを提供するモジュール
Definition dc_date.f90:57
エラー処理用モジュール
Definition dc_error.f90:454
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition dc_error.f90:891
integer, parameter, public dc_enotinit
-400 以下: dc ユーティリティのエラー
Definition dc_error.f90:534
integer, parameter, public dc_noerr
エラー等を保持
Definition dc_error.f90:468
integer, parameter, public hst_enodependtime
Definition dc_error.f90:562
integer, parameter, public hst_empinoaxisdata
Definition dc_error.f90:574
メッセージの出力
省略可能な制御パラメータの判定
logical function, public present_and_true(arg)
文字型変数の操作
Definition dc_string.f90:83
character(string) function, public joinchar(carray, expr)
デバッグ時の追跡用モジュール
Definition dc_trace.f90:150
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
Definition dc_trace.f90:476
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
Definition dc_trace.f90:599
種別型パラメタを提供します。
Definition dc_types.f90:55
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
Definition dc_types.f90:137
integer, parameter, public dp
倍精度実数型変数
Definition dc_types.f90:92
変数 URL の文字列解析
Definition dc_url.f90:61
character, parameter, public gt_atmark
Definition dc_url.f90:96
type(gt_history), target, save, public default

References dc_trace::beginsub(), dc_error::dc_enotinit, dc_error::dc_noerr, gtool_history_internal::default, dc_types::dp, dc_trace::endsub(), dc_url::gt_atmark, dc_error::hst_empinoaxisdata, dc_error::hst_enodependtime, dc_string::joinchar(), dc_present::present_and_true(), dc_error::storeerror(), and dc_types::string.

Here is the call graph for this function:

◆ historyaddvariable2()

subroutine historyaddvariable2 ( type(gt_history_varinfo), intent(in) varinfo,
type(gt_history), intent(inout), optional history,
logical, intent(out), optional err )

変数定義 (varinfo インターフェース)

GT_HISTORY_VARINFO 構造体を使って gtool4 データ内の変数の定義を 行います。このサブルーチンを用いる前に、HistoryCreate による 初期設定が必要です。

Parameters
[in]varinfo変数情報構造体
[in,out]history出力ファイル設定構造体 (省略可能)
[out]errエラーフラグ (省略可能)

Definition at line 569 of file historyaddvariable.f90.

571 !
572 use dc_string, only: joinchar
576 use dc_trace, only: beginsub, endsub
577 implicit none
578 type(GT_HISTORY_VARINFO), intent(in) :: varinfo
579 ! 変数情報を格納した構造体
580 !
581 ! ここに指定するものは、
582 ! HistoryVarinfoCreate によって
583 ! 初期設定されていなければなりません。
584 !
585 type(GT_HISTORY), intent(inout), optional:: history
586 ! 出力ファイルの設定に関する情報を
587 ! 格納した構造体
588 !
589 ! ここに指定するものは、
590 ! HistoryCreate によって初期設定
591 ! されていなければなりません。
592 !
593 logical, intent(out), optional:: err
594 ! 例外処理用フラグ.
595 ! デフォルトでは, この手続き内でエラーが
596 ! 生じた場合, プログラムは強制終了します.
597 ! 引数 *err* が与えられる場合,
598 ! プログラムは強制終了せず, 代わりに
599 ! *err* に .true. が代入されます.
600 !
601 ! Exception handling flag.
602 ! By default, when error occur in
603 ! this procedure, the program aborts.
604 ! If this *err* argument is given,
605 ! .true. is substituted to *err* and
606 ! the program does not abort.
607 character(len = *), parameter:: subname = "HistoryAddVariable2"
608 continue
609 call beginsub(subname, 'varname=<%c>, dims=<%c>, longname=<%c>', &
610 & c1=trim(varinfo % name), c2=trim(joinchar(varinfo % dims)), &
611 & c3=trim(varinfo % longname) )
612 call historyaddvariable( &
613 & history = history, & ! (inout)
614 & varname = varinfo % name, & ! (in)
615 & dims = varinfo % dims, & ! (in)
616 & longname = varinfo % longname, & ! (in)
617 & units = varinfo % units, & ! (in)
618 & xtype = varinfo % xtype, & ! (in)
619 & time_average = varinfo % time_average, & ! (in) optional
620 & err = err ) ! (out) optional
621 if (associated( varinfo % attrs )) then
622 call append_attrs( varinfo % name, varinfo % attrs, history )
623 end if
624 call endsub(subname)

References dc_trace::beginsub(), dc_trace::endsub(), and dc_string::joinchar().

Here is the call graph for this function: