73 & interval_value, interval_unit, &
75 & time_average, average, &
77 & origin_value, origin_unit, &
78 & terminus_value, terminus_unit, &
79 & slice_start, slice_end, slice_stride, &
81 & newfile_intvalue, newfile_intunit, &
92 use dc_date,
only: dcdifftimecreate,
operator(>),
operator(<)
96 use netcdf,
only: nf90_max_dims
99 character(*),
intent(in),
optional:: name
124 character(*),
intent(in),
optional:: file
127 real(
dp),
intent(in),
optional:: interval_value
133 character(*),
intent(in),
optional:: interval_unit
136 character(*),
intent(in),
optional:: precision
139 logical,
intent(in),
optional:: time_average
142 logical,
intent(in),
optional:: average
145 character(*),
intent(in),
optional:: fileprefix
148 real(
dp),
intent(in),
optional:: origin_value
151 character(*),
intent(in),
optional:: origin_unit
154 real(
dp),
intent(in),
optional:: terminus_value
157 character(*),
intent(in),
optional:: terminus_unit
160 integer,
intent(in),
optional:: slice_start(:)
163 integer,
intent(in),
optional:: slice_end(:)
166 integer,
intent(in),
optional:: slice_stride(:)
169 logical,
intent(in),
optional:: space_average(:)
172 integer,
intent(in),
optional:: newfile_intvalue
175 character(*),
intent(in),
optional:: newfile_intunit
178 logical,
intent(out),
optional:: err
199 character(TOKEN),
pointer:: varnames_array(:) =>null()
200 integer:: i, vnmax, ary_size
202 character(STRING):: cause_c
203 character(*),
parameter:: subname =
'HstNmlInfoAdd'
206 & fmt =
'@name=%a @file=%a @interval_value=%r @interval_unit=%a @precision=%a @time_average=%y @fileprefix=%a', &
223 if ( .not. gthstnml % initialized )
then
225 cause_c =
'GTHST_NMLINFO'
229 if ( .not. gthstnml % define_mode )
then
241 call dbgmessage(
'multiple entries (%c) will be created', c1 = trim(name) )
245 & carray = varnames_array )
246 vnmax =
size( varnames_array )
250 & gthstnml = gthstnml, &
251 & name = varnames_array(i), &
253 & interval_value = interval_value, &
254 & interval_unit = interval_unit, &
255 & precision = precision, &
256 & time_average = time_average, &
257 & average = average, &
258 & origin_value = origin_value, &
259 & origin_unit = origin_unit, &
260 & terminus_value = terminus_value, &
261 & terminus_unit = terminus_unit, &
262 & slice_start = slice_start, &
263 & slice_end = slice_end, &
264 & slice_stride = slice_stride, &
265 & space_average = space_average, &
266 & newfile_intvalue = newfile_intvalue, &
267 & newfile_intunit = newfile_intunit, &
270 deallocate( varnames_array )
275 deallocate( varnames_array )
285 if (
present(interval_value) ) gthstnml % gthstnml_list % interval_value = &
286 & real(interval_value, kind=kind(gthstnml % gthstnml_list % interval_value))
287 if (
present(interval_unit) ) gthstnml % gthstnml_list % interval_unit = interval_unit
288 if (
present(precision) ) gthstnml % gthstnml_list % precision = precision
289 if (
present(average) ) gthstnml % gthstnml_list % time_average = average
290 if (
present(time_average) ) gthstnml % gthstnml_list % time_average = time_average
291 if (
present(fileprefix) ) gthstnml % gthstnml_list % fileprefix = fileprefix
293 if (
present(origin_value ) ) gthstnml % gthstnml_list % origin_value = &
294 & real(origin_value, kind=kind(gthstnml % gthstnml_list % origin_value))
295 if (
present(origin_unit ) ) gthstnml % gthstnml_list % origin_unit = origin_unit
296 if (
present(terminus_value ) ) gthstnml % gthstnml_list % terminus_value = &
297 & real(terminus_value, kind=kind(gthstnml % gthstnml_list % terminus_value))
298 if (
present(terminus_unit ) ) gthstnml % gthstnml_list % terminus_unit = terminus_unit
299 if (
present(slice_start ) )
then
300 ary_size =
size(slice_start)
301 gthstnml % gthstnml_list % slice_start(1:ary_size) = slice_start
303 if (
present(slice_end ) )
then
304 ary_size =
size(slice_end)
305 gthstnml % gthstnml_list % slice_end(1:ary_size) = slice_end
307 if (
present(slice_stride ) )
then
308 ary_size =
size(slice_stride)
309 gthstnml % gthstnml_list % slice_stride(1:ary_size) = slice_stride
311 if (
present(space_average ) )
then
312 ary_size =
size(space_average)
313 gthstnml % gthstnml_list % space_average(1:ary_size) = space_average
315 if (
present(newfile_intvalue) ) gthstnml % gthstnml_list % newfile_intvalue = newfile_intvalue
316 if (
present(newfile_intunit ) ) gthstnml % gthstnml_list % newfile_intunit = newfile_intunit
319 hptr => gthstnml % gthstnml_list
322 hptr => gthstnml % gthstnml_list
325 if ( .not.
associated(hptr) )
then
326 call dbgmessage(
'new entry (%c) is created', c1 = trim( adjustl( name ) ) )
328 hptr_last => gthstnml % gthstnml_list
329 call listlast( gthstnml_list = hptr_last )
332 nullify( hptr % next )
334 hptr % interval_value => gthstnml % gthstnml_list % interval_value
335 hptr % interval_unit => gthstnml % gthstnml_list % interval_unit
336 hptr % precision => gthstnml % gthstnml_list % precision
337 hptr % time_average => gthstnml % gthstnml_list % time_average
338 hptr % fileprefix => gthstnml % gthstnml_list % fileprefix
340 hptr % origin_value => gthstnml % gthstnml_list % origin_value
341 hptr % origin_unit => gthstnml % gthstnml_list % origin_unit
342 hptr % terminus_value => gthstnml % gthstnml_list % terminus_value
343 hptr % terminus_unit => gthstnml % gthstnml_list % terminus_unit
344 hptr % slice_start => gthstnml % gthstnml_list % slice_start
345 hptr % slice_end => gthstnml % gthstnml_list % slice_end
346 hptr % slice_stride => gthstnml % gthstnml_list % slice_stride
347 hptr % space_average => gthstnml % gthstnml_list % space_average
348 hptr % newfile_intvalue => gthstnml % gthstnml_list % newfile_intvalue
349 hptr % newfile_intunit => gthstnml % gthstnml_list % newfile_intunit
351 hptr_last % next => hptr
353 call dbgmessage(
'entry (%c) is overwritten', c1 = trim( adjustl( name ) ) )
356 hptr % name = adjustl( name )
359 nullify( hptr % fileprefix )
360 allocate( hptr % fileprefix )
361 hptr % fileprefix =
''
363 hptr % file = trim( adjustl(name) ) //
'.nc'
366 if (
present(interval_value) )
then
367 nullify( hptr % interval_value )
368 allocate( hptr % interval_value )
369 hptr % interval_value = real(interval_value, kind=kind(hptr % interval_value))
371 if (
present(interval_unit) )
then
372 nullify( hptr % interval_unit )
373 allocate( hptr % interval_unit )
374 hptr % interval_unit = interval_unit
376 if (
present(precision) )
then
377 nullify( hptr % precision )
378 allocate( hptr % precision )
379 hptr % precision = precision
381 if (
present(average) )
then
382 nullify( hptr % time_average )
383 allocate( hptr % time_average )
384 hptr % time_average = average
386 if (
present(time_average) )
then
387 nullify( hptr % time_average )
388 allocate( hptr % time_average )
389 hptr % time_average = time_average
392 if (
present(origin_value) )
then
393 nullify( hptr % origin_value )
394 allocate( hptr % origin_value )
395 hptr % origin_value = real(origin_value, kind=kind(hptr % origin_value))
397 if (
present(origin_unit) )
then
398 nullify( hptr % origin_unit )
399 allocate( hptr % origin_unit )
400 hptr % origin_unit = origin_unit
402 if (
present(terminus_value) )
then
403 nullify( hptr % terminus_value )
404 allocate( hptr % terminus_value )
405 hptr % terminus_value = real(terminus_value, kind=kind(hptr % terminus_value))
407 if (
present(terminus_unit) )
then
408 nullify( hptr % terminus_unit )
409 allocate( hptr % terminus_unit )
410 hptr % terminus_unit = terminus_unit
412 if (
present(slice_start) )
then
413 ary_size =
size( slice_start )
414 nullify( hptr % slice_start )
415 allocate( hptr % slice_start(1:nf90_max_dims) )
416 hptr % slice_start = 1
417 hptr % slice_start(1:ary_size) = slice_start
419 if (
present(slice_end) )
then
420 ary_size =
size( slice_end )
421 nullify( hptr % slice_end )
422 allocate( hptr % slice_end(1:nf90_max_dims) )
423 hptr % slice_end = -1
424 hptr % slice_end(1:ary_size) = slice_end
426 if (
present(slice_stride) )
then
427 ary_size =
size( slice_stride )
428 nullify( hptr % slice_stride )
429 allocate( hptr % slice_stride(1:nf90_max_dims) )
430 hptr % slice_stride = 1
431 hptr % slice_stride(1:ary_size) = slice_stride
433 if (
present(space_average) )
then
434 ary_size =
size( space_average )
435 nullify( hptr % space_average )
436 allocate( hptr % space_average(1:nf90_max_dims) )
437 hptr % space_average = .false.
438 hptr % space_average(1:ary_size) = space_average
440 if (
present(newfile_intvalue) )
then
441 nullify( hptr % newfile_intvalue )
442 allocate( hptr % newfile_intvalue )
443 hptr % newfile_intvalue = newfile_intvalue
445 if (
present(newfile_intunit) )
then
446 nullify( hptr % newfile_intunit )
447 allocate( hptr % newfile_intunit )
448 hptr % newfile_intunit = newfile_intunit
457 call dcdifftimecreate( &
458 & diff = interval_time, &
459 &
value = hptr % interval_value, &
460 & unit = hptr % interval_unit, &
464 & gthstnml = gthstnml, &
474 call dcdifftimecreate( &
475 & diff = newfileint_time, &
476 &
value = real( hptr % newfile_intvalue ), &
477 & unit = hptr % newfile_intunit, &
481 & gthstnml = gthstnml, &
487 if ( hptr % newfile_intvalue > 0 )
then
488 if ( .not. ( newfileint_time > interval_time ) )
then
490 &
'newfile_int=%d [%c] must be greater than interval=%r [%c]', &
491 & i = (/ hptr % newfile_intvalue /), &
492 & r = (/ hptr % interval_value /), &
493 & c1 = trim( hptr % newfile_intunit ), &
494 & c2 = trim( hptr % interval_unit ) )
497 & gthstnml = gthstnml, &
500 cause_c =
cprintf(
'%d [%c]', &
501 & i = (/ hptr % newfile_intvalue /), c1 = trim( hptr % newfile_intunit ) )
513 call storeerror( stat, subname, err, cause_c )