264 type(
units),
intent(out):: u
265 character(*),
intent(in):: cunits
270 character(TOKEN):: name
271 real(DP):: power, factor
273 type(elem_units),
target:: ustack(100)
284 type(paren_t):: pstack(50)
288 integer,
parameter:: y_init = 1, y_number = 2, y_name = 3, &
289 & y_nx = 4, y_ni = 5, y_mul = 6, y_shift = 7
290 integer:: yparse_status = y_init
296 character(TOKEN):: cvalue
302 if (
associated(u%name))
deallocate(u%name)
303 if (
associated(u%power))
deallocate(u%power)
307 if (cunits ==
"")
return 311 yparse_status = y_init
317 select case(yparse_status)
319 pstack(pi)%factor = pstack(pi)%factor * ivalue(1)
320 yparse_status = y_number
322 i = pstack(pi)%power_exp
323 ustack(
i:ui)%power = ustack(
i:ui)%power * ivalue(1)
332 select case(yparse_status)
334 pstack(pi)%factor = pstack(pi)%factor * dvalue
335 yparse_status = y_number
337 i = pstack(pi)%power_exp
338 ustack(
i:ui)%power = ustack(
i:ui)%power * dvalue
347 select case(yparse_status)
348 case (y_init, y_number, y_mul)
349 ustack(ui)%name = cvalue
350 yparse_status = y_name
354 ustack(ui)%name = cvalue
355 yparse_status = y_name
362 select case(yparse_status)
369 select case(yparse_status)
370 case (y_number, y_name)
372 yparse_status = y_mul
377 select case(yparse_status)
378 case (y_number, y_name)
380 pstack(pi)%factor_inv = .true.
381 yparse_status = y_mul
388 yparse_status = y_shift
405 u%factor = product(ustack(1:ui)%factor)
406 call units_simplify(u, ustack(1:ui)%name, ustack(1:ui)%power)
411 print *,
operator"DCUnitsBuild: syntax error, (**) ignored" 415 print *,
"DCUnitsBuild: unexpected token <", &
416 & trim(cvalue),
"> ignored" 422 pstack(pi)%power_exp = ui
428 i = pstack(pi)%factor_exp
429 factor = product(ustack(
i:ui)%factor) * pstack(pi)%factor
430 if (pstack(pi)%factor_inv)
then 431 ustack(
i:ui)%power = -ustack(
i:ui)%power
432 factor = 1.0_dp / factor
434 ustack(
i)%factor = factor
435 ustack(
i+1:ui)%factor = 1.0_dp
437 pstack(pi)%factor = 1.0_dp
438 pstack(pi)%factor_exp = ui
451 if (ui >=
size(ustack)) stop
'DCUnitsBuild: too many elements' 454 ustack(ui)%factor = 1.0_dp
455 ustack(ui)%power = 1.0_dp
464 if (pi >=
size(pstack)) stop
'DCUnitsBuild: too many parens' 467 pstack(pi)%factor_exp = ui
468 pstack(pi)%factor = 1.0_dp
469 pstack(pi)%factor_inv = .false.
470 pstack(pi)%power_exp = ui
471 pstack(pi)%paren_exp = ui
integer, parameter, public s_exponent
integer, parameter, public s_eof
integer, parameter, public s_openpar
integer, parameter, public s_shift
integer, parameter, public s_real
integer, parameter, public s_divide
integer, parameter, public s_multiply
integer, parameter, public s_closepar
integer, parameter, public s_text
subroutine, public dcunitsgettoken(tokentype, ivalue, dvalue, cvalue)
subroutine, public dcunitssetline(line)
integer, parameter, public s_integer
subroutine units_finalize