147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
175 use dc_trace, only: beginsub, endsub
178 type(GT_VARIABLE), intent(inout):: var
179 character(len = *), intent(in) :: string
180 logical, intent(out), optional :: err
181 integer:: is, ie
182continue
183 call beginsub('GTVarLimit', 'var=%d lim=<%c>', i=(/var%mapid/), c1=trim(string))
185
186 is = 1
187 do
189 if (ie == 0) exit
191 is = is + ie
192 if (is > len(string)) exit
193 enddo
195 if (present(err)) err = .false.
196 call endsub('GTVarLimit')
197 return
198contains
199
202 use dc_string, only: strieq, stoi
203 use gtdata_generic, only: del_dim, dimname_to_dimord
204 use gtdata_generic, only: del_dim, dimname_to_dimord, limit
205 character(len = *), intent(in):: string
206 integer:: equal, dimord
207 integer:: start, count, stride, strhead
208 logical:: myerr
209
210 if (string == '') return
211
212 strhead = 4
213 if (len(string) < 4) strhead = len(string)
214
215 if (strieq(string(1:strhead), "IGN:")) then
216
218 if (equal == 0) then
219 start = 1
220 else
221 start = stoi(string(equal+1: ), default=1)
222 endif
223 dimord = dimname_to_dimord(var, string(5: equal-1))
224 call limit(var, dimord, start, 1, 1, err)
225 call del_dim(var, dimord, myerr)
226 return
227 endif
228
229
230
231
233 if (equal == 0) return
234 dimord = dimname_to_dimord(var, string(1: equal-1))
235 if (dimord <= 0) return
236
237 call region_spec(dimord, string(equal+1: ), start, count, stride)
238 call limit(var, dimord, start, count, stride, err)
240
241
242
243
244 subroutine region_spec(dimord, string, start, count, stride)
246 use dc_string, only: index_ofs, stoi
249 integer, intent(in):: dimord
250 integer, intent(out):: start, count, stride
251 character(len = *), intent(in):: string
252 integer:: colon, prev_colon, finish, dimlo, dimhi
253 character(len = token):: val(3)
254 continue
256 if (colon == 0) then
257
258 val(1) = string(1: )
259 val(2) = val(1)
260 val(3) = ""
261 else
262 val(1) = string(1: colon - 1)
263 prev_colon = colon
264 colon = index_ofs(string, colon + 1,
gt_colon)
265 if (colon > 0) then
266 val(2) = string(prev_colon + 1: colon - 1)
267 val(3) = string(colon + 1: )
268 else
269 val(2) = string(prev_colon + 1: )
270 val(3) = ""
271 endif
272 endif
273 if (val(3) == "") val(3) = "^1"
274
276 start = stoi(val(1)(2: ))
277 else if (val(1) == val(2)) then
278 start = nint(value_to_index(dimord, val(1)))
279 else
280 start = floor(value_to_index(dimord, val(1)))
281 endif
282 if (val(2) == val(1)) then
283 finish = start
285 finish = stoi(val(2)(2: ))
286 else
287 finish = ceiling(value_to_index(dimord, val(2)))
288 endif
289
290 call dimrange(var, dimord, dimlo, dimhi)
291 start = min(max(dimlo, start), dimhi)
292 finish = min(max(dimlo, finish), dimhi)
293 count = abs(finish - start) + 1
294
296 stride = stoi(val(3)(2: ))
297 else
298 stride = stoi(val(3))
299 endif
300 stride = sign(stride, finish - start)
301 end subroutine region_spec
302
303 real function value_to_index(dimord, value) result(result)
304
305
306
307
308
309
310
311
312
313
314
315
316
318 use gtdata_generic, only: get, open, close
319 use dc_string, only: stod
320 use dc_trace, only: beginsub, endsub, dbgmessage
321 integer, intent(in):: dimord
322 character(len = *), intent(in):: value
323 type(GT_VARIABLE):: axisvar
324 real, pointer:: axisval(:) => null()
325 real:: val
326 integer:: i
327 continue
328
329 call beginsub('value_to_index', 'var=%d dimord=%d value=%c', &
330 & i=(/var%mapid, dimord/), c1=trim(value))
331
332 call open(axisvar, var, dimord, count_compact=.true.)
333 nullify(axisval)
334 call get(axisvar, axisval)
335 call close(axisvar)
336 if (.not. associated(axisval)) then
337 result = -1.0
338 return
339 else if (size(axisval) < 2) then
340 result = 1.0
341 goto 900
342 endif
343
344 val = stod(value)
345
346
347
348
349 do, i = 1, size(axisval) - 1
350 if (axisval(i + 1) == axisval(i)) then
351 result = real(i) + 0.5
352 goto 900
353 endif
354 result = i + (val - axisval(i)) / (axisval(i + 1) - axisval(i))
355 if (result <= (i + 1)) goto 900
356 enddo
357
358900 continue
359 call endsub('value_to_index', '(%c) = %r', &
360 & c1=trim(value), r=(/result/))
361 deallocate(axisval)
362 end function value_to_index
363
subroutine limit_one(string)
Provides kind type parameter values.
integer, parameter, public token
Character length for word, token
character, parameter, public gt_comma
character, parameter, public gt_equal
character, parameter, public gt_colon
character, parameter, public gt_circumflex
subroutine gtvar_dump(var)