diff --git a/src/mo_expression.F90 b/src/mo_expression.F90 index e82652399b0231bf694bda5e1278ffa4dcb9df5b..6d9d296067d39efd8213e7b740450223e69b0cc0 100644 --- a/src/mo_expression.F90 +++ b/src/mo_expression.F90 @@ -1050,9 +1050,15 @@ CONTAINS CLASS(t_op_pow), INTENT(INOUT) :: this CLASS(t_result_stack_0D), INTENT(INOUT) :: result_stack REAL(real_kind), POINTER :: arg1, arg2 + INTEGER :: exponent CALL result_stack%pop(arg2) CALL result_stack%pop(arg1) - arg1 = arg1**arg2 + exponent = arg2 + IF (arg2 == exponent) THEN + arg1 = arg1**exponent + ELSE + arg1 = arg1**arg2 + END IF CALL result_stack%push(arg1) DEALLOCATE (arg2) END SUBROUTINE stack_op_pow_eval_0D @@ -1061,9 +1067,15 @@ CONTAINS CLASS(t_op_pow), INTENT(INOUT) :: this CLASS(t_result_stack_2D), INTENT(INOUT) :: result_stack REAL(real_kind), DIMENSION(:, :), POINTER :: arg1, arg2 + INTEGER, DIMENSION(:, :), ALLOCATABLE :: exponent CALL result_stack%pop(arg2) CALL result_stack%pop(arg1) - arg1 = arg1**arg2 + exponent = arg2 + IF (ALL(arg2 == exponent)) THEN + arg1 = arg1**exponent + ELSE + arg1 = arg1**arg2 + END IF CALL result_stack%push(arg1) DEALLOCATE (arg2) END SUBROUTINE stack_op_pow_eval_2D @@ -1072,9 +1084,15 @@ CONTAINS CLASS(t_op_pow), INTENT(INOUT) :: this CLASS(t_result_stack_3D), INTENT(INOUT) :: result_stack REAL(real_kind), DIMENSION(:, :, :), POINTER :: arg1, arg2 + INTEGER, DIMENSION(:, :, :), ALLOCATABLE :: exponent CALL result_stack%pop(arg2) CALL result_stack%pop(arg1) - arg1 = arg1**arg2 + exponent = arg2 + IF (ALL(arg2 == exponent)) THEN + arg1 = arg1**exponent + ELSE + arg1 = arg1**arg2 + END IF CALL result_stack%push(arg1) DEALLOCATE (arg2) END SUBROUTINE stack_op_pow_eval_3D