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
!---------------------------------------------------------------------
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
......
......@@ -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)
......
......@@ -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
......
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