変数の出力情報を加えます.
92 use dc_date,
only: dcdifftimecreate,
operator(>),
operator(<)
96 use netcdf, only: nf90_max_dims
97 implicit none
98 type(GTHST_NMLINFO), intent(inout):: gthstnml
99 character(*), intent(in), optional:: name
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 character(*), intent(in), optional:: file
125
126
127 real(DP), intent(in), optional:: interval_value
128
129
130
131
132
133 character(*), intent(in), optional:: interval_unit
134
135
136 character(*), intent(in), optional:: precision
137
138
139 logical, intent(in), optional:: time_average
140
141
142 logical, intent(in), optional:: average
143
144
145 character(*), intent(in), optional:: fileprefix
146
147
148 real(DP), intent(in), optional:: origin_value
149
150
151 character(*), intent(in), optional:: origin_unit
152
153
154 real(DP), intent(in), optional:: terminus_value
155
156
157 character(*), intent(in), optional:: terminus_unit
158
159
160 integer, intent(in), optional:: slice_start(:)
161
162
163 integer, intent(in), optional:: slice_end(:)
164
165
166 integer, intent(in), optional:: slice_stride(:)
167
168
169 logical, intent(in), optional:: space_average(:)
170
171
172 integer, intent(in), optional:: newfile_intvalue
173
174
175 character(*), intent(in), optional:: newfile_intunit
176
177
178 logical, intent(out), optional:: err
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 type(GTHST_NMLINFO_ENTRY), pointer:: hptr =>null()
197 type(GTHST_NMLINFO_ENTRY), pointer:: hptr_last =>null()
198 type(DC_DIFFTIME):: interval_time, newfileint_time
199 character(TOKEN), pointer:: varnames_array(:) =>null()
200 integer:: i, vnmax, ary_size
201 integer:: stat
202 character(STRING):: cause_c
203 character(*), parameter:: subname = 'HstNmlInfoAdd'
204 continue
206 & fmt = '@name=%a @file=%a @interval_value=%r @interval_unit=%a @precision=%a @time_average=%y @fileprefix=%a', &
214 & )
215
217 cause_c = ''
218
219
220
221
222
223 if ( .not. gthstnml % initialized ) then
225 cause_c = 'GTHST_NMLINFO'
226 goto 999
227 end if
228
229 if ( .not. gthstnml % define_mode ) then
231 cause_c = 'Add'
232 goto 999
233 end if
234
235
236
237
238
241 call dbgmessage(
'multiple entries (%c) will be created', c1 = trim(name) )
242
243
245 & carray = varnames_array )
246 vnmax = size( varnames_array )
247
248 do i = 1, vnmax
250 & gthstnml = gthstnml, &
251 & name = varnames_array(i), &
252 & file = file, &
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, &
268 & err = err )
270 deallocate( varnames_array )
272 goto 999
273 end if
274 end do
275 deallocate( varnames_array )
276 goto 999
277 end if
278 end if
279
280
281
282
283
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
292
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
302 end if
303 if ( present(slice_end ) ) then
304 ary_size = size(slice_end)
305 gthstnml % gthstnml_list % slice_end(1:ary_size) = slice_end
306 end if
307 if ( present(slice_stride ) ) then
308 ary_size = size(slice_stride)
309 gthstnml % gthstnml_list % slice_stride(1:ary_size) = slice_stride
310 end if
311 if ( present(space_average ) ) then
312 ary_size = size(space_average)
313 gthstnml % gthstnml_list % space_average(1:ary_size) = space_average
314 end if
315 if ( present(newfile_intvalue) ) gthstnml % gthstnml_list % newfile_intvalue = newfile_intvalue
316 if ( present(newfile_intunit ) ) gthstnml % gthstnml_list % newfile_intunit = newfile_intunit
317
318
319 hptr => gthstnml % gthstnml_list
320
321 else
322 hptr => gthstnml % gthstnml_list
324 & name = name )
325 if ( .not. associated(hptr) ) then
326 call dbgmessage(
'new entry (%c) is created', c1 = trim( adjustl( name ) ) )
327
328 hptr_last => gthstnml % gthstnml_list
329 call listlast( gthstnml_list = hptr_last )
330 allocate( hptr )
331
332 nullify( hptr % next )
333
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
339
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
350
351 hptr_last % next => hptr
352 else
353 call dbgmessage(
'entry (%c) is overwritten', c1 = trim( adjustl( name ) ) )
354 end if
355
356 hptr % name = adjustl( name )
358 hptr % file = file
359 nullify( hptr % fileprefix )
360 allocate( hptr % fileprefix )
361 hptr % fileprefix = ''
362 else
363 hptr % file = trim( adjustl(name) ) // '.nc'
364 end if
365
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))
370 end if
371 if ( present(interval_unit) ) then
372 nullify( hptr % interval_unit )
373 allocate( hptr % interval_unit )
374 hptr % interval_unit = interval_unit
375 end if
376 if ( present(precision) ) then
377 nullify( hptr % precision )
378 allocate( hptr % precision )
379 hptr % precision = precision
380 end if
381 if ( present(average) ) then
382 nullify( hptr % time_average )
383 allocate( hptr % time_average )
384 hptr % time_average = average
385 end if
386 if ( present(time_average) ) then
387 nullify( hptr % time_average )
388 allocate( hptr % time_average )
389 hptr % time_average = time_average
390 end if
391
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))
396 end if
397 if ( present(origin_unit) ) then
398 nullify( hptr % origin_unit )
399 allocate( hptr % origin_unit )
400 hptr % origin_unit = origin_unit
401 end if
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))
406 end if
407 if ( present(terminus_unit) ) then
408 nullify( hptr % terminus_unit )
409 allocate( hptr % terminus_unit )
410 hptr % terminus_unit = terminus_unit
411 end if
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
418 end if
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
425 end if
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
432 end if
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
439 end if
440 if ( present(newfile_intvalue) ) then
441 nullify( hptr % newfile_intvalue )
442 allocate( hptr % newfile_intvalue )
443 hptr % newfile_intvalue = newfile_intvalue
444 end if
445 if ( present(newfile_intunit) ) then
446 nullify( hptr % newfile_intunit )
447 allocate( hptr % newfile_intunit )
448 hptr % newfile_intunit = newfile_intunit
449 end if
450
451 end if
452
453
454
455
456
457 call dcdifftimecreate( &
458 & diff = interval_time, &
459 & value = hptr % interval_value, &
460 & unit = hptr % interval_unit, &
461 & err = err )
464 & gthstnml = gthstnml, &
465 & name = name )
467 goto 999
468 end if
469
470
471
472
473
474 call dcdifftimecreate( &
475 & diff = newfileint_time, &
476 & value = real( hptr % newfile_intvalue ), &
477 & unit = hptr % newfile_intunit, &
478 & err = err )
481 & gthstnml = gthstnml, &
482 & name = name )
484 goto 999
485 end if
486
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 ) )
495
497 & gthstnml = gthstnml, &
498 & name = name )
500 cause_c =
cprintf(
'%d [%c]', &
501 & i = (/ hptr % newfile_intvalue /), c1 = trim( hptr % newfile_intunit ) )
502 goto 999
503 end if
504 end if
505
506 nullify( hptr )
507
508
509
510
511
512999 continue
513 call storeerror( stat, subname, err, cause_c )
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public usr_errno
-1000 以下: ユーザー定義
integer, parameter, public dc_noerr
エラー等を保持
integer, parameter, public dc_enotinit
-400 以下: dc ユーティリティのエラー
integer, parameter, public hst_enotindefine
-500 以下: データ入出力層のエラー
integer, parameter, public hst_ebadnewfileint
logical function, public present_and_not_empty(arg)
logical function, public present_and_true(arg)
character(string) function, public joinchar(carray, expr)
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
integer, parameter, public dp
倍精度実数型変数
integer, parameter, public string
文字列を保持する 文字型変数の種別型パラメタ
character(1), parameter, public name_delimiter