New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 10292 for NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/ICE/icedyn_adv_umx.F90 – NEMO

Ignore:
Timestamp:
2018-11-09T16:35:08+01:00 (5 years ago)
Author:
smasson
Message:

dev_r10164_HPC09_ESIWACE_PREP_MERGE: action 4b: reduce communications in si3, see #2133

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/src/ICE/icedyn_adv_umx.F90

    r10180 r10292  
    8383      ALLOCATE( zpato(jpi,jpj,1) ) 
    8484      ! 
    85       ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- !         
    86       zcfl  =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
    87       zcfl  = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
    88       IF( lk_mpp )   CALL mpp_max( zcfl ) 
    89  
    90       IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp 
    91       ELSE                    ;   initad = 1   ;   zusnit = 1.0_wp 
     85      ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- ! 
     86      !     When needed, the advection split is applied at the next time-step in order to avoid blocking global comm. 
     87      !     ...this should not affect too much the stability... Was ok on the tests we did... 
     88      zcfl =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
     89      zcfl = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
     90      IF( zcfl > 0.5 ) THEN   ;   l_split_advumx(1) = .TRUE.    ! split advection time-step if CFL violated 
     91      ELSE                    ;   l_split_advumx(1) = .FALSE. 
     92      ENDIF 
     93       
     94      ! non-blocking global communication send l_split_advumx(1) and receive l_split_advumx(2) 
     95      IF( lk_mpp )   CALL mpp_ilor( l_split_advumx, ldlast = kt == nitend - nn_fsbc + 1 ) 
     96 
     97      IF( l_split_advumx(2) ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp    ! split defined at the previous time-step 
     98      ELSE                           ;   initad = 1   ;   zusnit = 1.0_wp 
    9299      ENDIF 
    93100 
     
    120127      DO jt = 1, initad 
    121128         CALL adv_umx( k_order, kt,   1, zdt, zudy, zvdx, zcu_box, zcv_box, zpato(:,:,1) )        ! Open water area  
     129         CALL lbc_lnk( 'icedyn_adv_umx', zpato, 'T',  1. ) 
    122130         CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pa_i(:,:,:) )         ! Ice area 
    123131         CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pv_i(:,:,:) )         ! Ice  volume 
     
    127135            CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pe_i(:,:,jk,:) )   ! Ice  heat content 
    128136         END DO 
     137         CALL lbc_lnk( 'icedyn_adv_umx', pe_i, 'T',  1. ) 
     138 
    129139         CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pv_s(:,:,:) )         ! Snow volume 
    130140         DO jk = 1, nlay_s 
    131141            CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pe_s(:,:,jk,:) )   ! Snow heat content 
    132142         END DO 
     143         CALL lbc_lnk( 'icedyn_adv_umx', pe_s, 'T',  1. ) 
     144 
    133145         IF ( ln_pnd_H12 ) THEN 
    134146            CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pa_ip(:,:,:) )     ! Melt pond fraction 
    135147            CALL adv_umx( k_order, kt, jpl, zdt, zudy, zvdx, zcu_box, zcv_box, pv_ip(:,:,:) )     ! Melt pond volume 
     148            CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i, 'T',  1., pv_i, 'T',  1., psv_i, 'T',  1., & 
     149                                                & poa_i, 'T',  1., pv_s, 'T',  1., pa_ip, 'T',  1., & 
     150                                                & pv_ip, 'T',  1. ) 
     151         ELSE 
     152            CALL lbc_lnk_multi( 'icedyn_adv_umx', pa_i, 'T',  1., pv_i, 'T',  1., psv_i, 'T',  1., & 
     153                                                & poa_i, 'T',  1., pv_s, 'T',  1. ) 
    136154         ENDIF 
    137155      END DO 
     
    249267         END DO 
    250268      END DO 
    251       CALL lbc_lnk( 'icedyn_adv_umx', ptc, 'T',  1. ) 
    252269      ! 
    253270   END SUBROUTINE adv_umx 
Note: See TracChangeset for help on using the changeset viewer.