ここで <dim> は次元番号または次元名であり、 <lower>, <upper> は座標値または "^" を前置した格子番号です。 <stride> は格子数です。
エラーが生じた場合、メッセージを出力してプログラムは強制終了します。 err を与えてある場合にはの引数に .true. が返り、プログラムは終了しません。
218 type(GT_VARIABLE), intent(inout):: var
219 character(len = *), intent(in) :: string
220 logical, intent(out), optional :: err
221 integer:: is, ie
222continue
223 call beginsub(
'GTVarLimit',
'var=%d lim=<%c>', i=(/var%mapid/), c1=trim(string))
225
226 is = 1
227 do
229 if (ie == 0) exit
231 is = is + ie
232 if (is > len(string)) exit
233 enddo
235 if (present(err)) err = .false.
237 return
238contains
239
245 character(len = *), intent(in):: string
246 integer:: equal, dimord
247 integer:: start, count, stride, strhead
248 logical:: myerr
249
250 if (string == '') return
251
253 if (len(string) < 4)
strhead = len(string)
254
256
258 if (equal == 0) then
259 start = 1
260 else
261 start =
stoi(string(equal+1: ), default=1)
262 endif
264 call limit(var, dimord, start, 1, 1, err)
265 call del_dim(var, dimord, myerr)
266 return
267 endif
268
269
270
271
273 if (equal == 0) return
275 if (dimord <= 0) return
276
277 call region_spec(dimord, string(equal+1: ), start, count, stride)
278 call limit(var, dimord, start, count, stride, err)
280
281
282
283
284 subroutine region_spec(dimord, string, start, count, stride)
289 integer, intent(in):: dimord
290 integer, intent(out):: start, count, stride
291 character(len = *), intent(in):: string
292 integer:: colon, prev_colon, finish, dimlo, dimhi
293 character(len = token):: val(3)
294 continue
296 if (colon == 0) then
297
298 val(1) = string(1: )
299 val(2) = val(1)
300 val(3) = ""
301 else
302 val(1) = string(1: colon - 1)
303 prev_colon = colon
305 if (colon > 0) then
306 val(2) = string(prev_colon + 1: colon - 1)
307 val(3) = string(colon + 1: )
308 else
309 val(2) = string(prev_colon + 1: )
310 val(3) = ""
311 endif
312 endif
313 if (val(3) == "") val(3) = "^1"
314
316 start =
stoi(val(1)(2: ))
317 else if (val(1) == val(2)) then
318 start = nint(value_to_index(dimord, val(1)))
319 else
320 start = floor(value_to_index(dimord, val(1)))
321 endif
322 if (val(2) == val(1)) then
323 finish = start
325 finish =
stoi(val(2)(2: ))
326 else
327 finish = ceiling(value_to_index(dimord, val(2)))
328 endif
329
330 call dimrange(var, dimord, dimlo, dimhi)
331 start = min(max(dimlo, start), dimhi)
332 finish = min(max(dimlo, finish), dimhi)
333 count = abs(finish - start) + 1
334
336 stride =
stoi(val(3)(2: ))
337 else
338 stride =
stoi(val(3))
339 endif
340 stride = sign(stride, finish - start)
341 end subroutine region_spec
342
343 real function value_to_index(dimord, value) result(result)
344
345
346
347
348
349
350
351
352
353
354
355
356
362 integer, intent(in):: dimord
363 character(len = *), intent(in):: value
364 type(GT_VARIABLE):: axisvar
365 real, allocatable:: axisval(:)
366 real:: val
367 integer:: i, n
368 logical:: myerr
369 continue
370
371 call beginsub(
'value_to_index',
'var=%d dimord=%d value=%c', &
372 & i=(/var%mapid, dimord/), c1=trim(value))
373
374 call open(axisvar, var, dimord, count_compact=.true., &
375 & inherit_slice=.false., err=myerr)
376 if (myerr) then
377 result = -1.0
378 return
379 endif
380 call inquire(axisvar, allcount=n)
381 allocate(axisval(n))
382 call get(axisvar, axisval, n, err=myerr)
384 if (myerr) then
385 result = -1.0
386 return
387 else if (size(axisval) < 2) then
388 result = 1.0
389 goto 900
390 endif
391
392 val = real(
stod(
value), kind=kind(axisval))
393
394
395
396
397 do, i = 1, size(axisval) - 1
398 if (abs(axisval(i + 1) - axisval(i)) <=
sp_eps)
then
399 result = real(i) + 0.5
400 goto 900
401 endif
402 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
403 if (result <= (i + 1)) goto 900
404 enddo
405
406900 continue
407 call endsub(
'value_to_index',
'(%c) = %r', &
408 & c1=trim(value), r=(/result/))
409 if (allocated(axisval)) then
410 deallocate(axisval)
411 endif
412 end function value_to_index
413
subroutine limit_one(string)
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)
integer, parameter, public token
単語やキーワードを保持する文字型変数の種別型パラメタ
real(sp), parameter, public sp_eps
単精度実数型変数のマシンイプシロン.
character, parameter, public gt_comma
character, parameter, public gt_equal
character, parameter, public gt_colon
character, parameter, public gt_circumflex
subroutine gtvar_dump(var)