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 9943 for NEMO/trunk/src/ICE/icevar.F90 – NEMO

Ignore:
Timestamp:
2018-07-13T16:15:22+02:00 (6 years ago)
Author:
clem
Message:

add a proper correction for negative values occuring after Ultimate-Macho advection scheme. This correction conserves mass, heat etc. 3 diagnostics have also been added in the outputs to make sure that the negative values are indeed small and unimportant in view of the advantages in using Ultimate-Macho

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/icevar.F90

    r9935 r9943  
    4444   !!   ice_var_salprof1d : salinity profile in the ice 1D 
    4545   !!   ice_var_zapsmall  : remove very small area and volume 
     46   !!   ice_var_zapneg    : remove negative ice fields (to debug the advection scheme UM3-5) 
    4647   !!   ice_var_itd       : convert 1-cat to jpl-cat 
    4748   !!   ice_var_itd2      : convert N-cat to jpl-cat 
     
    6869   PUBLIC   ice_var_salprof1d     
    6970   PUBLIC   ice_var_zapsmall 
     71   PUBLIC   ice_var_zapneg 
    7072   PUBLIC   ice_var_itd 
    7173   PUBLIC   ice_var_itd2 
     
    462464      DO jl = 1, jpl       !==  loop over the categories  ==! 
    463465         ! 
     466         WHERE( a_i(:,:,jl) > epsi10 )   ;   h_i(:,:,jl) = v_i(:,:,jl) / a_i(:,:,jl) 
     467         ELSEWHERE                       ;   h_i(:,:,jl) = 0._wp 
     468         END WHERE 
     469         ! 
     470         WHERE( a_i(:,:,jl) < epsi10 .OR. v_i(:,:,jl) < epsi10 .OR. h_i(:,:,jl) < epsi10 )   ;   zswitch(:,:) = 0._wp 
     471         ELSEWHERE                                                                           ;   zswitch(:,:) = 1._wp 
     472         END WHERE 
     473         ! 
    464474         !----------------------------------------------------------------- 
    465475         ! Zap ice energy and use ocean heat to melt ice 
    466476         !----------------------------------------------------------------- 
    467          WHERE( a_i(:,:,jl) > epsi10 )   ;   h_i(:,:,jl) = v_i(:,:,jl) / a_i(:,:,jl) 
    468          ELSEWHERE                       ;   h_i(:,:,jl) = 0._wp 
    469          END WHERE 
    470          ! 
    471          WHERE( a_i(:,:,jl) < epsi10 .OR. v_i(:,:,jl) < epsi10 .OR. h_i(:,:,jl) < epsi10 )   ;   zswitch(:,:) = 0._wp 
    472          ELSEWHERE                                                                           ;   zswitch(:,:) = 1._wp 
    473          END WHERE 
    474          ! 
    475477         DO jk = 1, nlay_i 
    476478            DO jj = 1 , jpj 
     
    495497         END DO 
    496498         ! 
     499         !----------------------------------------------------------------- 
     500         ! zap ice and snow volume, add water and salt to ocean 
     501         !----------------------------------------------------------------- 
    497502         DO jj = 1 , jpj 
    498503            DO ji = 1 , jpi 
     
    502507               wfx_res(ji,jj)  = wfx_res(ji,jj) + (1._wp - zswitch(ji,jj) ) * v_s (ji,jj,jl)   * rhos * r1_rdtice 
    503508               ! 
    504                !----------------------------------------------------------------- 
    505                ! zap ice and snow volume, add water and salt to ocean 
    506                !----------------------------------------------------------------- 
    507509               a_i  (ji,jj,jl) = a_i (ji,jj,jl) * zswitch(ji,jj) 
    508510               v_i  (ji,jj,jl) = v_i (ji,jj,jl) * zswitch(ji,jj) 
     
    533535 
    534536 
     537   SUBROUTINE ice_var_zapneg( pato_i, pv_i, pv_s, psv_i, poa_i, pa_i, pa_ip, pv_ip, pe_s, pe_i ) 
     538      !!------------------------------------------------------------------- 
     539      !!                   ***  ROUTINE ice_var_zapneg *** 
     540      !! 
     541      !! ** Purpose :   Remove negative sea ice fields and correct fluxes 
     542      !!------------------------------------------------------------------- 
     543      INTEGER  ::   ji, jj, jl, jk   ! dummy loop indices 
     544      ! 
     545      REAL(wp), DIMENSION(:,:)    , INTENT(inout) ::   pato_i     ! open water area 
     546      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_i       ! ice volume 
     547      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_s       ! snw volume 
     548      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   psv_i      ! salt content 
     549      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   poa_i      ! age content 
     550      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_i       ! ice concentration 
     551      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pa_ip      ! melt pond fraction 
     552      REAL(wp), DIMENSION(:,:,:)  , INTENT(inout) ::   pv_ip      ! melt pond volume 
     553      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_s       ! snw heat content 
     554      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pe_i       ! ice heat content 
     555      !!------------------------------------------------------------------- 
     556      ! 
     557      WHERE( pato_i(:,:)   < 0._wp )   pato_i(:,:)   = 0._wp 
     558      WHERE( poa_i (:,:,:) < 0._wp )   poa_i (:,:,:) = 0._wp 
     559      WHERE( pa_i  (:,:,:) < 0._wp )   pa_i  (:,:,:) = 0._wp 
     560      WHERE( pa_ip (:,:,:) < 0._wp )   pa_ip (:,:,:) = 0._wp 
     561      WHERE( pv_ip (:,:,:) < 0._wp )   pv_ip (:,:,:) = 0._wp ! in theory one should change wfx_pnd(-) and wfx_sum(+) 
     562      !                                                        but it does not change conservation, so keep it this way is ok 
     563      ! 
     564      DO jl = 1, jpl       !==  loop over the categories  ==! 
     565         ! 
     566         !---------------------------------------- 
     567         ! zap ice energy and send it to the ocean 
     568         !---------------------------------------- 
     569         DO jk = 1, nlay_i 
     570            DO jj = 1 , jpj 
     571               DO ji = 1 , jpi 
     572                  IF( pe_i(ji,jj,jk,jl) < 0._wp ) THEN 
     573                     hfx_res(ji,jj)   = hfx_res(ji,jj) - pe_i(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 
     574                     pe_i(ji,jj,jk,jl) = 0._wp 
     575                  ENDIF 
     576               END DO 
     577            END DO 
     578         END DO 
     579         ! 
     580         DO jk = 1, nlay_s 
     581            DO jj = 1 , jpj 
     582               DO ji = 1 , jpi 
     583                  IF( pe_s(ji,jj,jk,jl) < 0._wp ) THEN 
     584                     hfx_res(ji,jj)   = hfx_res(ji,jj) - pe_s(ji,jj,jk,jl) * r1_rdtice ! W.m-2 <0 
     585                     pe_s(ji,jj,jk,jl) = 0._wp 
     586                  ENDIF 
     587               END DO 
     588            END DO 
     589         END DO 
     590         ! 
     591         !----------------------------------------------------- 
     592         ! zap ice and snow volume, add water and salt to ocean 
     593         !----------------------------------------------------- 
     594         DO jj = 1 , jpj 
     595            DO ji = 1 , jpi 
     596              IF( pv_i(ji,jj,jl) < 0._wp ) THEN 
     597                  wfx_res(ji,jj)    = wfx_res(ji,jj) + pv_i (ji,jj,jl) * rhoi * r1_rdtice 
     598                  pv_i   (ji,jj,jl) = 0._wp 
     599               ENDIF 
     600               IF( pv_s(ji,jj,jl) < 0._wp ) THEN 
     601                  wfx_res(ji,jj)    = wfx_res(ji,jj) + pv_s (ji,jj,jl) * rhos * r1_rdtice 
     602                  pv_s   (ji,jj,jl) = 0._wp 
     603               ENDIF 
     604               IF( psv_i(ji,jj,jl) < 0._wp ) THEN 
     605                  sfx_res(ji,jj)    = sfx_res(ji,jj) + psv_i(ji,jj,jl) * rhoi * r1_rdtice 
     606                  psv_i  (ji,jj,jl) = 0._wp 
     607               ENDIF 
     608            END DO 
     609         END DO 
     610         ! 
     611      END DO  
     612      ! 
     613   END SUBROUTINE ice_var_zapneg 
     614 
     615    
    535616   SUBROUTINE ice_var_itd( zhti, zhts, zati, zh_i, zh_s, za_i ) 
    536617      !!------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.