static value_object eval_aux(expr* node) { if (node == NULL) return make_null(); if (node->type == EXP_ASSIGN) return assign_value(node->left, node->right); value_object left = eval_aux(node->left); value_object right = eval_aux(node->right); switch (node->type) { case EXP_PLUS: return add_values(left, right); case EXP_MINUS: return sub_values(left, right); case EXP_TIMES: return mul_values(left, right); case EXP_DIV: return div_values(left, right); case EXP_INT: return make_int(atoi(node->text)); case EXP_FLOAT: return make_float(to_float64(node->text)); case EXP_NATIVE: return make_native(atof(node->text)); case EXP_CALL: return eval_function(node->text, node->args); case EXP_ID: return get_variable_value(node->text); case EXP_UNMINUS: return negate_value(left); } }
void IntrepidKernel<Scalar>::dfuncValue( Teuchos::ArrayRCP<Scalar> &values, const double param_coords[3] ) { MDArray coords(1,3); coords(0,0) = param_coords[0]; coords(0,1) = param_coords[1]; coords(0,2) = param_coords[2]; if ( this->b_function_space_type == FOOD_HGRAD ) { MDArray grad_values( this->b_cardinality, 1 ); d_intrepid_basis->getValues( grad_values, coords, Intrepid::OPERATOR_VALUE ); values = grad_values.getData(); } else if ( this->b_function_space_type == FOOD_HDIV ) { MDArray div_values( this->b_cardinality, 1, 3 ); d_intrepid_basis->getValues( div_values, coords, Intrepid::OPERATOR_VALUE ); values = div_values.getData(); } else if ( this->b_function_space_type == FOOD_HCURL ) { MDArray curl_values( this->b_cardinality, 1, 3 ); d_intrepid_basis->getValues( curl_values, coords, Intrepid::OPERATOR_VALUE ); values = curl_values.getData(); } else { testPrecondition( this->b_function_space_type == FOOD_HGRAD || this->b_function_space_type == FOOD_HDIV || this->b_function_space_type == FOOD_HCURL, "Invalid function space type" ); } }