78 integer,
intent(in) :: dimord
79 integer,
intent(in) ,
optional :: start, count, stride
80 logical,
intent(out),
optional :: err
82 integer:: iolo, iohi, uilo, uihi, lowerlim, upperlim, dimlo, dimhi
87 &
'var%d-dim%d start=%d count=%d stride=%d', &
88 & i=(/var%mapid, dimord, start, count, stride/))
91 print *,
"dimord =", dimord,
" < 1"
95 print *,
"stride == 0"
100 print *,
"ndims =", ndims,
" <= 0"
103 if (dimord > ndims)
then
104 print *,
"dimrod =", dimord,
" > ndims =", ndims
107 if (
allocated(map))
then
113 lowerlim = min(start, start + (count - 1) * stride)
114 upperlim = max(start, start + (count - 1) * stride)
115 call dimrange(var, dimord, dimlo, dimhi)
116 if (lowerlim < dimlo)
then
117 print *,
"lowerlim = ", lowerlim,
" < dimlo =", dimlo
120 if (upperlim > dimhi)
then
121 print *,
"upperlim = ", upperlim,
" < dimhi =", dimhi
125 call dbgmessage(
'@ lowerlim=%d upperlim=%d', i=(/lowerlim, upperlim/))
128 uilo = map(dimord)%start
129 iolo = 1 + map(dimord)%step * (uilo - 1) + map(dimord)%offset
130 uihi = map(dimord)%start + (map(dimord)%count - 1) * map(dimord)%stride
131 iohi = 1 + map(dimord)%step * (uihi - 1) + map(dimord)%offset
133 call dbgmessage(
'@ userindex=%d %d, internal=%d %d', &
134 & i=(/uilo, uihi, iolo, iohi/))
135 call dbgmessage(
'@ DbgMessage offset %d -> %d step=%d', &
136 & i=(/map(dimord)%offset, (start-1), stride/))
139 map(dimord)%offset = start - 1
140 map(dimord)%allcount = count
141 map(dimord)%step = stride
144 uilo = 1 + (iolo - 1 - map(dimord)%offset) / map(dimord)%step
145 uihi = 1 + (iohi - 1 - map(dimord)%offset) / map(dimord)%step
146 call dbgmessage(
'@ userindex=%d %d', i=(/uilo, uihi/))
149 uilo = max(1, min(map(dimord)%allcount, uilo))
150 uihi = max(1, min(map(dimord)%allcount, uihi))
152 call dbgmessage(
'@ userindex=%d %d orig_stride=%d', &
153 & i=(/uilo, uihi, map(dimord)%stride/))
156 map(dimord)%stride = max(1, abs(map(dimord)%stride))
157 map(dimord)%start = min(uilo, uihi)
158 map(dimord)%count = 1 + abs(uihi - uilo) / map(dimord)%stride
161 if (stat /= 0)
call dbgmessage(
"map_set fail")
165 call endsub(
'GTVarLimit_iiii')
219 character(len = *),
intent(in) :: string
220 logical,
intent(out),
optional :: err
223 call beginsub(
'GTVarLimit',
'var=%d lim=<%c>', i=(/var%mapid/), c1=trim(string))
232 if (is > len(string))
exit
235 if (
present(err)) err = .false.
245 character(len = *),
intent(in):: string
246 integer:: equal, dimord
247 integer:: start, count, stride, strhead
250 if (string ==
'')
return
253 if (len(string) < 4)
strhead = len(string)
261 start =
stoi(string(equal+1: ), default=1)
264 call limit(var, dimord, start, 1, 1, err)
265 call del_dim(var, dimord, myerr)
273 if (equal == 0)
return
275 if (dimord <= 0)
return
277 call region_spec(dimord, string(equal+1: ), start, count, stride)
278 call limit(var, dimord, start, count, stride, err)
284 subroutine region_spec(dimord, string, start, count, stride)
289 integer,
intent(in):: dimord
290 integer,
intent(out):: start, count, stride
291 character(len = *),
intent(in):: string
292 integer:: colon, prev_colon, finish, dimlo, dimhi
293 character(len = token):: val(3)
302 val(1) = string(1: colon - 1)
306 val(2) = string(prev_colon + 1: colon - 1)
307 val(3) = string(colon + 1: )
309 val(2) = string(prev_colon + 1: )
313 if (val(3) ==
"") val(3) =
"^1"
316 start =
stoi(val(1)(2: ))
317 else if (val(1) == val(2))
then
318 start = nint(value_to_index(dimord, val(1)))
320 start = floor(value_to_index(dimord, val(1)))
322 if (val(2) == val(1))
then
325 finish =
stoi(val(2)(2: ))
327 finish = ceiling(value_to_index(dimord, val(2)))
330 call dimrange(var, dimord, dimlo, dimhi)
331 start = min(max(dimlo, start), dimhi)
332 finish = min(max(dimlo, finish), dimhi)
333 count = abs(finish - start) + 1
336 stride =
stoi(val(3)(2: ))
338 stride =
stoi(val(3))
340 stride = sign(stride, finish - start)
341 end subroutine region_spec
343 real function value_to_index(dimord, value) result(result)
362 integer,
intent(in):: dimord
363 character(len = *),
intent(in):: value
365 real,
allocatable:: axisval(:)
371 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
372 & i=(/var%mapid, dimord/), c1=trim(
value))
374 call open(axisvar, var, dimord, count_compact=.true., &
375 & inherit_slice=.false., err=myerr)
380 call inquire(axisvar, allcount=n)
382 call get(axisvar, axisval, n, err=myerr)
387 else if (
size(axisval) < 2)
then
392 val = real(
stod(
value), kind=kind(axisval))
397 do, i = 1,
size(axisval) - 1
398 if (abs(axisval(i + 1) - axisval(i)) <=
sp_eps)
then
399 result = real(i) + 0.5
402 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
403 if (result <= (i + 1))
goto 900
407 call endsub(
'value_to_index',
'(%c) = %r', &
408 & c1=trim(
value), r=(/result/))
409 if (
allocated(axisval))
then
412 end function value_to_index
subroutine gtvarlimit(var, string, err)
subroutine limit_one(string)
subroutine gtvarlimit_iiii(var, dimord, start, count, stride, err)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Handling character types.
subroutine, public dbgmessage(fmt, i, r, d, l, n, c1, c2, c3, ca)
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
Provides kind type parameter values.
real(sp), parameter, public sp_eps
Machine epsilon for single precision real number.
integer, parameter, public token
Character length for word, token
Variable URL string parser.
character, parameter, public gt_comma
character, parameter, public gt_equal
character, parameter, public gt_colon
character, parameter, public gt_circumflex
subroutine, public map_lookup(var, vid, map, ndims)
subroutine map_set(var, map, stat)
subroutine gtvar_dump(var)