From b1945992cf6a004b6d84123759f41ed6d21b5704 Mon Sep 17 00:00:00 2001
From: Simon Mueller <11-smueller@users.noreply.forge.nemo-ocean.eu>
Date: Fri, 2 Dec 2022 12:59:55 +0000
Subject: [PATCH] Resolve "Robust and accurate passive-tracer restart mechanism
 for configurations with forward Euler time stepping of passive tracers"
 ('main')

---
 src/TOP/AGE/trcsms_age.F90    |  8 +-------
 src/TOP/PISCES/P4Z/p4zsms.F90 |  8 +-------
 src/TOP/trcrst.F90            | 17 +++++++++++++----
 src/TOP/trcstp.F90            |  7 ++++---
 4 files changed, 19 insertions(+), 21 deletions(-)

diff --git a/src/TOP/AGE/trcsms_age.F90 b/src/TOP/AGE/trcsms_age.F90
index a8283edf..8e793d23 100644
--- a/src/TOP/AGE/trcsms_age.F90
+++ b/src/TOP/AGE/trcsms_age.F90
@@ -56,13 +56,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) ' trc_sms_age:  AGE model'
          IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~~'
       ENDIF
-
-#if ! defined key_RK3
-      IF( l_1st_euler .OR. ln_top_euler ) THEN
-         tr(:,:,:,jp_age,Kbb) = tr(:,:,:,jp_age,Kmm)
-      ENDIF
-#endif
-
+      !
       DO jk = 1, nla_age
          tr(:,:,jk,jp_age,Krhs) = rn_age_kill_rate * tr(:,:,jk,jp_age,Kbb)
       END DO
diff --git a/src/TOP/PISCES/P4Z/p4zsms.F90 b/src/TOP/PISCES/P4Z/p4zsms.F90
index 664d1206..32a3c6fb 100644
--- a/src/TOP/PISCES/P4Z/p4zsms.F90
+++ b/src/TOP/PISCES/P4Z/p4zsms.F90
@@ -104,13 +104,7 @@ CONTAINS
          IF(lwp) write(numout,*) '    PISCES  Biology time step    rfact2 = ', rfact2
          IF(lwp) WRITE(numout,*)
       ENDIF
-
-      IF( l_1st_euler .OR. ln_top_euler ) THEN
-         DO jn = jp_pcs0, jp_pcs1              !   SMS on tracer without Asselin time-filter
-            tr(:,:,:,jn,Kbb) = tr(:,:,:,jn,Kmm)
-         END DO
-      ENDIF
-
+      !
       DO jn = jp_pcs0, jp_pcs1              !   Store the tracer concentrations before entering PISCES
          ztrbbio(:,:,:,jn) = tr(:,:,:,jn,Kbb)
       END DO
diff --git a/src/TOP/trcrst.F90 b/src/TOP/trcrst.F90
index 78ff2bbc..fc54fc09 100644
--- a/src/TOP/trcrst.F90
+++ b/src/TOP/trcrst.F90
@@ -130,14 +130,23 @@ CONTAINS
       IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
 
       ! READ prognostic variables and computes diagnostic variable
-#if ! defined key_RK3
+#if defined key_RK3
+      DO jn = 1, jptra      ! RK3: Before time step
+         CALL iom_get( numrtr, jpdom_auto, 'TRB'//ctrcnm(jn), tr(:,:,:,jn,Kbb) )
+      END DO
+#else
       DO jn = 1, jptra      ! MLF only : Now time step
          CALL iom_get( numrtr, jpdom_auto, 'TRN'//ctrcnm(jn), tr(:,:,:,jn,Kmm) )
       END DO
+      IF( l_1st_euler .OR. ln_top_euler ) THEN
+         IF(lwp) WRITE(numout,*) '              + adjustment for forward Euler time stepping'
+         tr(:,:,:,1:jptra,Kbb) = tr(:,:,:,1:jptra,Kmm)
+      ELSE                  ! MLF only : Before time step
+         DO jn = 1, jptra
+            CALL iom_get( numrtr, jpdom_auto, 'TRB'//ctrcnm(jn), tr(:,:,:,jn,Kbb) )
+         END DO
+      END IF
 #endif
-      DO jn = 1, jptra      ! RK3 and MLF : Before time step
-         CALL iom_get( numrtr, jpdom_auto, 'TRB'//ctrcnm(jn), tr(:,:,:,jn,Kbb) )
-      END DO
       !
       IF(.NOT.lrxios) CALL iom_delay_rst( 'READ', 'TOP', numrtr )   ! read only TOP delayed global communication variables
    END SUBROUTINE trc_rst_read
diff --git a/src/TOP/trcstp.F90 b/src/TOP/trcstp.F90
index 9d7e7574..e016e27c 100644
--- a/src/TOP/trcstp.F90
+++ b/src/TOP/trcstp.F90
@@ -115,9 +115,7 @@ CONTAINS
          IF(lrxios) CALL iom_context_finalize(      cr_toprst_cxt          )
          IF(lwm) CALL FLUSH( numont )                     ! flush namelist output
       ENDIF
-      IF( lrst_trc )            CALL trc_rst_wri  ( kt, Kbb, Kmm, Kaa  )       ! write tracer restart file
-!     IF( lrst_trc )            CALL trc_rst_wri  ( kt, Kmm, Kaa, Kbb  )       ! write tracer restart file
-
+      !
       IF( lk_trdmxl_trc  )      CALL trd_mxl_trc  ( kt,      Kaa       )       ! trends: Mixed-layer
       !
       IF( ln_top_euler ) THEN 
@@ -126,6 +124,9 @@ CONTAINS
          ! "before" fields = "now" fields.
          tr(:,:,:,:,Kmm) = tr(:,:,:,:,Kaa)
       ENDIF
+      !
+      IF( lrst_trc )            CALL trc_rst_wri  ( kt, Kbb, Kmm, Kaa  )       ! write tracer restart file
+!     IF( lrst_trc )            CALL trc_rst_wri  ( kt, Kmm, Kaa, Kbb  )       ! write tracer restart file
       !
       IF (ll_trcstat) THEN
          ztrai = 0._wp                                                   !  content of all tracers
-- 
GitLab