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
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
integer, parameter, public stdout
標準出力の装置番号
integer, parameter, public dp
倍精度実数型変数
character(1), parameter, public name_delimiter