39 const word& entryName,
46 this->readEntry(entryName,
dict, mandatory);
53 const word& entryName,
59 this->readEntry(entryName,
dict, mandatory);
69 Foam::dimensionSet::tokeniser::tokeniser(Istream& is)
80 void Foam::dimensionSet::tokeniser::push(
const token& t)
82 const label
end = (start_+size_)%tokens_.size();
84 if (size_ == tokens_.size())
86 start_ = tokens_.fcIndex(start_);
97 token t = tokens_[start_];
98 start_ = tokens_.fcIndex(start_);
104 void Foam::dimensionSet::tokeniser::unpop(
const token& t)
107 start_ = tokens_.rcIndex(start_);
112 bool Foam::dimensionSet::tokeniser::hasToken()
const
114 return size_ || is_.
good();
118 bool Foam::dimensionSet::tokeniser::valid(
char c)
139 Foam::label Foam::dimensionSet::tokeniser::priority(
const token& t)
141 if (t.isPunctuation())
151 else if (t.pToken() ==
'^')
162 void Foam::dimensionSet::tokeniser::splitWord(
const word& w)
165 for (
size_t i=0; i<w.size(); ++i)
171 const word subWord = w.substr(start, i-start);
174 push(token(readScalar(subWord)));
178 push(token(subWord));
186 const scalar val = (w[i] -
'0');
197 if (start < w.size())
199 const word subWord = w.substr(start);
202 push(token(readScalar(subWord)));
206 push(token(subWord));
212 Foam::token Foam::dimensionSet::tokeniser::nextToken()
219 splitWord(t.wordToken());
234 void Foam::dimensionSet::tokeniser::putBack(
const token& t)
249 void Foam::dimensionSet::round(
const scalar tol)
252 for (scalar& val : exponents_)
254 const scalar fractionalPart = std::modf(val, &integralPart);
256 if (
mag(fractionalPart-1.0) <= tol)
258 val = 1.0+integralPart;
260 else if (
mag(fractionalPart+1.0) <= tol)
262 val = -1.0+integralPart;
264 else if (
mag(fractionalPart) <= tol)
274 const label lastPrior,
276 const HashTable<dimensionedScalar>& readSet
282 token nextToken(tis.nextToken());
286 bool haveReadSymbol =
false;
291 if (nextToken.isWord())
293 const word& unitName = nextToken.wordToken();
296 ds.value() *= unitDim.value();
297 haveReadSymbol =
true;
299 else if (nextToken.isNumber())
302 ds.value() *= nextToken.number();
303 haveReadSymbol =
true;
305 else if (nextToken.isPunctuation())
307 label nextPrior = tokeniser::priority(nextToken);
312 tis.putBack(nextToken);
317 tis.putBack(nextToken);
324 token t = tis.nextToken();
331 ds.dimensions() *= sub.dimensions();
332 ds.value() *= sub.value();
334 haveReadSymbol =
true;
338 tis.putBack(nextToken);
343 if (nextPrior > lastPrior)
347 ds.dimensions() *= sub.dimensions();
348 ds.value() *= sub.value();
353 tis.putBack(nextToken);
356 haveReadSymbol =
false;
360 if (nextPrior > lastPrior)
364 ds.dimensions() /= sub.dimensions();
365 ds.value() /= sub.value();
369 tis.putBack(nextToken);
372 haveReadSymbol =
false;
374 else if (nextToken.pToken() ==
'^')
376 if (nextPrior > lastPrior)
380 ds.dimensions().reset(
pow(ds.dimensions(),
expon.value()));
382 ds.dimensions().round(10*smallExponent);
387 tis.putBack(nextToken);
390 haveReadSymbol =
false;
410 nextToken = tis.nextToken();
411 if (nextToken.error())
416 if (haveReadSymbol && (nextToken.isWord() || nextToken.isNumber()))
419 tis.putBack(nextToken);
430 const word& entryName,
431 const dictionary&
dict,
439 const entry&
e = *eptr;
440 ITstream& is =
e.stream();
451 <<
"Entry '" << entryName <<
"' not found in dictionary "
464 const HashTable<dimensionedScalar>& readSet
470 token startToken(is);
476 <<
"in stream " << is.info() <<
nl
483 if (!nextToken.isNumber())
485 is.putBack(nextToken);
491 multiplier = ds.value();
492 exponents_ = ds.dimensions().values();
509 if (nextToken.isNumber())
527 <<
"in stream " << is.info() <<
nl
557 token startToken(is);
563 <<
"in stream " << is.
info() <<
nl
570 if (nextToken.isWord())
572 bool continueParsing =
true;
575 word symbolPow = nextToken.wordToken();
578 symbolPow.resize(symbolPow.size()-1);
579 continueParsing =
false;
584 dimensionSet symbolSet;
586 const auto index = symbolPow.find(
'^');
587 if (index != std::string::npos)
589 const word symbol = symbolPow.substr(0, index);
590 const scalar exponent = readScalar(symbolPow.substr(index+1));
595 symbolSet.reset(
pow(
s.dimensions(), exponent));
598 symbolSet.round(10*smallExponent);
606 symbolSet.reset(
s.dimensions());
607 multiplier *=
s.value();
613 exponents_[i] += symbolSet[i];
618 nextToken = token(is);
622 continueParsing =
false;
626 while (continueParsing);
643 if (nextToken.isNumber())
661 <<
"in stream " << is.
info() <<
nl
687 exponents[d] = exponents_[d];
691 bool hasPrinted =
false;
696 std::numeric_limits<scalar>::digits10
701 if (
mag(exponents[i]) > smallExponent)
711 if (
mag(exponents[i]-1) > smallExponent)
713 os <<
'^' << exponents[i];
719 multiplier *= ds.
value();
763 <<
"Cannot use scaled units in dimensionSet"