From fabb1c429d6d7d0e0716999cb41d3ddfb89f1f01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lorenz=20H=C3=BCdepohl?= <lorenz.huedepohl@rzg.mpg.de>
Date: Fri, 21 Jul 2017 12:06:18 +0200
Subject: [PATCH] Loop over all possible domain decompositions

We got reports from a user that there were troubles with certain domain
decompositions. So far the tests only looked at (approximately) square
decompositions in column-major process order.

Now, a new class of tests loops over all possible decompositions
(row * col) for a given number of total tasks.

So far, we can not confirm that there are any problems, all
possibilities work as expected.
---
 generate_automake_test_programs.py            | 21 ++++++-
 src/elpa_impl.F90                             |  2 +-
 .../legacy_complex_driver_c_version.c         |  4 +-
 .../legacy_real_driver_c_version.c            |  4 +-
 .../legacy_single_complex_driver_c_version.c  |  4 +-
 .../legacy_single_real_driver_c_version.c     |  4 +-
 .../legacy_complex_1stage_c_version.c         |  4 +-
 .../legacy_real_1stage_c_version.c            |  4 +-
 .../legacy_complex_2stage_c_version.c         |  4 +-
 .../legacy_real_2stage_c_version.c            |  4 +-
 test/C/test.c                                 |  4 +-
 .../legacy_complex_driver.F90                 |  4 +-
 .../legacy_interface/legacy_real_driver.F90   |  4 +-
 .../legacy_single_complex_driver.F90          |  4 +-
 .../legacy_single_real_driver.F90             |  4 +-
 .../elpa1/legacy_interface/legacy_complex.F90 |  4 +-
 .../legacy_complex_cholesky.F90               |  4 +-
 .../legacy_interface/legacy_complex_gpu.F90   |  4 +-
 .../legacy_complex_invert_trm.F90             |  4 +-
 .../legacy_complex_transp_multiply.F90        |  4 +-
 .../elpa1/legacy_interface/legacy_real.F90    |  4 +-
 .../legacy_interface/legacy_real_cholesky.F90 |  4 +-
 .../legacy_interface/legacy_real_gpu.F90      |  4 +-
 .../legacy_real_invert_trm.F90                |  4 +-
 .../legacy_real_transp_multiply.F90           |  4 +-
 .../legacy_single_complex.F90                 |  4 +-
 .../legacy_single_complex_cholesky.F90        |  4 +-
 .../legacy_single_complex_gpu.F90             |  4 +-
 .../legacy_single_complex_invert_trm.F90      |  4 +-
 .../legacy_single_complex_transp_multiply.F90 |  4 +-
 .../legacy_interface/legacy_single_real.F90   |  4 +-
 .../legacy_single_real_cholesky.F90           |  4 +-
 .../legacy_single_real_gpu.F90                |  4 +-
 .../legacy_single_real_invert_trm.F90         |  4 +-
 .../legacy_single_real_transp_multiply.F90    |  4 +-
 .../legacy_single_toeplitz.F90                |  4 +-
 .../legacy_interface/legacy_toeplitz.F90      |  4 +-
 test/Fortran/elpa2/complex_2stage_banded.F90  |  4 +-
 test/Fortran/elpa2/double_instance.F90        |  4 +-
 .../elpa2/legacy_interface/legacy_complex.F90 |  4 +-
 .../legacy_interface/legacy_complex_api.F90   |  4 +-
 .../legacy_complex_default_kernel.F90         |  4 +-
 .../legacy_interface/legacy_complex_gpu.F90   |  4 +-
 .../elpa2/legacy_interface/legacy_real.F90    |  4 +-
 .../legacy_interface/legacy_real_api.F90      |  4 +-
 .../legacy_real_default_kernel.F90            |  4 +-
 .../legacy_interface/legacy_real_gpu.F90      |  4 +-
 .../elpa2/legacy_interface/legacy_real_qr.F90 |  4 +-
 .../legacy_single_complex.F90                 |  4 +-
 .../legacy_single_complex_api.F90             |  4 +-
 .../legacy_single_complex_default_kernel.F90  |  4 +-
 .../legacy_single_complex_gpu.F90             |  4 +-
 .../legacy_interface/legacy_single_real.F90   |  4 +-
 .../legacy_single_real_api.F90                |  4 +-
 .../legacy_single_real_default_kernel.F90     |  4 +-
 .../legacy_single_real_gpu.F90                |  4 +-
 .../legacy_single_real_qr.F90                 |  4 +-
 test/Fortran/elpa2/real_2stage_banded.F90     |  4 +-
 .../elpa2/single_complex_2stage_banded.F90    |  4 +-
 .../elpa2/single_real_2stage_banded.F90       |  4 +-
 test/Fortran/test.F90                         | 39 ++++++++++---
 test/shared/test_blacs_infrastructure.F90     | 58 ++++++++++---------
 62 files changed, 196 insertions(+), 156 deletions(-)

