114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
155 use gtdata_generic, only: slice
156 use dc_trace, only: beginsub, endsub
159 type(GT_VARIABLE), intent(inout) :: var
160 character(len = *), intent(in) :: string
161 logical, intent(out) :: err
162 integer:: is, ie
163continue
164 call beginsub('GTVarSliceC', 'var=%d lim=<%c>', &
165 & i=(/var%mapid/), c1=trim(string))
167
168 is = 1
169 do
171 if (ie == 0) exit
173 is = is + ie
174 if (is > len(string)) exit
175 enddo
177 err = .false.
178 call endsub('GTVarSliceC')
179 return
180contains
181
184 use dc_string, only: strieq, stoi
185 use gtdata_generic, only: del_dim, dimname_to_dimord
186 character(len = *), intent(in):: string
187 integer:: equal, dimord
188 integer:: start, count, stride
189 logical:: myerr
190
191 if (string == '') return
192
193 if (strieq(string(1:4), "IGN:")) then
194
196 if (equal == 0) then
197 start = 1
198 else
199 start = stoi(string(equal+1: ), default=1)
200 endif
201 dimord = dimname_to_dimord(var, string(5: equal-1))
202 call slice(var, dimord, start, 1, 1)
203 call del_dim(var, dimord, myerr)
204 return
205 endif
206
207
208
210 if (equal == 0) return
211 dimord = dimname_to_dimord(var, string(1: equal-1))
212 if (dimord <= 0) return
213
214 call region_spec(dimord, string(equal+1: ), start, count, stride)
215 call slice(var, dimord, start, count, stride)
217
218
219
220
221 subroutine region_spec(dimord, string, start, count, stride)
223 use dc_string, only: index_ofs, stoi
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)
231 continue
233 if (colon == 0) then
234
235 val(1) = string(1: )
236 val(2) = val(1)
237 val(3) = ""
238 else
239 val(1) = string(1: colon - 1)
240 prev_colon = colon
241 colon = index_ofs(string, colon + 1,
gt_colon)
242 if (colon > 0) then
243 val(2) = string(prev_colon + 1: colon - 1)
244 val(3) = string(colon + 1: )
245 else
246 val(2) = string(prev_colon + 1: )
247 val(3) = ""
248 endif
249 endif
250 if (val(3) == "") val(3) = "^1"
251
253 start = stoi(val(1)(2: ))
254 else if (val(1) == val(2)) then
255 start = nint(value_to_index(dimord, val(1)))
256 else
257 start = floor(value_to_index(dimord, val(1)))
258 endif
259 if (val(2) == val(1)) then
260 finish = start
262 finish = stoi(val(2)(2: ))
263 else
264 finish = ceiling(value_to_index(dimord, val(2)))
265 endif
266
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
271
273 stride = stoi(val(3)(2: ))
274 else
275 stride = stoi(val(3))
276 endif
277 stride = sign(stride, finish - start)
278 end subroutine region_spec
279
280 real function value_to_index(dimord, value) result(result)
281
282
283
284
285
286
287
288
289
290
291
292
293
295 use gtdata_generic, only: get, open, close
296 use dc_string, only: stod
297 use dc_trace, only: beginsub, endsub, dbgmessage
298 integer, intent(in):: dimord
299 character(len = *), intent(in):: value
300 type(GT_VARIABLE):: axisvar
301 real, pointer:: axisval(:)
302 real:: val
303 integer:: i
304 continue
305 call beginsub('value_to_index', 'var=%d dimord=%d value=%c', &
306 & i=(/var%mapid, dimord/), c1=trim(value))
307
308 call open(axisvar, var, dimord, count_compact=.true.)
309 call get(axisvar, axisval)
310 call close(axisvar)
311 if (.not. associated(axisval)) then
312 result = -1.0
313 return
314 else if (size(axisval) < 2) then
315 result = 1.0
316 goto 900
317 endif
318
319 val = stod(value)
320
321
322
323
324 do, i = 1, size(axisval) - 1
325 if (axisval(i + 1) == axisval(i)) then
326 result = real(i) + 0.5
327 goto 900
328 endif
329 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
330 if (result <= (i + 1)) goto 900
331 enddo
332
333900 continue
334 call endsub('value_to_index', 'value(%c) =~ index(%r)', &
335 & c1=trim(value), r=(/result/))
336 deallocate(axisval)
337 end function value_to_index
338
subroutine limit_one(string)
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
character, parameter, public gt_comma
character, parameter, public gt_equal
character, parameter, public gt_colon
character, parameter, public gt_circumflex