Skip to content
Snippets Groups Projects
Commit fa081320 authored by Yen-Chen Chen's avatar Yen-Chen Chen Committed by Jonas Jucker
Browse files

Add tests for mo_expression (!71)

## What is the new feature
Add tests
## How is it implemented
Add tests in `mo_expression` and the test coverage badge has officially turned yellow. :tada:



Merged-by: default avatarJonas Jucker <jonas.jucker@env.ethz.ch>
Changelog: feature
parent a106e11a
No related branches found
No related tags found
1 merge request!71Add tests for mo_expression
Pipeline #63473 passed
......@@ -18,7 +18,7 @@ CONTAINS
SUBROUTINE TEST_expression_simple
TYPE(expression) :: formula
REAL(wp), TARGET :: val
REAL(wp), TARGET :: val, x
REAL(wp), POINTER :: ptr_val
REAL(wp) :: ref
......@@ -48,6 +48,258 @@ CONTAINS
CALL formula%evaluate(ptr_val)
CALL ASSERT_ALMOST_EQUAL(val, ref)
CALL TAG_TEST("TEST_exp_erf")
formula = expression("exp(1.) + erf(0.76)")
ref = EXP(1.) + ERF(0.76)
CALL formula%evaluate(ptr_val)
CALL ASSERT_ALMOST_EQUAL(val, ref)
CALL TAG_TEST("TEST_max")
formula = expression("max(1., 0.)")
ref = 1._wp
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(val, ref)
CALL TAG_TEST("TEST_min")
formula = expression("min(1., 0.)")
ref = 0._wp
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(val, ref)
CALL TAG_TEST("TEST_gt")
formula = expression("if(1 > 0, 1, 0)")
ref = 1._wp
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(val, ref)
CALL TAG_TEST("TEST_lt")
formula = expression("if(1 < 0, 1, 0)")
ref = 0._wp
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(val, ref)
CALL TAG_TEST("TEST_sqrt")
formula = expression("sqrt(2.) + sqrt(3.)")
ref = SQRT(2._wp) + SQRT(3._wp)
CALL formula%evaluate(ptr_val)
CALL ASSERT_ALMOST_EQUAL(val, ref)
CALL TAG_TEST("TEST_link")
CALL RANDOM_NUMBER(x)
formula = expression("[x]")
CALL formula%link("x", x)
CALL formula%evaluate(ptr_val)
CALL ASSERT_ALMOST_EQUAL(val, x)
END SUBROUTINE
SUBROUTINE TEST_expression_2D()
REAL(wp), PARAMETER :: TOL = 5.e-6
TYPE(expression) :: formula
REAL(wp), TARGET :: val(5, 5)
REAL(wp), POINTER :: ptr_val(:, :)
REAL(wp), TARGET :: x(5, 5), y(5, 5), z(5, 5)
REAL(wp) :: ref(5, 5)
LOGICAL :: logl(5, 5)
ptr_val => val
CALL RANDOM_NUMBER(x)
CALL RANDOM_NUMBER(y)
CALL RANDOM_NUMBER(z)
CALL TAG_TEST("TEST_plus_minus_2D")
formula = expression("[x] - [y] + [z]")
CALL formula%link("x", x)
CALL formula%link("y", y)
CALL formula%link("z", z)
ref = x - y + z
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_arithmetic_2D")
formula = expression("[x] * 10 + [y] / 5 - [z]")
CALL formula%link("x", x)
CALL formula%link("y", y)
CALL formula%link("z", z)
ref = x*10 + y/5 - z
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_log_pow_2D")
formula = expression("log([x]) ^ 2")
CALL formula%link("x", x)
ref = LOG(x)**2
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_exp_erf_2D")
formula = expression("exp([x]) + erf([y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = EXP(x) + ERF(y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_sin_cos_2D")
formula = expression("sin([x]) + cos([y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = SIN(x) + COS(y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_sqrt_2D")
formula = expression("sqrt([x])")
CALL formula%link("x", x)
ref = SQRT(x)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_max_2D")
formula = expression("max([x] - 0.5, 0)")
CALL formula%link("x", x)
ref = MAX(x - 0.5_wp, 0.0_wp)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_min_2D")
formula = expression("min([x], [y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = MIN(x, y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_gt_2D")
formula = expression("[x] > 0.5")
CALL formula%link("x", x)
ref = REAL(ABS(FLOOR(0.5_wp - x)), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_lt_2D")
formula = expression("[x] < 0.3")
CALL formula%link("x", x)
ref = REAL(1 + FLOOR(0.3_wp - x), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_if_2D")
formula = expression("if([x] > [y], 1.0, 0.0)")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = REAL(ABS(FLOOR(y - x)), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL formula%finalize()
END SUBROUTINE
SUBROUTINE TEST_expression_3D()
REAL(wp), PARAMETER :: TOL = 5.e-6
TYPE(expression) :: formula
REAL(wp), TARGET :: val(3, 3, 3)
REAL(wp), POINTER :: ptr_val(:, :, :)
REAL(wp), TARGET :: x(3, 3, 3), y(3, 3, 3), z(3, 3, 3)
REAL(wp) :: ref(3, 3, 3)
ptr_val => val
CALL RANDOM_NUMBER(x)
CALL RANDOM_NUMBER(y)
CALL RANDOM_NUMBER(z)
CALL TAG_TEST("TEST_plus_minus_3D")
formula = expression("[x] - [y] + [z]")
CALL formula%link("x", x)
CALL formula%link("y", y)
CALL formula%link("z", z)
ref = x - y + z
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_arithmetic_3D")
formula = expression("[x] * 10 + [y] / 5 - [z]")
CALL formula%link("x", x)
CALL formula%link("y", y)
CALL formula%link("z", z)
ref = x*10 + y/5 - z
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_log_pow_3D")
formula = expression("log([x]) ^ 2")
CALL formula%link("x", x)
ref = LOG(x)**2
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_exp_erf_3D")
formula = expression("exp([x]) + erf([y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = EXP(x) + ERF(y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_sin_cos_3D")
formula = expression("sin([x]) + cos([y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = SIN(x) + COS(y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_sqrt_3D")
formula = expression("sqrt([x])")
CALL formula%link("x", x)
ref = SQRT(x)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_max_3D")
formula = expression("max([x] - 0.5, 0)")
CALL formula%link("x", x)
ref = MAX(x - 0.5_wp, 0.0_wp)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_min_3D")
formula = expression("min([x], [y])")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = MIN(x, y)
CALL formula%evaluate(ptr_val)
CALL ASSERT_GREATER_THAN(TOL, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_gt_3D")
formula = expression("[x] > 0.5")
CALL formula%link("x", x)
ref = REAL(ABS(FLOOR(0.5_wp - x)), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_lt_3D")
formula = expression("[x] < 0.3")
CALL formula%link("x", x)
ref = REAL(1 + FLOOR(0.3_wp - x), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL TAG_TEST("TEST_if_3D")
formula = expression("if([x] > [y], 1.0, 0.0)")
CALL formula%link("x", x)
CALL formula%link("y", y)
ref = REAL(ABS(FLOOR(y - x)), KIND(REAL(wp)))
CALL formula%evaluate(ptr_val)
CALL ASSERT_EQUAL(0.0_wp, MAXVAL(ABS(val - ref)))
CALL formula%finalize()
END SUBROUTINE
SUBROUTINE TEST_expression_complex()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment