486{
488
489
490 unsigned int head = 0;
491
492 for (
unsigned int pos = 0; pos <
_rpn.size(); ++pos)
493 {
495
496 const auto inst =
_rpn[pos];
497
498 switch (
_rpn[pos].op)
499 {
500 case Opcode::NUM:
502 ++head;
503 break;
504 case Opcode::VAR:
505 if (inst.arg < 3)
506 stack[head] = p(inst.arg);
507 else if (inst.arg == 3)
508 stack[head] = t;
509 else
510 {
513
514 switch (type)
515 {
518 break;
520 {
521 KOKKOS_ASSERT(datum);
522
524 break;
525 }
527 {
528 KOKKOS_ASSERT(datum);
529
531 break;
532 }
535 break;
536 }
537 }
538 ++head;
539 break;
540 case Opcode::NEG:
541 stack[head - 1] = -stack[head - 1];
542 break;
543 case Opcode::NOT:
544 stack[head - 1] = !::Kokkos::round(stack[head - 1]);
545 break;
546 case Opcode::EQ:
547 stack[head - 2] = ::Kokkos::abs(stack[head - 2] - stack[head - 1]) <=
_epsilon;
548 --head;
549 break;
550 case Opcode::NEQ:
551 stack[head - 2] = ::Kokkos::abs(stack[head - 2] - stack[head - 1]) >
_epsilon;
552 --head;
553 break;
554 case Opcode::AND:
555 stack[head - 2] = ::Kokkos::round(stack[head - 2]) && ::Kokkos::round(stack[head - 1]);
556 --head;
557 break;
558 case Opcode::OR:
559 stack[head - 2] = ::Kokkos::round(stack[head - 2]) || ::Kokkos::round(stack[head - 1]);
560 --head;
561 break;
562 case Opcode::IF:
563 stack[head - 3] = ::Kokkos::round(stack[head - 3]) ? stack[head - 2] : stack[head - 1];
564 head -= 2;
565 break;
566 KOKKOS_FPARSER_COMPARE(LT, <, -
_epsilon);
567 KOKKOS_FPARSER_COMPARE(LEQ, <=,
_epsilon);
568 KOKKOS_FPARSER_COMPARE(GT, >,
_epsilon);
569 KOKKOS_FPARSER_COMPARE(GEQ, >=, -
_epsilon);
570 KOKKOS_FPARSER_BINARY(ADD, +);
571 KOKKOS_FPARSER_BINARY(SUB, -);
572 KOKKOS_FPARSER_BINARY(MUL, *);
573 KOKKOS_FPARSER_BINARY(DIV, /);
574 KOKKOS_FPARSER_FUNCTION_1(ABS, abs);
575 KOKKOS_FPARSER_FUNCTION_1(ACOS, acos);
576 KOKKOS_FPARSER_FUNCTION_1(ACOSH, acosh);
577 KOKKOS_FPARSER_FUNCTION_1(ASIN, asin);
578 KOKKOS_FPARSER_FUNCTION_1(ASINH, asinh);
579 KOKKOS_FPARSER_FUNCTION_1(ATAN, atan);
580 KOKKOS_FPARSER_FUNCTION_2(ATAN2, atan2);
581 KOKKOS_FPARSER_FUNCTION_1(ATANH, atanh);
582 KOKKOS_FPARSER_FUNCTION_1(CBRT, cbrt);
583 KOKKOS_FPARSER_FUNCTION_1(CEIL, ceil);
584 KOKKOS_FPARSER_FUNCTION_1(COS, cos);
585 KOKKOS_FPARSER_FUNCTION_1(COSH, cosh);
586 KOKKOS_FPARSER_FUNCTION_INV_1(COT, tan);
587 KOKKOS_FPARSER_FUNCTION_INV_1(CSC, sin);
588 KOKKOS_FPARSER_FUNCTION_1(EXP, exp);
589 KOKKOS_FPARSER_FUNCTION_1(EXP2, exp2);
590 KOKKOS_FPARSER_FUNCTION_1(FLOOR, floor);
591 KOKKOS_FPARSER_FUNCTION_2(HYPOT, hypot);
592 KOKKOS_FPARSER_FUNCTION_1(INT, round);
593 KOKKOS_FPARSER_FUNCTION_1(LOG, log);
594 KOKKOS_FPARSER_FUNCTION_1(LOG2, log2);
595 KOKKOS_FPARSER_FUNCTION_1(LOG10, log10);
596 KOKKOS_FPARSER_FUNCTION_2(MAX, max);
597 KOKKOS_FPARSER_FUNCTION_2(MIN, min);
598 KOKKOS_FPARSER_FUNCTION_2(POW, pow);
599 KOKKOS_FPARSER_FUNCTION_INV_1(SEC, cos);
600 KOKKOS_FPARSER_FUNCTION_1(SIN, sin);
601 KOKKOS_FPARSER_FUNCTION_1(SINH, sinh);
602 KOKKOS_FPARSER_FUNCTION_1(SQRT, sqrt);
603 KOKKOS_FPARSER_FUNCTION_1(TAN, tan);
604 KOKKOS_FPARSER_FUNCTION_1(TANH, tanh);
605 KOKKOS_FPARSER_FUNCTION_1(TRUNC, trunc);
606 }
607 }
608
609 KOKKOS_ASSERT(head == 1);
610
611 return stack[head - 1];
612}
KOKKOS_FUNCTION T & first() const
Get the first element.
Array<::Kokkos::pair< VariableType, unsigned int > > _variables
Types of variables and indices.
Array< Function > _functions
Functions used in the function.
Array< Instruction > _rpn
RPN sequence.
Array< Real > _numbers
Numbers used in the function.
Array< MaterialProperty< Real > > _properties
Material properties used in the function.
Array< VariableValue > _fields
Field variables used in the function.
static constexpr double _epsilon
Epsilon for equality comparison.
Array< Real > _scalars
Scalar variables used in the function.
static constexpr unsigned int _stack_size
Fixed stack size.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real