13 subroutine gtvarslice(var, dimord, start, count, stride)
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
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
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
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
110 call endsub(
'GTVarSlice',
'err skipped')
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')
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)
202 call slice(var, dimord, start, 1, 1)
203 call del_dim(var, dimord, myerr)
210 if (equal == 0)
return 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)
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)
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)
298 integer,
intent(in):: dimord
299 character(len = *),
intent(in):: value
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, 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)
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)
subroutine, public query_growable(vid, result)