71 & varname, dims, longname, units, &
72 & xtype, time_average, average, history, err )
82 use netcdf,
only: nf90_ebaddim
88 use dc_date,
only: dcdifftimecreate
94 character(len = *),
intent(in):: varname
99 character(len = *),
intent(in):: dims(:)
114 character(len = *),
intent(in):: longname
119 character(len = *),
intent(in):: units
124 character(len = *),
intent(in),
optional:: xtype
135 logical,
intent(in),
optional:: time_average
144 logical,
intent(in),
optional:: average
147 type(
gt_history),
intent(inout),
optional,
target:: history
155 logical,
intent(out),
optional:: err
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
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()
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"
194 call beginsub(subname,
'name=<%a>, dims=<%a>, longname=<%a>, units=<%a>', &
200 if (
present(history))
then
208 if ( .not. hst % initialized )
then
210 cause_c =
'GT_HISTORY'
215 if (
associated(hst % vars))
then
216 nvars =
size(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)
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))
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 )
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 )
272 allocate(hst % vars(1), hst % count(2), hst % growable_indices(1))
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))
278 nvars =
size(hst % vars(:))
279 hst % growable_indices(nvars) = 0
280 if ( nvars < 2 )
then
281 hst % count(nvars) = 0
283 hst % count(nvars) = hst % count(1)
287 if (
size(dims) == 1 .and. trim(dims(1)) ==
'')
then
292 allocate( dimvars(numdims) )
293 allocate( dimord(numdims) )
302 if (dimord(i) == 0)
then
304 cause_c =
cprintf(
'"%c" dimension is not found.', c1=trim(dims(i)))
314 if (dimord(i) == hst % unlimited_index)
then
315 hst % growable_indices(nvars) = i
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 )
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)
330 call put_attr(hst % vars(nvars),
'long_name', longname)
331 call put_attr(hst % vars(nvars),
'units', units)
336 hst % var_avr_count(nvars) = 0
341 & var = hst % dimvars( hst % unlimited_index ), &
342 & name = time_name, url = time_url, &
343 & xtype = time_xtype )
346 call inquire(hst % vars(nvars),
size = var_avr_length )
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
354 hst % var_avr_firstput = .true.
355 hst % var_avr_coefsum(nvars) = 0.0_dp
356 hst % var_avr_baseint(nvars) = 0.0_dp
360 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
363 if ( hst % growable_indices(nvars) < 1 )
then
365 cause_c = trim(varname)
370 call put_attr( var = hst % dimvars( hst % unlimited_index ), &
372 &
value = trim(time_name) // bnds_suffix )
375 call put_attr( var = hst % vars(nvars), &
376 & name =
'cell_methods', &
377 &
value = trim(time_name) //
': mean' )
380 dimvars_size =
size( hst % dimvars )
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
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), &
413 hst % dim_value_written(dimvars_size + 1) = .true.
420 & var = hst % vars(i), &
421 & name = bnds_name_check )
422 if ( trim(time_name) // trim(bnds_suffix) == trim(bnds_name_check) )
then
427 if (
associated(dimord) )
deallocate( dimord )
428 if ( .not. bnds_exist )
then
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 )
441 hst % var_avr_count(nvars) = -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
450 hst % var_avr_firstput = .true.
451 hst % var_avr_coefsum(nvars) = 0.0_dp
452 hst % var_avr_baseint(nvars) = 0.0_dp
456 hst % var_avr_prevtime(nvars) = hst % var_avr_baseint(nvars)
462 if (
associated(dimvars) )
deallocate( dimvars )
463 if (
associated(dimord) )
deallocate( dimord )