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 11521 for NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF – NEMO

Ignore:
Timestamp:
2019-09-10T11:49:13+02:00 (5 years ago)
Author:
mathiot
Message:

ENHANCE-02_ISF: fix issue with ice sheet coupling and conservation + other minor changes (ticket #2142)

Location:
NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isf.F90

    r11489 r11521  
    3030   ! 0.1 -------- ice shelf cavity parameter -------------- 
    3131   CHARACTER(LEN=256), PUBLIC :: cn_isfdir 
     32   LOGICAL           , PUBLIC :: ln_isf 
    3233   ! 
    3334   ! 0.2 -------- ice shelf cavity opened namelist parameter ------------- 
     
    100101   INTEGER , PUBLIC                                        ::   nstp_iscpl   !: 
    101102   REAL(wp), PUBLIC                                        ::   rdt_iscpl    !:  
    102    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol  !: 
    103    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc  !: 
     103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   risfcpl_cons_ssh, risfcpl_cons_ssh_b               !: 
     104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   risfcpl_vol, risfcpl_cons_vol, risfcpl_cons_vol_b  !: 
     105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   risfcpl_tsc, risfcpl_cons_tsc, risfcpl_cons_tsc_b  !: 
    104106   ! 
    105107   !!---------------------------------------------------------------------- 
     
    184186      ! 
    185187      ALLOCATE( risfcpl_tsc(jpi,jpj,jpk,jpts)      , risfcpl_vol(jpi,jpj,jpk)      ,             & 
    186          &      risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) , STAT=ialloc ) 
     188         &      risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) ,             & 
     189         &      risfcpl_cons_tsc_b(jpi,jpj,jpk,jpts) , risfcpl_cons_vol_b(jpi,jpj,jpk),          & 
     190                risfcpl_cons_ssh_b(jpi,jpj), risfcpl_cons_ssh(jpi,jpj), STAT=ialloc ) 
    187191      ierr = ierr + ialloc 
    188192      ! 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcav.F90

    r11495 r11521  
    7878      !  
    7979      ! output T/S/U/V for the top boundary layer 
    80       CALL iom_put('ttbl_cav',zttbl(:,:)) 
    81       CALL iom_put('stbl'    ,zstbl(:,:)) 
     80      CALL iom_put('ttbl_cav',zttbl(:,:) * mskisf_cav(:,:)) 
     81      CALL iom_put('stbl'    ,zstbl(:,:) * mskisf_cav(:,:)) 
    8282      ! 
    8383      ! initialisation 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfcavgam.F90

    r11495 r11521  
    6464         ! 
    6565         ! mask velocity in tbl with ice shelf mask 
    66          !zutbl(:,:) = zutbl(:,:) * mskisf_cav(:,:) 
    67          !zvtbl(:,:) = zvtbl(:,:) * mskisf_cav(:,:) 
     66         zutbl(:,:) = zutbl(:,:) * mskisf_cav(:,:) 
     67         zvtbl(:,:) = zvtbl(:,:) * mskisf_cav(:,:) 
    6868         ! 
    6969         ! output 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfdiags.F90

    r11395 r11521  
    1717   USE dom_oce 
    1818   USE isf            ! ice shelf variable 
     19   USE isfutils 
    1920   USE iom            !  
    2021 
     
    9394      ! compute 3d output 
    9495      zvar2d(:,:) = pvar2d(:,:) / phtbl(:,:) 
     96      zvar3d(:,:,:) = 0._wp 
     97      ! 
    9598      DO jj = 1,jpj 
    9699         DO ji = 1,jpi 
     
    98101            ikb = kbot(ji,jj) 
    99102            DO jk = ikt, ikb - 1 
    100                zvar3d(ji,jj,jk) = zvar3d(ji,jj,jk) + zvar2d(ji,jj) * e3t_n(ji,jj,jk) 
     103               zvar3d(ji,jj,jk) = zvar2d(ji,jj) * e3t_n(ji,jj,jk) 
    101104            END DO 
    102             ! phtbl(ji,jj) * pfrac(ji,jj) = thickness of bottom affected by tbl 
    103             zvar3d(ji,jj,ikb) = zvar3d(ji,jj,ikb) + zvar2d(ji,jj) * e3t_n(ji,jj,ikb) * pfrac(ji,jj) 
     105            zvar3d(ji,jj,ikb) = zvar2d(ji,jj) * e3t_n(ji,jj,ikb) * pfrac(ji,jj) 
    104106         END DO 
    105107      END DO 
    106108      ! 
    107       ! output data 
    108109      CALL iom_put( TRIM(cdvar) , zvar3d(:,:,:)) 
    109110      ! 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfhdiv.F90

    r11423 r11521  
    22 
    33   USE dom_oce 
     4   USE iom 
    45   USE isf 
     6   USE isfutils 
    57   USE phycst 
    68   USE in_out_manager 
     
    2830      INTEGER, INTENT(in) :: kt 
    2931      ! 
    30       ! ice shelf cavity contribution 
    31       IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, fwfisf_cav_b, phdiv) 
     32      IF (lwp) WRITE(numout,*) ' isfdiv start' 
     33      FLUSH(numout) 
    3234      ! 
    33       ! ice shelf parametrisation contribution 
    34       IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, phdiv) 
     35      IF ( ln_isf ) THEN 
     36         ! 
     37         ! ice shelf cavity contribution 
     38         IF ( ln_isfcav_mlt ) CALL isf_hdiv_mlt(misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav, fwfisf_cav, fwfisf_cav_b, phdiv) 
     39         ! 
     40         ! ice shelf parametrisation contribution 
     41         IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, phdiv) 
     42         ! 
     43      END IF 
    3544      ! 
    3645      ! ice sheet coupling contribution (if conservation needed) 
     
    3847         ! 
    3948         ! correct divergence only for the first time step 
    40          IF ( kt == nit000 ) CALL isf_hdiv_cpl(risfcpl_vol, phdiv) 
     49         !IF ( kt == nit000 ) CALL isf_hdiv_cpl(risfcpl_vol, phdiv) 
    4150         ! 
    4251         ! correct divergence every time step to remove any trend due to coupling 
    43          IF ( ll_isfcpl_cons ) CALL isf_hdiv_cpl(risfcpl_cons_vol, phdiv) 
     52         IF ( ll_isfcpl_cons ) CALL isf_hdiv_cpl(risfcpl_cons_vol, risfcpl_cons_vol_b, phdiv) 
    4453         ! 
    4554      END IF 
     55      IF (lwp) WRITE(numout,*) ' isfdiv end' 
     56      FLUSH(numout) 
    4657      ! 
    4758   END SUBROUTINE isf_hdiv 
     
    7889      DO jj = 1,jpj 
    7990         DO ji = 1,jpi 
    80                ikt = ktop(ji,jj) 
    81                ikb = kbot(ji,jj) 
    82                ! level fully include in the ice shelf boundary layer 
    83                DO jk = ikt, ikb - 1 
    84                   phdiv(ji,jj,jk) = phdiv(ji,jj,jk) + zqvol(ji,jj) 
    85                END DO 
    86                ! level partially include in ice shelf boundary layer  
    87                phdiv(ji,jj,ikb) = phdiv(ji,jj,ikb) + zqvol(ji,jj) * pfrac(ji,jj) 
     91            ikt = ktop(ji,jj) 
     92            ikb = kbot(ji,jj) 
     93            ! level fully include in the ice shelf boundary layer 
     94            DO jk = ikt, ikb - 1 
     95               phdiv(ji,jj,jk) = phdiv(ji,jj,jk) + zqvol(ji,jj) 
     96            END DO 
     97            ! level partially include in ice shelf boundary layer  
     98            phdiv(ji,jj,ikb) = phdiv(ji,jj,ikb) + zqvol(ji,jj) * pfrac(ji,jj) 
    8899         END DO 
    89100      END DO 
     
    91102   END SUBROUTINE isf_hdiv_mlt 
    92103 
    93    SUBROUTINE isf_hdiv_cpl(pqvol, phdiv) 
     104   SUBROUTINE isf_hdiv_cpl(pqvol, pqvol_b, phdiv) 
     105      !!---------------------------------------------------------------------- 
     106      !!                  ***  SUBROUTINE isf_hdiv_cpl  *** 
     107      !!        
     108      !! ** Purpose :    
     109      !! 
     110      !! ** Method  :    
     111      !! 
     112      !! ** Action  :   
     113      !!---------------------------------------------------------------------- 
    94114      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phdiv 
    95       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pqvol 
    96     
    97    INTEGER :: jk 
    98        
     115      !!---------------------------------------------------------------------- 
     116      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pqvol, pqvol_b 
     117      !!---------------------------------------------------------------------- 
     118      INTEGER :: jk 
     119      !!---------------------------------------------------------------------- 
     120      ! 
    99121      DO jk=1,jpk  
    100122         phdiv(:,:,jk) =  phdiv(:,:,jk) + pqvol(:,:,jk) * r1_e1e2t(:,:) / e3t_n(:,:,jk) 
    101123      END DO 
    102  
    103    END SUBROUTINE 
     124      ! 
     125   END SUBROUTINE isf_hdiv_cpl 
    104126 
    105127END MODULE isfhdiv 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfnxt.F90

    r11403 r11521  
    4242      IF ( ln_isfpar_mlt ) CALL isf_dynnxt_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, pcoef) 
    4343      ! 
    44       ! ice sheet coupling 
    45       !IF ( ln_iscpl_hsb  ) CALL isf_dynnxt_cpl(...zcoef) 
    46       ! 
    4744   END SUBROUTINE isf_dynnxt 
    4845 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfparmlt.F90

    r11495 r11521  
    148148      ! 3. ------------BG03 output 
    149149      ! output ttbl 
    150       CALL iom_put('ttbl_par', ztavg(:,:) ) 
     150      CALL iom_put('ttbl_par', ztavg(:,:) * mskisf_par(:,:) ) 
    151151      ! 
    152152      ! output thermal driving 
    153       CALL iom_put('isfthermald_par',( ztfrz(:,:) - ztavg(:,:) )) 
     153      CALL iom_put('isfthermald_par',( ztfrz(:,:) - ztavg(:,:) ) * mskisf_par(:,:)) 
    154154      ! 
    155155      ! 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfstp.F90

    r11489 r11521  
    3333   USE isfcpl         ! isf variables 
    3434   USE isf            ! isf variables 
     35   USE isfutils 
    3536 
    3637   IMPLICIT NONE 
     
    103104      END IF 
    104105 
    105       IF ( ln_isfcpl ) THEN 
     106      IF ( ll_isfcpl ) THEN 
     107 
    106108         IF (lrst_oce) CALL isfcpl_rst_write(kt) 
     109 
    107110      END IF 
    108111      ! 
     
    181184            WRITE(numout,*) '' 
    182185            ! 
    183             WRITE(numout,*) '      Coupling to an ice sheet model          ln_isfcpl         = ', ln_isfcpl 
    184             IF ( ln_isfcpl ) THEN 
    185                WRITE(numout,*) '         conservation activated ln_isfcpl_cons           = ', ln_isfcpl_cons 
    186                WRITE(numout,*) '            number of call of the extrapolation loop = ', nn_drown 
    187             ENDIF 
    188             ! 
    189             WRITE(numout,*) '      Ice shelf load method                   cn_isfload        = ', TRIM(cn_isfload) 
    190186         ELSE 
    191187            IF ( ln_isfcav ) THEN 
     
    196192         END IF 
    197193 
     194         WRITE(numout,*) '      Coupling to an ice sheet model          ln_isfcpl         = ', ln_isfcpl 
     195         IF ( ln_isfcpl ) THEN 
     196            WRITE(numout,*) '         conservation activated ln_isfcpl_cons           = ', ln_isfcpl_cons 
     197            WRITE(numout,*) '            number of call of the extrapolation loop = ', nn_drown 
     198         ENDIF 
     199         ! 
     200         IF (ln_isfcav) WRITE(numout,*) '      Ice shelf load method                   cn_isfload        = ', TRIM(cn_isfload) 
     201         WRITE(numout,*) '' 
     202 
    198203      END IF 
    199204      ! 
     
    244249      ! 
    245250      ! terminate routine now if no ice shelf melt formulation specify 
    246       IF ( .NOT. ln_isf ) RETURN 
    247       ! 
    248       ! initialisation useful variable 
    249       r1_Lfusisf =  1._wp / rLfusisf 
     251      IF ( ln_isf ) THEN 
     252         ! 
     253         ! initialisation useful variable 
     254         r1_Lfusisf =  1._wp / rLfusisf 
     255         ! 
     256         ! initialisation melt in the cavity 
     257         IF ( ln_isfcav_mlt ) THEN 
     258            ! 
     259            ! initialisation  of cav variable 
     260            CALL isf_cav_init() 
     261            ! 
     262            ! read cav variable from restart 
     263            IF ( ln_rstart ) CALL isfrst_read('cav', risf_cav_tsc, fwfisf_cav, risf_cav_tsc_b, fwfisf_cav_b) 
     264            ! 
     265         END IF 
     266         ! 
     267         !--------------------------------------------------------------------------------------------------------------------- 
     268         ! initialisation parametrised melt 
     269         IF ( ln_isfpar_mlt ) THEN 
     270            ! 
     271            ! initialisation  of par variable 
     272            CALL isf_par_init() 
     273            ! 
     274            ! read par variable from restart 
     275            IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b) 
     276            ! 
     277         END IF 
     278      END IF 
     279      ! 
     280      !--------------------------------------------------------------------------------------------------------------------- 
     281      ! initialisation ice sheet coupling 
    250282      ! 
    251283      ll_isfcpl     = .FALSE. 
    252284      ll_isfcpl_cons= .FALSE. 
    253285      ! 
    254       ! initialisation melt in the cavity 
    255       IF ( ln_isfcav_mlt ) THEN 
    256          ! 
    257          ! initialisation  of cav variable 
    258          CALL isf_cav_init() 
    259          ! 
    260          ! read cav variable from restart 
    261          IF ( ln_rstart ) CALL isfrst_read('cav', risf_cav_tsc, fwfisf_cav, risf_cav_tsc_b, fwfisf_cav_b) 
    262          ! 
    263       END IF 
    264       ! 
    265       !--------------------------------------------------------------------------------------------------------------------- 
    266       ! initialisation parametrised melt 
    267       IF ( ln_isfpar_mlt ) THEN 
    268          ! 
    269          ! initialisation  of par variable 
    270          CALL isf_par_init() 
    271          ! 
    272          ! read par variable from restart 
    273          IF ( ln_rstart ) CALL isfrst_read('par', risf_par_tsc, fwfisf_par, risf_par_tsc_b, fwfisf_par_b) 
    274          ! 
    275       END IF 
    276       ! 
    277       !--------------------------------------------------------------------------------------------------------------------- 
    278       ! initialisation ice sheet coupling 
    279286      IF( ln_isfcpl ) THEN 
    280287 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isftbl.F90

    r11495 r11521  
    9898         ! 
    9999      END SELECT 
    100       ! 
    101       ! mask mean tbl value 
    102       pvarout(:,:) = pvarout(:,:) * ssmask(:,:) 
    103100      ! 
    104101   END SUBROUTINE isf_tbl 
  • NEMO/branches/2019/ENHANCE-02_ISF_nemo/src/OCE/ISF/isfutils.F90

    r11494 r11521  
    6565      !!-------------------------------------------------------------------- 
    6666      ! 
    67       zsum = glob_sum( 'debug', pvar(:,:) ) 
     67      zsum = glob_sum_full( 'debug', pvar(:,:) ) 
    6868      zmin = MINVAL( pvar(:,:) ) ; CALL mpp_min( 'debug', zmin ) ! min over the global domain 
    6969      zmax = MAXVAL( pvar(:,:) ) ; CALL mpp_max( 'debug', zmax ) ! max over the global domain 
     
    8989      !!-------------------------------------------------------------------- 
    9090      ! 
    91       zsum = glob_sum( 'debug', pvar(:,:) ) 
    92       zmin = MINVAL( pvar(:,:) ) ; CALL mpp_min( 'debug', zmin ) ! min over the global domain 
    93       zmax = MAXVAL( pvar(:,:) ) ; CALL mpp_max( 'debug', zmax ) ! max over the global domain 
     91      zsum = glob_sum_full( 'debug', pvar(:,:,:) ) 
     92      zmin = MINVAL( pvar(:,:,:) ) ; CALL mpp_min( 'debug', zmin ) ! min over the global domain 
     93      zmax = MAXVAL( pvar(:,:,:) ) ; CALL mpp_max( 'debug', zmax ) ! max over the global domain 
    9494      ! 
    9595      WRITE(numout,*) TRIM(cdtxt),' (min, max, sum) : ',zmin, zmax, zsum 
Note: See TracChangeset for help on using the changeset viewer.