73
82 use netcdf, only: nf90_ebaddim
88 use dc_date,
only: dcdifftimecreate
93 implicit none
94 character(len = *), intent(in):: varname
95
96
97
98
99 character(len = *), intent(in):: dims(:)
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 character(len = *), intent(in):: longname
115
116
117
118
119 character(len = *), intent(in):: units
120
121
122
123
124 character(len = *), intent(in), optional:: xtype
125
126
127
128
129
130
131
132
133
134
135 logical, intent(in), optional:: time_average
136
137
138
139
140
141
142
143
144 logical, intent(in), optional:: average
145
146
147 type(GT_HISTORY), intent(inout), optional, target:: history
148
149
150
151
152
153
154
155 logical, intent(out), optional:: err
156
157
158
159
160
161
162
163
164
165
166
167
168
169 type(GT_HISTORY), pointer:: hst =>null()
170 type(GT_VARIABLE), pointer:: vwork(:) =>null(), dimvars(:) =>null()
171 character(STRING):: fullname, url, cause_c
172 integer, pointer:: count_work(:) =>null()
173 integer, pointer:: var_avr_count_work(:) =>null()
174 integer:: var_avr_length
175 type(GT_HISTORY_AVRDATA), pointer:: var_avr_data_work(:) =>null()
176 logical, pointer:: var_avr_firstput_work(:) =>null()
177 real(DP), pointer:: var_avr_coefsum_work(:) =>null()
178 real(DP), pointer:: var_avr_baseint_work(:) =>null()
179 real(DP), pointer:: var_avr_prevtime_work(:) =>null()
180
181
182 character(STRING):: time_name, time_xtype, time_url
183 type(GT_VARIABLE), pointer:: dimvars_work(:) =>null()
184 logical, pointer:: dim_value_written_work(:) =>null()
185 integer:: dimvars_size
186 logical:: nv_exist, bnds_exist
187 character(STRING):: nv_name_check, bnds_name_check
188 character(*), parameter:: nv_suffix = '_nv'
189 character(*), parameter:: bnds_suffix = '_bnds'
190 integer, pointer:: dimord(:) =>null()
191 integer:: nvars, numdims, i, stat
192 character(*), parameter:: subname = "HistoryAddVariable1"
193 continue
194 call beginsub(subname,
'name=<%a>, dims=<%a>, longname=<%a>, units=<%a>', &
197 cause_c = ''
198
199
200 if (present(history)) then
201 hst => history
202 else
204 endif
205
206
207
208 if ( .not. hst % initialized ) then
210 cause_c = 'GT_HISTORY'
211 goto 999
212 end if
213
214
215 if (associated(hst % vars)) then
216 nvars = size(hst % vars(:))
217 vwork => hst % vars
218 count_work => hst % count
219 nullify(hst % vars, hst % count)
220 allocate(hst % vars(nvars + 1), hst % count(nvars + 1))
221 hst % vars(1:nvars) = vwork(1:nvars)
222 hst % count(1:nvars) = count_work(1:nvars)
223 deallocate(vwork, count_work)
224 count_work => hst % growable_indices
225 nullify(hst % growable_indices)
226 allocate(hst % growable_indices(nvars + 1))
227 hst % growable_indices(1:nvars) = count_work(1:nvars)
228 deallocate(count_work)
229
230
231
232 var_avr_count_work => hst % var_avr_count
233 nullify( hst % var_avr_count )
234 allocate( hst % var_avr_count(nvars + 1) )
235 hst % var_avr_count(1:nvars) = var_avr_count_work(1:nvars)
236 deallocate( var_avr_count_work )
237 var_avr_data_work => hst % var_avr_data
238 nullify(hst % var_avr_data)
239 allocate(hst % var_avr_data(nvars + 1))
240 do i = 1, nvars
241 hst % var_avr_data(i) % length = var_avr_data_work(i) % length
242 allocate(hst % var_avr_data(i) % &
243 & a_dataavr(var_avr_data_work(i) % length))
244 hst % var_avr_data(i) % a_DataAvr = var_avr_data_work(i) % a_DataAvr
245 deallocate( var_avr_data_work(i) % a_DataAvr )
246 end do
247 deallocate( var_avr_data_work )
248 var_avr_firstput_work => hst % var_avr_firstput
249 nullify( hst % var_avr_firstput )
250 allocate( hst % var_avr_firstput(nvars + 1) )
251 hst % var_avr_firstput(1:nvars) = var_avr_firstput_work(1:nvars)
252 deallocate( var_avr_firstput_work )
253 var_avr_coefsum_work => hst % var_avr_coefsum
254 nullify( hst % var_avr_coefsum )
255 allocate( hst % var_avr_coefsum(nvars + 1) )
256 hst % var_avr_coefsum(1:nvars) = var_avr_coefsum_work(1:nvars)
257 deallocate( var_avr_coefsum_work )
258 var_avr_baseint_work => hst % var_avr_baseint
259 nullify( hst % var_avr_baseint )
260 allocate( hst % var_avr_baseint(nvars + 1) )
261 hst % var_avr_baseint(1:nvars) = var_avr_baseint_work(1:nvars)
262 deallocate( var_avr_baseint_work )
263 var_avr_prevtime_work => hst % var_avr_prevtime
264 nullify( hst % var_avr_prevtime )
265 allocate( hst % var_avr_prevtime(nvars + 1) )
266 hst % var_avr_prevtime(1:nvars) = var_avr_prevtime_work(1:nvars)
267 deallocate( var_avr_prevtime_work )
268 else
269
270
271
272 allocate(hst % vars(1), hst % count(2), hst % growable_indices(1))
273 hst % count(2) = 0
274 allocate(hst % var_avr_count(1), hst % var_avr_data(1))
275 allocate(hst % var_avr_firstput(1), hst % var_avr_coefsum(1))
276 allocate(hst % var_avr_baseint(1), hst % var_avr_prevtime(1))
277 endif
278 nvars = size(hst % vars(:))
279 hst % growable_indices(nvars) = 0
280 if ( nvars < 2 ) then
281 hst % count(nvars) = 0
282 else
283 hst % count(nvars) = hst % count(1)
284 end if
285
286
287 if (size(dims) == 1 .and. trim(dims(1)) == '') then
288 numdims = 0
289 else
290 numdims = size(dims)
291 end if
292 allocate( dimvars(numdims) )
293 allocate( dimord(numdims) )
294
295
296 do, i = 1, numdims
297
298
299
301 & ord = dimord(i) )
302 if (dimord(i) == 0) then
303 stat = nf90_ebaddim
304 cause_c =
cprintf(
'"%c" dimension is not found.', c1=trim(dims(i)))
305 goto 999
306 end if
307 end do
308
309
310 do, i = 1, numdims
311
312
313
314 if (dimord(i) == hst % unlimited_index) then
315 hst % growable_indices(nvars) = i
316 endif
317 enddo
318
319
320 call inquire(hst % dimvars(1), url=url)
322 call create(hst % vars(nvars), trim(fullname), dimvars, xtype=xtype)
323 if ( associated(dimvars) ) deallocate( dimvars )
324
325
326 if (hst % growable_indices(nvars) /= 0) then
327 call slice(hst % vars(nvars), hst % growable_indices(nvars), &
328 & start=1, count=1, stride=1)
329 endif
330 call put_attr(hst % vars(nvars),
'long_name', longname)
331 call put_attr(hst % vars(nvars),
'units', units)
332
333
336 hst % var_avr_count(nvars) = 0
337
338
339
341 & var = hst % dimvars( hst % unlimited_index ), &
342 & name = time_name, url = time_url, &
343 & xtype = time_xtype )
344
345
346 call inquire(hst % vars(nvars),
size = var_avr_length )
347
348
349 hst % var_avr_data(nvars) % length = var_avr_length
350 allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
351 hst % var_avr_data(nvars) % a_DataAvr = 0.0_dp
352
353
354 hst % var_avr_firstput = .true.
355 hst % var_avr_coefsum(nvars) = 0.0_dp
356 hst % var_avr_baseint(nvars) = 0.0_dp
357
358
359
360 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
361
362
363 if ( hst % growable_indices(nvars) < 1 ) then
365 cause_c = trim(varname)
366 goto 999
367 end if
368
369
370 call put_attr( var = hst % dimvars( hst % unlimited_index ), &
371 & name = 'bounds', &
372 & value = trim(time_name) // bnds_suffix )
373
374
375 call put_attr( var = hst % vars(nvars), &
376 & name = 'cell_methods', &
377 & value = trim(time_name) // ': mean' )
378
379
380 dimvars_size = size( hst % dimvars )
381 nv_exist = .false.
382 do i = 1, dimvars_size
384 & var = hst % dimvars(i), &
385 & name = nv_name_check )
386 if ( trim(time_name) // trim(nv_suffix) == trim(nv_name_check) ) then
387 nv_exist = .true.
388 exit
389 end if
390 end do
391 if ( .not. nv_exist ) then
392 dimvars_work => hst % dimvars
393 dim_value_written_work => hst % dim_value_written
394 nullify(hst % dimvars, hst % dim_value_written)
395 allocate(hst % dimvars(dimvars_size + 1))
396 allocate(hst % dim_value_written(dimvars_size + 1))
397 hst % dimvars(1:dimvars_size) = dimvars_work(1:dimvars_size)
398 hst % dim_value_written(1:dimvars_size) = dim_value_written_work(1:dimvars_size)
399 deallocate(dimvars_work)
400 deallocate(dim_value_written_work)
402 & var = hst % dimvars(dimvars_size + 1), &
403 & url = trim(time_url) // trim(nv_suffix), &
404 & length = 2, xtype = 'integer' )
405 hst % time_nv_index = dimvars_size + 1
406 call put_attr( var = hst % dimvars(dimvars_size + 1), &
407 & name = 'long_name', &
408 & value = 'number of vertices of time')
409 call put_attr( var = hst % dimvars(dimvars_size + 1), &
410 & name = 'units', value = '1' )
411 call put( var = hst % dimvars(dimvars_size + 1), &
412 & value = (/1, 2/) )
413 hst % dim_value_written(dimvars_size + 1) = .true.
414 end if
415
416
417 bnds_exist = .false.
418 do i = 1, nvars
420 & var = hst % vars(i), &
421 & name = bnds_name_check )
422 if ( trim(time_name) // trim(bnds_suffix) == trim(bnds_name_check) ) then
423 bnds_exist = .true.
424 exit
425 end if
426 end do
427 if ( associated(dimord) ) deallocate( dimord )
428 if ( .not. bnds_exist ) then
430 & history = hst, &
431 & varname = trim(time_name) // trim(bnds_suffix), &
432 & dims =
stoa( trim(time_name) // trim(nv_suffix), &
433 & trim(time_name) ), &
434 & longname = 'bounds of time', &
435 & units = hst % unlimited_units, &
436 & xtype = time_xtype )
437 end if
438
439
440 else
441 hst % var_avr_count(nvars) = -1
442
443
444 var_avr_length = 1
445 hst % var_avr_data(nvars) % length = var_avr_length
446 allocate(hst % var_avr_data(nvars) % a_DataAvr(var_avr_length))
447 hst % var_avr_data(nvars) % a_DataAvr = 0.0_dp
448
449
450 hst % var_avr_firstput = .true.
451 hst % var_avr_coefsum(nvars) = 0.0_dp
452 hst % var_avr_baseint(nvars) = 0.0_dp
453
454
455
456 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
457 end if
458
459
460
461999 continue
462 if ( associated(dimvars) ) deallocate( dimvars )
463 if ( associated(dimord) ) deallocate( dimord )
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_enotinit
-400 以下: dc ユーティリティのエラー
integer, parameter, public dc_noerr
エラー等を保持
integer, parameter, public hst_enodependtime
integer, parameter, public hst_empinoaxisdata
logical function, public present_and_true(arg)
character(string) function, public joinchar(carray, expr)
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 string
文字列を保持する 文字型変数の種別型パラメタ
integer, parameter, public dp
倍精度実数型変数
character, parameter, public gt_atmark
type(gt_history), target, save, public default