12 & interval_value, interval_unit, &
14 & time_average, average, &
16 & origin_value, origin_unit, &
17 & terminus_value, terminus_unit, &
18 & slice_start, slice_end, slice_stride, &
20 & newfile_intvalue, newfile_intunit, &
55 use dc_trace
, only: beginsub, endsub, dbgmessage
56 use dc_string
, only: putline, printf, split, strinclude, stoa, joinchar, cprintf
57 use dc_present
, only: present_and_not_empty, present_and_true, present_select
60 use dc_date, only: dcdifftimecreate,
operator(>),
operator(<)
61 use dc_message
, only: messagenotify
64 use netcdf
, only: nf90_max_dims
67 character(*),
intent(in),
optional:: name
92 character(*),
intent(in),
optional:: file
95 real(DP),
intent(in),
optional:: interval_value
101 character(*),
intent(in),
optional:: interval_unit
104 character(*),
intent(in),
optional:: precision
107 logical,
intent(in),
optional:: time_average
110 logical,
intent(in),
optional:: average
113 character(*),
intent(in),
optional:: fileprefix
116 real(DP),
intent(in),
optional:: origin_value
119 character(*),
intent(in),
optional:: origin_unit
122 real(DP),
intent(in),
optional:: terminus_value
125 character(*),
intent(in),
optional:: terminus_unit
128 integer,
intent(in),
optional:: slice_start(:)
131 integer,
intent(in),
optional:: slice_end(:)
134 integer,
intent(in),
optional:: slice_stride(:)
137 logical,
intent(in),
optional:: space_average(:)
140 integer,
intent(in),
optional:: newfile_intvalue
143 character(*),
intent(in),
optional:: newfile_intunit
146 logical,
intent(out),
optional:: err
166 type(dc_difftime):: interval_time, newfileint_time
167 character(TOKEN),
pointer:: varnames_array(:) =>null()
168 integer:: i, vnmax, ary_size
170 character(STRING):: cause_c
171 character(*),
parameter:: subname =
'HstNmlInfoAdd' 173 call beginsub( subname, &
174 & fmt =
'@name=%a @file=%a @interval_value=%r @interval_unit=%a @precision=%a @time_average=%y @fileprefix=%a', &
175 & d = (/ present_select(.true., -1.0_dp, interval_value) /), &
176 & l = (/ present_and_true(time_average) /), &
177 & ca = stoa( present_select(.true.,
'<no>', name), &
178 & present_select(.true.,
'<no>', file), &
179 & present_select(.true.,
'<no>', interval_unit), &
180 & present_select(.true.,
'<no>', precision), &
181 & present_select(.true.,
'<no>', fileprefix) ) &
191 if ( .not. gthstnml % initialized )
then 193 cause_c =
'GTHST_NMLINFO' 197 if ( .not. gthstnml % define_mode )
then 207 if ( present_and_not_empty(name) )
then 209 call dbgmessage(
'multiple entries (%c) will be created', c1 = trim(name) )
213 & carray = varnames_array )
214 vnmax =
size( varnames_array )
218 & gthstnml = gthstnml, &
219 & name = varnames_array(i), &
221 & interval_value = interval_value, &
222 & interval_unit = interval_unit, &
223 & precision = precision, &
224 & time_average = time_average, &
225 & average = average, &
226 & origin_value = origin_value, &
227 & origin_unit = origin_unit, &
228 & terminus_value = terminus_value, &
229 & terminus_unit = terminus_unit, &
230 & slice_start = slice_start, &
231 & slice_end = slice_end, &
232 & slice_stride = slice_stride, &
233 & space_average = space_average, &
234 & newfile_intvalue = newfile_intvalue, &
235 & newfile_intunit = newfile_intunit, &
237 if ( present_and_true( err ) )
then 238 deallocate( varnames_array )
243 deallocate( varnames_array )
252 if ( .not. present_and_not_empty(name) )
then 253 if (
present(interval_value) ) gthstnml % gthstnml_list % interval_value = interval_value
254 if (
present(interval_unit) ) gthstnml % gthstnml_list % interval_unit = interval_unit
255 if (
present(precision) ) gthstnml % gthstnml_list % precision = precision
256 if (
present(average) ) gthstnml % gthstnml_list % time_average = average
257 if (
present(time_average) ) gthstnml % gthstnml_list % time_average = time_average
258 if (
present(fileprefix) ) gthstnml % gthstnml_list % fileprefix = fileprefix
260 if (
present(origin_value ) ) gthstnml % gthstnml_list % origin_value = origin_value
261 if (
present(origin_unit ) ) gthstnml % gthstnml_list % origin_unit = origin_unit
262 if (
present(terminus_value ) ) gthstnml % gthstnml_list % terminus_value = terminus_value
263 if (
present(terminus_unit ) ) gthstnml % gthstnml_list % terminus_unit = terminus_unit
264 if (
present(slice_start ) )
then 265 ary_size =
size(slice_start)
266 gthstnml % gthstnml_list % slice_start(1:ary_size) = slice_start
268 if (
present(slice_end ) )
then 269 ary_size =
size(slice_end)
270 gthstnml % gthstnml_list % slice_end(1:ary_size) = slice_end
272 if (
present(slice_stride ) )
then 273 ary_size =
size(slice_stride)
274 gthstnml % gthstnml_list % slice_stride(1:ary_size) = slice_stride
276 if (
present(space_average ) )
then 277 ary_size =
size(space_average)
278 gthstnml % gthstnml_list % space_average(1:ary_size) = space_average
280 if (
present(newfile_intvalue) ) gthstnml % gthstnml_list % newfile_intvalue = newfile_intvalue
281 if (
present(newfile_intunit ) ) gthstnml % gthstnml_list % newfile_intunit = newfile_intunit
284 hptr => gthstnml % gthstnml_list
287 hptr => gthstnml % gthstnml_list
288 call listsearch( gthstnml_list = hptr, &
290 if ( .not.
associated(hptr) )
then 291 call dbgmessage(
'new entry (%c) is created', c1 = trim( adjustl( name ) ) )
293 hptr_last => gthstnml % gthstnml_list
294 call listlast( gthstnml_list = hptr_last )
297 nullify( hptr % next )
299 hptr % interval_value => gthstnml % gthstnml_list % interval_value
300 hptr % interval_unit => gthstnml % gthstnml_list % interval_unit
301 hptr % precision => gthstnml % gthstnml_list % precision
302 hptr % time_average => gthstnml % gthstnml_list % time_average
303 hptr % fileprefix => gthstnml % gthstnml_list % fileprefix
305 hptr % origin_value => gthstnml % gthstnml_list % origin_value
306 hptr % origin_unit => gthstnml % gthstnml_list % origin_unit
307 hptr % terminus_value => gthstnml % gthstnml_list % terminus_value
308 hptr % terminus_unit => gthstnml % gthstnml_list % terminus_unit
309 hptr % slice_start => gthstnml % gthstnml_list % slice_start
310 hptr % slice_end => gthstnml % gthstnml_list % slice_end
311 hptr % slice_stride => gthstnml % gthstnml_list % slice_stride
312 hptr % space_average => gthstnml % gthstnml_list % space_average
313 hptr % newfile_intvalue => gthstnml % gthstnml_list % newfile_intvalue
314 hptr % newfile_intunit => gthstnml % gthstnml_list % newfile_intunit
316 hptr_last % next => hptr
318 call dbgmessage(
'entry (%c) is overwritten', c1 = trim( adjustl( name ) ) )
321 hptr % name = adjustl( name )
322 if ( present_and_not_empty(file) )
then 324 nullify( hptr % fileprefix )
325 allocate( hptr % fileprefix )
326 hptr % fileprefix =
'' 328 hptr % file = trim( adjustl(name) ) //
'.nc' 331 if (
present(interval_value) )
then 332 nullify( hptr % interval_value )
333 allocate( hptr % interval_value )
334 hptr % interval_value = interval_value
336 if (
present(interval_unit) )
then 337 nullify( hptr % interval_unit )
338 allocate( hptr % interval_unit )
339 hptr % interval_unit = interval_unit
341 if (
present(precision) )
then 342 nullify( hptr % precision )
343 allocate( hptr % precision )
344 hptr % precision = precision
346 if (
present(average) )
then 347 nullify( hptr % time_average )
348 allocate( hptr % time_average )
349 hptr % time_average = average
351 if (
present(time_average) )
then 352 nullify( hptr % time_average )
353 allocate( hptr % time_average )
354 hptr % time_average = time_average
357 if (
present(origin_value) )
then 358 nullify( hptr % origin_value )
359 allocate( hptr % origin_value )
360 hptr % origin_value = origin_value
362 if (
present(origin_unit) )
then 363 nullify( hptr % origin_unit )
364 allocate( hptr % origin_unit )
365 hptr % origin_unit = origin_unit
367 if (
present(terminus_value) )
then 368 nullify( hptr % terminus_value )
369 allocate( hptr % terminus_value )
370 hptr % terminus_value = terminus_value
372 if (
present(terminus_unit) )
then 373 nullify( hptr % terminus_unit )
374 allocate( hptr % terminus_unit )
375 hptr % terminus_unit = terminus_unit
377 if (
present(slice_start) )
then 378 ary_size =
size( slice_start )
379 nullify( hptr % slice_start )
380 allocate( hptr % slice_start(1:nf90_max_dims) )
381 hptr % slice_start = 1
382 hptr % slice_start(1:ary_size) = slice_start
384 if (
present(slice_end) )
then 385 ary_size =
size( slice_end )
386 nullify( hptr % slice_end )
387 allocate( hptr % slice_end(1:nf90_max_dims) )
388 hptr % slice_end = -1
389 hptr % slice_end(1:ary_size) = slice_end
391 if (
present(slice_stride) )
then 392 ary_size =
size( slice_stride )
393 nullify( hptr % slice_stride )
394 allocate( hptr % slice_stride(1:nf90_max_dims) )
395 hptr % slice_stride = 1
396 hptr % slice_stride(1:ary_size) = slice_stride
398 if (
present(space_average) )
then 399 ary_size =
size( space_average )
400 nullify( hptr % space_average )
401 allocate( hptr % space_average(1:nf90_max_dims) )
402 hptr % space_average = .false.
403 hptr % space_average(1:ary_size) = space_average
405 if (
present(newfile_intvalue) )
then 406 nullify( hptr % newfile_intvalue )
407 allocate( hptr % newfile_intvalue )
408 hptr % newfile_intvalue = newfile_intvalue
410 if (
present(newfile_intunit) )
then 411 nullify( hptr % newfile_intunit )
412 allocate( hptr % newfile_intunit )
413 hptr % newfile_intunit = newfile_intunit
422 call dcdifftimecreate( &
423 & diff = interval_time, &
424 &
value = hptr % interval_value, &
425 & unit = hptr % interval_unit, &
427 if ( present_and_true( err ) )
then 429 & gthstnml = gthstnml, &
439 call dcdifftimecreate( &
440 & diff = newfileint_time, &
441 &
value =
real( hptr % newfile_intvalue ), &
442 & unit = hptr % newfile_intunit, &
444 if ( present_and_true( err ) ) then
446 & gthstnml = gthstnml, &
452 if ( ( hptr % newfile_intvalue > 0 ) &
453 & .and. .not. ( newfileint_time > interval_time ) )
then 454 call messagenotify(
'W', subname, &
455 &
'newfile_int=%d [%c] must be greater than interval=%r [%c]', &
456 & i = (/ hptr % newfile_intvalue /), &
457 & r = (/ hptr % interval_value /), &
458 & c1 = trim( hptr % newfile_intunit ), &
459 & c2 = trim( hptr % interval_unit ) )
462 & gthstnml = gthstnml, &
465 cause_c = cprintf(
'%d [%c]', &
466 & i = (/ hptr % newfile_intvalue /), c1 = trim( hptr % newfile_intunit ) )
477 call storeerror( stat, subname, err, cause_c )
478 call endsub( subname )
integer, parameter, public dc_earglack
integer, parameter, public usr_errno
integer, parameter, public hst_enotindefine
integer, parameter, public dc_enotinit
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
character(1), parameter, public name_delimiter
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_noerr
recursive subroutine hstnmlinfoadd(gthstnml, name, file, interval_value, interval_unit, precision, time_average, average, fileprefix, origin_value, origin_unit, terminus_value, terminus_unit, slice_start, slice_end, slice_stride, space_average, newfile_intvalue, newfile_intunit, err)
integer, parameter, public hst_ebadnewfileint
integer, parameter, public dp
倍精度実数型変数
integer, parameter, public stdout
標準出力の装置番号
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