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

Changeset 2210


Ignore:
Timestamp:
2010-10-12T11:54:28+02:00 (14 years ago)
Author:
smasson
Message:

bugfix on diurnal cycle in dev_r2174_DCY, see ticket:730

Location:
branches/dev_r2174_DCY/NEMO/OPA_SRC/SBC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_r2174_DCY/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r2188 r2210  
    177177      ENDIF 
    178178 
    179                        CALL fld_read( kt, nn_fsbc, sf )        ! input fields provided at the current time-step 
    180  
    181       IF( ln_dm2dc )   CALL sbc_dcy ( kt , sf(jp_qsr)%fnow )   ! modify now Qsr to include the diurnal cycle 
     179      CALL fld_read( kt, nn_fsbc, sf )        ! input fields provided at the current time-step 
    182180 
    183181#if defined key_lim3 
     
    185183#endif 
    186184      !                                                        ! surface ocean fluxes computed with CLIO bulk formulea 
    187       IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( sf, sst_m, ssu_m, ssv_m ) 
     185      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 
    188186      ! 
    189187   END SUBROUTINE sbc_blk_core 
    190188    
    191189    
    192    SUBROUTINE blk_oce_core( sf, pst, pu, pv ) 
     190   SUBROUTINE blk_oce_core( kt, sf, pst, pu, pv ) 
    193191      !!--------------------------------------------------------------------- 
    194192      !!                     ***  ROUTINE blk_core  *** 
     
    211209      !!  ** Nota  :   sf has to be a dummy argument for AGRIF on NEC 
    212210      !!--------------------------------------------------------------------- 
     211      INTEGER ,  INTENT(in)                     ::   kt   ! ocean time step 
    213212      TYPE(fld), INTENT(in), DIMENSION(:)       ::   sf    ! input data 
    214213      REAL(wp),  INTENT(in), DIMENSION(jpi,jpj) ::   pst   ! surface temperature                      [Celcius] 
     
    264263      ! ----------------------------------------------------------------------------- ! 
    265264     
     265      IF( ln_dm2dc ) THEN   ;   qsr(:,:) = sbc_dcy( kt, sf(jp_qsr)%fnow )   ! modify now Qsr to include the diurnal cycle 
     266      ELSE                  ;   qsr(:,:) = sf(jp_qsr)%fnow(:,:) 
     267      ENDIF 
    266268      ! ocean albedo assumed to be 0.066 
    267 !CDIR COLLAPSE 
    268       qsr (:,:) = ( 1. - 0.066 ) * sf(jp_qsr)%fnow(:,:) * tmask(:,:,1)                                 ! Short Wave 
     269      qsr (:,:) = ( 1. - 0.066 ) * qsr(:,:) * tmask(:,:,1)                                                 ! Short Wave 
    269270!CDIR COLLAPSE 
    270271      zqlw(:,:) = (  sf(jp_qlw)%fnow(:,:) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
  • branches/dev_r2174_DCY/NEMO/OPA_SRC/SBC/sbcdcy.F90

    r2188 r2210  
    1616   USE phycst           ! ocean physics 
    1717   USE dom_oce          ! ocean space and time domain 
     18   USE sbc_oce          ! Surface boundary condition: ocean fields 
    1819   USE in_out_manager   ! I/O manager 
    1920 
     
    2324   REAL(wp), DIMENSION(jpi,jpj) ::   raa , rbb  , rcc  , rab     ! parameters used to compute the diurnal cycle 
    2425   REAL(wp), DIMENSION(jpi,jpj) ::   rtmd, rdawn, rdusk, rscal   !     -       -         -           -      - 
    25    REAL(wp), DIMENSION(jpi,jpj) ::   qsr_daily                   ! to hold daily mean QSR 
    2626   
    2727   PUBLIC   sbc_dcy     ! routine called by sbc 
     
    3434CONTAINS 
    3535 
    36       SUBROUTINE sbc_dcy( kt, pqsr ) 
     36      FUNCTION sbc_dcy( kt, pqsrin ) RESULT( zqsrout ) 
    3737      !!---------------------------------------------------------------------- 
    3838      !!                  ***  ROUTINE sbc_dcy  *** 
     
    4848      !!              Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 
    4949      !!---------------------------------------------------------------------- 
    50       INTEGER,                      INTENT(in   ) ::   kt     ! ocean time-step index 
    51       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pqsr   ! QSR flux with diurnal cycle 
    52       !! 
    53       INTEGER  ::   ji, jj                                    ! dummy loop indices 
     50      INTEGER,                      INTENT(in   ) ::   kt        ! ocean time-step index 
     51      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pqsrin    ! input daily QSR flux  
     52      !! 
     53      INTEGER  ::   ji, jj                                       ! dummy loop indices 
    5454      REAL(wp) ::   ztwopi, zinvtwopi, zconvrad  
    5555      REAL(wp) ::   zlo, zup, zlousd, zupusd 
    56       REAL(wp) ::   zdsws, zdecrad, ztx 
     56      REAL(wp) ::   zdsws, zdecrad, ztx, zsin, zcos 
    5757      REAL(wp) ::   ztmp, ztmp1, ztmp2, ztest 
     58      REAL(wp), DIMENSION(jpi,jpj) ::   zqsrout                  ! output QSR flux with diurnal cycle 
    5859      !---------------------------statement functions------------------------ 
    59       REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc     ! dummy statement function arguments 
     60      REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc        ! dummy statement function arguments 
    6061      fintegral( pt1, pt2, paaa, pbbb, pccc ) =                         & 
    6162         &   paaa * pt2 + zinvtwopi * pbbb * SIN(pccc + ztwopi * pt2)   & 
     
    7071 
    7172      ! When are we during the day (from 0 to 1) 
    72       zlo = MOD( rdt / rday * REAL( kt-nit000, wp ), 1.) 
    73       zup = zlo + rdt / rday 
     73      zlo = ( REAL(nsec_day, wp) - 0.5   * rdttra(1) ) / rday 
     74      zup = zlo + ( REAL(nn_fsbc, wp) * rdttra(1) ) / rday 
    7475 
    7576      !                                           
     
    99100         nday_qsr = nday  
    100101         ! number of days since the previous winter solstice (supposed to be always 21 December)          
    101          zdsws = 11 + nday_year 
     102         zdsws = REAL(11 + nday_year, wp) 
    102103         ! declination of the earths orbit 
    103104         zdecrad = (-23.5 * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 
    104          ! save the daily QSR for nest hours of the day 
    105          qsr_daily(:,:) = pqsr(:,:) 
    106105         ! Compute A and B needed to compute the time integral of the diurnal cycle 
    107106         
     107         zsin = SIN( zdecrad )   ;   zcos = COS( zdecrad ) 
    108108         DO jj = 1, jpj 
    109109            DO ji = 1, jpi 
    110110               ztmp = zconvrad * gphit(ji,jj) 
    111                raa(ji,jj) = SIN( ztmp ) * SIN( zdecrad ) 
    112                rbb(ji,jj) = COS( ztmp ) * COS( zdecrad ) 
     111               raa(ji,jj) = SIN( ztmp ) * zsin 
     112               rbb(ji,jj) = COS( ztmp ) * zcos 
    113113            END DO   
    114114         END DO   
     
    166166         END DO   
    167167         ! 
    168          ztmp = rday / rdt 
     168         ztmp = rday / ( rdttra(1) * REAL(nn_fsbc, wp) ) 
    169169         rscal(:,:) = rscal(:,:) * ztmp 
    170170 
     
    184184                  zupusd = MAX(zupusd, zlo) 
    185185                  ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    186                   pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     186                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    187187                  ! 
    188188               ELSE                                         ! day time in two parts 
     
    194194                  ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    195195                  ztmp = ztmp1 + ztmp2 
    196                   pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     196                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    197197               ENDIF 
    198198            ELSE                                   ! 24h light or 24h night 
    199199               ! 
    200                IF( raa(ji,jj) > rbb(ji,jj) ) THEN         ! 24h day 
     200               IF( raa(ji,jj) > rbb(ji,jj) ) THEN           ! 24h day 
    201201                  ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    202                   pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     202                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    203203                  ! 
    204204               ELSE                                         ! No day 
    205                   pqsr(ji,jj) = 0.e0 
     205                  zqsrout(ji,jj) = 0.e0 
    206206               ENDIF 
    207207            ENDIF 
     
    209209      END DO   
    210210      ! 
    211    END SUBROUTINE sbc_dcy 
     211   END FUNCTION sbc_dcy 
    212212 
    213213   !!====================================================================== 
  • branches/dev_r2174_DCY/NEMO/OPA_SRC/SBC/sbcflx.F90

    r2188 r2210  
    123123      ENDIF 
    124124 
    125                        CALL fld_read( kt, nn_fsbc, sf )       ! input fields provided at the current time-step 
    126        
    127       IF( ln_dm2dc )   CALL sbc_dcy( kt , sf(jp_qsr)%fnow )   ! modify now Qsr to include the diurnal cycle 
    128  
    129       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN                    ! update ocean fluxes at each SBC frequency 
     125      CALL fld_read( kt, nn_fsbc, sf )                            ! input fields provided at the current time-step 
     126      
     127      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN                        ! update ocean fluxes at each SBC frequency 
     128         IF( ln_dm2dc ) THEN   ;   qsr(:,:) = sbc_dcy( kt, sf(jp_qsr)%fnow )   ! modify now Qsr to include the diurnal cycle 
     129         ELSE                  ;   qsr(:,:) = sf(jp_qsr)%fnow(:,:) 
     130         ENDIF 
    130131!CDIR COLLAPSE 
    131132         DO jj = 1, jpj                                           ! set the ocean fluxes from read fields 
     
    133134               utau(ji,jj) = sf(jp_utau)%fnow(ji,jj) 
    134135               vtau(ji,jj) = sf(jp_vtau)%fnow(ji,jj) 
    135                qns (ji,jj) = sf(jp_qtot)%fnow(ji,jj) - sf(jp_qsr)%fnow(ji,jj) 
    136                qsr (ji,jj) = sf(jp_qsr )%fnow(ji,jj) 
     136               qns (ji,jj) = sf(jp_qtot)%fnow(ji,jj) - qsr(ji,jj) 
    137137               emp (ji,jj) = sf(jp_emp )%fnow(ji,jj) 
    138138            END DO 
Note: See TracChangeset for help on using the changeset viewer.