diff --git a/src/ICE/icedyn_rhg_eap.F90 b/src/ICE/icedyn_rhg_eap.F90 index 59fb26ffddd9c8551fe710b7d88b1e59eed2f091..55b1392ac6a5e8ffeda9e8c44c516e5b2c009630 100644 --- a/src/ICE/icedyn_rhg_eap.F90 +++ b/src/ICE/icedyn_rhg_eap.F90 @@ -370,8 +370,6 @@ CONTAINS ! ! ==================== ! DO jter = 1 , nn_nevp ! loop over jter ! ! ! ==================== ! - l_full_nf_update = jter == nn_nevp ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 - ! ! convergence test IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN DO_2D( 0, 0, 0, 0 ) diff --git a/src/ICE/icedyn_rhg_evp.F90 b/src/ICE/icedyn_rhg_evp.F90 index 9e367e52a3888875f5d3df2171d46c000362f822..49e7753c2ae939a3c6a5a6a9a5ea74665ecdb7bf 100644 --- a/src/ICE/icedyn_rhg_evp.F90 +++ b/src/ICE/icedyn_rhg_evp.F90 @@ -356,8 +356,6 @@ CONTAINS ! ! ==================== ! DO jter = 1 , nn_nevp ! loop over jter ! ! ! ==================== ! - l_full_nf_update = jter == nn_nevp ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 - ! ! convergence test IF( nn_rhg_chkcvg == 1 .OR. nn_rhg_chkcvg == 2 ) THEN DO_2D( 0, 0, 0, 0 ) diff --git a/src/ICE/icedyn_rhg_vp.F90 b/src/ICE/icedyn_rhg_vp.F90 index 300336ccb889921aa7898f852a37201fce2cf34b..b2c344993dbf9b471bc971d48c4bcf9301560228 100644 --- a/src/ICE/icedyn_rhg_vp.F90 +++ b/src/ICE/icedyn_rhg_vp.F90 @@ -733,7 +733,6 @@ CONTAINS !--- mitgcm computes initial value of residual here... i_inn_tot = i_inn_tot + 1 - ! l_full_nf_update = i_inn_tot == nn_nvp ! false: disable full North fold update (performances) for iter = 1 to nn_nevp-1 zu_b(:,:) = u_ice(:,:) ! velocity at previous inner-iterate zv_b(:,:) = v_ice(:,:) diff --git a/src/OCE/DYN/dynspg_ts.F90 b/src/OCE/DYN/dynspg_ts.F90 index 16c2fcc1fa8e3244dc5b5c4a5741340ce0acf0fc..a1e78f536b0a2dc60ce56083135087ee249c02f2 100644 --- a/src/OCE/DYN/dynspg_ts.F90 +++ b/src/OCE/DYN/dynspg_ts.F90 @@ -459,8 +459,6 @@ CONTAINS DO jn = 1, icycle ! sub-time-step loop ! ! ! ==================== ! ! - l_full_nf_update = jn == icycle ! false: disable full North fold update (performances) for jn = 1 to icycle-1 - ! ! !== Update the forcing ==! (BDY and tides) ! IF( ln_bdy .AND. ln_tide ) CALL bdy_dta_tides( kt, kit=jn, pt_offset= REAL(noffset+1,wp) ) diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90 index 49433e40e524b91b51945c9ccf365502c1e1a0d9..9739f31418fab8ba9a4c9a2bcb313d7c65a9770c 100644 --- a/src/OCE/IOM/iom.F90 +++ b/src/OCE/IOM/iom.F90 @@ -1372,9 +1372,9 @@ CONTAINS zsgn = 1._wp IF( PRESENT(psgn ) ) zsgn = psgn IF( PRESENT(pv_r2d) ) THEN - CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill ) + CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. ) ELSEIF( PRESENT(pv_r3d) ) THEN - CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill ) + CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. ) ENDIF ENDIF ! @@ -1401,13 +1401,13 @@ CONTAINS IF(lwp) WRITE(numout,*) 'XIOS RST READ (3D): ',TRIM(cdvar) CALL xios_recv_field( trim(cdvar), pv_r3d(:, :, :)) IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN - CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill) + CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. ) ENDIF ELSEIF( PRESENT(pv_r2d) ) THEN IF(lwp) WRITE(numout,*) 'XIOS RST READ (2D): ', TRIM(cdvar) CALL xios_recv_field( trim(cdvar), pv_r2d(:, :)) IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN - CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill) + CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. ) ENDIF ELSEIF( PRESENT(pv_r1d) ) THEN IF(lwp) WRITE(numout,*) 'XIOS RST READ (1D): ', TRIM(cdvar) @@ -2416,7 +2416,7 @@ CONTAINS END SELECT ! z_fld(:,:) = 1._wp - CALL lbc_lnk( 'iom', z_fld, cdgrd, -1.0_wp ) ! Working array for location of northfold + CALL lbc_lnk( 'iom', z_fld, cdgrd, -1.0_wp, ldfull = .TRUE. ) ! Working array for location of northfold ! ! Cell vertices that can be defined DO_2D( 0, 0, 0, 0 ) diff --git a/src/OCE/LBC/lbc_lnk_call_generic.h90 b/src/OCE/LBC/lbc_lnk_call_generic.h90 index f735ac909d1380aac3eb38883cc77c4c5f815667..69765545a5cc176ef897d07ec62f45f7ef993466 100644 --- a/src/OCE/LBC/lbc_lnk_call_generic.h90 +++ b/src/OCE/LBC/lbc_lnk_call_generic.h90 @@ -27,7 +27,7 @@ & , pt21, cdna21, psgn21, pt22, cdna22, psgn22, pt23, cdna23, psgn23, pt24, cdna24, psgn24 & & , pt25, cdna25, psgn25, pt26, cdna26, psgn26, pt27, cdna27, psgn27, pt28, cdna28, psgn28 & & , pt29, cdna29, psgn29, pt30, cdna30, psgn30 & - & , kfillmode, pfillval, lsend, lrecv, ld4only ) + & , kfillmode, pfillval, lsend, lrecv, ld4only, ldfull ) !!--------------------------------------------------------------------- CHARACTER(len=*) , INTENT(in ) :: cdname ! name of the calling subroutine REAL(PRECISION), DIMENSION(DIMS) , TARGET, CONTIGUOUS, INTENT(inout) :: pt1 ! arrays on which the lbc is applied @@ -52,6 +52,7 @@ REAL(PRECISION) , OPTIONAL , INTENT(in ) :: pfillval ! background value (used at closed boundaries) LOGICAL, DIMENSION(8), OPTIONAL , INTENT(in ) :: lsend, lrecv ! indicate how communications are to be carried out LOGICAL , OPTIONAL , INTENT(in ) :: ld4only ! if .T., do only 4-neighbour comm (ignore corners) + LOGICAL , OPTIONAL , INTENT(in ) :: ldfull ! .true. if we also update the last line of the inner domain !! INTEGER :: kfld ! number of elements that will be attributed TYPE(PTR_4d_/**/PRECISION), DIMENSION(30) :: ptab_ptr ! pointer array @@ -96,9 +97,9 @@ IF( PRESENT(psgn30) ) CALL load_ptr_/**/XD/**/_/**/PRECISION( pt30, cdna30, psgn30, ptab_ptr, cdna_ptr, psgn_ptr, kfld ) ! IF( nn_comm == 1 ) THEN - CALL lbc_lnk_pt2pt( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only ) + CALL lbc_lnk_pt2pt( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull ) ELSE - CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only ) + CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull ) ENDIF ! END SUBROUTINE lbc_lnk_call_/**/XD/**/_/**/PRECISION diff --git a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 index d6bd3038066f876fd55231c89843f106bd7ceeac..9952ec29e06bae409338801bf7bf88174b2c666f 100644 --- a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 +++ b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 @@ -1,5 +1,5 @@ - SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only ) + SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull ) CHARACTER(len=*) , INTENT(in ) :: cdname ! name of the calling subroutine TYPE(PTR_4d_/**/PRECISION), DIMENSION(:), INTENT(inout) :: ptab ! pointer of arrays on which apply the b.c. CHARACTER(len=1), DIMENSION(:), INTENT(in ) :: cd_nat ! nature of array grid-points @@ -9,6 +9,7 @@ REAL(PRECISION), OPTIONAL, INTENT(in ) :: pfillval ! background value (used at closed boundaries) LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in ) :: lsend, lrecv ! communication with other 4 proc LOGICAL, OPTIONAL, INTENT(in ) :: ld4only ! if .T., do only 4-neighbour comm (ignore corners) + LOGICAL , OPTIONAL, INTENT(in ) :: ldfull ! .true. if we also update the last line of the inner domain ! INTEGER :: ji, jj, jk , jl, jf, jn ! dummy loop indices INTEGER :: ip0i, ip1i, im0i, im1i @@ -310,8 +311,8 @@ ! ------------------------------- ! ! IF( l_IdoNFold ) THEN - IF( jpni == 1 ) THEN ; CALL lbc_nfd( ptab, cd_nat, psgn , kfld ) ! self NFold - ELSE ; CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld ) ! mpi NFold + IF( jpni == 1 ) THEN ; CALL lbc_nfd( ptab, cd_nat, psgn , kfld ) ! self NFold + ELSE ; CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld, ldfull ) ! mpi NFold ENDIF ENDIF ! diff --git a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 index 777c9913d19264ec77a32311bfdd74477f00714b..4da99f55070f836a87f65c7e896d92c16f1df26e 100644 --- a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 +++ b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 @@ -1,6 +1,6 @@ #if ! defined BLOCK_ISEND && ! defined BLOCK_FILL_nonMPI && ! defined BLOCK_FILL_MPI_RECV - SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only ) + SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only, ldfull ) CHARACTER(len=*) , INTENT(in ) :: cdname ! name of the calling subroutine TYPE(PTR_4d_/**/PRECISION), DIMENSION(:), INTENT(inout) :: ptab ! pointer of arrays on which apply the b.c. CHARACTER(len=1), DIMENSION(:), INTENT(in ) :: cd_nat ! nature of array grid-points @@ -10,6 +10,7 @@ REAL(PRECISION), OPTIONAL, INTENT(in ) :: pfillval ! background value (used at closed boundaries) LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in ) :: lsend, lrecv ! communication with other 4 proc LOGICAL, OPTIONAL, INTENT(in ) :: ld4only ! if .T., do only 4-neighbour comm (ignore corners) + LOGICAL , OPTIONAL, INTENT(in ) :: ldfull ! .true. if we also update the last line of the inner domain ! INTEGER :: ji, jj, jk, jl, jf, jn ! dummy loop indices INTEGER :: ip0i, ip1i, im0i, im1i @@ -236,8 +237,8 @@ ! Do if before MPI_Recv from south/north/corners neighbourgs so we will have more time to receive data ! IF( l_IdoNFold ) THEN - IF( jpni == 1 ) THEN ; CALL lbc_nfd( ptab, cd_nat, psgn , kfld ) ! self NFold - ELSE ; CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld ) ! mpi NFold + IF( jpni == 1 ) THEN ; CALL lbc_nfd( ptab, cd_nat, psgn , kfld ) ! self NFold + ELSE ; CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld, ldfull ) ! mpi NFold ENDIF ENDIF ! diff --git a/src/OCE/LBC/lib_mpp.F90 b/src/OCE/LBC/lib_mpp.F90 index 3c4c955f9a253b8b902910eb75b907ea0c32b01f..3b4d1ab6486cea9272f1f662c32805956307d007 100644 --- a/src/OCE/LBC/lib_mpp.F90 +++ b/src/OCE/LBC/lib_mpp.F90 @@ -192,7 +192,6 @@ MODULE lib_mpp INTEGER, PUBLIC :: n_sequence_glb = 0 !: # of global communications INTEGER, PUBLIC :: n_sequence_dlg = 0 !: # of delayed global communications INTEGER, PUBLIC :: numcom = -1 !: logical unit for communicaton report - LOGICAL, PUBLIC :: l_full_nf_update = .TRUE. !: logical for a full (2lines) update of bc at North fold report INTEGER, PARAMETER, PUBLIC :: nbdelay = 2 !: number of delayed operations !: name (used as id) of allreduce-delayed operations ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) diff --git a/src/OCE/LBC/mpp_nfd_generic.h90 b/src/OCE/LBC/mpp_nfd_generic.h90 index 237f9b311857c032259e3ae1ab28d68d68914d35..b6bee828e55d46e8aa6b6c35a559154c037a2eb5 100644 --- a/src/OCE/LBC/mpp_nfd_generic.h90 +++ b/src/OCE/LBC/mpp_nfd_generic.h90 @@ -1,13 +1,14 @@ - SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld ) + SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld, ldfull ) TYPE(PTR_4d_/**/PRECISION), DIMENSION(:), INTENT(inout) :: ptab ! pointer of arrays on which apply the b.c. CHARACTER(len=1), DIMENSION(kfld), INTENT(in ) :: cd_nat ! nature of array grid-points REAL(PRECISION), DIMENSION(kfld), INTENT(in ) :: psgn ! sign used across the north fold boundary INTEGER , INTENT(in ) :: kfillmode ! filling method for halo over land REAL(PRECISION) , INTENT(in ) :: pfillval ! background value (used at closed boundaries) INTEGER , INTENT(in ) :: kfld ! number of pt3d arrays + LOGICAL , OPTIONAL, INTENT(in ) :: ldfull ! .true. if we also update the last line of the inner domain ! - LOGICAL :: ll_add_line + LOGICAL :: llfull INTEGER :: ji, jj, jk, jl, jf, jr, jg, jn ! dummy loop indices INTEGER :: ierr, ibuffsize, impp, ipi0 INTEGER :: ii1, ii2, ij1, ij2, ij3, iig, inei @@ -55,15 +56,13 @@ ! In consequence, we may want to force the folding on these points by setting l_full_nf_update = .TRUE. ! This is slightly slower but necessary to avoid different values on identical grid points!! ! - !!!!!!!!! temporary switch off this optimisation ==> force TRUE !!!!!!!! - !!!!!!!!! needed to get the same results without agrif and with agrif and no zoom !!!!!!!! - !!!!!!!!! I don't know why we must do that... !!!!!!!! - l_full_nf_update = .TRUE. - ! also force it if not restart during the first 2 steps (leap frog?) - ll_add_line = l_full_nf_update .OR. ( ncom_stp <= nit000+1 .AND. .NOT. ln_rstart ) + llfull = .FALSE. + IF ( PRESENT(ldfull) ) llfull = ldfull + ! also force during the first step to make sure all the init are ok + llfull = llfull .OR. ncom_stp <= nit000 ALLOCATE(ipjfld(kfld)) ! how many lines do we send for each field? - IF( ll_add_line ) THEN + IF( llfull ) THEN DO jf = 1, kfld ! Loop over the number of arrays to be processed ipjfld(jf) = ihls(jf) + COUNT( (/ c_NFtype == 'T' .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) ) & & + COUNT( (/ c_NFtype == 'F' .AND. cd_nat(jf) == 'T' .AND. ihls(jf) == 0 /) ) diff --git a/src/OCE/SBC/cpl_oasis3.F90 b/src/OCE/SBC/cpl_oasis3.F90 index b86deba5449834d308288480d3ab7b23ed8ff5c0..ab62c5a4d4ff9f6701da542833d2e96a764f0687 100644 --- a/src/OCE/SBC/cpl_oasis3.F90 +++ b/src/OCE/SBC/cpl_oasis3.F90 @@ -407,7 +407,7 @@ CONTAINS !--- we must call lbc_lnk to fill the halos that where not received. IF( .NOT. ll_1st ) THEN - CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn ) + CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn, ldfull = .TRUE. ) ENDIF !!clem: mettre T instead of clgrid diff --git a/tests/BENCH/MY_SRC/usrdef_sbc.F90 b/tests/BENCH/MY_SRC/usrdef_sbc.F90 index 9d7d2808d00c492a20bb9832892a8a4d96a0c515..fb690fe8e436f550a69bf82751ca49db6a1ef512 100644 --- a/tests/BENCH/MY_SRC/usrdef_sbc.F90 +++ b/tests/BENCH/MY_SRC/usrdef_sbc.F90 @@ -116,7 +116,7 @@ CONTAINS vtau_ice(mi0( nn_hls+1,nn_hls):mi1( nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp ENDIF - CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1. ) + CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. ) #endif ! END SUBROUTINE usrdef_sbc_ice_tau diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 index 603cb78a3d34b5009d3e20302978fceae1b392d9..0b4f020abb72d3849d89ea5be6bac204539047c2 100644 --- a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 +++ b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 @@ -140,7 +140,7 @@ CONTAINS utau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndi_t vtau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndj_t END_2D - CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1. ) + CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. ) ! END SUBROUTINE usrdef_sbc_ice_tau