From 8236765d977c388b5f6fc16dd166cb330516131e Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Tue, 15 Dec 2020 14:25:25 +0100
Subject: [PATCH] Add a intern wallclock runtime end condition to avoid
 enforced slurm end

---
 matlab/write_fort90.m |  4 +---
 src/basic_mod.F90     |  3 ++-
 src/control.F90       |  4 ++--
 src/tesend.F90        | 11 +++++++++++
 4 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/matlab/write_fort90.m b/matlab/write_fort90.m
index f6d04f34..9986b020 100644
--- a/matlab/write_fort90.m
+++ b/matlab/write_fort90.m
@@ -8,6 +8,7 @@ fprintf(fid,['  nrun   = ', num2str(BASIC.nrun),'\n']);
 fprintf(fid,['  dt     = ', num2str(BASIC.dt),'\n']);
 fprintf(fid,['  tmax   = ', num2str(BASIC.tmax),'\n']);
 fprintf(fid,['  RESTART = ', num2str(BASIC.RESTART),'\n']);
+fprintf(fid,['  maxruntime = ', num2str(BASIC.maxruntime),'\n']);
 fprintf(fid,'/\n');
 
 fprintf(fid,'&GRID\n');
@@ -20,7 +21,6 @@ fprintf(fid,['  Lr = ', num2str(GRID.Lr),'\n']);
 fprintf(fid,['  Nz   = ', num2str(GRID.Nz),'\n']);
 fprintf(fid,['  Lz = ', num2str(GRID.Lz),'\n']);
 fprintf(fid,['  kpar = ', num2str(GRID.kpar),'\n']);
-fprintf(fid,['  CANCEL_ODD_P = ', num2str(GRID.CANCEL_ODD_P),'\n']);
 fprintf(fid,'/\n');
 
 fprintf(fid,'&OUTPUT_PAR\n');
@@ -56,8 +56,6 @@ fprintf(fid,['  eta_n   = ', num2str(MODEL.eta_n),'\n']);
 fprintf(fid,['  eta_T   = ', num2str(MODEL.eta_T),'\n']);
 fprintf(fid,['  eta_B   = ', num2str(MODEL.eta_B),'\n']);
 fprintf(fid,['  lambdaD = ', num2str(MODEL.lambdaD),'\n']);
-fprintf(fid,['  kr0KH   = ', num2str(MODEL.kr0KH),'\n']);
-fprintf(fid,['  A0KH    = ', num2str(MODEL.A0KH),'\n']);
 fprintf(fid,'/\n');
 
 fprintf(fid,'&INITIAL_CON\n');
diff --git a/src/basic_mod.F90 b/src/basic_mod.F90
index 494679bd..6cf33393 100644
--- a/src/basic_mod.F90
+++ b/src/basic_mod.F90
@@ -35,6 +35,7 @@ MODULE basic
   real(dp) :: t0_rhs, t0_adv_field, t0_poisson, t0_Sapj, t0_diag, t0_checkfield, t0_step
   real(dp) :: t1_rhs, t1_adv_field, t1_poisson, t1_Sapj, t1_diag, t1_checkfield, t1_step
   real(dp) :: tc_rhs, tc_adv_field, tc_poisson, tc_Sapj, tc_diag, tc_checkfield, tc_step
+  real(dp):: maxruntime = 1e9 ! Maximum simulation CPU time
 
   INTERFACE allocate_array
     MODULE PROCEDURE allocate_array_dp1,allocate_array_dp2,allocate_array_dp3,allocate_array_dp4
@@ -52,7 +53,7 @@ CONTAINS
     use prec_const
     IMPLICIT NONE
 
-    NAMELIST /BASIC/  nrun, dt, tmax, RESTART
+    NAMELIST /BASIC/  nrun, dt, tmax, RESTART, maxruntime
 
     READ(lu_in,basic)
 
diff --git a/src/control.F90 b/src/control.F90
index 4522733f..394fe61e 100644
--- a/src/control.F90
+++ b/src/control.F90
@@ -48,7 +48,7 @@ SUBROUTINE control
   !________________________________________________________________________________
   !              2.   Main loop
   DO
-CALL cpu_time(t0_step) ! Measuring time
+     CALL cpu_time(t0_step) ! Measuring time
 
      step  = step  + 1
      cstep = cstep + 1
@@ -64,8 +64,8 @@ CALL cpu_time(t0_step) ! Measuring time
      CALL diagnose(step)
      CALL cpu_time(t1_diag); tc_diag = tc_diag + (t1_diag - t0_diag)
 
-
     CALL cpu_time(t1_step); tc_step = tc_step + (t1_step - t0_step)
+    
   END DO
   IF (my_id .EQ. 1) WRITE(*,'(a/)') '...time integration done'
   !________________________________________________________________________________
diff --git a/src/tesend.F90 b/src/tesend.F90
index 5d77e444..91d438ca 100644
--- a/src/tesend.F90
+++ b/src/tesend.F90
@@ -32,4 +32,15 @@ SUBROUTINE tesend
   END IF
   !
   !
+
+  !________________________________________________________________________________
+  !                   4.  Test on rune time
+  CALL cpu_time(finish)
+  nlend = (finish-start) .GT. maxruntime
+  IF ( nlend ) THEN
+     IF (my_id .EQ. 0) WRITE(*,'(/a)') 'Max run time reached'
+     RETURN
+  END IF
+  !
+  !
 END SUBROUTINE tesend
-- 
GitLab