79 character(len=STRING):: url
125 integer,
parameter:: maptab_init_size = 16
130 private:: maptab, maptab_init_size
160 integer,
intent(in):: dimno
161 integer,
intent(out):: dimlo, dimhi
164 call open(dimvar, var, dimno, count_compact=.true., &
165 & inherit_slice=.false.)
190 integer:: vid, mid1, mid2, vid2, nd,
class, cid
203 mid1 = source_var%mapid
205 maptab(mid2)%ndims = maptab(mid1)%ndims
206 if (
associated(maptab(mid1)%map))
then
207 nd =
size(maptab(mid1)%map)
208 allocate(maptab(mid2)%map(nd))
209 maptab(mid2)%map(1:nd) = maptab(mid1)%map(1:nd)
211 nullify(maptab(mid2)%map)
213 call dbgmessage(
'map_dup mapid(%d from %d) vid(%d from %d)', &
214 & i=(/mid2, mid1, maptab(mid2)%vid, maptab(mid1)%vid/))
246 subroutine map_create(var, class, cid, ndims, allcount, stat)
251 integer,
intent(in)::
class, cid,
ndims, allcount(:)
252 integer,
intent(out):: stat
258 if (
ndims < 0 )
then
266 maptab(var%mapid)%ndims =
ndims
267 maptab(var%mapid)%map => map
271 map(i)%allcount = allcount(i)
272 map(i)%count = allcount(i)
277 map(i)%scalar = .false.
282 maptab(var%mapid)%ndims = 0
283 maptab(var%mapid)%map => map
291 map(1)%scalar = .true.
318 integer,
intent(out):: mapid
319 integer,
intent(in):: vid
323 if (.not.
allocated(maptab))
then
324 allocate(maptab(maptab_init_size))
325 maptab(:)%vid = vid_invalid
326 do, n = 1, maptab_init_size
327 nullify(maptab(n)%map)
331 do, i = 1,
size(maptab)
332 if (maptab(i)%vid == vid_invalid)
then
334 maptab(mapid)%vid = vid
340 allocate(tmp_maptab(n))
341 tmp_maptab(:) = maptab(:)
343 allocate(maptab(n * 2))
345 maptab(1:n) = tmp_maptab(1:n)
346 do, i = n + 1, (2 *
size(tmp_maptab))
347 maptab(i)%vid = vid_invalid
348 nullify(maptab(i)%map)
350 deallocate(tmp_maptab)
352 maptab(mapid)%vid = vid
380 logical,
intent(out),
optional:: err
383 if (.not.
allocated(maptab))
goto 999
384 if (mapid <= 0 .or. mapid >
size(maptab))
goto 999
385 if (maptab(mapid)%vid == vid_invalid)
goto 999
386 maptab(mapid)%vid = vid_invalid
387 if (
associated(maptab(mapid)%map))
deallocate(maptab(mapid)%map)
389 call dbgmessage(
'gtdata_internal_map table %d deleted', i=(/mapid/))
392 call storeerror(nf90_enotvar,
'maptabdelete', err)
415 integer,
intent(out),
optional:: vid
416 type(
gt_dimmap),
intent(out),
optional:: map(:)
417 integer,
intent(out),
optional:: ndims
418 if (.not.
allocated(maptab))
goto 999
419 if (var%mapid <= 0 .or. var%mapid >
size(maptab))
goto 999
420 if (maptab(var%mapid)%vid == vid_invalid)
goto 999
421 if (
present(vid)) vid = maptab(var%mapid)%vid
422 if (
present(map)) map(:) = maptab(var%mapid)%map(1:
size(map))
423 if (
present(ndims)) ndims = maptab(var%mapid)%ndims
426 if (
present(vid)) vid = vid_invalid
427 if (
present(map))
then
431 if (
present(ndims)) ndims = 0
454 integer,
intent(out):: stat
455 if (.not.
allocated(maptab))
goto 999
456 if (var%mapid <= 0 .or. var%mapid >
size(maptab))
goto 999
457 if (maptab(var%mapid)%vid == vid_invalid)
goto 999
458 if (
size(map) >
size(maptab(var%mapid)%map))
then
462 maptab(var%mapid)%map(1:
size(map)) = map(:)
488 integer,
intent(out),
optional::
class, cid
513 integer,
intent(in):: ndims
514 integer,
intent(out):: stat
517 if (vid == vid_invalid)
then
521 if (.not.
associated(maptab(var%mapid)%map))
then
524 maptab(var%mapid)%ndims = 0
529 if (ndims >
size(maptab(var%mapid)%map))
then
533 maptab(var%mapid)%ndims = ndims
564 integer,
intent(in):: rank
565 integer,
intent(out):: stat
570 if (vid == vid_invalid)
then
574 if (ndims < rank)
then
578 tmpmap => maptab(var%mapid)%map
579 do, nd = ndims, 1, -1
580 if (count(tmpmap(1:ndims)%count > 1) <= rank)
exit
613 integer,
pointer:: specs(:, :)
614 integer,
intent(out),
optional::
ndims
616 integer:: vid, i, j, imap, internal_ndims
617 integer:: external_ndims
620 internal_ndims = num_dimensions(vid)
622 allocate(specs(max(1, internal_ndims), 4))
628 do, i = 1,
size(maptab(var%mapid)%map)
629 it => maptab(var%mapid)%map(i)
631 if (j > 0 .and. j <= internal_ndims)
then
632 specs(j, 1) = it%start + it%offset
633 specs(j, 2) = it%count
634 if (i > external_ndims) specs(j, 2) = 1
635 specs(j, 3) = it%stride * it%step
638 imap = imap * it%count
657 integer,
intent(in):: ndims
662 allocate(map(1:ndims))
663 map(1:ndims)%dimno = -1
664 map(1:ndims)%url =
' '
665 map(1:ndims)%allcount = 0
666 map(1:ndims)%offset = 0
667 map(1:ndims)%step = 1
668 map(1:ndims)%start = 1
669 map(1:ndims)%count = 0
670 map(1:ndims)%stride = 1
671 map(1:ndims)%scalar = .false.
691 type(
gt_dimmap),
pointer:: tmpmap(:), varmap
696 tmpmap(i)%allcount = map(i)%allcount
697 tmpmap(i)%count = map(i)%count
698 if (map(i)%dimno > 0)
then
699 varmap => maptab(var%mapid)%map(map(i)%dimno)
700 tmpmap(i)%url = varmap%url
701 tmpmap(i)%dimno = varmap%dimno
702 tmpmap(i)%offset = varmap%offset + map(i)%offset
703 tmpmap(i)%step = varmap%step * map(i)%step
705 tmpmap(i)%url = map(i)%url
707 tmpmap(i)%offset = map(i)%offset
708 tmpmap(i)%step = map(i)%step
731 integer,
intent(in):: ndims
735 if (
associated(maptab(var%mapid)%map))
then
736 tmpmap => maptab(var%mapid)%map
738 n = min(
size(tmpmap), ndims)
739 newmap(1:n) = tmpmap(1:n)
741 maptab(var%mapid)%map => newmap
742 newmap(n+1:ndims)%dimno = -1
743 newmap(n+1:ndims)%url =
' '
744 newmap(n+1:ndims)%allcount = 0
745 newmap(n+1:ndims)%offset = 0
746 newmap(n+1:ndims)%step = 1
747 newmap(n+1:ndims)%start = 1
748 newmap(n+1:ndims)%count = 0
749 newmap(n+1:ndims)%stride = 1
775 call debug( dbg_mode )
776 if (.not. dbg_mode)
return
778 if (imap < 1 .or. imap >
size(maptab))
then
779 call dbgmessage(
'[gt_variable %d: invalid id]', i=(/imap/))
782 if (
associated(maptab(imap)%map))
then
783 call dbgmessage(
'[gt_variable %d: ndims=%d, map.size=%d]', &
784 & i=(/imap, maptab(imap)%ndims,
size(maptab(imap)%map)/))
785 do, idim = 1,
size(maptab(imap)%map)
786 call dbgmessage(
'[dim%d dimno=%d ofs=%d step=%d' &
787 &//
' all=%d start=%d count=%d stride=%d url=%c]', &
788 & c1=trim(maptab(imap)%map(idim)%url), &
789 & i=(/idim, maptab(imap)%map(idim)%dimno, &
790 & maptab(imap)%map(idim)%offset, &
791 & maptab(imap)%map(idim)%step, &
792 & maptab(imap)%map(idim)%allcount, &
793 & maptab(imap)%map(idim)%start, &
794 & maptab(imap)%map(idim)%count, &
795 & maptab(imap)%map(idim)%stride/))
798 call dbgmessage(
'[gt_variable %d: ndims=%d, map=null]', &
799 & i=(/imap, maptab(imap)%ndims/))
828 integer,
intent(in):: dimord
833 do, id = 1,
size(map)
834 if (map(id)%count < 2) cycle
836 if (nd < dimord) cycle
838 call dbgmessage(
'compact dim skip: %d <= %d', i=(/result, dimord/))
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_noerr
Error storage variables
integer, parameter, public gt_enomoredims
-101 or less: Data structure errors
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
Provides kind type parameter values.
integer, parameter, public string
Character length for string
subroutine, public map_lookup(var, vid, map, ndims)
subroutine map_apply(var, map)
subroutine map_set_ndims(var, ndims, stat)
subroutine map_set(var, map, stat)
subroutine, public map_to_internal_specs(var, specs, ndims)
integer function dimord_skip_compact(dimord, map)
subroutine, public maptabdelete(var, err)
subroutine map_allocate(map, ndims)
subroutine, public var_class(var, class, cid)
subroutine, public maptabadd(mapid, vid)
subroutine dimrange_by_dimno(var, dimno, dimlo, dimhi)
subroutine, public map_create(var, class, cid, ndims, allcount, stat)
subroutine map_dup(var, source_var)
subroutine gtvar_dump(var)
subroutine map_set_rank(var, rank, stat)
subroutine map_resize(var, ndims)
subroutine, public vartablelookup(vid, class, cid)
integer, parameter, public vid_invalid
subroutine, public vartableadd(vid, class, cid)
integer, parameter, public vtb_class_netcdf
subroutine, public vartable_dump(vid)
integer function, public ndims(vid)
integer, parameter, public vtb_class_unused