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
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')
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.
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)
221 start =
stoi(string(equal+1: ), default=1)
224 call limit(var, dimord, start, 1, 1, err)
225 call del_dim(var, dimord, myerr)
233 if (equal == 0)
return 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)
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)
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)
321 integer,
intent(in):: dimord
322 character(len = *),
intent(in):: value
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, 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)
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)
character, parameter, public gt_circumflex
character, parameter, public gt_colon
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 endsub(name, fmt, i, r, d, L, n, c1, c2, c3, ca)