14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
32 & nf90_einval, nf90_enotvar
34 use dc_trace, only: beginsub, endsub, dbgmessage
35 implicit none
36 type(GT_VARIABLE), intent(in out):: var
37 integer, intent(in), optional:: dimord
38 logical, intent(out), optional:: err
39 integer, intent(out), optional:: stat
40 type(gt_dimmap), allocatable:: map(:)
41 integer:: mystat, vid, id, nd, idim_lo, idim_hi, ilast
42continue
43 call beginsub('gtvarslicenext')
44 if (present(dimord)) call dbgmessage('dimord=%d', i=(/dimord/))
45
47 if (vid < 0) then
48 mystat = nf90_enotvar
49 goto 999
50 endif
51 if (nd <= 0) then
52 call dbgmessage('dimension map not associated')
54 goto 999
55 endif
56 allocate(map(nd))
58
59 if (present(dimord)) then
60 if (dimord < 0 .or. dimord <= size(map)) then
61 call dbgmessage('dimord=%d is out of 1..%d', i=(/dimord, size(map)/))
62 mystat = nf90_einval
63 goto 995
64 endif
65 idim_lo = dimord
66 idim_hi = dimord
67 else
68 idim_lo = 1
69 idim_hi = size(map)
70 endif
71 call dbgmessage('idim scan range=(%d:%d)', i=(/idim_lo, idim_hi/))
72
74 do, id = idim_lo, idim_hi
75 ilast = map(id)%start + (map(id)%count * 2 - 1) * map(id)%stride
76 call dbgmessage('last_index=%d allcount=%d', &
77 & i=(/ilast, map(id)%allcount/))
78 if (ilast >= 1 .and. ilast <= map(id)%allcount) then
79 map(id)%start = map(id)%start + map(id)%count * map(id)%stride
81 exit
82 endif
83 enddo
86
87995 continue
88 deallocate(map)
89
90999 continue
91 if (present(stat)) then
92 stat = mystat
93 if (
present(err)) err = (mystat /=
dc_noerr)
94 else
96 endif
97 call endsub('gtvarslicenext', 'stat=%d', i=(/mystat/))
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public gt_efake
integer, parameter, public dc_noerr
integer, parameter, public gt_enomoredims
subroutine, public map_lookup(var, vid, map, ndims)
subroutine map_set(var, map, stat)