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 2228 for branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/sbcdcy.F90 – NEMO

Ignore:
Timestamp:
2010-10-12T16:33:06+02:00 (14 years ago)
Author:
smasson
Message:

update diurnal cycle from dev_r2174_DCY into DEV_r2106_LOCEAN2010

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DEV_r2106_LOCEAN2010/NEMO/OPA_SRC/SBC/sbcdcy.F90

    r2198 r2228  
    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 
    2021   IMPLICIT NONE 
    2122   PRIVATE 
    22    INTEGER                      ::   nday_qsr                    ! day when parameters were computed 
     23   INTEGER, PUBLIC              ::   nday_qsr                    ! day when parameters were computed 
    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( 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,1), INTENT(inout) ::   pqsr   ! QSR flux with diurnal cycle 
    52       !! 
    53       INTEGER  ::   ji, jj                                      ! dummy loop indices 
     50      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqsrin    ! input daily QSR flux  
     51      !! 
     52      INTEGER  ::   ji, jj                                       ! dummy loop indices 
    5453      REAL(wp) ::   ztwopi, zinvtwopi, zconvrad  
    5554      REAL(wp) ::   zlo, zup, zlousd, zupusd 
    56       REAL(wp) ::   zdsws, zdecrad, ztx 
     55      REAL(wp) ::   zdsws, zdecrad, ztx, zsin, zcos 
    5756      REAL(wp) ::   ztmp, ztmp1, ztmp2, ztest 
     57      REAL(wp), DIMENSION(jpi,jpj) ::   zqsrout                  ! output QSR flux with diurnal cycle 
    5858      !---------------------------statement functions------------------------ 
    59       REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc       ! dummy statement function arguments 
     59      REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc        ! dummy statement function arguments 
    6060      fintegral( pt1, pt2, paaa, pbbb, pccc ) =                         & 
    6161         &   paaa * pt2 + zinvtwopi * pbbb * SIN(pccc + ztwopi * pt2)   & 
     
    7070 
    7171      ! 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 
     72      zlo = ( REAL(nsec_day, wp) - 0.5   * rdttra(1) ) / rday 
     73      zup = zlo + ( REAL(nn_fsbc, wp) * rdttra(1) ) / rday 
    7474 
    7575      !                                           
    76       IF( kt == nit000 ) THEN       ! first time step only                
     76      IF( nday_qsr == -1 ) THEN       ! first time step only                
    7777         IF(lwp) THEN 
    7878            WRITE(numout,*) 
     
    8181            WRITE(numout,*) 
    8282         ENDIF 
    83          nday_qsr = 0 
    8483         ! Compute rcc needed to compute the time integral of the diurnal cycle 
    8584         rcc(:,:) = zconvrad * glamt(:,:) - rpi 
     
    9998         nday_qsr = nday  
    10099         ! number of days since the previous winter solstice (supposed to be always 21 December)          
    101          zdsws = 11 + nday_year 
     100         zdsws = REAL(11 + nday_year, wp) 
    102101         ! declination of the earths orbit 
    103102         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(:,:,1) 
    106103         ! Compute A and B needed to compute the time integral of the diurnal cycle 
    107104         
     105         zsin = SIN( zdecrad )   ;   zcos = COS( zdecrad ) 
    108106         DO jj = 1, jpj 
    109107            DO ji = 1, jpi 
    110108               ztmp = zconvrad * gphit(ji,jj) 
    111                raa(ji,jj) = SIN( ztmp ) * SIN( zdecrad ) 
    112                rbb(ji,jj) = COS( ztmp ) * COS( zdecrad ) 
     109               raa(ji,jj) = SIN( ztmp ) * zsin 
     110               rbb(ji,jj) = COS( ztmp ) * zcos 
    113111            END DO   
    114112         END DO   
     
    140138         rdawn(:,:) = MOD((rdawn(:,:) + 1.), 1.) 
    141139         rdusk(:,:) = MOD((rdusk(:,:) + 1.), 1.) 
    142  
    143140 
    144141         !     2.2 Compute the scalling function: 
     
    166163         END DO   
    167164         ! 
    168          ztmp = rday / rdt 
     165         ztmp = rday / ( rdttra(1) * REAL(nn_fsbc, wp) ) 
    169166         rscal(:,:) = rscal(:,:) * ztmp 
    170167 
     
    184181                  zupusd = MAX(zupusd, zlo) 
    185182                  ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    186                   pqsr(ji,jj,1) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     183                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    187184                  ! 
    188185               ELSE                                         ! day time in two parts 
     
    194191                  ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    195192                  ztmp = ztmp1 + ztmp2 
    196                   pqsr(ji,jj,1) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     193                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    197194               ENDIF 
    198195            ELSE                                   ! 24h light or 24h night 
    199196               ! 
    200                IF( raa(ji,jj) > rbb(ji,jj) ) THEN         ! 24h day 
     197               IF( raa(ji,jj) > rbb(ji,jj) ) THEN           ! 24h day 
    201198                  ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    202                   pqsr(ji,jj,1) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     199                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
    203200                  ! 
    204201               ELSE                                         ! No day 
    205                   pqsr(ji,jj,1) = 0.e0 
     202                  zqsrout(ji,jj) = 0.e0 
    206203               ENDIF 
    207204            ENDIF 
     
    209206      END DO   
    210207      ! 
    211    END SUBROUTINE sbc_dcy 
     208   END FUNCTION sbc_dcy 
    212209 
    213210   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.