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

Changeset 14423


Ignore:
Timestamp:
2021-02-09T18:49:21+01:00 (3 years ago)
Author:
dancopsey
Message:

Merge in solar penetrating branch up to revision 14393.

Location:
NEMO/branches/UKMO/NEMO_4.0.4_ocean_mean_fluxes/src/OCE/SBC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.4_ocean_mean_fluxes/src/OCE/SBC/cpl_oasis3.F90

    r14075 r14423  
    6666   INTEGER                    ::   nsnd         ! total number of fields sent  
    6767   INTEGER                    ::   ncplmodel    ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
    68    INTEGER, PUBLIC, PARAMETER ::   nmaxfld=60   ! Maximum number of coupling fields 
     68   INTEGER, PUBLIC, PARAMETER ::   nmaxfld=61   ! Maximum number of coupling fields 
    6969   INTEGER, PUBLIC, PARAMETER ::   nmaxcat=5    ! Maximum number of coupling fields 
    7070   INTEGER, PUBLIC, PARAMETER ::   nmaxcpl=5    ! Maximum number of coupling fields 
  • NEMO/branches/UKMO/NEMO_4.0.4_ocean_mean_fluxes/src/OCE/SBC/sbccpl.F90

    r14075 r14423  
    120120   INTEGER, PARAMETER ::   jpr_tauwy  = 56   ! y component of the ocean stress from waves 
    121121   INTEGER, PARAMETER ::   jpr_ts_ice = 57   ! Sea ice surface temp 
    122  
    123    INTEGER, PARAMETER ::   jprcv      = 57   ! total number of fields received   
     122   INTEGER, PARAMETER ::   jpr_grnm   = 58   ! Greenland ice mass  
     123   INTEGER, PARAMETER ::   jpr_antm   = 59   ! Antarctic ice mass  
     124   INTEGER, PARAMETER ::   jpr_rnf_1d = 60   ! 1D river runoff  
     125   INTEGER, PARAMETER ::   jpr_qtr    = 61   ! Transmitted solar 
     126 
     127   INTEGER, PARAMETER ::   jprcv      = 61   ! total number of fields received 
    124128 
    125129   INTEGER, PARAMETER ::   jps_fice   =  1   ! ice fraction sent to the atmosphere 
     
    192196   TYPE(FLD_C) ::   sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, sn_rcv_tauwoc, & 
    193197                    sn_rcv_wdrag, sn_rcv_wfreq 
     198   ! Transmitted solar 
     199   TYPE(FLD_C) ::   sn_rcv_qtr 
    194200   !                                   ! Other namelist parameters 
    195201   INTEGER     ::   nn_cplmodel           ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
     
    274280         &                  sn_rcv_w10m  , sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr   ,  &  
    275281         &                  sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum  , sn_rcv_tauwoc,  & 
     282         &                  sn_rcv_qtr   ,                                                             & 
    276283         &                  sn_rcv_wdrag , sn_rcv_qns   , sn_rcv_emp  , sn_rcv_rnf   , sn_rcv_cal   ,  & 
    277284         &                  sn_rcv_iceflx, sn_rcv_co2   , sn_rcv_mslp ,                                & 
     
    319326         WRITE(numout,*)'      ice shelf                       = ', TRIM(sn_rcv_isf%cldes   ), ' (', TRIM(sn_rcv_isf%clcat   ), ')' 
    320327         WRITE(numout,*)'      sea ice heat fluxes             = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')' 
     328         WRITE(numout,*)'      transmitted solar               = ', TRIM(sn_rcv_qtr%cldes   ), ' (', TRIM(sn_rcv_qtr%clcat   ), ')' 
    321329         WRITE(numout,*)'      atm co2                         = ', TRIM(sn_rcv_co2%cldes   ), ' (', TRIM(sn_rcv_co2%clcat   ), ')' 
    322330         WRITE(numout,*)'      significant wave heigth         = ', TRIM(sn_rcv_hsig%cldes  ), ' (', TRIM(sn_rcv_hsig%clcat  ), ')'  
     
    588596         srcv(jpr_topm:jpr_botm)%laction = .TRUE. 
    589597      ENDIF 
     598      !                                                      ! ------------------------- ! 
     599      !                                                      !    transmitted solar      !    
     600      !                                                      ! ------------------------- ! 
     601      srcv(jpr_qtr )%clname = 'OQtr' 
     602      IF( TRIM(sn_rcv_qtr%cldes) == 'coupled' ) THEN 
     603         IF ( TRIM( sn_rcv_qtr%clcat ) == 'yes' ) THEN 
     604            srcv(jpr_qtr)%nct = nn_cats_cpl 
     605         ELSE 
     606            CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qtr%clcat should always be set to yes currently' ) 
     607         ENDIF 
     608         srcv(jpr_qtr)%laction = .TRUE. 
     609      ENDIF 
     610 
    590611      !                                                      ! ------------------------- ! 
    591612      !                                                      !    ice skin temperature   !    
     
    16731694      ziceld(:,:) = 1._wp - picefr(:,:) 
    16741695      zcptn (:,:) = rcp * sst_m(:,:) 
     1696 
     1697#if defined key_si3       
     1698      !                                                      ! ========================= ! 
     1699      SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !  ice topmelt and botmelt  ! 
     1700      !                                                      ! ========================= ! 
     1701      CASE ('coupled') 
     1702         IF (ln_scale_ice_flux) THEN 
     1703            WHERE( a_i(:,:,:) > 1.e-10_wp ) 
     1704               qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:) 
     1705               qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:) 
     1706            ELSEWHERE 
     1707               qml_ice(:,:,:) = 0.0_wp 
     1708               qcn_ice(:,:,:) = 0.0_wp 
     1709            END WHERE 
     1710         ELSE 
     1711            qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) 
     1712            qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) 
     1713         ENDIF 
     1714      END SELECT 
     1715#endif 
     1716 
    16751717      ! 
    16761718      !                                                      ! ========================= ! 
     
    18401882      !                                                      ! ========================= ! 
    18411883      CASE( 'oce only' )         ! the required field is directly provided 
    1842          zqns_tot(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
    1843          ! For Met Office sea ice non-solar fluxes are already delt with by JULES so setting to zero 
    1844          ! here so the only flux is the ocean only one. 
    1845          zqns_ice(:,:,:) = 0._wp  
     1884 
     1885         ! Get the sea ice non solar heat flux from conductive, melting and sublimation fluxes 
     1886         IF( TRIM(sn_rcv_iceflx%cldes) == 'coupled' ) THEN 
     1887            zqns_ice(:,:,:) = qml_ice(:,:,:) + qcn_ice(:,:,:) + evap_ice(:,:,:) * rLsub 
     1888         ELSE 
     1889            zqns_ice(:,:,:) = 0._wp 
     1890         ENDIF 
     1891 
     1892         ! Calculate the total non solar heat flux. The ocean only non solar heat flux (zqns_oce) will be recalculated after this CASE 
     1893         ! statement to be consistent with other coupling methods even though .zqns_oce = frcv(jpr_qnsoce)%z3(:,:,1) 
     1894         zqns_tot(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) * ziceld(:,:) + SUM( zqns_ice(:,:,:) * a_i(:,:,:), dim=3 ) 
     1895          
    18461896      CASE( 'conservative' )     ! the required fields are directly provided 
    18471897         zqns_tot(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
     
    19822032      !                                                      ! ========================= ! 
    19832033      CASE( 'oce only' ) 
    1984          zqsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
    1985          ! For Met Office sea ice solar fluxes are already delt with by JULES so setting to zero 
    1986          ! here so the only flux is the ocean only one. 
     2034         zqsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) * ziceld(:,:) 
     2035 
     2036         ! For the Met Office the only sea ice solar flux is the transmitted qsr which is added onto zqsr_ice 
     2037         ! further down. Therefore start zqsr_ice off at zero. 
    19872038         zqsr_ice(:,:,:) = 0._wp 
    19882039      CASE( 'conservative' ) 
     
    20382089      ENDIF 
    20392090 
    2040 #if defined key_si3 
    2041       ! --- solar flux over ocean --- ! 
    2042       !         note: ziceld cannot be = 0 since we limit the ice concentration to amax 
    2043       zqsr_oce = 0._wp 
    2044       WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / ziceld(:,:) 
    2045  
    2046       IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:) 
    2047       ELSE                   ;   qsr_oce(:,:) = zqsr_oce(:,:)   ;   ENDIF 
    2048 #endif 
    2049  
    2050       IF( ln_mixcpl ) THEN 
    2051          qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
    2052          qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
    2053          DO jl = 1, jpl 
    2054             qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
    2055          END DO 
    2056       ELSE 
    2057          qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
    2058          qsr_ice(:,:,:) = zqsr_ice(:,:,:) 
    2059       ENDIF 
    2060  
    2061       !                                                      ! ========================= ! 
    2062       SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) )             !          d(qns)/dt        ! 
    2063       !                                                      ! ========================= ! 
    2064       CASE ('coupled') 
    2065          IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN 
    2066             zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
    2067          ELSE 
    2068             ! Set all category values equal for the moment 
    2069             DO jl=1,jpl 
    2070                zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
    2071             ENDDO 
    2072          ENDIF 
    2073       CASE( 'none' )  
    2074          zdqns_ice(:,:,:) = 0._wp 
    2075       END SELECT 
    2076        
    2077       IF( ln_mixcpl ) THEN 
    2078          DO jl=1,jpl 
    2079             dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:) 
    2080          ENDDO 
    2081       ELSE 
    2082          dqns_ice(:,:,:) = zdqns_ice(:,:,:) 
    2083       ENDIF 
    2084  
    20852091#if defined key_si3       
    2086       !                                                      ! ========================= ! 
    2087       SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !  ice topmelt and botmelt  ! 
    2088       !                                                      ! ========================= ! 
    2089       CASE ('coupled') 
    2090          IF (ln_scale_ice_flux) THEN 
    2091             WHERE( a_i(:,:,:) > 1.e-10_wp ) 
    2092                qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:) 
    2093                qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:) 
    2094             ELSEWHERE 
    2095                qml_ice(:,:,:) = 0.0_wp 
    2096                qcn_ice(:,:,:) = 0.0_wp 
    2097             END WHERE 
    2098          ELSE 
    2099             qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) 
    2100             qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) 
    2101          ENDIF 
    2102       END SELECT 
    21032092      !                                                      ! ========================= ! 
    21042093      !                                                      !      Transmitted Qsr      !   [W/m2] 
     
    21322121      ELSEIF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN      !==  conduction flux as surface forcing  ==! 
    21332122         ! 
    2134          !          ! ===> here we must receive the qtr_ice_top array from the coupler 
    2135          !                 for now just assume zero (fully opaque ice) 
    2136          zqtr_ice_top(:,:,:) = 0._wp 
     2123         SELECT CASE( TRIM( sn_rcv_qtr%cldes ) ) 
     2124         ! 
     2125         !      ! ===> here we receive the qtr_ice_top array from the coupler 
     2126         CASE ('coupled') 
     2127            IF (ln_scale_ice_flux) THEN 
     2128               WHERE( a_i(:,:,:) > 0.0_wp ) zqtr_ice_top(:,:,:) = frcv(jpr_qtr)%z3(:,:,:) * a_i_last_couple(:,:,:) / a_i(:,:,:) 
     2129               WHERE( a_i(:,:,:) <= 0.0_wp ) zqtr_ice_top(:,:,:) = 0.0_wp 
     2130            ELSE 
     2131               zqtr_ice_top(:,:,:) = frcv(jpr_qtr)%z3(:,:,:) 
     2132            ENDIF 
     2133 
     2134            ! Add retrieved transmitted solar radiation onto the ice and total solar radiation 
     2135            zqsr_ice(:,:,:) = zqsr_ice(:,:,:) + zqtr_ice_top(:,:,:) 
     2136            zqsr_tot(:,:) = zqsr_tot(:,:) + SUM( zqtr_ice_top(:,:,:) * a_i(:,:,:), dim=3 ) 
     2137 
     2138         !      if we are not getting this data from the coupler then assume zero (fully opaque ice) 
     2139         CASE ('none') 
     2140            zqtr_ice_top(:,:,:) = 0._wp 
     2141         END SELECT 
     2142 
    21372143         ! 
    21382144      ENDIF 
     
    21452151         qtr_ice_top(:,:,:) = zqtr_ice_top(:,:,:) 
    21462152      ENDIF 
     2153 
     2154      ! --- solar flux over ocean --- ! 
     2155      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax 
     2156      zqsr_oce = 0._wp 
     2157      WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / ziceld(:,:) 
     2158 
     2159      IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:) 
     2160      ELSE                   ;   qsr_oce(:,:) = zqsr_oce(:,:)   ;   ENDIF 
     2161#endif 
     2162 
     2163      IF( ln_mixcpl ) THEN 
     2164         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     2165         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
     2166         DO jl = 1, jpl 
     2167            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
     2168         END DO 
     2169      ELSE 
     2170         qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
     2171         qsr_ice(:,:,:) = zqsr_ice(:,:,:) 
     2172      ENDIF 
     2173 
     2174      !                                                      ! ========================= ! 
     2175      SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) )             !          d(qns)/dt        ! 
     2176      !                                                      ! ========================= ! 
     2177      CASE ('coupled') 
     2178         IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN 
     2179            zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
     2180         ELSE 
     2181            ! Set all category values equal for the moment 
     2182            DO jl=1,jpl 
     2183               zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
     2184            ENDDO 
     2185         ENDIF 
     2186      CASE( 'none' )  
     2187         zdqns_ice(:,:,:) = 0._wp 
     2188      END SELECT 
     2189       
     2190      IF( ln_mixcpl ) THEN 
     2191         DO jl=1,jpl 
     2192            dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:) 
     2193         ENDDO 
     2194      ELSE 
     2195         dqns_ice(:,:,:) = zdqns_ice(:,:,:) 
     2196      ENDIF 
     2197 
     2198#if defined key_si3 
    21472199      !                                                      ! ================== ! 
    21482200      !                                                      !   ice skin temp.   ! 
Note: See TracChangeset for help on using the changeset viewer.