71 integer,
intent(in):: dimord
72 integer,
intent(in),
optional:: start
73 integer,
intent(in),
optional:: count
74 integer,
intent(in),
optional:: stride
76 integer:: vid, maxindex, maxcount, nd, stat
77 logical:: growable_dimension
79 call beginsub(
'GTVarSlice',
'var%%mapid=%d dimord=%d', &
80 & i=(/var%mapid, dimord/))
90 growable_dimension = .false.
97 if (dimord <= 0 .or. dimord >
size(map))
goto 998
99 call dbgmessage(
'map(dimord): originally start=%d count=%d stride=%d', &
100 & i=(/map(dimord)%start, map(dimord)%count, map(dimord)%stride/))
101 maxindex = map(dimord)%allcount
102 if (.not. growable_dimension)
then
103 call dbgmessage(
'maxindex=%d', i=(/maxindex/))
106 if (
present(start))
then
108 map(dimord)%start = max(1, maxindex + 1 + start)
109 else if (growable_dimension)
then
110 map(dimord)%start = max(1, start)
112 map(dimord)%start = min(maxindex, max(1, start))
114 call dbgmessage(
'start=%d (%d specified)', i=(/map(dimord)%start, start/))
117 if (
present(stride))
then
118 map(dimord)%stride = stride
119 if (stride == 0) map(dimord)%stride = 1
121 & i=(/map(dimord)%stride, stride/))
124 if (
present(count))
then
125 map(dimord)%count = abs(count)
126 if (count == 0) map(dimord)%count = 1
128 & i=(/map(dimord)%count, count/))
129 if (growable_dimension)
then
130 maxcount = map(dimord)%start + &
131 & (map(dimord)%count - 1) * abs(map(dimord)%stride)
132 map(dimord)%allcount = max(map(dimord)%allcount, maxcount)
133 call dbgmessage(
'allcount=%d ', i=(/map(dimord)%allcount/))
137 if (.not. growable_dimension)
then
138 maxcount = 1 + (maxindex - map(dimord)%start) / map(dimord)%stride
139 map(dimord)%count = max(1, min(maxcount, map(dimord)%count))
140 call dbgmessage(
'count=%d ', i=(/map(dimord)%count/))
143 if (stat /= 0)
goto 998
152 call endsub(
'GTVarSlice',
'err skipped')
216 character(len = *),
intent(in) :: string
217 logical,
intent(out) :: err
220 call beginsub(
'GTVarSliceC',
'var=%d lim=<%c>', &
221 & i=(/var%mapid/), c1=trim(string))
230 if (is > len(string))
exit
234 call endsub(
'GTVarSliceC')
242 character(len = *),
intent(in):: string
243 integer:: equal, dimord
244 integer:: start, count, stride
247 if (string ==
'')
return
249 if (
strieq(string(1:4),
"IGN:"))
then
255 start =
stoi(string(equal+1: ), default=1)
258 call slice(var, dimord, start, 1, 1)
259 call del_dim(var, dimord, myerr)
266 if (equal == 0)
return
268 if (dimord <= 0)
return
270 call region_spec(dimord, string(equal+1: ), start, count, stride)
271 call slice(var, dimord, start, count, stride)
277 subroutine region_spec(dimord, string, start, count, stride)
282 integer,
intent(in):: dimord
283 integer,
intent(out):: start, count, stride
284 character(len = *),
intent(in):: string
285 integer:: colon, prev_colon, finish, dimlo, dimhi
286 character(len = token):: val(3)
295 val(1) = string(1: colon - 1)
299 val(2) = string(prev_colon + 1: colon - 1)
300 val(3) = string(colon + 1: )
302 val(2) = string(prev_colon + 1: )
306 if (val(3) ==
"") val(3) =
"^1"
309 start =
stoi(val(1)(2: ))
310 else if (val(1) == val(2))
then
311 start = nint(value_to_index(dimord, val(1)))
313 start = floor(value_to_index(dimord, val(1)))
315 if (val(2) == val(1))
then
318 finish =
stoi(val(2)(2: ))
320 finish = ceiling(value_to_index(dimord, val(2)))
323 call dimrange(var, dimord, dimlo, dimhi)
324 start = min(max(dimlo, start), dimhi)
325 finish = min(max(dimlo, finish), dimhi)
326 count = abs(finish - start) + 1
329 stride =
stoi(val(3)(2: ))
331 stride =
stoi(val(3))
333 stride = sign(stride, finish - start)
334 end subroutine region_spec
336 real function value_to_index(dimord, value) result(result)
355 integer,
intent(in):: dimord
356 character(len = *),
intent(in):: value
358 real,
allocatable:: axisval(:)
363 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
364 & i=(/var%mapid, dimord/), c1=trim(
value))
366 call open(axisvar, var, dimord, count_compact=.true., &
367 & inherit_slice=.false., err=myerr)
372 call inquire(axisvar, allcount=n)
374 call get(axisvar, axisval, n, err=myerr)
379 else if (
size(axisval) < 2)
then
384 val = real(
stod(
value), kind=kind(axisval))
389 do, i = 1,
size(axisval) - 1
390 if (abs(axisval(i + 1) - axisval(i)) <=
sp_eps)
then
391 result = real(i) + 0.5
394 result = real(i) + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
395 if (result <= (i + 1))
goto 900
399 call endsub(
'value_to_index',
'value(%c) =~ index(%r)', &
400 & c1=trim(
value), r=(/result/))
401 if (
allocated(axisval))
then
404 end function value_to_index
subroutine limit_one(string)
subroutine gtvarslicec(var, string, err)
subroutine gtvarslice(var, dimord, start, count, stride)
subroutine, public storeerror(number, where, err, cause_c, cause_i)
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)
real(sp), parameter, public sp_eps
単精度実数型変数のマシンイプシロン.
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
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)
subroutine, public query_growable(vid, result)
integer function, public ndims(vid)