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 12928 for NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/SBC/sbcrnf.F90 – NEMO

Ignore:
Timestamp:
2020-05-14T21:46:00+02:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12925 (ticket #2170)

Location:
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser

    • Property svn:externals
      •  

        old new  
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@HEAD         sette 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/SBC/sbcrnf.F90

    r12178 r12928  
    1919   USE phycst         ! physical constants 
    2020   USE sbc_oce        ! surface boundary condition variables 
    21    USE sbcisf         ! PM we could remove it I think 
    2221   USE eosbn2         ! Equation Of State 
    23    USE closea        ! closed seas 
     22   USE closea, ONLY: l_clo_rnf, clo_rnf ! closed seas 
    2423   ! 
    2524   USE in_out_manager ! I/O manager 
     
    4342   REAL(wp)                   ::      rn_dep_max        !: depth over which runoffs is spread       (ln_rnf_depth_ini =T) 
    4443   INTEGER                    ::      nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 
     44   LOGICAL                    ::   ln_rnf_icb        !: iceberg flux is specified in a file 
    4545   LOGICAL                    ::   ln_rnf_tem        !: temperature river runoffs attribute specified in a file 
    4646   LOGICAL           , PUBLIC ::   ln_rnf_sal        !: salinity    river runoffs attribute specified in a file 
    4747   TYPE(FLD_N)       , PUBLIC ::   sn_rnf            !: information about the runoff file to be read 
    4848   TYPE(FLD_N)                ::   sn_cnf            !: information about the runoff mouth file to be read 
     49   TYPE(FLD_N)                ::   sn_i_rnf        !: information about the iceberg flux file to be read 
    4950   TYPE(FLD_N)                ::   sn_s_rnf          !: information about the salinities of runoff file to be read 
    5051   TYPE(FLD_N)                ::   sn_t_rnf          !: information about the temperatures of runoff file to be read 
     
    6566 
    6667   TYPE(FLD),        ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
     68   TYPE(FLD),        ALLOCATABLE, DIMENSION(:) ::   sf_i_rnf     ! structure: iceberg flux (file information, fields read) 
    6769   TYPE(FLD),        ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
    6870   TYPE(FLD),        ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
    6971  
     72   !! * Substitutions 
     73#  include "do_loop_substitute.h90" 
    7074   !!---------------------------------------------------------------------- 
    7175   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    112116      !                                            !-------------------! 
    113117      ! 
    114       IF( .NOT. l_rnfcpl )   CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt 
     118      ! 
     119      IF( .NOT. l_rnfcpl )  THEN 
     120                            CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt ( runoffs + iceberg ) 
     121         IF( ln_rnf_icb )   CALL fld_read ( kt, nn_fsbc, sf_i_rnf )    ! idem for iceberg flux if required 
     122      ENDIF 
    115123      IF(   ln_rnf_tem   )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
    116124      IF(   ln_rnf_sal   )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
     
    118126      IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
    119127         ! 
    120          IF( .NOT. l_rnfcpl )   rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1)       ! updated runoff value at time step kt 
     128         IF( .NOT. l_rnfcpl ) THEN 
     129             rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1)  ! updated runoff value at time step kt 
     130             IF( ln_rnf_icb ) THEN 
     131                fwficb(:,:) = rn_rfact * ( sf_i_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1)  ! updated runoff value at time step kt 
     132                CALL iom_put( 'iceberg_cea'  , fwficb(:,:)  )         ! output iceberg flux 
     133                CALL iom_put( 'hflx_icb_cea' , fwficb(:,:) * rLfus )   ! output Heat Flux into Sea Water due to Iceberg Thermodynamics --> 
     134             ENDIF 
     135         ENDIF 
    121136         ! 
    122137         !                                                           ! set temperature & salinity content of runoffs 
    123138         IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
    124             rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     139            rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 
    125140            CALL eos_fzp( sss_m(:,:), ztfrz(:,:) ) 
    126141            WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature 
    127                rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    128             END WHERE 
    129             WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp )             ! where fwf comes from melting of ice shelves or iceberg 
    130                rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * rLfusisf * r1_rau0_rcp 
     142               rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rho0 
    131143            END WHERE 
    132144         ELSE                                                        ! use SST as runoffs temperature 
    133145            !CEOD River is fresh water so must at least be 0 unless we consider ice 
    134             rnf_tsc(:,:,jp_tem) = MAX(sst_m(:,:),0.0_wp) * rnf(:,:) * r1_rau0 
     146            rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:), 0.0_wp ) * rnf(:,:) * r1_rho0 
    135147         ENDIF 
    136148         !                                                           ! use runoffs salinity data 
    137          IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     149         IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 
    138150         !                                                           ! else use S=0 for runoffs (done one for all in the init) 
    139          IF( iom_use('runoffs') )        CALL iom_put( 'runoffs'     , rnf(:,:)                         )   ! output runoff mass flux 
    140          IF( iom_use('hflx_rnf_cea') )   CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * rau0 * rcp )   ! output runoff sensible heat (W/m2) 
     151                                         CALL iom_put( 'runoffs'     , rnf(:,:)                         )   ! output runoff mass flux 
     152         IF( iom_use('hflx_rnf_cea') )   CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * rho0 * rcp )   ! output runoff sensible heat (W/m2) 
    141153      ENDIF 
    142154      ! 
     
    173185 
    174186 
    175    SUBROUTINE sbc_rnf_div( phdivn ) 
     187   SUBROUTINE sbc_rnf_div( phdivn, Kmm ) 
    176188      !!---------------------------------------------------------------------- 
    177189      !!                  ***  ROUTINE sbc_rnf  *** 
     
    185197      !! ** Action  :   phdivn   decreased by the runoff inflow 
    186198      !!---------------------------------------------------------------------- 
     199      INTEGER                   , INTENT(in   ) ::   Kmm      ! ocean time level index 
    187200      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   phdivn   ! horizontal divergence 
    188201      !! 
     
    195208      IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN      !==   runoff distributed over several levels   ==! 
    196209         IF( ln_linssh ) THEN    !* constant volume case : just apply the runoff input flow 
    197             DO jj = 1, jpj 
    198                DO ji = 1, jpi 
    199                   DO jk = 1, nk_rnf(ji,jj) 
    200                      phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj) 
    201                   END DO 
     210            DO_2D_11_11 
     211               DO jk = 1, nk_rnf(ji,jj) 
     212                  phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 
    202213               END DO 
    203             END DO 
     214            END_2D 
    204215         ELSE                    !* variable volume case 
    205             DO jj = 1, jpj                   ! update the depth over which runoffs are distributed 
    206                DO ji = 1, jpi 
    207                   h_rnf(ji,jj) = 0._wp 
    208                   DO jk = 1, nk_rnf(ji,jj)                           ! recalculates h_rnf to be the depth in metres 
    209                      h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk)   ! to the bottom of the relevant grid box 
    210                   END DO 
    211                   !                          ! apply the runoff input flow 
    212                   DO jk = 1, nk_rnf(ji,jj) 
    213                      phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj) 
    214                   END DO 
     216            DO_2D_11_11 
     217               h_rnf(ji,jj) = 0._wp 
     218               DO jk = 1, nk_rnf(ji,jj)                           ! recalculates h_rnf to be the depth in metres 
     219                  h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm)   ! to the bottom of the relevant grid box 
    215220               END DO 
    216             END DO 
     221               !                          ! apply the runoff input flow 
     222               DO jk = 1, nk_rnf(ji,jj) 
     223                  phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 
     224               END DO 
     225            END_2D 
    217226         ENDIF 
    218227      ELSE                       !==   runoff put only at the surface   ==! 
    219          h_rnf (:,:)   = e3t_n (:,:,1)        ! update h_rnf to be depth of top box 
    220          phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rau0 / e3t_n(:,:,1) 
     228         h_rnf (:,:)   = e3t (:,:,1,Kmm)        ! update h_rnf to be depth of top box 
     229         phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rho0 / e3t(:,:,1,Kmm) 
    221230      ENDIF 
    222231      ! 
     
    224233 
    225234 
    226    SUBROUTINE sbc_rnf_init 
     235   SUBROUTINE sbc_rnf_init( Kmm ) 
    227236      !!---------------------------------------------------------------------- 
    228237      !!                  ***  ROUTINE sbc_rnf_init  *** 
     
    234243      !! ** Action  : - read parameters 
    235244      !!---------------------------------------------------------------------- 
     245      INTEGER, INTENT(in) :: Kmm           ! ocean time level index 
    236246      CHARACTER(len=32) ::   rn_dep_file   ! runoff file name 
    237247      INTEGER           ::   ji, jj, jk, jm    ! dummy loop indices 
     
    242252      REAL(wp), DIMENSION(jpi,jpj,2) :: zrnfcl     
    243253      !! 
    244       NAMELIST/namsbc_rnf/ cn_dir            , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
    245          &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   & 
     254      NAMELIST/namsbc_rnf/ cn_dir            , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, ln_rnf_icb,   & 
     255         &                 sn_rnf, sn_cnf    , sn_i_rnf, sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   & 
    246256         &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact,     & 
    247257         &                 ln_rnf_depth_ini  , rn_dep_max  , rn_rnf_max, nn_rnf_depth_file 
     
    265275      !                                   ! ============ 
    266276      ! 
    267       REWIND( numnam_ref )              ! Namelist namsbc_rnf in reference namelist : Runoffs  
    268277      READ  ( numnam_ref, namsbc_rnf, IOSTAT = ios, ERR = 901) 
    269278901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_rnf in reference namelist' ) 
    270279 
    271       REWIND( numnam_cfg )              ! Namelist namsbc_rnf in configuration namelist : Runoffs 
    272280      READ  ( numnam_cfg, namsbc_rnf, IOSTAT = ios, ERR = 902 ) 
    273281902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_rnf in configuration namelist' ) 
     
    299307         IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 
    300308         CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf', no_print ) 
     309         ! 
     310         IF( ln_rnf_icb ) THEN                      ! Create (if required) sf_i_rnf structure 
     311            IF(lwp) WRITE(numout,*) 
     312            IF(lwp) WRITE(numout,*) '          iceberg flux read in a file' 
     313            ALLOCATE( sf_i_rnf(1), STAT=ierror  ) 
     314            IF( ierror > 0 ) THEN 
     315               CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_i_rnf structure' )   ;   RETURN 
     316            ENDIF 
     317            ALLOCATE( sf_i_rnf(1)%fnow(jpi,jpj,1)   ) 
     318            IF( sn_i_rnf%ln_tint ) ALLOCATE( sf_i_rnf(1)%fdta(jpi,jpj,1,2) ) 
     319            CALL fld_fill (sf_i_rnf, (/ sn_i_rnf /), cn_dir, 'sbc_rnf_init', 'read iceberg flux data', 'namsbc_rnf' ) 
     320         ELSE 
     321            fwficb(:,:) = 0._wp 
     322         ENDIF 
     323 
    301324      ENDIF 
    302325      ! 
     
    337360         ! 
    338361         nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied 
    339          DO jj = 1, jpj 
    340             DO ji = 1, jpi 
    341                IF( h_rnf(ji,jj) > 0._wp ) THEN 
    342                   jk = 2 
    343                   DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
    344                   END DO 
    345                   nk_rnf(ji,jj) = jk 
    346                ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
    347                ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
    348                ELSE 
    349                   CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
    350                   WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
    351                ENDIF 
     362         DO_2D_11_11 
     363            IF( h_rnf(ji,jj) > 0._wp ) THEN 
     364               jk = 2 
     365               DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
     366               END DO 
     367               nk_rnf(ji,jj) = jk 
     368            ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
     369            ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
     370            ELSE 
     371               CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
     372               WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
     373            ENDIF 
     374         END_2D 
     375         DO_2D_11_11 
     376            h_rnf(ji,jj) = 0._wp 
     377            DO jk = 1, nk_rnf(ji,jj) 
     378               h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) 
    352379            END DO 
    353          END DO 
    354          DO jj = 1, jpj                                ! set the associated depth 
    355             DO ji = 1, jpi 
    356                h_rnf(ji,jj) = 0._wp 
    357                DO jk = 1, nk_rnf(ji,jj) 
    358                   h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 
    359                END DO 
    360             END DO 
    361          END DO 
     380         END_2D 
    362381         ! 
    363382      ELSE IF( ln_rnf_depth_ini ) THEN           ! runoffs applied at the surface 
     
    384403         WHERE( zrnfcl(:,:,1) > 0._wp )  h_rnf(:,:) = zacoef * zrnfcl(:,:,1)   ! compute depth for all runoffs 
    385404         ! 
    386          DO jj = 1, jpj                     ! take in account min depth of ocean rn_hmin 
    387             DO ji = 1, jpi 
    388                IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 
    389                   jk = mbkt(ji,jj) 
    390                   h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 
    391                ENDIF 
     405         DO_2D_11_11 
     406            IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 
     407               jk = mbkt(ji,jj) 
     408               h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 
     409            ENDIF 
     410         END_2D 
     411         ! 
     412         nk_rnf(:,:) = 0                       ! number of levels on which runoffs are distributed 
     413         DO_2D_11_11 
     414            IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 
     415               jk = 2 
     416               DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
     417               END DO 
     418               nk_rnf(ji,jj) = jk 
     419            ELSE 
     420               nk_rnf(ji,jj) = 1 
     421            ENDIF 
     422         END_2D 
     423         ! 
     424         DO_2D_11_11 
     425            h_rnf(ji,jj) = 0._wp 
     426            DO jk = 1, nk_rnf(ji,jj) 
     427               h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) 
    392428            END DO 
    393          END DO 
    394          ! 
    395          nk_rnf(:,:) = 0                       ! number of levels on which runoffs are distributed 
    396          DO jj = 1, jpj 
    397             DO ji = 1, jpi 
    398                IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 
    399                   jk = 2 
    400                   DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
    401                   END DO 
    402                   nk_rnf(ji,jj) = jk 
    403                ELSE 
    404                   nk_rnf(ji,jj) = 1 
    405                ENDIF 
    406             END DO 
    407          END DO 
    408          ! 
    409          DO jj = 1, jpj                                ! set the associated depth 
    410             DO ji = 1, jpi 
    411                h_rnf(ji,jj) = 0._wp 
    412                DO jk = 1, nk_rnf(ji,jj) 
    413                   h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 
    414                END DO 
    415             END DO 
    416          END DO 
     429         END_2D 
    417430         ! 
    418431         IF( nn_rnf_depth_file == 1 ) THEN      !  save  output nb levels for runoff 
     
    424437      ELSE                                       ! runoffs applied at the surface 
    425438         nk_rnf(:,:) = 1 
    426          h_rnf (:,:) = e3t_n(:,:,1) 
     439         h_rnf (:,:) = e3t(:,:,1,Kmm) 
    427440      ENDIF 
    428441      ! 
     
    439452         !                                      !    - mixed upstream-centered (ln_traadv_cen2=T) 
    440453         ! 
    441          IF ( ln_rnf_depth )   CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already',   & 
     454         IF( ln_rnf_depth )   CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already',   & 
    442455            &                                              'be spread through depth by ln_rnf_depth'               ) 
    443456         ! 
Note: See TracChangeset for help on using the changeset viewer.