From 54e987c4ae2e607ae592dacb692a4accd5d8a75c Mon Sep 17 00:00:00 2001
From: Antoine Hoffmann <antoine.hoffmann@epfl.ch>
Date: Fri, 5 Aug 2022 17:54:38 +0200
Subject: [PATCH] Restart loads full checkpoint on every process, 10x faster on
 marconi

---
 src/restarts_mod.F90 | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/src/restarts_mod.F90 b/src/restarts_mod.F90
index 9d38ce98..0840222c 100644
--- a/src/restarts_mod.F90
+++ b/src/restarts_mod.F90
@@ -12,7 +12,7 @@ IMPLICIT NONE
 INTEGER :: rank, sz_, n_
 INTEGER :: dims(1) = (/0/)
 CHARACTER(LEN=50) :: dset_name
-INTEGER :: pmaxe_cp, jmaxe_cp, pmaxi_cp, jmaxi_cp, n0
+INTEGER :: pmaxe_cp, jmaxe_cp, pmaxi_cp, jmaxi_cp, n0, Nkx_cp, Nky_cp, Nz_cp
 COMPLEX(dp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: moments_e_cp
 COMPLEX(dp), DIMENSION(:,:,:,:,:), ALLOCATABLE :: moments_i_cp
 
@@ -25,9 +25,8 @@ CONTAINS
     !******************************************************************************!
     SUBROUTINE load_moments
         IMPLICIT NONE
-        REAL :: timer_tot_1, timer_find_CP_1, timer_load_mom_1
-        REAL :: timer_tot_2, timer_find_CP_2, timer_load_mom_2
-
+        REAL    :: timer_tot_1, timer_find_CP_1, timer_load_mom_1
+        REAL    :: timer_tot_2, timer_find_CP_2, timer_load_mom_2
         CALL cpu_time(timer_tot_1)
 
         ! Checkpoint filename
@@ -37,6 +36,9 @@ CONTAINS
         ! Open file
         CALL openf(rstfile, fidrst,mpicomm=comm0)
         ! Get the checkpoint moments degrees to allocate memory
+        CALL getatt(fidrst,"/data/input/" ,   "Nkx",   Nkx_cp)
+        CALL getatt(fidrst,"/data/input/" ,   "Nky",   Nky_cp)
+        CALL getatt(fidrst,"/data/input/" ,    "Nz",    Nz_cp)
         IF (KIN_E) THEN
         CALL getatt(fidrst,"/data/input/" , "pmaxe", pmaxe_cp)
         CALL getatt(fidrst,"/data/input/" , "jmaxe", jmaxe_cp)
@@ -78,12 +80,30 @@ CONTAINS
 
           CALL cpu_time(timer_load_mom_1)
           ! Read state of system from checkpoint file
+
+          ! Super slow futils routine in Marconi.... but spare RAM
+          ! IF (KIN_E) THEN
+          ! WRITE(dset_name, "(A, '/', i6.6)") "/data/var5d/moments_e", n_
+          ! CALL getarrnd(fidrst, dset_name, moments_e(ips_e:ipe_e, ijs_e:ije_e, ikys:ikye, ikxs:ikxe, izs:ize, 1),(/1,3,5/))
+          ! ENDIF
+          ! WRITE(dset_name, "(A, '/', i6.6)") "/data/var5d/moments_i", n_
+          ! CALL getarrnd(fidrst, dset_name, moments_i(ips_i:ipe_i, ijs_i:ije_i, ikys:ikye, ikxs:ikxe, izs:ize, 1),(/1,3,5/))
+
+          ! Brute force loading: load the full moments and take what is needed (RAM dangerous...)
           IF (KIN_E) THEN
-          WRITE(dset_name, "(A, '/', i6.6)") "/data/var5d/moments_e", n_
-          CALL getarrnd(fidrst, dset_name, moments_e(ips_e:ipe_e, ijs_e:ije_e, ikys:ikye, ikxs:ikxe, izs:ize, 1),(/1,3,5/))
+            CALL allocate_array(moments_e_cp,1,Nky_cp, 1,Nkx_cp, 1,Nz_cp, 1,pmaxe_cp+1, 1,jmaxe_cp+1)
+            WRITE(dset_name, "(A, '/', i6.6)") "/data/var5d/moments_e", n_
+            CALL getarr(fidrst, dset_name, moments_e_cp(:,:,:,:,:))
+            moments_e(ips_e:ipe_e, ijs_e:ije_e, ikys:ikye, ikxs:ikxe, izs:ize, 1) &
+            = moments_e_cp(ips_e:ipe_e, ijs_e:ije_e, ikys:ikye, ikxs:ikxe, izs:ize)
+            DEALLOCATE(moments_e_cp)
           ENDIF
+          CALL allocate_array(moments_i_cp, 1,pmaxi_cp+1, 1,jmaxi_cp+1, 1,Nky_cp, 1,Nkx_cp, 1,Nz_cp)
           WRITE(dset_name, "(A, '/', i6.6)") "/data/var5d/moments_i", n_
-          CALL getarrnd(fidrst, dset_name, moments_i(ips_i:ipe_i, ijs_i:ije_i, ikys:ikye, ikxs:ikxe, izs:ize, 1),(/1,3,5/))
+          CALL getarr(fidrst, dset_name, moments_i_cp(:,:,:,:,:))
+          moments_i(ips_i:ipe_i, ijs_i:ije_i, ikys:ikye, ikxs:ikxe, izs:ize, 1) &
+          = moments_i_cp(ips_i:ipe_i, ijs_i:ije_i, ikys:ikye, ikxs:ikxe, izs:ize)
+          DEALLOCATE(moments_i_cp)
 
           CALL closef(fidrst)
 
@@ -93,7 +113,7 @@ CONTAINS
         CALL cpu_time(timer_tot_2)
 
         CALL mpi_barrier(MPI_COMM_WORLD, ierr)
-        
+
         IF(my_id.EQ.0) WRITE(*,*) '** Time load mom : ', timer_load_mom_2 - timer_load_mom_1, ' **'
         IF(my_id.EQ.0) WRITE(*,*) '** Total load time : ', timer_tot_2 - timer_tot_1, ' **'
 
-- 
GitLab