Skip to content
Snippets Groups Projects
Commit e48b7f7e authored by Lionel GUEZ's avatar Lionel GUEZ
Browse files

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.
parent 3679c22e
No related branches found
No related tags found
No related merge requests found
...@@ -41,21 +41,21 @@ contains ...@@ -41,21 +41,21 @@ contains
!--------------------------------------------------------------------- !---------------------------------------------------------------------
if (k == d_init) then if (k == 0) then
ishape_first = 0 ishape_first = 0
else else
! {k > d_init} ! {k > 0}
ishape_first = ishape_last(k - d_init) + 1 ishape_first = ishape_last(k) + 1
end if 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)) 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) call read_eddy(e, d, i, hshp, ishape)
! Check that all the eddies have the same date index: ! 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 s%list_vis(i) = e
end do end do
......
...@@ -5,7 +5,7 @@ module dispatch_snapshot_m ...@@ -5,7 +5,7 @@ module dispatch_snapshot_m
contains contains
subroutine dispatch_snapshot(s, unit_isolated, unit_number_eddies, rank, & 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 derived_types, only: snapshot
use send_snapshot_m, only: send_snapshot use send_snapshot_m, only: send_snapshot
...@@ -18,22 +18,24 @@ contains ...@@ -18,22 +18,24 @@ contains
integer, intent(in):: unit_number_eddies integer, intent(in):: unit_number_eddies
! logical unit for file number_eddies_$rank.csv ! logical unit for file number_eddies_$rank.csv
integer, intent(in):: rank, k_begin, max_delta integer, intent(in):: rank, k_begin, max_delta, d_init
integer, intent(in):: k ! date index integer, intent(in):: k ! date index (0-based)
! Local: ! Local:
integer i integer i, d
!------------------------------------------------------------------ !------------------------------------------------------------------
if (rank == 0 .or. k >= k_begin + max_delta) then if (rank == 0 .or. k >= k_begin + max_delta) then
d = k + d_init
do i = 1, s%number_vis_extr do i = 1, s%number_vis_extr
if (s%list_vis(i)%valid .and. s%list_vis(i)%delta_in == huge(0) & if (s%list_vis(i)%valid .and. s%list_vis(i)%delta_in == huge(0) &
.and. s%list_vis(i)%delta_out == 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 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 s%number_eddies - s%number_vis_extr
else else
call send_snapshot(s, tag = k, dest = rank - 1) call send_snapshot(s, tag = k, dest = rank - 1)
......
...@@ -22,9 +22,9 @@ program eddy_graph ...@@ -22,9 +22,9 @@ program eddy_graph
implicit none 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:: 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 integer d_init, k_begin, k_end, k_end_main_loop
character(len = :), allocatable:: shpc_dir character(len = :), allocatable:: shpc_dir
integer:: max_delta = 1 integer:: max_delta = 1
...@@ -139,13 +139,13 @@ program eddy_graph ...@@ -139,13 +139,13 @@ program eddy_graph
call shpc_create(hshp_interp, shpc_dir = trim(file), cyclone = hshp%cyclone) call shpc_create(hshp_interp, shpc_dir = trim(file), cyclone = hshp%cyclone)
call init_interpolated_eddy 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 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 k_end_main_loop = k_end - max_delta + 1
else else
k_end = d_init + n_dates - 1 k_end = n_dates - 1
k_end_main_loop = k_end k_end_main_loop = k_end
end if end if
...@@ -160,8 +160,8 @@ program eddy_graph ...@@ -160,8 +160,8 @@ program eddy_graph
do delta = 1, max_delta do delta = 1, max_delta
do k = k_begin + delta, k_begin + max_delta do k = k_begin + delta, k_begin + max_delta
call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, k, & call overlap(flow, nlon, nlat, periodic, dist_lim, hshp_interp, &
delta, j = k - k_begin + 1) d = d_init + k, delta = delta, j = k - k_begin + 1)
end do end do
end do end do
...@@ -169,13 +169,14 @@ program eddy_graph ...@@ -169,13 +169,14 @@ program eddy_graph
do k = k_begin + max_delta + 1, k_end_main_loop do k = k_begin + max_delta + 1, k_end_main_loop
call dispatch_snapshot(flow(1), unit_isolated, unit_number_eddies, rank, & 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:) flow(:max_delta) = flow(2:)
call get_snapshot(flow(max_delta + 1), nlon, nlat, ishape_last, corner, & 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) step, copy, hshp, d_init, k, k_end, rank, n_proc, max_delta)
d = d_init + k
do delta = 1, max_delta 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) delta, j = max_delta + 1)
end do end do
end do end do
...@@ -185,22 +186,25 @@ program eddy_graph ...@@ -185,22 +186,25 @@ program eddy_graph
do k = k_end_main_loop + 1, k_end do k = k_end_main_loop + 1, k_end
! {rank < n_proc - 1 and k >= k_end - max_delta + 2} ! {rank < n_proc - 1 and k >= k_end - max_delta + 2}
call dispatch_snapshot(flow(1), unit_isolated, unit_number_eddies, rank, & 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:) flow(:max_delta) = flow(2:)
call get_snapshot(flow(max_delta + 1), nlon, nlat, ishape_last, corner, & 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) step, copy, hshp, d_init, k, k_end, rank, n_proc, max_delta)
! (reception) ! (reception)
! Stitching: ! Stitching:
d = d_init + k
do delta = k - k_end + max_delta, max_delta 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) delta, j = max_delta + 1)
end do end do
end do end do
do j = 1, max_delta + 1 do j = 1, max_delta + 1
call dispatch_snapshot(flow(j), unit_isolated, unit_number_eddies, rank, & 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 end do
! 5. Back matter ! 5. Back matter
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment