Ignore:
Timestamp:
2012-11-16T18:42:50+01:00 (8 years ago)
Author:
cbricaud
Message:

add modification from dev_r3342_MERCATOR7_SST in dev_MERCATOR_2012_rev3555

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_MERCATOR_2012_rev3555/NEMOGCM/NEMO/OPA_SRC/SBC/sbcdcy.F90

    r3294 r3586  
    4949 
    5050 
    51    FUNCTION sbc_dcy( pqsrin ) RESULT( zqsrout ) 
     51   FUNCTION sbc_dcy( pqsrin, l_mask ) RESULT( zqsrout ) 
    5252      !!---------------------------------------------------------------------- 
    5353      !!                  ***  ROUTINE sbc_dcy  *** 
     
    6363      !!              Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 
    6464      !!---------------------------------------------------------------------- 
     65      LOGICAL, OPTIONAL, INTENT(in) :: l_mask ! use the routine for night mask computation 
    6566      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pqsrin    ! input daily QSR flux  
    6667      !! 
    6768      INTEGER  ::   ji, jj                                       ! dummy loop indices 
     69      INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask 
    6870      REAL(wp) ::   ztwopi, zinvtwopi, zconvrad  
    6971      REAL(wp) ::   zlo, zup, zlousd, zupusd 
    7072      REAL(wp) ::   zdsws, zdecrad, ztx, zsin, zcos 
    7173      REAL(wp) ::   ztmp, ztmp1, ztmp2, ztest 
     74      REAL(wp) ::   ztmpm, ztmpm1, ztmpm2 
    7275      REAL(wp), DIMENSION(jpi,jpj) ::   zqsrout                  ! output QSR flux with diurnal cycle 
    7376      !---------------------------statement functions------------------------ 
     
    9093      zup = zlo + ( REAL(nn_fsbc, wp)     * rdttra(1) ) / rday 
    9194      !                                           
    92       IF( nday_qsr == -1 ) THEN       ! first time step only                
     95      IF( nday_qsr == -1 ) THEN       ! first time step only   
    9396         IF(lwp) THEN 
    9497            WRITE(numout,*) 
     
    120123         zdecrad = (-23.5 * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 
    121124         ! Compute A and B needed to compute the time integral of the diurnal cycle 
    122          
     125 
    123126         zsin = SIN( zdecrad )   ;   zcos = COS( zdecrad ) 
    124127         DO jj = 1, jpj 
     
    129132            END DO   
    130133         END DO   
    131  
    132134         ! Compute the time of dawn and dusk 
    133135 
     
    156158         rdawn(:,:) = MOD( (rdawn(:,:) + 1._wp), 1._wp ) 
    157159         rdusk(:,:) = MOD( (rdusk(:,:) + 1._wp), 1._wp ) 
    158  
    159160         !     2.2 Compute the scalling function: 
    160161         !         S* = the inverse of the time integral of the diurnal cycle from dawm to dusk 
     
    185186         ! 
    186187      ENDIF  
    187  
    188188         !     3. update qsr with the diurnal cycle 
    189189         !     ------------------------------------ 
    190190 
     191      imask_night(:,:) = 0 
    191192      DO jj = 1, jpj 
    192193         DO ji = 1, jpi 
     194            ztmpm = 0.0 
    193195            IF( ABS(rab(ji,jj)) < 1 ) THEN         ! day duration is less than 24h 
    194196               ! 
     
    200202                  ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    201203                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
     204                  ztmpm = zupusd - zlousd 
     205                  IF ( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 
    202206                  ! 
    203207               ELSE                                         ! day time in two parts 
     
    205209                  zupusd = MIN(zup, rdusk(ji,jj)) 
    206210                  ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     211                  ztmpm1=zupusd-zlousd 
    207212                  zlousd = MAX(zlo, rdawn(ji,jj)) 
    208213                  zupusd = MAX(zup, rdawn(ji,jj)) 
    209214                  ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     215                  ztmpm2 =zupusd-zlousd 
    210216                  ztmp = ztmp1 + ztmp2 
     217                  ztmpm = ztmpm1 + ztmpm2 
    211218                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
     219                  IF (ztmpm .EQ. 0.) imask_night(ji,jj) = 1 
    212220               ENDIF 
    213221            ELSE                                   ! 24h light or 24h night 
     
    216224                  ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
    217225                  zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 
     226                  imask_night(ji,jj) = 0 
    218227                  ! 
    219228               ELSE                                         ! No day 
    220229                  zqsrout(ji,jj) = 0.e0 
     230                  imask_night(ji,jj) = 1 
    221231               ENDIF 
    222232            ENDIF 
    223233         END DO   
    224234      END DO   
     235      ! 
     236      IF ( PRESENT(l_mask) .AND. l_mask ) THEN 
     237         zqsrout(:,:) = float(imask_night(:,:)) 
     238      ENDIF 
    225239      ! 
    226240      IF( nn_timing == 1 )  CALL timing_stop('sbc_dcy') 
Note: See TracChangeset for help on using the changeset viewer.