From e48b7f7eb508745a62ec307abccbf02d8b504196 Mon Sep 17 00:00:00 2001
From: Lionel GUEZ <guez@lmd.ens.fr>
Date: Tue, 29 Jun 2021 12:41:19 +0200
Subject: [PATCH] Work with date index instead of date

This does not make the code simpler but a little more general,
anticipating for example time steps different than one day.

In main program unit `eddy_graph` and procedures `dispatch_snapshot`
and `read_snapshot`, variable k now refers to the date index, 0-based,
instead of the date in days since 1950-1-1.

In main program unit `eddy_graph`, add variable d for date. `k_begin`,
`k_end` and `k_end_main_loop` also now refer to date indices. We have
to pass an additional argument `d_init` to procedure
`dispatch_snapshot`.

Note that no modification is necessary in procedures `get_snapshot`,
`recv_snapshot` and `send_snapshot` although the meaning of k in
`get_snapshot` and tag in `recv_snapshot` and `send_snapshot` also
changes.
---
 Common/read_snapshot.f90      | 12 ++++++------
 Overlap/dispatch_snapshot.f90 | 14 ++++++++------
 Overlap/eddy_graph.f90        | 30 +++++++++++++++++-------------
 3 files changed, 31 insertions(+), 25 deletions(-)

diff --git a/Common/read_snapshot.f90 b/Common/read_snapshot.f90
index f86d16a1..f2501f86 100644
--- a/Common/read_snapshot.f90
+++ b/Common/read_snapshot.f90
@@ -41,21 +41,21 @@ contains
 
     !---------------------------------------------------------------------
 
-    if (k == d_init) then
+    if (k == 0) then
        ishape_first = 0
     else
-       ! {k > d_init}
-       ishape_first = ishape_last(k - d_init) + 1
+       ! {k > 0}
+       ishape_first = ishape_last(k) + 1
     end if
 
-    s%number_vis_extr = ishape_last(k - d_init + 1) - ishape_first + 1
+    s%number_vis_extr = ishape_last(k + 1) - ishape_first + 1
     allocate(s%list_vis(s%number_vis_extr))
 
-    do ishape = ishape_first, ishape_last(k - d_init + 1)
+    do ishape = ishape_first, ishape_last(k + 1)
        call read_eddy(e, d, i, hshp, ishape)
 
        ! Check that all the eddies have the same date index:
-       call assert(d == k, "read_snapshot: date index")
+       call assert(d - d_init == k, "read_snapshot: date index")
 
        s%list_vis(i) = e
     end do
diff --git a/Overlap/dispatch_snapshot.f90 b/Overlap/dispatch_snapshot.f90
index 20f63793..cb295aed 100644
--- a/Overlap/dispatch_snapshot.f90
+++ b/Overlap/dispatch_snapshot.f90
@@ -5,7 +5,7 @@ module dispatch_snapshot_m
 contains
 
   subroutine dispatch_snapshot(s, unit_isolated, unit_number_eddies, rank, &
-       k_begin, max_delta, k)
+       k_begin, max_delta, d_init, k)
 
     use derived_types, only: snapshot
     use send_snapshot_m, only: send_snapshot
@@ -18,22 +18,24 @@ contains
     integer, intent(in):: unit_number_eddies
     ! logical unit for file number_eddies_$rank.csv
 
-    integer, intent(in):: rank, k_begin, max_delta
-    integer, intent(in):: k ! date index
+    integer, intent(in):: rank, k_begin, max_delta, d_init
+    integer, intent(in):: k ! date index (0-based)
 
     ! Local:
-    integer i
+    integer i, d
 
     !------------------------------------------------------------------
 
     if (rank == 0 .or. k >= k_begin + max_delta) then
+       d = k + d_init
+       
        do i = 1, s%number_vis_extr
           if (s%list_vis(i)%valid .and. s%list_vis(i)%delta_in == huge(0) &
                .and. s%list_vis(i)%delta_out == huge(0)) &
-               write(unit_isolated, fmt = *) k, i
+               write(unit_isolated, fmt = *) d, i
        end do
 
