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 15813 – NEMO

Changeset 15813


Ignore:
Timestamp:
2023-04-05T13:59:14+02:00 (21 months ago)
Author:
clem
Message:

SI3: change heat budget to avoid supercooling. The rest: cosmetics

Location:
NEMO/releases/r4.0/r4.0-HEAD/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • NEMO/releases/r4.0/r4.0-HEAD/src/ICE/icethd.F90

    r14885 r15813  
    183183            !     If warming (zqld >= 0), then the energy in the leads is used to melt ice (bottom melting) => fhld  (W/m2) 
    184184            !     If cooling (zqld <  0), then the energy in the leads is used to grow ice in open water    => qlead (J.m-2) 
    185             IF( zqld >= 0._wp .AND. at_i(ji,jj) > 0._wp ) THEN 
    186                ! upper bound for fhld: fhld should be equal to zqld 
    187                !                        but we have to make sure that this heat will not make the sst drop below the freezing point 
    188                !                        so the max heat that can be pulled out of the ocean is zqld - qsb - zqfr_pos 
    189                !                        The following formulation is ok for both normal conditions and supercooling 
    190                fhld (ji,jj) = rswitch * MAX( 0._wp, ( zqld - zqfr_pos ) * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) &  ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 
    191                   &                                 - qsb_ice_bot(ji,jj) ) 
    192                qlead(ji,jj) = 0._wp 
    193             ELSE 
     185            IF( ( zqld - zqfr ) < 0._wp .OR. at_i(ji,jj) < epsi10 ) THEN 
    194186               fhld (ji,jj) = 0._wp 
    195187               ! upper bound for qlead: qlead should be equal to zqld 
    196188               !                        but before using this heat for ice formation, we suppose that the ocean cools down till the freezing point. 
    197                !                        The energy for this cooling down is zqfr. Also some heat will be removed from the ocean from turbulent fluxes (qsb) 
    198                !                        and freezing point is reached if zqfr = zqld - qsb*a/dt 
    199                !                        so the max heat that can be pulled out of the ocean is zqld - qsb - zqfr 
     189               !                        The energy for this cooling down is zqfr and freezing point is reached if zqfr = zqld 
     190               !                        so the max heat that can be pulled out of the ocean is zqld - zqfr 
     191               !                        The following formulation is ok for both normal conditions and supercooling             
     192               qlead(ji,jj) = MIN( 0._wp , zqld - zqfr ) 
     193            ELSE 
     194               ! upper bound for fhld: fhld should be equal to zqld 
     195               !                        but we have to make sure that this heat will not make the sst drop below the freezing point 
     196               !                        so the max heat that can be pulled out of the ocean is zqld - zqfr_pos 
    200197               !                        The following formulation is ok for both normal conditions and supercooling 
    201                qlead(ji,jj) = MIN( 0._wp , zqld - ( qsb_ice_bot(ji,jj) * at_i(ji,jj) * rdt_ice ) - zqfr ) 
     198               fhld (ji,jj) = rswitch * MAX( 0._wp, ( zqld - zqfr_pos ) * r1_rdtice / MAX( at_i(ji,jj), epsi10 ) )  ! divided by at_i since this is (re)multiplied by a_i in icethd_dh.F90 
     199               qlead(ji,jj) = 0._wp 
    202200            ENDIF 
    203201            ! 
  • NEMO/releases/r4.0/r4.0-HEAD/src/OCE/DYN/dynnxt.F90

    r13284 r15813  
    356356      ENDIF 
    357357      ! 
     358      !!clem 
     359      !!CALL lbc_lnk_multi( 'dynnxt' , ub, 'U', -1., vn, 'V', -1.) 
     360 
     361      ! 
    358362      IF ( iom_use("utau") ) THEN 
    359363         IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 
  • NEMO/releases/r4.0/r4.0-HEAD/src/OCE/SBC/sbcblk.F90

    r15613 r15813  
    422422      END DO 
    423423#endif 
     424      ! mask the wind in case it is not masked in the input file otherwise we end up with twice the stress at the coast 
     425      ! (see calculation of utau/vtau below) 
    424426      DO jj = 2, jpjm1 
    425427         DO ji = fs_2, fs_jpim1   ! vect. opt. 
    426             zwnd_i(ji,jj) = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pu(ji-1,jj  ) + pu(ji,jj) )  ) 
    427             zwnd_j(ji,jj) = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pv(ji  ,jj-1) + pv(ji,jj) )  ) 
     428            zwnd_i(ji,jj) = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pu(ji-1,jj  ) + pu(ji,jj) )  ) * tmask(ji,jj,1) 
     429            zwnd_j(ji,jj) = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pv(ji  ,jj-1) + pv(ji,jj) )  ) * tmask(ji,jj,1) 
    428430         END DO 
    429431      END DO 
     
    431433      ! ... scalar wind ( = | U10m - U_oce | ) at T-point (masked) 
    432434      wndm(:,:) = SQRT(  zwnd_i(:,:) * zwnd_i(:,:)   & 
    433          &             + zwnd_j(:,:) * zwnd_j(:,:)  ) * tmask(:,:,1) 
     435         &             + zwnd_j(:,:) * zwnd_j(:,:)  ) 
    434436 
    435437      ! ----------------------------------------------------------------------------- ! 
  • NEMO/releases/r4.0/r4.0-HEAD/src/OCE/SBC/sbcflx.F90

    r15681 r15813  
    3535   INTEGER , PARAMETER ::   jp_qsr  = 4   ! index of solar heat file 
    3636   INTEGER , PARAMETER ::   jp_emp  = 5   ! index of evaporation-precipation file 
    37  !!INTEGER , PARAMETER ::   jp_sfx  = 6   ! index of salt flux flux 
    38    INTEGER , PARAMETER ::   jpfld   = 5 !! 6 ! maximum number of files to read  
     37!!$   INTEGER , PARAMETER ::   jp_sfx  = 6   ! index of salt flux 
     38!!$   INTEGER , PARAMETER ::   jp_sithic = 7    ! index of sea ice thickness 
     39!!$   INTEGER , PARAMETER ::   jp_siconc = 8    ! index of sea ice fraction 
     40!!$   INTEGER , PARAMETER ::   jp_hfrnf  = 9    ! index of rnf heat flux 
     41!!$   INTEGER , PARAMETER ::   jp_hfisf  = 10   ! index of iceshelf heat flux 
     42!!$   INTEGER , PARAMETER ::   jp_fwisf  = 11   ! index of iceshelf freshwater flux 
     43!!$   INTEGER , PARAMETER ::   jp_fwrnf  = 12   ! index of runoff freshwater flux 
     44   INTEGER , PARAMETER ::   jpfld   = 5   ! maximum number of files to read  
    3945 
    4046   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf    ! structure of input fields (file informations, fields read) 
     
    7480      !!              - qsr         solar heat flux 
    7581      !!              - emp         upward mass flux (evap. - precip.) 
    76       !!              - sfx         salt flux; set to zero at nit000 but possibly non-zero 
    77       !!                            if ice 
     82      !!              - sfx         salt flux; set to zero at nit000 but possibly non-zero if ice 
    7883      !!---------------------------------------------------------------------- 
    7984      INTEGER, INTENT(in) ::   kt   ! ocean time step 
     
    8994      CHARACTER(len=100) ::  cn_dir                               ! Root directory for location of flx files 
    9095      TYPE(FLD_N), DIMENSION(jpfld) ::   slf_i                    ! array of namelist information structures 
    91       TYPE(FLD_N) ::   sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, sn_sfx ! informations about the fields to be read 
    92       NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, sn_sfx 
     96      TYPE(FLD_N) ::   sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp  !!, & ! informations about the fields to be read 
     97!!$         &             sn_sfx, sn_sithic, sn_siconc, sn_hfisf, sn_hfrnf, sn_fwisf, sn_fwrnf 
     98      NAMELIST/namsbc_flx/ cn_dir, sn_utau, sn_vtau, sn_qtot, sn_qsr, sn_emp !!, & 
     99!!$         &                         sn_sfx, sn_sithic, sn_siconc, sn_hfisf, sn_hfrnf, sn_fwisf, sn_fwrnf 
    93100      !!--------------------------------------------------------------------- 
    94101      ! 
     
    111118         slf_i(jp_utau) = sn_utau   ;   slf_i(jp_vtau) = sn_vtau 
    112119         slf_i(jp_qtot) = sn_qtot   ;   slf_i(jp_qsr ) = sn_qsr  
    113          slf_i(jp_emp ) = sn_emp !! ;   slf_i(jp_sfx ) = sn_sfx 
     120         slf_i(jp_emp ) = sn_emp 
     121!!$         slf_i(jp_sfx  ) = sn_sfx 
     122!!$         slf_i(jp_sithic) = sn_sithic 
     123!!$         slf_i(jp_siconc) = sn_siconc 
     124!!$         slf_i(jp_hfisf) = sn_hfisf    ;   slf_i(jp_hfrnf) = sn_hfrnf 
     125!!$         slf_i(jp_fwisf) = sn_fwisf    ;   slf_i(jp_fwrnf) = sn_fwrnf 
    114126         ! 
    115127         ALLOCATE( sf(jpfld), STAT=ierror )        ! set sf structure 
     
    146158               qns (ji,jj) = ( sf(jp_qtot)%fnow(ji,jj,1) - sf(jp_qsr)%fnow(ji,jj,1) ) * tmask(ji,jj,1) 
    147159               emp (ji,jj) =   sf(jp_emp )%fnow(ji,jj,1)                              * tmask(ji,jj,1) 
    148                !!sfx (ji,jj) = sf(jp_sfx )%fnow(ji,jj,1)                              * tmask(ji,jj,1)  
     160!!$               sfx (ji,jj) = sf(jp_sfx   )%fnow(ji,jj,1)                             * tmask(ji,jj,1)  
     161!!$               !! => if the following is used, then one needs to change tke routine + allocate hm_i in sbc_oce 
     162!!$               hm_i(ji,jj) = sf(jp_sithic)%fnow(ji,jj,1)                             * tmask(ji,jj,1)  
     163!!$               fr_i(ji,jj) = sf(jp_siconc)%fnow(ji,jj,1)                             * tmask(ji,jj,1) 
     164!!$               !! => if the following is used, then one needs to change rnf and isf routines + allocate the arrays 
     165!!$               hfisf(ji,jj) = sf(jp_hfisf)%fnow(ji,jj,1)                             * ssmask(ji,jj) 
     166!!$               fwisf(ji,jj) = sf(jp_fwisf)%fnow(ji,jj,1)                             * ssmask(ji,jj) 
     167!!$               hfrnf(ji,jj) = sf(jp_hfrnf)%fnow(ji,jj,1)                             * tmask(ji,jj,1) 
     168!!$               fwrnf(ji,jj) = sf(jp_fwrnf)%fnow(ji,jj,1)                             * tmask(ji,jj,1) 
    149169            END DO 
    150170         END DO 
    151          !                                                        ! add to qns the heat due to e-p 
    152          !clem: I do not think it is needed 
    153          !!qns(:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp        ! mass flux is at SST 
    154171         ! 
    155172         ! clem: without these lbc calls, it seems that the northfold is not ok (true in 3.6, not sure in 4.x)  
    156173         CALL lbc_lnk_multi( 'sbcflx', utau, 'U', -1._wp, vtau, 'V', -1._wp, & 
    157             &                           qns, 'T',  1._wp, emp , 'T',  1._wp, qsr, 'T', 1._wp ) !! sfx, 'T', 1._wp  ) 
     174            &                           qns, 'T',  1._wp, emp , 'T',  1._wp, qsr, 'T', 1._wp ) !! & 
     175!!$            &                           sfx, 'T', 1._wp, hm_i,'T', 1._wp, fr_i,'T', 1._wp, & 
     176!!$            &                          hfisf, 'T', 1._wp, fwisf, 'T', 1._wp, hfrnf, 'T', 1._wp, fwrnf, 'T', 1._wp ) 
    158177         ! 
    159178         IF( nitend-nit000 <= 100 .AND. lwp ) THEN                ! control print (if less than 100 time-step asked) 
Note: See TracChangeset for help on using the changeset viewer.