22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
65 implicit none
66 type(GTHST_NMLINFO), intent(inout):: gthstnml
67 character(*), intent(in), optional:: name
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 character(*), intent(in), optional:: file
93
94
95 real(DP), intent(in), optional:: interval_value
96
97
98
99
100
101 character(*), intent(in), optional:: interval_unit
102
103
104 character(*), intent(in), optional:: precision
105
106
107 logical, intent(in), optional:: time_average
108
109
110 logical, intent(in), optional:: average
111
112
113 character(*), intent(in), optional:: fileprefix
114
115
116 real(DP), intent(in), optional:: origin_value
117
118
119 character(*), intent(in), optional:: origin_unit
120
121
122 real(DP), intent(in), optional:: terminus_value
123
124
125 character(*), intent(in), optional:: terminus_unit
126
127
128 integer, intent(in), optional:: slice_start(:)
129
130
131 integer, intent(in), optional:: slice_end(:)
132
133
134 integer, intent(in), optional:: slice_stride(:)
135
136
137 logical, intent(in), optional:: space_average(:)
138
139
140 integer, intent(in), optional:: newfile_intvalue
141
142
143 character(*), intent(in), optional:: newfile_intunit
144
145
146 logical, intent(out), optional:: err
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164 type(GTHST_NMLINFO_ENTRY), pointer:: hptr =>null()
165 type(GTHST_NMLINFO_ENTRY), pointer:: hptr_last =>null()
166 type(DC_DIFFTIME):: interval_time, newfileint_time
167 character(TOKEN), pointer:: varnames_array(:) =>null()
168 integer:: i, vnmax, ary_size
169 integer:: stat
170 character(STRING):: cause_c
171 character(*), parameter:: subname = 'HstNmlInfoAdd'
172 continue
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) ) &
182 & )
183
185 cause_c = ''
186
187
188
189
190
191 if ( .not. gthstnml % initialized ) then
193 cause_c = 'GTHST_NMLINFO'
194 goto 999
195 end if
196
197 if ( .not. gthstnml % define_mode ) then
199 cause_c = 'Add'
200 goto 999
201 end if
202
203
204
205
206
207 if ( present_and_not_empty(name) ) then
209 call dbgmessage( 'multiple entries (%c) will be created', c1 = trim(name) )
210
211
213 & carray = varnames_array )
214 vnmax = size( varnames_array )
215
216 do i = 1, vnmax
218 & gthstnml = gthstnml, &
219 & name = varnames_array(i), &
220 & file = file, &
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, &
236 & err = err )
237 if ( present_and_true( err ) ) then
238 deallocate( varnames_array )
240 goto 999
241 end if
242 end do
243 deallocate( varnames_array )
244 goto 999
245 end if
246 end if
247
248
249
250
251
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
259
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
267 end if
268 if ( present(slice_end ) ) then
269 ary_size = size(slice_end)
270 gthstnml % gthstnml_list % slice_end(1:ary_size) = slice_end
271 end if
272 if ( present(slice_stride ) ) then
273 ary_size = size(slice_stride)
274 gthstnml % gthstnml_list % slice_stride(1:ary_size) = slice_stride
275 end if
276 if ( present(space_average ) ) then
277 ary_size = size(space_average)
278 gthstnml % gthstnml_list % space_average(1:ary_size) = space_average
279 end if
280 if ( present(newfile_intvalue) ) gthstnml % gthstnml_list % newfile_intvalue = newfile_intvalue
281 if ( present(newfile_intunit ) ) gthstnml % gthstnml_list % newfile_intunit = newfile_intunit
282
283
284 hptr => gthstnml % gthstnml_list
285
286 else
287 hptr => gthstnml % gthstnml_list
289 & name = name )
290 if ( .not. associated(hptr) ) then
291 call dbgmessage( 'new entry (%c) is created', c1 = trim( adjustl( name ) ) )
292
293 hptr_last => gthstnml % gthstnml_list
294 call listlast( gthstnml_list = hptr_last )
295 allocate( hptr )
296
297 nullify( hptr % next )
298
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
304
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
315
316 hptr_last % next => hptr
317 else
318 call dbgmessage( 'entry (%c) is overwritten', c1 = trim( adjustl( name ) ) )
319 end if
320
321 hptr % name = adjustl( name )
322 if ( present_and_not_empty(file) ) then
323 hptr % file = file
324 nullify( hptr % fileprefix )
325 allocate( hptr % fileprefix )
326 hptr % fileprefix = ''
327 else
328 hptr % file = trim( adjustl(name) ) // '.nc'
329 end if
330
331 if ( present(interval_value) ) then
332 nullify( hptr % interval_value )
333 allocate( hptr % interval_value )
334 hptr % interval_value = interval_value
335 end if
336 if ( present(interval_unit) ) then
337 nullify( hptr % interval_unit )
338 allocate( hptr % interval_unit )
339 hptr % interval_unit = interval_unit
340 end if
341 if ( present(precision) ) then
342 nullify( hptr % precision )
343 allocate( hptr % precision )
344 hptr % precision = precision
345 end if
346 if ( present(average) ) then
347 nullify( hptr % time_average )
348 allocate( hptr % time_average )
349 hptr % time_average = average
350 end if
351 if ( present(time_average) ) then
352 nullify( hptr % time_average )
353 allocate( hptr % time_average )
354 hptr % time_average = time_average
355 end if
356
357 if ( present(origin_value) ) then
358 nullify( hptr % origin_value )
359 allocate( hptr % origin_value )
360 hptr % origin_value = origin_value
361 end if
362 if ( present(origin_unit) ) then
363 nullify( hptr % origin_unit )
364 allocate( hptr % origin_unit )
365 hptr % origin_unit = origin_unit
366 end if
367 if ( present(terminus_value) ) then
368 nullify( hptr % terminus_value )
369 allocate( hptr % terminus_value )
370 hptr % terminus_value = terminus_value
371 end if
372 if ( present(terminus_unit) ) then
373 nullify( hptr % terminus_unit )
374 allocate( hptr % terminus_unit )
375 hptr % terminus_unit = terminus_unit
376 end if
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
383 end if
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
390 end if
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
397 end if
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
404 end if
405 if ( present(newfile_intvalue) ) then
406 nullify( hptr % newfile_intvalue )
407 allocate( hptr % newfile_intvalue )
408 hptr % newfile_intvalue = newfile_intvalue
409 end if
410 if ( present(newfile_intunit) ) then
411 nullify( hptr % newfile_intunit )
412 allocate( hptr % newfile_intunit )
413 hptr % newfile_intunit = newfile_intunit
414 end if
415
416 end if
417
418
419
420
421
422 call dcdifftimecreate( &
423 & diff = interval_time, &
424 & value = hptr % interval_value, &
425 & unit = hptr % interval_unit, &
426 & err = err )
427 if ( present_and_true( err ) ) then
429 & gthstnml = gthstnml, &
430 & name = name )
432 goto 999
433 end if
434
435
436
437
438
439 call dcdifftimecreate( &
440 & diff = newfileint_time, &
441 & value = real( hptr % newfile_intvalue ), &
442 & unit = hptr % newfile_intunit, &
443 & err = err )
444 if ( present_and_true( err ) ) then
446 & gthstnml = gthstnml, &
447 & name = name )
449 goto 999
450 end if
451
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 ) )
460
462 & gthstnml = gthstnml, &
463 & name = name )
465 cause_c = cprintf( '%d [%c]', &
466 & i = (/ hptr % newfile_intvalue /), c1 = trim( hptr % newfile_intunit ) )
467 goto 999
468 end if
469
470 nullify( hptr )
471
472
473
474
475
476999 continue
477 call storeerror( stat, subname, err, cause_c )
478 call endsub( subname )
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public usr_errno
integer, parameter, public dc_enotinit
integer, parameter, public dc_earglack
integer, parameter, public dc_noerr
integer, parameter, public hst_enotindefine
integer, parameter, public hst_ebadnewfileint
Provides kind type parameter values.
integer, parameter, public token
Character length for word, token
integer, parameter, public string
Character length for string
integer, parameter, public stdout
Unit number for Standard OUTPUT
integer, parameter, public dp
Double Precision Real number
character(1), parameter, public name_delimiter