41 use dc_trace
, only: beginsub, endsub, dbgmessage
43 type(gt_variable),
intent(inout):: var
44 integer,
intent(in) :: dimord
45 integer,
intent(in) ,
optional :: start, count, stride
46 logical,
intent(out),
optional :: err
48 integer:: iolo, iohi, uilo, uihi, lowerlim, upperlim, dimlo, dimhi
52 call beginsub(
'GTVarLimit_iiii', &
53 &
'var%d-dim%d start=%d count=%d stride=%d', &
54 & i=(/var%mapid, dimord, start, count, stride/))
57 print *,
"dimord =", dimord,
" < 1" 61 print *,
"stride == 0" 66 print *,
"ndims =", ndims,
" <= 0" 69 if (dimord > ndims)
then 70 print *,
"dimrod =", dimord,
" > ndims =", ndims
73 if (
allocated(map))
then 79 lowerlim = min(start, start + (count - 1) * stride)
80 upperlim = max(start, start + (count - 1) * stride)
81 call dimrange(var, dimord, dimlo, dimhi)
82 if (lowerlim < dimlo)
then 83 print *,
"lowerlim = ", lowerlim,
" < dimlo =", dimlo
86 if (upperlim > dimhi)
then 87 print *,
"upperlim = ", upperlim,
" < dimhi =", dimhi
91 call dbgmessage(
'@ lowerlim=%d upperlim=%d', i=(/lowerlim, upperlim/))
94 uilo = map(dimord)%start
95 iolo = 1 + map(dimord)%step * (uilo - 1) + map(dimord)%offset
96 uihi = map(dimord)%start + (map(dimord)%count - 1) * map(dimord)%stride
97 iohi = 1 + map(dimord)%step * (uihi - 1) + map(dimord)%offset
99 call dbgmessage(
'@ userindex=%d %d, internal=%d %d', &
100 & i=(/uilo, uihi, iolo, iohi/))
101 call dbgmessage(
'@ DbgMessage offset %d -> %d step=%d', &
102 & i=(/map(dimord)%offset, (start-1), stride/))
105 map(dimord)%offset = start - 1
106 map(dimord)%allcount = count
107 map(dimord)%step = stride
110 uilo = 1 + (iolo - 1 - map(dimord)%offset) / map(dimord)%step
111 uihi = 1 + (iohi - 1 - map(dimord)%offset) / map(dimord)%step
112 call dbgmessage(
'@ userindex=%d %d', i=(/uilo, uihi/))
115 uilo = max(1, min(map(dimord)%allcount, uilo))
116 uihi = max(1, min(map(dimord)%allcount, uihi))
118 call dbgmessage(
'@ userindex=%d %d orig_stride=%d', &
119 & i=(/uilo, uihi, map(dimord)%stride/))
122 map(dimord)%stride = max(1, abs(map(dimord)%stride))
123 map(dimord)%start = min(uilo, uihi)
124 map(dimord)%count = 1 + abs(uihi - uilo) / map(dimord)%stride
127 if (stat /= 0)
call dbgmessage(
"map_set fail")
131 call endsub(
'GTVarLimit_iiii')
175 use dc_trace
, only: beginsub, endsub
178 type(gt_variable),
intent(inout):: var
179 character(len = *),
intent(in) :: string
180 logical,
intent(out),
optional :: err
183 call beginsub(
'GTVarLimit',
'var=%d lim=<%c>', i=(/var%mapid/), c1=trim(string))
192 if (is > len(string))
exit 195 if (
present(err)) err = .false.
196 call endsub(
'GTVarLimit')
202 use dc_string
, only: strieq, stoi
203 use gtdata_generic
, only: del_dim, dimname_to_dimord
204 use gtdata_generic
, only: del_dim, dimname_to_dimord, limit
205 character(len = *),
intent(in):: string
206 integer:: equal, dimord
207 integer:: start, count, stride, strhead
210 if (string ==
'')
return 213 if (len(string) < 4) strhead = len(string)
215 if (strieq(string(1:strhead),
"IGN:"))
then 221 start = stoi(string(equal+1: ), default=1)
223 dimord = dimname_to_dimord(var, string(5: equal-1))
224 call limit(var, dimord, start, 1, 1, err)
225 call del_dim(var, dimord, myerr)
233 if (equal == 0)
return 234 dimord = dimname_to_dimord(var, string(1: equal-1))
235 if (dimord <= 0)
return 237 call region_spec(dimord, string(equal+1: ), start, count, stride)
238 call limit(var, dimord, start, count, stride, err)
244 subroutine region_spec(dimord, string, start, count, stride)
246 use dc_string
, only: index_ofs, stoi
249 integer,
intent(in):: dimord
250 integer,
intent(out):: start, count, stride
251 character(len = *),
intent(in):: string
252 integer:: colon, prev_colon, finish, dimlo, dimhi
253 character(len = token):: val(3)
262 val(1) = string(1: colon - 1)
264 colon = index_ofs(string, colon + 1,
gt_colon)
266 val(2) = string(prev_colon + 1: colon - 1)
267 val(3) = string(colon + 1: )
269 val(2) = string(prev_colon + 1: )
273 if (val(3) ==
"") val(3) =
"^1" 276 start = stoi(val(1)(2: ))
277 else if (val(1) == val(2))
then 282 if (val(2) == val(1))
then 285 finish = stoi(val(2)(2: ))
290 call dimrange(var, dimord, dimlo, dimhi)
291 start = min(max(dimlo, start), dimhi)
292 finish = min(max(dimlo, finish), dimhi)
293 count = abs(finish - start) + 1
296 stride = stoi(val(3)(2: ))
298 stride = stoi(val(3))
300 stride = sign(stride, finish - start)
319 use dc_string
, only: stod
320 use dc_trace
, only: beginsub, endsub, dbgmessage
321 integer,
intent(in):: dimord
322 character(len = *),
intent(in):: value
323 type(gt_variable):: axisvar
324 real,
pointer:: axisval(:) => null()
329 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
330 & i=(/var%mapid, dimord/), c1=trim(
value))
332 call open(axisvar, var, dimord, count_compact=.true.)
334 call get(axisvar, axisval)
336 if (.not.
associated(axisval))
then 339 else if (
size(axisval) < 2)
then 349 do, i = 1,
size(axisval) - 1
350 if (axisval(i + 1) == axisval(i))
then 351 result =
real(i) + 0.5
354 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
355 if (result <= (i + 1))
goto 900
359 call endsub(
'value_to_index',
'(%c) = %r', &
360 & c1=trim(
value), r=(/result/))
character, parameter, public gt_comma
subroutine gtvar_dump(var)
subroutine gtvarlimit_iiii(var, dimord, start, count, stride, err)
integer, parameter, public token
Character length for word, token.
character, parameter, public gt_equal
subroutine limit_one(string)
subroutine map_set(var, map, stat)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
integer, parameter, public dc_noerr
subroutine gtvarlimit(var, string, err)
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)