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 8504 for branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv_umx.F90 – NEMO

Ignore:
Timestamp:
2017-09-06T17:47:28+02:00 (7 years ago)
Author:
clem
Message:

changes in style - part4 - clarify ice advection routines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv_umx.F90

    r8486 r8504  
    4343CONTAINS 
    4444 
    45    SUBROUTINE ice_adv_umx( kt, pdt, puc, pvc, pubox, pvbox, ptc ) 
     45   SUBROUTINE ice_adv_umx( kt, pu_ice, pv_ice,  & 
     46      &                    pato_i, pv_i, pv_s, psmv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 
    4647      !!---------------------------------------------------------------------- 
    4748      !!                  ***  ROUTINE ice_adv_umx  *** 
     49      !!  
     50      !! **  Purpose :   Compute the now trend due to total advection of  
     51      !!                 tracers and add it to the general trend of tracer equations 
     52      !!                 using an "Ultimate-Macho" scheme 
     53      !! 
     54      !! Reference : Leonard, B.P., 1991, Comput. Methods Appl. Mech. Eng., 88, 17-74.  
     55      !!---------------------------------------------------------------------- 
     56      INTEGER                     , INTENT(in   ) ::   kt         ! time step 
     57      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   pu_ice     ! ice i-velocity 
     58      REAL(wp), DIMENSION(:,:)    , INTENT(in   ) ::   pv_ice     ! ice j-velocity 
     59      REAL(wp), DIMENSION(:,:)    , INTENT(inout) ::   pato_i     ! open water area 
     60      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i       ! ice volume 
     61      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_s       ! snw volume 
     62      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   psmv_i     ! salt content 
     63      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   poa_i      ! age content 
     64      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_i       ! ice concentration 
     65      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_ip      ! melt pond fraction 
     66      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_ip      ! melt pond volume 
     67      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s       ! snw heat content 
     68      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i       ! ice heat content 
     69      ! 
     70      INTEGER  ::   ji, jj, jk, jl, jt      ! dummy loop indices 
     71      INTEGER  ::   initad                  ! number of sub-timestep for the advection 
     72      REAL(wp) ::   zcfl , zusnit, zdt      !   -      - 
     73      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zudy, zvdx, zcu_box, zcv_box 
     74      !!---------------------------------------------------------------------- 
     75      ! 
     76      IF( kt == nit000 .AND. lwp ) THEN 
     77         WRITE(numout,*)  
     78         WRITE(numout,*) 'ice_adv_umx : Ultimate-MACHO advection scheme' 
     79         WRITE(numout,*) '~~~~~~~~~~~' 
     80      ENDIF 
     81      ! 
     82      ALLOCATE( zudy(jpi,jpj) , zvdx(jpi,jpj) , zcu_box(jpi,jpj) , zcv_box(jpi,jpj) ) 
     83      ! 
     84      ! --- If ice drift field is too fast, use an appropriate time step for advection (CFL test for stability) --- !         
     85      zcfl  =            MAXVAL( ABS( pu_ice(:,:) ) * rdt_ice * r1_e1u(:,:) ) 
     86      zcfl  = MAX( zcfl, MAXVAL( ABS( pv_ice(:,:) ) * rdt_ice * r1_e2v(:,:) ) ) 
     87      IF( lk_mpp )   CALL mpp_max( zcfl ) 
     88 
     89      IF( zcfl > 0.5 ) THEN   ;   initad = 2   ;   zusnit = 0.5_wp 
     90      ELSE                    ;   initad = 1   ;   zusnit = 1.0_wp 
     91      ENDIF 
     92 
     93      zdt = rdt_ice / REAL(initad) 
     94 
     95      ! --- transport --- ! 
     96      zudy(:,:) = pu_ice(:,:) * e2u(:,:) 
     97      zvdx(:,:) = pv_ice(:,:) * e1v(:,:) 
     98 
     99      ! --- define velocity for advection: u*grad(H) --- ! 
     100      DO jj = 2, jpjm1 
     101         DO ji = fs_2, fs_jpim1 
     102            IF    ( pu_ice(ji,jj) * pu_ice(ji-1,jj) <= 0._wp ) THEN   ;   zcu_box(ji,jj) = 0._wp 
     103            ELSEIF( pu_ice(ji,jj)                   >  0._wp ) THEN   ;   zcu_box(ji,jj) = pu_ice(ji-1,jj) 
     104            ELSE                                                      ;   zcu_box(ji,jj) = pu_ice(ji  ,jj) 
     105            ENDIF 
     106 
     107            IF    ( pv_ice(ji,jj) * pv_ice(ji,jj-1) <= 0._wp ) THEN   ;   zcv_box(ji,jj) = 0._wp 
     108            ELSEIF( pv_ice(ji,jj)                   >  0._wp ) THEN   ;   zcv_box(ji,jj) = pv_ice(ji,jj-1) 
     109            ELSE                                                      ;   zcv_box(ji,jj) = pv_ice(ji,jj  ) 
     110            ENDIF 
     111         END DO 
     112      END DO 
     113 
     114      !---------------! 
     115      !== advection ==! 
     116      !---------------! 
     117      DO jt = 1, initad 
     118         CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pato_i(:,:) )             ! Open water area  
     119         DO jl = 1, jpl 
     120            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pa_i(:,:,jl) )         ! Ice area 
     121            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_i(:,:,jl) )         ! Ice  volume 
     122            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, psmv_i(:,:,jl) )       ! Salt content 
     123            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, poa_i (:,:,jl) )       ! Age content 
     124            DO jk = 1, nlay_i 
     125               CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pe_i(:,:,jk,jl) )   ! Ice  heat content 
     126            END DO 
     127            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_s(:,:,jl) )         ! Snow volume 
     128            CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pe_s(:,:,1,jl) )       ! Snow heat content 
     129            IF ( nn_pnd_scheme > 0 ) THEN 
     130               CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pa_ip(:,:,jl) )     ! Melt pond fraction 
     131               CALL adv_umx( kt, zdt, zudy, zvdx, zcu_box, zcv_box, pv_ip(:,:,jl) )     ! Melt pond volume 
     132            ENDIF 
     133         END DO 
     134      END DO 
     135      ! 
     136      DEALLOCATE( zudy, zvdx, zcu_box, zcv_box ) 
     137      ! 
     138   END SUBROUTINE ice_adv_umx 
     139    
     140   SUBROUTINE adv_umx( kt, pdt, puc, pvc, pubox, pvbox, ptc ) 
     141      !!---------------------------------------------------------------------- 
     142      !!                  ***  ROUTINE adv_umx  *** 
    48143      !!  
    49144      !! **  Purpose :   Compute the now trend due to total advection of  
     
    146241      IF( nn_timing == 1 )  CALL timing_stop('ice_adv_umx') 
    147242      ! 
    148    END SUBROUTINE ice_adv_umx 
     243   END SUBROUTINE adv_umx 
    149244 
    150245 
Note: See TracChangeset for help on using the changeset viewer.