変数 var の入出力範囲を、string に応じて指定します。 string には gtool4 netCDF 規約の 「5.4 コンマ記法」に述べられる範囲指定表現を用います。 凡例を以下に挙げます。
ここで、<dim> は次元番号または次元名であり、 <lower>, <upper> は座標値または "^" を前置した格子番号です。 <stride> は格子数です。
現在 err は必ず .false. を返すことになっています。
215 type(GT_VARIABLE), intent(inout) :: var
216 character(len = *), intent(in) :: string
217 logical, intent(out) :: err
218 integer:: is, ie
219continue
220 call beginsub(
'GTVarSliceC',
'var=%d lim=<%c>', &
221 & i=(/var%mapid/), c1=trim(string))
223
224 is = 1
225 do
227 if (ie == 0) exit
229 is = is + ie
230 if (is > len(string)) exit
231 enddo
233 err = .false.
234 call endsub(
'GTVarSliceC')
235 return
236contains
237
242 character(len = *), intent(in):: string
243 integer:: equal, dimord
244 integer:: start, count, stride
245 logical:: myerr
246
247 if (string == '') return
248
249 if (
strieq(string(1:4),
"IGN:"))
then
250
252 if (equal == 0) then
253 start = 1
254 else
255 start =
stoi(string(equal+1: ), default=1)
256 endif
258 call slice(var, dimord, start, 1, 1)
259 call del_dim(var, dimord, myerr)
260 return
261 endif
262
263
264
266 if (equal == 0) return
268 if (dimord <= 0) return
269
270 call region_spec(dimord, string(equal+1: ), start, count, stride)
271 call slice(var, dimord, start, count, stride)
273
274
275
276
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)
287 continue
289 if (colon == 0) then
290
291 val(1) = string(1: )
292 val(2) = val(1)
293 val(3) = ""
294 else
295 val(1) = string(1: colon - 1)
296 prev_colon = colon
298 if (colon > 0) then
299 val(2) = string(prev_colon + 1: colon - 1)
300 val(3) = string(colon + 1: )
301 else
302 val(2) = string(prev_colon + 1: )
303 val(3) = ""
304 endif
305 endif
306 if (val(3) == "") val(3) = "^1"
307
309 start =
stoi(val(1)(2: ))
310 else if (val(1) == val(2)) then
311 start = nint(value_to_index(dimord, val(1)))
312 else
313 start = floor(value_to_index(dimord, val(1)))
314 endif
315 if (val(2) == val(1)) then
316 finish = start
318 finish =
stoi(val(2)(2: ))
319 else
320 finish = ceiling(value_to_index(dimord, val(2)))
321 endif
322
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
327
329 stride =
stoi(val(3)(2: ))
330 else
331 stride =
stoi(val(3))
332 endif
333 stride = sign(stride, finish - start)
334 end subroutine region_spec
335
336 real function value_to_index(dimord, value) result(result)
337
338
339
340
341
342
343
344
345
346
347
348
349
355 integer, intent(in):: dimord
356 character(len = *), intent(in):: value
357 type(GT_VARIABLE):: axisvar
358 real, allocatable:: axisval(:)
359 real:: val
360 integer:: i, n
361 logical:: myerr
362 continue
363 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
364 & i=(/var%mapid, dimord/), c1=trim(value))
365
366 call open(axisvar, var, dimord, count_compact=.true., &
367 & inherit_slice=.false., err=myerr)
368 if (myerr) then
369 result = -1.0
370 return
371 endif
372 call inquire(axisvar, allcount=n)
373 allocate(axisval(n))
374 call get(axisvar, axisval, n, err=myerr)
376 if (myerr) then
377 result = -1.0
378 return
379 else if (size(axisval) < 2) then
380 result = 1.0
381 goto 900
382 endif
383
384 val = real(
stod(
value), kind=kind(axisval))
385
386
387
388
389 do, i = 1, size(axisval) - 1
390 if (abs(axisval(i + 1) - axisval(i)) <=
sp_eps)
then
391 result = real(i) + 0.5
392 goto 900
393 endif
394 result = real(i) + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
395 if (result <= (i + 1)) goto 900
396 enddo
397
398900 continue
399 call endsub(
'value_to_index',
'value(%c) =~ index(%r)', &
400 & c1=trim(value), r=(/result/))
401 if (allocated(axisval)) then
402 deallocate(axisval)
403 endif
404 end function value_to_index
405
subroutine limit_one(string)
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