-       write(unit_number_eddies, fmt = *) k, s%number_vis_extr, &
+       write(unit_number_eddies, fmt = *) d, s%number_vis_extr, &
             s%number_eddies - s%number_vis_extr
     else
        call send_snapshot(s, tag = k, dest = rank - 1)
diff --git a/Overlap/eddy_graph.f90 b/Overlap/eddy_graph.f90
index c9b5e849..ae4938e6 100644
--- a/Overlap/eddy_graph.f90
+++ b/Overlap/eddy_graph.f90
@@ -22,9 +22,9 @@ program eddy_graph
   
   implicit none
 
-  integer rank, n_proc, copy, delta, j
+  integer rank, n_proc, copy, delta, j, d
   integer:: n_dates = huge(0) ! number of dates to read
-  integer k ! date
+  integer k ! date index ((0-based)
   integer d_init, k_begin, k_end, k_end_main_loop
   character(len = :), allocatable:: shpc_dir
   integer:: max_delta = 1
@@ -139,13 +139,13 @@ program eddy_graph
   call shpc_create(hshp_interp, shpc_dir = trim(file), cyclone = hshp%cyclone)
   call init_interpolated_eddy
 
-  k_begin = d_init + (rank * n_dates) / n_proc
+  k_begin = (rank * n_dates) / n_proc
 
   if (rank < n_proc - 1) then
-     k_end = d_init + ((rank + 1) * n_dates) / n_proc + max_delta - 1
+     k_end = ((rank + 1) * n_dates) / n_proc + max_delta - 1
      k_end_main_loop = k_end - max_delta + 1
   else
-     k_end = d_init + n_dates - 1
+     k_end = n_dates - 1
      k_end_main_loop = k_end
   end if
 
@@ -160,8 +160,8 @@ program eddy_graph
 
   do delta = 1, max_delta
      do k = k_begin + delta, k_begin + max_delta
-        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, k, &
-             delta, j = k - k_begin + 1)
+        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, &
+             d = d_init + k, delta = delta, j = k - k_begin + 1)
      end do
   end do
 
@@ -169,13 +169,14 @@ program eddy_graph
 
   do k = k_begin + max_delta + 1, k_end_main_loop
      call dispatch_snapshot(flow(1), unit_isolated, unit_number_eddies, rank, &
-          k_begin, max_delta, k = k - max_delta - 1)
+          k_begin, max_delta, d_init, k = k - max_delta - 1)
      flow(:max_delta) = flow(2:)
      call get_snapshot(flow(max_delta + 1), nlon, nlat, ishape_last, corner, &
           step, copy, hshp, d_init, k, k_end, rank, n_proc, max_delta)
-
+     d = d_init + k
+     
      do delta = 1, max_delta
-        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, k, &
+        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, d, &
              delta, j = max_delta + 1)
      end do
   end do
@@ -185,22 +186,25 @@ program eddy_graph
   do k = k_end_main_loop + 1, k_end
      ! {rank < n_proc - 1 and k >= k_end - max_delta + 2}
      call dispatch_snapshot(flow(1), unit_isolated, unit_number_eddies, rank, &
-          k_begin, max_delta, k = k - max_delta - 1)
+          k_begin, max_delta, d_init, k = k - max_delta - 1)
      flow(:max_delta) = flow(2:)
      call get_snapshot(flow(max_delta + 1), nlon, nlat, ishape_last, corner, &
           step, copy, hshp, d_init, k, k_end, rank, n_proc, max_delta)
      ! (reception)
 
      ! Stitching:
+
+     d = d_init + k
+
      do delta = k - k_end + max_delta, max_delta
-        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, k, &
+        call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, d, &
              delta, j = max_delta + 1)
      end do
   end do
 
   do j = 1, max_delta + 1
      call dispatch_snapshot(flow(j), unit_isolated, unit_number_eddies, rank, &
-          k_begin, max_delta, k = k_end - max_delta - 1 + j)
+          k_begin, max_delta, d_init, k = k_end - max_delta - 1 + j)
   end do
 
   ! 5. Back matter
-- 
GitLab