From 309f3e6f44fb98c276f73a398b8bbfbcc7b5c531 Mon Sep 17 00:00:00 2001
From: Yen-Chen Chen <yen-chen.chen@kit.edu>
Date: Thu, 28 Dec 2023 16:58:37 +0100
Subject: [PATCH] Fix power expression error for NAG compiler

---
 src/mo_expression.F90 | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/mo_expression.F90 b/src/mo_expression.F90
index e826523..6d9d296 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
-- 
GitLab