13 subroutine gtvarslice(var, dimord, start, count, stride)
32 use dc_trace
, only: beginsub, endsub, dbgmessage
34 type(gt_variable),
intent(in):: var
35 integer,
intent(in):: dimord
36 integer,
intent(in),
optional:: start
37 integer,
intent(in),
optional:: count
38 integer,
intent(in),
optional:: stride
40 integer:: vid, maxindex, maxcount, nd, stat
41 logical:: growable_dimension
43 call beginsub(
'GTVarSlice',
'var%%mapid=%d dimord=%d', &
44 & i=(/var%mapid, dimord/))
54 growable_dimension = .false.
61 if (dimord <= 0 .or. dimord >
size(map))
goto 998
63 call dbgmessage(
'map(dimord): originally start=%d count=%d stride=%d', &
64 & i=(/map(dimord)%start, map(dimord)%count, map(dimord)%stride/))
65 if (.not. growable_dimension)
then 66 maxindex = map(dimord)%allcount
67 call dbgmessage(
'maxindex=%d', i=(/maxindex/))
70 if (
present(start))
then 72 map(dimord)%start = max(1, maxindex + 1 + start)
73 else if (growable_dimension)
then 74 map(dimord)%start = max(1, start)
76 map(dimord)%start = min(maxindex, max(1, start))
78 call dbgmessage(
'start=%d (%d specified)', i=(/map(dimord)%start, start/))
81 if (
present(stride))
then 82 map(dimord)%stride = stride
83 if (stride == 0) map(dimord)%stride = 1
84 call dbgmessage(
'stride=%d (%d specified)', &
85 & i=(/map(dimord)%stride, stride/))
88 if (
present(count))
then 89 map(dimord)%count = abs(count)
90 if (count == 0) map(dimord)%count = 1
91 call dbgmessage(
'count=%d (%d specified)', &
92 & i=(/map(dimord)%count, count/))
95 if (.not. growable_dimension)
then 96 maxcount = 1 + (maxindex - map(dimord)%start) / map(dimord)%stride
97 map(dimord)%count = max(1, min(maxcount, map(dimord)%count))
98 call dbgmessage(
'count=%d ', i=(/map(dimord)%count/))
101 if (stat /= 0)
goto 998
103 call endsub(
'GTVarSlice')
110 call endsub(
'GTVarSlice',
'err skipped')
155 use gtdata_generic
, only: slice
156 use dc_trace
, only: beginsub, endsub
159 type(gt_variable),
intent(inout) :: var
160 character(len = *),
intent(in) :: string
161 logical,
intent(out) :: err
164 call beginsub(
'GTVarSliceC',
'var=%d lim=<%c>', &
165 & i=(/var%mapid/), c1=trim(string))
174 if (is > len(string))
exit 178 call endsub(
'GTVarSliceC')
184 use dc_string
, only: strieq, stoi
185 use gtdata_generic
, only: del_dim, dimname_to_dimord
186 character(len = *),
intent(in):: string
187 integer:: equal, dimord
188 integer:: start, count, stride
191 if (string ==
'')
return 193 if (strieq(string(1:4),
"IGN:"))
then 199 start = stoi(string(equal+1: ), default=1)
201 dimord = dimname_to_dimord(var, string(5: equal-1))
202 call slice(var, dimord, start, 1, 1)
203 call del_dim(var, dimord, myerr)
210 if (equal == 0)
return 211 dimord = dimname_to_dimord(var, string(1: equal-1))
212 if (dimord <= 0)
return 214 call region_spec(dimord, string(equal+1: ), start, count, stride)
215 call slice(var, dimord, start, count, stride)
221 subroutine region_spec(dimord, string, start, count, stride)
223 use dc_string
, only: index_ofs, stoi
226 integer,
intent(in):: dimord
227 integer,
intent(out):: start, count, stride
228 character(len = *),
intent(in):: string
229 integer:: colon, prev_colon, finish, dimlo, dimhi
230 character(len = token):: val(3)
239 val(1) = string(1: colon - 1)
241 colon = index_ofs(string, colon + 1,
gt_colon)
243 val(2) = string(prev_colon + 1: colon - 1)
244 val(3) = string(colon + 1: )
246 val(2) = string(prev_colon + 1: )
250 if (val(3) ==
"") val(3) =
"^1" 253 start = stoi(val(1)(2: ))
254 else if (val(1) == val(2))
then 259 if (val(2) == val(1))
then 262 finish = stoi(val(2)(2: ))
267 call dimrange(var, dimord, dimlo, dimhi)
268 start = min(max(dimlo, start), dimhi)
269 finish = min(max(dimlo, finish), dimhi)
270 count = abs(finish - start) + 1
273 stride = stoi(val(3)(2: ))
275 stride = stoi(val(3))
277 stride = sign(stride, finish - start)
295 use gtdata_generic
, only: get, open, close
296 use dc_string
, only: stod
297 use dc_trace
, only: beginsub, endsub, dbgmessage
298 integer,
intent(in):: dimord
299 character(len = *),
intent(in):: value
300 type(gt_variable):: axisvar
301 real,
pointer:: axisval(:)
305 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
306 & i=(/var%mapid, dimord/), c1=trim(
value))
308 call open(axisvar, var, dimord, count_compact=.true.)
309 call get(axisvar, axisval)
311 if (.not.
associated(axisval))
then 314 else if (
size(axisval) < 2)
then 324 do, i = 1,
size(axisval) - 1
325 if (axisval(i + 1) == axisval(i))
then 326 result =
real(i) + 0.5
329 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
330 if (result <= (i + 1))
goto 900
334 call endsub(
'value_to_index',
'value(%c) =~ index(%r)', &
335 & c1=trim(
value), r=(/result/))
character, parameter, public gt_comma
subroutine gtvar_dump(var)
integer, parameter, public token
Character length for word, token.
character, parameter, public gt_equal
subroutine limit_one(string)
subroutine gtvarslicec(var, string, err)
subroutine map_set(var, map, stat)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
subroutine gtvarslice(var, dimord, start, count, stride)
character, parameter, public gt_circumflex
character, parameter, public gt_colon
Provides kind type parameter values.
subroutine region_spec(dimord, string, start, count, stride)
subroutine, public map_lookup(var, vid, map, ndims)
real function value_to_index(dimord, value)
subroutine, public query_growable(vid, result)