In my CFD Solver, several extensive computations must be applied throughout the domain on each node depending on indices i, j, k, and l. The domain is 3-D and have a resolution of IMAX + 1 by JMAX + 1 by KMAX + 1.
My problem is about repetitive implementation of these very extensive blocks.
Which of the two following methods is more efficient and creates less processing load?
Method 1
MODULE module_of_method_1
IMPLICIT NONE
PRIVATE
INTEGER, PARAMETER, PUBLIC :: IMIN = 0 , &
IMAX = 1024, &
JMIN = 0 , &
JMAX = 1024, &
KMIN = 0 , &
KMAX = 1024, &
SITE = 32
CONTAINS
SUBROUTINE sub_1 ()
! very extentise bLock 1
END SUBROUTINE
SUBROUTINE sub_2 ()
! very extentise bLock 2
END SUBROUTINE
SUBROUTINE sub_3 ()
! very extentise bLock 3
END SUBROUTINE
END MODULE
PROGRAM driver_of_method_1
USE module_of_method_1
IMPLICIT NONE
INTEGER :: I, J, K, L
DO k = KMIN, KMAX
DO j = JMIN, JMAX
DO i = IMIN, IMAX
DO l = 0, SITE
SELECT CASE (case_expression(i, j, k, l))
CASE (case_selector_1)
CALL sub_1 ()
CASE (case_selector_2)
CALL sub_2 ()
CASE DEFAULT
CALL sub_3 ()
END SELECT
END DO
END DO
END DO
END DO
END PROGRAM
Method 2
MODULE module_of_method_2
IMPLICIT NONE
PRIVATE
INTEGER, PARAMETER :: IMIN = 0 , &
IMAX = 1024, &
JMIN = 0 , &
JMAX = 1024, &
KMIN = 0 , &
KMAX = 1024, &
SITE = 32
CONTAINS
SUBROUTINE only_one_subroutine ()
INTEGER :: I, J, K, L
DO k = KMIN, KMAX
DO j = JMIN, JMAX
DO i = IMIN, IMAX
DO l = 0, SITE
SELECT CASE (case_expression(i, j, k, l))
CASE (case_selector_1)
! very extentise bLock 1
CASE (case_selector_2)
! very extentise bLock 2
CASE DEFAULT
! very extentise bLock 3
END SELECT
END DO
END DO
END DO
END DO
END SUBROUTINE
END MODULE
PROGRAM program_of_method_2
USE module_of_method_2
IMPLICIT NONE
CALL only_one_subroutine ()
END PROGRAM
I prefer method 1, since it is a kind of top-down design with simpler debugging, developing, and maintenance, but I concern about processing load of this method.