35 character(len=STRING):: url
69 integer,
parameter:: maptab_init_size = 16
74 private:: maptab, maptab_init_size
85 use gtdata_generic
, only: open, close
87 type(gt_variable),
intent(in):: var
88 integer,
intent(in):: dimno
89 integer,
intent(out):: dimlo, dimhi
90 type(gt_variable):: dimvar
92 call open(dimvar, var, dimno, count_compact=.true.)
98 subroutine map_dup(var, source_var)
102 use dc_trace
, only: dbgmessage
103 type(gt_variable),
intent(out):: var
104 type(gt_variable),
intent(in):: source_var
105 integer:: vid, mid1, mid2, vid2, nd,
class, cid
108 var = gt_variable(-1)
118 mid1 = source_var%mapid
120 maptab(mid2)%ndims = maptab(mid1)%ndims
121 if (
associated(maptab(mid1)%map))
then 122 nd =
size(maptab(mid1)%map)
123 allocate(maptab(mid2)%map(nd))
124 maptab(mid2)%map(1:nd) = maptab(mid1)%map(1:nd)
126 nullify(maptab(mid2)%map)
128 call dbgmessage(
'map_dup mapid(%d from %d) vid(%d from %d)', &
129 & i=(/mid2, mid1, maptab(mid2)%vid, maptab(mid1)%vid/))
132 subroutine map_create(var, class, cid, ndims, allcount, stat)
139 type(gt_variable),
intent(out):: var
140 integer,
intent(in)::
class, cid, ndims, allcount(:)
141 integer,
intent(out):: stat
147 if ( ndims < 0 )
then 155 maptab(var%mapid)%ndims = ndims
156 maptab(var%mapid)%map => map
160 map(i)%allcount = allcount(i)
161 map(i)%count = allcount(i)
166 map(i)%scalar = .false.
171 maptab(var%mapid)%ndims = 0
172 maptab(var%mapid)%map => map
180 map(1)%scalar = .true.
190 integer,
intent(out):: mapid
191 integer,
intent(in):: vid
195 if (.not.
allocated(maptab))
then 196 allocate(maptab(maptab_init_size))
198 do, n = 1, maptab_init_size
199 nullify(maptab(n)%map)
203 do, i = 1,
size(maptab)
206 maptab(mapid)%vid = vid
212 allocate(tmp_maptab(n))
213 tmp_maptab(:) = maptab(:)
215 allocate(maptab(n * 2))
217 maptab(1:n) = tmp_maptab(1:n)
218 do, i = n + 1, (2 *
size(tmp_maptab))
220 nullify(maptab(i)%map)
222 deallocate(tmp_maptab)
224 maptab(mapid)%vid = vid
232 use dc_trace
, only: dbgmessage
234 type(gt_variable),
intent(in):: var
235 logical,
intent(out),
optional:: err
238 if (.not.
allocated(maptab))
goto 999
239 if (mapid <= 0 .or. mapid >
size(maptab))
goto 999
242 if (
associated(maptab(mapid)%map))
deallocate(maptab(mapid)%map)
244 call dbgmessage(
'gtdata_internal_map table %d deleted', i=(/mapid/))
247 call storeerror(nf90_enotvar,
'maptabdelete', err)
253 type(gt_variable),
intent(in):: var
254 integer,
intent(out),
optional:: vid
255 type(
gt_dimmap),
intent(out),
optional:: map(:)
256 integer,
intent(out),
optional:: ndims
257 if (.not.
allocated(maptab))
goto 999
258 if (var%mapid <= 0 .or. var%mapid >
size(maptab))
goto 999
260 if (
present(vid)) vid = maptab(var%mapid)%vid
261 if (
present(map)) map(:) = maptab(var%mapid)%map(1:
size(map))
262 if (
present(ndims)) ndims = maptab(var%mapid)%ndims
266 if (
present(map))
then 270 if (
present(ndims)) ndims = 0
273 subroutine map_set(var, map, stat)
277 type(gt_variable),
intent(in):: var
279 integer,
intent(out):: stat
280 if (.not.
allocated(maptab))
goto 999
281 if (var%mapid <= 0 .or. var%mapid >
size(maptab))
goto 999
283 if (
size(map) >
size(maptab(var%mapid)%map))
then 287 maptab(var%mapid)%map(1:
size(map)) = map(:)
299 type(gt_variable),
intent(in):: var
300 integer,
intent(out),
optional::
class, cid
311 type(gt_variable),
intent(in):: var
312 integer,
intent(in):: ndims
313 integer,
intent(out):: stat
316 if (vid == vid_invalid)
then 320 if (.not.
associated(maptab(var%mapid)%map))
then 323 maptab(var%mapid)%ndims = 0
328 if (ndims >
size(maptab(var%mapid)%map))
then 332 maptab(var%mapid)%ndims = ndims
343 type(gt_variable),
intent(in):: var
344 integer,
intent(in):: rank
345 integer,
intent(out):: stat
350 if (vid == vid_invalid)
then 354 if (ndims < rank)
then 358 tmpmap => maptab(var%mapid)%map
359 do, nd = ndims, 1, -1
360 if (count(tmpmap(1:ndims)%count > 1) <= rank)
exit 372 type(gt_variable),
intent(in):: var
373 integer,
pointer:: specs(:, :)
374 integer,
intent(out),
optional:: ndims
376 integer:: vid, i, j, imap, internal_ndims
377 integer:: external_ndims
379 call map_lookup(var, vid, ndims=external_ndims)
380 internal_ndims = num_dimensions(vid)
381 if (
present(ndims)) ndims = internal_ndims
382 allocate(specs(max(1, internal_ndims), 4))
388 do, i = 1,
size(maptab(var%mapid)%map)
389 it => maptab(var%mapid)%map(i)
391 if (j > 0 .and. j <= internal_ndims)
then 392 specs(j, 1) = it%start + it%offset
393 specs(j, 2) = it%count
394 if (i > external_ndims) specs(j, 2) = 1
395 specs(j, 3) = it%stride * it%step
398 imap = imap * it%count
405 integer,
intent(in):: ndims
410 allocate(map(1:ndims))
411 map(1:ndims)%dimno = -1
412 map(1:ndims)%url =
' ' 413 map(1:ndims)%allcount = 0
414 map(1:ndims)%offset = 0
415 map(1:ndims)%step = 1
416 map(1:ndims)%start = 1
417 map(1:ndims)%count = 0
418 map(1:ndims)%stride = 1
419 map(1:ndims)%scalar = .false.
425 type(gt_variable),
intent(inout):: var
427 type(
gt_dimmap),
pointer:: tmpmap(:), varmap
432 tmpmap(i)%allcount = map(i)%allcount
433 tmpmap(i)%count = map(i)%count
434 if (map(i)%dimno > 0)
then 435 varmap => maptab(var%mapid)%map(map(i)%dimno)
436 tmpmap(i)%url = varmap%url
437 tmpmap(i)%dimno = varmap%dimno
438 tmpmap(i)%offset = varmap%offset + map(i)%offset
439 tmpmap(i)%step = varmap%step * map(i)%step
441 tmpmap(i)%url = map(i)%url
443 tmpmap(i)%offset = map(i)%offset
444 tmpmap(i)%step = map(i)%step
454 type(gt_variable),
intent(in):: var
455 integer,
intent(in):: ndims
459 if (
associated(maptab(var%mapid)%map))
then 460 tmpmap => maptab(var%mapid)%map
462 n = min(
size(tmpmap), ndims)
463 newmap(1:n) = tmpmap(1:n)
465 maptab(var%mapid)%map => newmap
466 newmap(n+1:ndims)%dimno = -1
467 newmap(n+1:ndims)%url =
' ' 468 newmap(n+1:ndims)%allcount = 0
469 newmap(n+1:ndims)%offset = 0
470 newmap(n+1:ndims)%step = 1
471 newmap(n+1:ndims)%start = 1
472 newmap(n+1:ndims)%count = 0
473 newmap(n+1:ndims)%stride = 1
484 use dc_trace
, only: debug, dbgmessage
485 type(gt_variable),
intent(in):: var
489 call debug( dbg_mode )
490 if (.not. dbg_mode)
return 492 if (imap < 1 .or. imap >
size(maptab))
then 493 call dbgmessage(
'[gt_variable %d: invalid id]', i=(/imap/))
496 if (
associated(maptab(imap)%map))
then 497 call dbgmessage(
'[gt_variable %d: ndims=%d, map.size=%d]', &
498 & i=(/imap, maptab(imap)%ndims,
size(maptab(imap)%map)/))
499 do, idim = 1,
size(maptab(imap)%map)
500 call dbgmessage(
'[dim%d dimno=%d ofs=%d step=%d' &
501 &//
' all=%d start=%d count=%d stride=%d url=%c]', &
502 & c1=trim(maptab(imap)%map(idim)%url), &
503 & i=(/idim, maptab(imap)%map(idim)%dimno, &
504 & maptab(imap)%map(idim)%offset, &
505 & maptab(imap)%map(idim)%step, &
506 & maptab(imap)%map(idim)%allcount, &
507 & maptab(imap)%map(idim)%start, &
508 & maptab(imap)%map(idim)%count, &
509 & maptab(imap)%map(idim)%stride/))
512 call dbgmessage(
'[gt_variable %d: ndims=%d, map=null]', &
513 & i=(/imap, maptab(imap)%ndims/))
521 use dc_trace
, only: dbgmessage
522 integer,
intent(in):: dimord
527 do, id = 1,
size(map)
528 if (map(id)%count < 2) cycle
530 if (nd < dimord) cycle
532 call dbgmessage(
'compact dim skip: %d <= %d', i=(/result, dimord/))
subroutine map_apply(var, map)
subroutine, public map_to_internal_specs(var, specs, ndims)
subroutine gtvar_dump(var)
subroutine dimrange_by_dimno(var, dimno, dimlo, dimhi)
subroutine, public vartable_dump(vid)
integer, parameter, public vtb_class_netcdf
integer, parameter, public vid_invalid
subroutine map_dup(var, source_var)
subroutine, public maptabdelete(var, err)
integer function dimord_skip_compact(dimord, map)
subroutine, public map_create(var, class, cid, ndims, allcount, stat)
subroutine map_set(var, map, stat)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
subroutine map_set_ndims(var, ndims, stat)
integer, parameter, public dc_noerr
integer function, public ndims(vid)
subroutine map_set_rank(var, rank, stat)
integer, parameter, public vtb_class_unused
subroutine, public vartablelookup(vid, class, cid)
Provides kind type parameter values.
subroutine, public maptabadd(mapid, vid)
subroutine, public map_lookup(var, vid, map, ndims)
subroutine, public vartableadd(vid, class, cid)
integer, parameter, public gt_enomoredims
subroutine map_allocate(map, ndims)
subroutine, public var_class(var, class, cid)
subroutine map_resize(var, ndims)
integer, parameter, public string
Character length for string.