diff --git a/generate_automake_test_programs.py b/generate_automake_test_programs.py
index 05c3e918..d86922a6 100755
--- a/generate_automake_test_programs.py
+++ b/generate_automake_test_programs.py
@@ -29,12 +29,19 @@ test_type_flag = {
         "solve_tridiagonal"  : "-D__SOLVE_TRIDIAGONAL",
 }
 
-for m, g, t, p, d, s in product(sorted(matrix_flag.keys()),
+layout_flag = {
+        "all_layouts" : "-DTEST_ALL_LAYOUTS",
+        "square" : ""
+}
+
+for m, g, t, p, d, s, l in product(
+                             sorted(matrix_flag.keys()),
                              sorted(gpu_flag.keys()),
                              sorted(test_type_flag.keys()),
                              sorted(prec_flag.keys()),
                              sorted(domain_flag.keys()),
-                             sorted(solver_flag.keys())):
+                             sorted(solver_flag.keys()),
+                             sorted(layout_flag.keys())):
 
     #todo: decide what tests we actually want
     if(m == "analytic" and (g == 1 or t != "eigenvectors" or p == "single" or d == "complex")):
@@ -59,6 +66,9 @@ for m, g, t, p, d, s in product(sorted(matrix_flag.keys()),
         elif kernel == "all_kernels":
             extra_flags.append("-DTEST_ALL_KERNELS")
 
+        if layout_flag[l]:
+            extra_flags.append(layout_flag[l])
+
         if (p == "single"):
             if (d == "real"):
                 print("if WANT_SINGLE_PRECISION_REAL")
@@ -68,7 +78,12 @@ for m, g, t, p, d, s in product(sorted(matrix_flag.keys()),
                 raise Exception("Oh no!")
             endifs += 1
 
-        name = "test_{0}_{1}_{2}_{3}{4}{5}{6}".format(d, p, t, s, "" if kernel == "nokernel" else "_" + kernel, "_gpu" if g else "", "_analytic" if m == "analytic" else "")
+        name = "test_{0}_{1}_{2}_{3}{4}{5}{6}{7}".format(
+                    d, p, t, s,
+                    "" if kernel == "nokernel" else "_" + kernel,
+                    "_gpu" if g else "",
+                    "_analytic" if m == "analytic" else "",
+                    "_all_layouts" if l == "all_layouts" else "")
         print("noinst_PROGRAMS += " + name)
         print("check_SCRIPTS += " + name + ".sh")
         print(name + "_SOURCES = test/Fortran/test.F90")
diff --git a/src/elpa_impl.F90 b/src/elpa_impl.F90
index 9a03d30e..14bd94be 100644
--- a/src/elpa_impl.F90
+++ b/src/elpa_impl.F90
@@ -1176,7 +1176,7 @@ module elpa_impl
     !> \param nrows_c               number of rows of local (sub) matrix c
     !> \param ncols_c               number of columns of local (sub) matrix c
     !> \param error                 optional argument, error code which can be queried with elpa_strerr
-    subroutine elpa_hermitian_multiply_d (self,uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
+    subroutine elpa_hermitian_multiply_d (self, uplo_a, uplo_c, ncb, a, b, nrows_b, ncols_b, &
                                           c, nrows_c, ncols_c, error)
       use iso_c_binding
       use elpa1_auxiliary_impl
diff --git a/test/C/driver/legacy_interface/legacy_complex_driver_c_version.c b/test/C/driver/legacy_interface/legacy_complex_driver_c_version.c
index 8adf9155..86c28f3b 100644
--- a/test/C/driver/legacy_interface/legacy_complex_driver_c_version.c
+++ b/test/C/driver/legacy_interface/legacy_complex_driver_c_version.c
@@ -66,7 +66,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -138,7 +138,7 @@ int main(int argc, char** argv) {
 #else
    my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/driver/legacy_interface/legacy_real_driver_c_version.c b/test/C/driver/legacy_interface/legacy_real_driver_c_version.c
index 1fe1bf69..60a1181b 100644
--- a/test/C/driver/legacy_interface/legacy_real_driver_c_version.c
+++ b/test/C/driver/legacy_interface/legacy_real_driver_c_version.c
@@ -65,7 +65,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -134,7 +134,7 @@ int main(int argc, char** argv) {
 #else
   my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/driver/legacy_interface/legacy_single_complex_driver_c_version.c b/test/C/driver/legacy_interface/legacy_single_complex_driver_c_version.c
index a062404f..4fbff052 100644
--- a/test/C/driver/legacy_interface/legacy_single_complex_driver_c_version.c
+++ b/test/C/driver/legacy_interface/legacy_single_complex_driver_c_version.c
@@ -66,7 +66,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -138,7 +138,7 @@ int main(int argc, char** argv) {
 #else
    my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/driver/legacy_interface/legacy_single_real_driver_c_version.c b/test/C/driver/legacy_interface/legacy_single_real_driver_c_version.c
index 2a43b67d..a21c71d9 100644
--- a/test/C/driver/legacy_interface/legacy_single_real_driver_c_version.c
+++ b/test/C/driver/legacy_interface/legacy_single_real_driver_c_version.c
@@ -65,7 +65,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -135,7 +135,7 @@ int main(int argc, char** argv) {
 #else
   my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/elpa1/legacy_interface/legacy_complex_1stage_c_version.c b/test/C/elpa1/legacy_interface/legacy_complex_1stage_c_version.c
index 9e999ccd..9e010bce 100644
--- a/test/C/elpa1/legacy_interface/legacy_complex_1stage_c_version.c
+++ b/test/C/elpa1/legacy_interface/legacy_complex_1stage_c_version.c
@@ -68,7 +68,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -151,7 +151,7 @@ int main(int argc, char** argv) {
 #else
    my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/elpa1/legacy_interface/legacy_real_1stage_c_version.c b/test/C/elpa1/legacy_interface/legacy_real_1stage_c_version.c
index 285a2df5..55144fc7 100644
--- a/test/C/elpa1/legacy_interface/legacy_real_1stage_c_version.c
+++ b/test/C/elpa1/legacy_interface/legacy_real_1stage_c_version.c
@@ -68,7 +68,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -143,7 +143,7 @@ int main(int argc, char** argv) {
 #ifdef WITH_MPI
    my_mpi_comm_world = MPI_Comm_c2f(MPI_COMM_WORLD);
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/elpa2/legacy_interface/legacy_complex_2stage_c_version.c b/test/C/elpa2/legacy_interface/legacy_complex_2stage_c_version.c
index b62d453c..b69a6b34 100644
--- a/test/C/elpa2/legacy_interface/legacy_complex_2stage_c_version.c
+++ b/test/C/elpa2/legacy_interface/legacy_complex_2stage_c_version.c
@@ -68,7 +68,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -148,7 +148,7 @@ int main(int argc, char** argv) {
 #else
    my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/elpa2/legacy_interface/legacy_real_2stage_c_version.c b/test/C/elpa2/legacy_interface/legacy_real_2stage_c_version.c
index 85286aea..941b90a2 100644
--- a/test/C/elpa2/legacy_interface/legacy_real_2stage_c_version.c
+++ b/test/C/elpa2/legacy_interface/legacy_real_2stage_c_version.c
@@ -67,7 +67,7 @@ int main(int argc, char** argv) {
 
    int np_cols, np_rows, np_colsStart;
 
-   int my_blacs_ctxt, nprow, npcol, my_prow, my_pcol;
+   int my_blacs_ctxt, my_prow, my_pcol;
 
    int mpierr;
 
@@ -143,7 +143,7 @@ int main(int argc, char** argv) {
 #else
   my_mpi_comm_world = 1;
 #endif
-   set_up_blacsgrid_f(my_mpi_comm_world, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(my_mpi_comm_world, np_rows, np_cols, 'C', &my_blacs_ctxt, &my_prow, &my_pcol);
 
    if (myid == 0) {
      printf("\n");
diff --git a/test/C/test.c b/test/C/test.c
index 2ecac859..c3f387a0 100644
--- a/test/C/test.c
+++ b/test/C/test.c
@@ -97,7 +97,7 @@ int main(int argc, char** argv) {
    int mpi_comm;
 
    /* blacs */
-   int my_blacs_ctxt, sc_desc[9], info, nprow, npcol;
+   int my_blacs_ctxt, sc_desc[9], info;
 
    /* The Matrix */
    MATRIX_TYPE *a, *as, *z;
@@ -136,7 +136,7 @@ int main(int argc, char** argv) {
 #else
    mpi_comm = 0;
 #endif
-   set_up_blacsgrid_f(mpi_comm, &my_blacs_ctxt, &np_rows, &np_cols, &nprow, &npcol, &my_prow, &my_pcol);
+   set_up_blacsgrid_f(mpi_comm, np_rows, np_cols, &my_blacs_ctxt, &my_prow, &my_pcol);
    set_up_blacs_descriptor_f(na, nblk, my_prow, my_pcol, np_rows, np_cols, &na_rows, &na_cols, sc_desc, my_blacs_ctxt, &info);
 
    /* allocate the matrices needed for elpa */
diff --git a/test/Fortran/driver/legacy_interface/legacy_complex_driver.F90 b/test/Fortran/driver/legacy_interface/legacy_complex_driver.F90
index 4fc55f26..ff3abc7b 100644
--- a/test/Fortran/driver/legacy_interface/legacy_complex_driver.F90
+++ b/test/Fortran/driver/legacy_interface/legacy_complex_driver.F90
@@ -166,8 +166,8 @@ program test_complex2
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/driver/legacy_interface/legacy_real_driver.F90 b/test/Fortran/driver/legacy_interface/legacy_real_driver.F90
index f096cc37..1f5a51a2 100644
--- a/test/Fortran/driver/legacy_interface/legacy_real_driver.F90
+++ b/test/Fortran/driver/legacy_interface/legacy_real_driver.F90
@@ -165,8 +165,8 @@ program test_real2
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/driver/legacy_interface/legacy_single_complex_driver.F90 b/test/Fortran/driver/legacy_interface/legacy_single_complex_driver.F90
index fccbbdcb..8749eed9 100644
--- a/test/Fortran/driver/legacy_interface/legacy_single_complex_driver.F90
+++ b/test/Fortran/driver/legacy_interface/legacy_single_complex_driver.F90
@@ -166,8 +166,8 @@ program test_complex2
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/driver/legacy_interface/legacy_single_real_driver.F90 b/test/Fortran/driver/legacy_interface/legacy_single_real_driver.F90
index 72ca5dd8..123df6eb 100644
--- a/test/Fortran/driver/legacy_interface/legacy_single_real_driver.F90
+++ b/test/Fortran/driver/legacy_interface/legacy_single_real_driver.F90
@@ -165,8 +165,8 @@ program test_real2
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_complex.F90 b/test/Fortran/elpa1/legacy_interface/legacy_complex.F90
index c9d05e65..df8383f8 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_complex.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_complex.F90
@@ -174,8 +174,8 @@ program test_complex_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_complex_cholesky.F90 b/test/Fortran/elpa1/legacy_interface/legacy_complex_cholesky.F90
index 1f4bf185..807c545d 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_complex_cholesky.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_complex_cholesky.F90
@@ -138,8 +138,8 @@ program test_cholesky
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_complex_gpu.F90 b/test/Fortran/elpa1/legacy_interface/legacy_complex_gpu.F90
index 91326aaf..7f4b018d 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_complex_gpu.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_complex_gpu.F90
@@ -173,8 +173,8 @@ program test_complex_gpu_version_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_complex_invert_trm.F90 b/test/Fortran/elpa1/legacy_interface/legacy_complex_invert_trm.F90
index 6f1ef010..9f4827f9 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_complex_invert_trm.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_complex_invert_trm.F90
@@ -138,8 +138,8 @@ program test_invert_trm
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_complex_transp_multiply.F90 b/test/Fortran/elpa1/legacy_interface/legacy_complex_transp_multiply.F90
index a1148162..a2929e1f 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_complex_transp_multiply.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_complex_transp_multiply.F90
@@ -132,8 +132,8 @@ program test_transpose_multiply
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_real.F90 b/test/Fortran/elpa1/legacy_interface/legacy_real.F90
index 52ca04ae..8bf6bec9 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_real.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_real.F90
@@ -170,8 +170,8 @@ program test_real_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_real_cholesky.F90 b/test/Fortran/elpa1/legacy_interface/legacy_real_cholesky.F90
index 226e3d06..50f41b9c 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_real_cholesky.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_real_cholesky.F90
@@ -135,8 +135,8 @@ program test_cholesky
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_real_gpu.F90 b/test/Fortran/elpa1/legacy_interface/legacy_real_gpu.F90
index 8a62cf26..4d58f3bf 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_real_gpu.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_real_gpu.F90
@@ -170,8 +170,8 @@ program test_real_gpu_version_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_real_invert_trm.F90 b/test/Fortran/elpa1/legacy_interface/legacy_real_invert_trm.F90
index 7c35b718..c2dc767a 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_real_invert_trm.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_real_invert_trm.F90
@@ -135,8 +135,8 @@ program test_invert_trm
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_real_transp_multiply.F90 b/test/Fortran/elpa1/legacy_interface/legacy_real_transp_multiply.F90
index d145257f..d55815c9 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_real_transp_multiply.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_real_transp_multiply.F90
@@ -131,8 +131,8 @@ program test_transpose_multiply
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_complex.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_complex.F90
index b2a55b66..a47a03ce 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_complex.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_complex.F90
@@ -174,8 +174,8 @@ program test_complex_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_cholesky.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_cholesky.F90
index 2d16581f..b8e0f59c 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_cholesky.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_cholesky.F90
@@ -138,8 +138,8 @@ program test_cholesky
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_gpu.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_gpu.F90
index 869fa833..b0801b4d 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_gpu.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_gpu.F90
@@ -173,8 +173,8 @@ program test_complex_gpu_version_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_invert_trm.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_invert_trm.F90
index 1f83621c..d621a5f6 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_invert_trm.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_invert_trm.F90
@@ -138,8 +138,8 @@ program test_invert_trm
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_transp_multiply.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_transp_multiply.F90
index 60accf85..e30413cc 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_complex_transp_multiply.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_complex_transp_multiply.F90
@@ -132,8 +132,8 @@ program test_transpose_multiply
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_real.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_real.F90
index 796e0cbf..a3488998 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_real.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_real.F90
@@ -170,8 +170,8 @@ program test_real_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_real_cholesky.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_real_cholesky.F90
index 434a0020..6f7d8e09 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_real_cholesky.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_real_cholesky.F90
@@ -135,8 +135,8 @@ program test_cholesky
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_real_gpu.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_real_gpu.F90
index dc74d58f..3169e59a 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_real_gpu.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_real_gpu.F90
@@ -170,8 +170,8 @@ program test_real_gpu_version_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_real_invert_trm.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_real_invert_trm.F90
index cfc983ee..23ddeb8e 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_real_invert_trm.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_real_invert_trm.F90
@@ -135,8 +135,8 @@ program test_invert_trm
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_real_transp_multiply.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_real_transp_multiply.F90
index c5801aaf..fb8a8416 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_real_transp_multiply.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_real_transp_multiply.F90
@@ -132,8 +132,8 @@ program test_transpose_multiply
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_single_toeplitz.F90 b/test/Fortran/elpa1/legacy_interface/legacy_single_toeplitz.F90
index 112e0837..78143e42 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_single_toeplitz.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_single_toeplitz.F90
@@ -153,8 +153,8 @@ program test_solve_tridi_single
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa1/legacy_interface/legacy_toeplitz.F90 b/test/Fortran/elpa1/legacy_interface/legacy_toeplitz.F90
index 3f64bff3..37276cde 100644
--- a/test/Fortran/elpa1/legacy_interface/legacy_toeplitz.F90
+++ b/test/Fortran/elpa1/legacy_interface/legacy_toeplitz.F90
@@ -152,8 +152,8 @@ program test_solve_tridi
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/complex_2stage_banded.F90 b/test/Fortran/elpa2/complex_2stage_banded.F90
index 93d90cf4..79862f0c 100644
--- a/test/Fortran/elpa2/complex_2stage_banded.F90
+++ b/test/Fortran/elpa2/complex_2stage_banded.F90
@@ -171,8 +171,8 @@ program test_complex2_double_banded
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/double_instance.F90 b/test/Fortran/elpa2/double_instance.F90
index fe3a1153..9cb615b9 100644
--- a/test/Fortran/elpa2/double_instance.F90
+++ b/test/Fortran/elpa2/double_instance.F90
@@ -102,8 +102,8 @@ program test_interface
    my_prow = mod(myid, np_cols)
    my_pcol = myid / np_cols
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    call set_up_blacs_descriptor(na, nblk, my_prow, my_pcol, np_rows, np_cols, &
                                 na_rows, na_cols, sc_desc, my_blacs_ctxt, info)
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_complex.F90 b/test/Fortran/elpa2/legacy_interface/legacy_complex.F90
index 2e8c74b0..c090095a 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_complex.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_complex.F90
@@ -178,8 +178,8 @@ program test_complex2_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_complex_api.F90 b/test/Fortran/elpa2/legacy_interface/legacy_complex_api.F90
index 4523d80c..0503f60f 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_complex_api.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_complex_api.F90
@@ -248,8 +248,8 @@ program test_complex2_choose_kernel_with_api_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_complex_default_kernel.F90 b/test/Fortran/elpa2/legacy_interface/legacy_complex_default_kernel.F90
index b519b127..75fffca6 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_complex_default_kernel.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_complex_default_kernel.F90
@@ -195,8 +195,8 @@ program test_complex2_default_kernel_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_complex_gpu.F90 b/test/Fortran/elpa2/legacy_interface/legacy_complex_gpu.F90
index c081688c..05cb0fde 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_complex_gpu.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_complex_gpu.F90
@@ -191,8 +191,8 @@ program test_complex2_gpu_version_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_real.F90 b/test/Fortran/elpa2/legacy_interface/legacy_real.F90
index 8abf6d1f..db6c46e1 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_real.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_real.F90
@@ -173,8 +173,8 @@ program test_real2_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_real_api.F90 b/test/Fortran/elpa2/legacy_interface/legacy_real_api.F90
index 83d32596..7db71744 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_real_api.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_real_api.F90
@@ -257,8 +257,8 @@ program test_real2_choose_kernel_with_api_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_real_default_kernel.F90 b/test/Fortran/elpa2/legacy_interface/legacy_real_default_kernel.F90
index 9d240a2c..2172742f 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_real_default_kernel.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_real_default_kernel.F90
@@ -189,8 +189,8 @@ program test_real2_default_kernel_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_real_gpu.F90 b/test/Fortran/elpa2/legacy_interface/legacy_real_gpu.F90
index 3f5e4b57..cdd7790a 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_real_gpu.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_real_gpu.F90
@@ -191,8 +191,8 @@ program test_real2_gpu_version_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_real_qr.F90 b/test/Fortran/elpa2/legacy_interface/legacy_real_qr.F90
index bdfe9523..ce23e417 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_real_qr.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_real_qr.F90
@@ -231,8 +231,8 @@ program test_real2_default_kernel_qr_decomposition_double_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_complex.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_complex.F90
index e75a3f69..5a23baaf 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_complex.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_complex.F90
@@ -178,8 +178,8 @@ program test_complex2_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_api.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_api.F90
index 24789189..4baf8d2d 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_api.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_api.F90
@@ -247,8 +247,8 @@ program test_complex2_choose_kernel_with_api_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_default_kernel.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_default_kernel.F90
index 7f21963c..7d5d996a 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_default_kernel.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_default_kernel.F90
@@ -193,8 +193,8 @@ program test_complex2_default_kernel_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_gpu.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_gpu.F90
index 145f688a..587ea020 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_complex_gpu.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_complex_gpu.F90
@@ -190,8 +190,8 @@ program test_complex2_gpu_version_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_real.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_real.F90
index 182706b0..f6b5fea6 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_real.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_real.F90
@@ -173,8 +173,8 @@ program test_real2_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_real_api.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_real_api.F90
index 416ef57c..6ceeea20 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_real_api.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_real_api.F90
@@ -255,8 +255,8 @@ program test_real2_choose_kernel_with_api_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_real_default_kernel.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_real_default_kernel.F90
index fae37710..e16130ba 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_real_default_kernel.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_real_default_kernel.F90
@@ -189,8 +189,8 @@ program test_real2_default_kernel_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_real_gpu.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_real_gpu.F90
index 57bad615..0944d759 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_real_gpu.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_real_gpu.F90
@@ -191,8 +191,8 @@ program test_real2_gpu_version_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/legacy_interface/legacy_single_real_qr.F90 b/test/Fortran/elpa2/legacy_interface/legacy_single_real_qr.F90
index a8fcb6db..7d3ac375 100644
--- a/test/Fortran/elpa2/legacy_interface/legacy_single_real_qr.F90
+++ b/test/Fortran/elpa2/legacy_interface/legacy_single_real_qr.F90
@@ -235,8 +235,8 @@ program test_real2_default_kernel_qr_decomposition_single_precision
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/real_2stage_banded.F90 b/test/Fortran/elpa2/real_2stage_banded.F90
index 1b1dd05c..850182a3 100644
--- a/test/Fortran/elpa2/real_2stage_banded.F90
+++ b/test/Fortran/elpa2/real_2stage_banded.F90
@@ -169,8 +169,8 @@ program test_real2_double_banded
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/single_complex_2stage_banded.F90 b/test/Fortran/elpa2/single_complex_2stage_banded.F90
index 9f2cd0c1..ed974eaa 100644
--- a/test/Fortran/elpa2/single_complex_2stage_banded.F90
+++ b/test/Fortran/elpa2/single_complex_2stage_banded.F90
@@ -171,8 +171,8 @@ program test_complex2_single_banded
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/elpa2/single_real_2stage_banded.F90 b/test/Fortran/elpa2/single_real_2stage_banded.F90
index 21d758d5..18355557 100644
--- a/test/Fortran/elpa2/single_real_2stage_banded.F90
+++ b/test/Fortran/elpa2/single_real_2stage_banded.F90
@@ -168,8 +168,8 @@ program test_real2_single_banded
    ! consistent (i.e. 0<=my_prow<np_rows, 0<=my_pcol<np_cols and every
    ! process has a unique (my_prow,my_pcol) pair).
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, 'C', &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    if (myid==0) then
      print '(a)','| Past BLACS_Gridinfo.'
diff --git a/test/Fortran/test.F90 b/test/Fortran/test.F90
index addbabc6..167607dd 100644
--- a/test/Fortran/test.F90
+++ b/test/Fortran/test.F90
@@ -145,8 +145,13 @@ program test
    class(elpa_t), pointer :: e
 #ifdef TEST_ALL_KERNELS
    integer :: i
+#endif
+#ifdef TEST_ALL_LAYOUTS
+   character(len=1), parameter :: layouts(2) = [ 'C', 'R' ]
+   integer :: i_layout
 #endif
    integer :: kernel
+   character(len=1) :: layout
 
 #if defined(TEST_COMPLEX) && defined(__SOLVE_TRIDIAGONAL)
 #ifdef WITH_MPI
@@ -158,11 +163,27 @@ program test
 
    call setup_mpi(myid, nprocs)
 
+   if (elpa_init(CURRENT_API_VERSION) /= ELPA_OK) then
+     print *, "ELPA API version not supported"
+     stop 1
+   endif
+
+#ifdef TEST_ALL_LAYOUTS
+   do i_layout = 1, size(layouts)               ! layout loop
+     layout = layouts(i_layout)
+     do np_cols = 1, nprocs                     ! factor loop
+       if (mod(nprocs,np_cols) /= 0 ) then
+         cycle
+       endif
+#else
+   layout = 'C'
    do np_cols = NINT(SQRT(REAL(nprocs))),2,-1
       if(mod(nprocs,np_cols) == 0 ) exit
    enddo
+#endif
 
    np_rows = nprocs/np_cols
+   assert(nprocs == np_rows * np_cols)
 
    if (myid == 0) then
      print '((a,i0))', 'Matrix size: ', na
@@ -170,11 +191,12 @@ program test
      print '((a,i0))', 'Blocksize: ', nblk
      print '((a,i0))', 'Num MPI proc: ', nprocs
      print '(3(a,i0))','Number of processor rows=',np_rows,', cols=',np_cols,', total=',nprocs
+     print '(a)',      'Process layout: ' // layout
      print *,''
    endif
 
-   call set_up_blacsgrid(mpi_comm_world, my_blacs_ctxt, np_rows, np_cols, &
-                         nprow, npcol, my_prow, my_pcol)
+   call set_up_blacsgrid(mpi_comm_world, np_rows, np_cols, layout, &
+                         my_blacs_ctxt, my_prow, my_pcol)
 
    call set_up_blacs_descriptor(na, nblk, my_prow, my_pcol, np_rows, np_cols, &
                                 na_rows, na_cols, sc_desc, my_blacs_ctxt, info)
@@ -218,11 +240,6 @@ program test
                                 np_cols, my_prow, my_pcol)
 #endif
 
-   if (elpa_init(CURRENT_API_VERSION) /= ELPA_OK) then
-     print *, "ELPA API version not supported"
-     stop 1
-   endif
-
    e => elpa_allocate()
 
    call e%set("na", na, error)
@@ -382,7 +399,6 @@ program test
 #endif
 
    call elpa_deallocate(e)
-   call elpa_uninit()
 
    deallocate(a)
 #ifdef TEST_MATRIX_RANDOM
@@ -397,6 +413,13 @@ program test
    deallocate(ev_analytic)
 #endif
 
+#ifdef TEST_ALL_LAYOUTS
+   end do ! factors
+   end do ! layouts
+#endif
+
+   call elpa_uninit()
+
 #ifdef WITH_MPI
    call blacs_gridexit(my_blacs_ctxt)
    call mpi_finalize(mpierr)
diff --git a/test/shared/test_blacs_infrastructure.F90 b/test/shared/test_blacs_infrastructure.F90
index 9cb7ba5e..ac52dbbd 100644
--- a/test/shared/test_blacs_infrastructure.F90
+++ b/test/shared/test_blacs_infrastructure.F90
@@ -45,44 +45,45 @@ module test_blacs_infrastructure
 
   contains
 
-    subroutine set_up_blacsgrid(mpi_comm_parent, my_blacs_ctxt, np_rows, &
-                                np_cols, nprow, npcol, my_prow, my_pcol)
+    !c> void set_up_blacsgrid_f(int mpi_comm_parent, int np_rows, int np_cols, char layout,
+    !c>                         int* my_blacs_ctxt, int *my_prow, int *my_pcol);
+    subroutine set_up_blacsgrid(mpi_comm_parent, np_rows, np_cols, layout, &
+                                my_blacs_ctxt, my_prow, my_pcol) bind(C, name="set_up_blacsgrid_f")
 
       use test_util
 
       implicit none
-      integer(kind=ik), intent(in)     :: mpi_comm_parent
-      integer(kind=ik), intent(inout)  :: my_blacs_ctxt, np_rows, &
-                                          np_cols, nprow, npcol, my_prow, my_pcol
+      integer(kind=c_int), intent(in), value  :: mpi_comm_parent, np_rows, np_cols
+      character(len=1), intent(in), value     :: layout
+      integer(kind=c_int), intent(out)        :: my_blacs_ctxt, my_prow, my_pcol
+
+#ifdef WITH_MPI
+      integer :: np_rows_, np_cols_
+#endif
+
+      if (layout /= 'R' .and. layout /= 'C') then
+        print *, "layout must be 'R' or 'C'"
+        stop 1
+      end if
 
       my_blacs_ctxt = mpi_comm_parent
 #ifdef WITH_MPI
-      call BLACS_Gridinit(my_blacs_ctxt, 'C', np_rows, np_cols)
-      call BLACS_Gridinfo(my_blacs_ctxt, nprow, npcol, my_prow, my_pcol)
+      call BLACS_Gridinit(my_blacs_ctxt, layout, np_rows, np_cols)
+      call BLACS_Gridinfo(my_blacs_ctxt, np_rows_, np_cols_, my_prow, my_pcol)
+      if (np_rows /= np_rows_) then
+        print *, "BLACS_Gridinfo returned different values for np_rows as set by BLACS_Gridinit"
+        stop 1
+      endif
+      if (np_cols /= np_cols_) then
+        print *, "BLACS_Gridinfo returned different values for np_cols as set by BLACS_Gridinit"
+        stop 1
+      endif
 #else
-      np_rows = 1
-      np_cols = 1
       my_prow = 0
       my_pcol = 0
 #endif
     end subroutine
 
-    !c> void set_up_blacsgrid_f(int mpi_comm_parent, int* my_blacs_ctxt,
-    !c>                         int *np_rows, int *np_cols, int *nprow, int *npcol,
-    !c>                         int *my_prow, int *my_pcol);
-    subroutine set_up_blacsgrid_f(mpi_comm_parent, my_blacs_ctxt, np_rows,  &
-                                  np_cols, nprow, npcol, my_prow, my_pcol) &
-                                  bind(C, name="set_up_blacsgrid_f")
-      use iso_c_binding
-      implicit none
-      integer(kind=c_int), value :: mpi_comm_parent
-      integer(kind=c_int)        :: my_blacs_ctxt, np_rows, &
-                                    np_cols, nprow, npcol, my_prow, my_pcol
-
-      call set_up_blacsgrid(mpi_comm_parent, my_blacs_ctxt, np_rows, &
-                                np_cols, nprow, npcol, my_prow, my_pcol)
-    end subroutine
-
     subroutine set_up_blacs_descriptor(na, nblk, my_prow, my_pcol, &
                                        np_rows, np_cols, na_rows,  &
                                        na_cols, sc_desc, my_blacs_ctxt, info)
@@ -91,9 +92,10 @@ module test_blacs_infrastructure
       use test_util
       implicit none
 
-      integer(kind=ik), intent(inout)  :: na, nblk, my_prow, my_pcol, np_rows,   &
-                                          np_cols, na_rows, na_cols, sc_desc(1:9), &
-                                          my_blacs_ctxt, info
+      integer(kind=ik), intent(in)  :: na, nblk, my_prow, my_pcol, np_rows,   &
+                                       np_cols, &
+                                       my_blacs_ctxt, info
+      integer(kind=ik), intent(out)  :: na_rows, na_cols, sc_desc(1:9)
 #ifdef WITH_MPI
       integer(kind=ik), external       :: numroc
       integer(kind=ik)                 :: mpierr
-- 
GitLab