diff --git a/src/grid_mod.F90 b/src/grid_mod.F90 index 677d72a41d6aded2d45c1ef143854d16707ac5e1..03ad393aada84ae2536ef627192dd8a2361d1132 100644 --- a/src/grid_mod.F90 +++ b/src/grid_mod.F90 @@ -35,7 +35,10 @@ MODULE grid REAL(dp), PUBLIC, PROTECTED :: deltar, deltaz INTEGER, PUBLIC, PROTECTED :: irs, ire, izs, ize INTEGER, PUBLIC :: ir,iz ! counters - integer(C_INTPTR_T), PUBLIC :: local_nkr, local_nkr_offset, local_nz, local_nz_offset + integer(C_INTPTR_T), PUBLIC :: local_nkr, local_nz + integer(C_INTPTR_T), PUBLIC :: local_nkr_offset, local_nz_offset + INTEGER, PUBLIC :: local_np_e, local_np_i + integer(C_INTPTR_T), PUBLIC :: local_np_e_offset, local_np_i_offset ! Grids containing position in fourier space REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: krarray @@ -69,12 +72,12 @@ CONTAINS SUBROUTINE init_1Dgrid_distr - write(*,*) Nr - local_nkr = (Nr/2+1)/num_procs - write(*,*) local_nkr - local_nkr_offset = my_id*local_nkr + ! write(*,*) Nr + local_nkr = (Nr/2+1)/num_procs_kr + ! write(*,*) local_nkr + local_nkr_offset = rank_r*local_nkr - if (my_id .EQ. num_procs-1) local_nkr = (Nr/2+1)-local_nkr_offset + if (rank_r .EQ. num_procs_kr-1) local_nkr = (Nr/2+1)-local_nkr_offset END SUBROUTINE init_1Dgrid_distr @@ -83,13 +86,14 @@ CONTAINS IMPLICIT NONE INTEGER :: ip - ips_e = 1; ipe_e = pmaxe + 1 - ips_i = 1; ipe_i = pmaxi + 1 + CALL decomp1D(pmaxe+1, num_procs_p, rank_p, ips_e, ipe_e) + CALL decomp1D(pmaxi+1, num_procs_p, rank_p, ips_i, ipe_i) + ALLOCATE(parray_e(ips_e:ipe_e)) ALLOCATE(parray_i(ips_i:ipe_i)) DO ip = ips_e,ipe_e; parray_e(ip) = (ip-1); END DO DO ip = ips_i,ipe_i; parray_i(ip) = (ip-1); END DO - + ! Ghosts boundaries ipsg_e = ips_e - 2; ipeg_e = ipe_e + 2; ipsg_i = ips_i - 2; ipeg_i = ipe_i + 2; @@ -119,7 +123,7 @@ CONTAINS ! Precomputations jmaxe_dp = real(jmaxe,dp) jmaxi_dp = real(jmaxi,dp) - + END SUBROUTINE set_jgrid @@ -245,4 +249,18 @@ CONTAINS bari = (jmaxi+1)*p_ + j_ + 1 END FUNCTION + SUBROUTINE decomp1D( n, numprocs, myid, s, e ) + INTEGER :: n, numprocs, myid, s, e + INTEGER :: nlocal + INTEGER :: deficit + + nlocal = n / numprocs + s = myid * nlocal + 1 + deficit = MOD(n,numprocs) + s = s + MIN(myid,deficit) + IF (myid .LT. deficit) nlocal = nlocal + 1 + e = s + nlocal - 1 + IF (e .GT. n .OR. myid .EQ. numprocs-1) e = n + END SUBROUTINE decomp1D + END MODULE grid