heat_3d

3D structured heat update and checksum validation.

program main {
    int64 n = 24
    int64 steps = 12
    real64 u[n, n, n]
    real64 unew[n, n, n]
    int64 i = 0
    int64 j = 0
    int64 k = 0
    int64 step = 0

    do parallel i = 0, n - 1 {
        do j = 0, n - 1 {
            do k = 0, n - 1 {
                u[i, j, k] = 0.0
                unew[i, j, k] = 0.0
            }
        }
    }

    do parallel i = 0, n - 1 {
        do j = 0, n - 1 {
            u[i, j, 0] = 1.0
            u[i, j, n - 1] = 1.0
        }
    }
    do parallel i = 0, n - 1 {
        do k = 0, n - 1 {
            u[i, 0, k] = 1.0
            u[i, n - 1, k] = 1.0
        }
    }
    do j = 0, n - 1 {
        do k = 0, n - 1 {
            u[0, j, k] = 1.0
            u[n - 1, j, k] = 1.0
        }
    }

    do step = 0, steps - 1 {
        do parallel i = 1, n - 2 {
            do j = 1, n - 2 {
                do k = 1, n - 2 {
                    unew[i, j, k] = (u[i - 1, j, k] + u[i + 1, j, k] + u[i, j - 1, k] + u[i, j + 1, k] + u[i, j, k - 1] + u[i, j, k + 1]) / 6.0
                }
            }
        }

        do parallel i = 1, n - 2 {
            do j = 1, n - 2 {
                do k = 1, n - 2 {
                    u[i, j, k] = unew[i, j, k]
                }
            }
        }
    }

    real64 center = u[n / 2, n / 2, n / 2]
    real64 checksum = 0.0
    do i = 0, n - 1 {
        do j = 0, n - 1 {
            do k = 0, n - 1 {
                checksum = checksum + u[i, j, k]
            }
        }
    }

    string summary = "heat_3d center=" + to_string(center) + " checksum=" + to_string(checksum) + "\n"
    write_file("/tmp/tgfortran_heat_3d.txt", summary)
    print(center, checksum)
}