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

Ignore:
Timestamp:
2010-10-08T10:32:36+02:00 (14 years ago)
Author:
smasson
Message:

code review but GM for dev_r2174_DCY

File:
1 edited

Legend:

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

    r2187 r2188  
    44   !! Ocean forcing:  compute the diurnal cycle 
    55   !!====================================================================== 
    6    !! History : 8.2  !  2005-02  (D. Bernie)  Original code 
    7    !!           9.0  !  2006-02  (S. Masson, G. Madec)  adaptation to OPA9 
    8    !!           3.1  !  2009-07  (J.M. Molines)  adaptation to nemo3.1 
     6   !! History : OPA  !  2005-02  (D. Bernie)  Original code 
     7   !!   NEMO    2.0  !  2006-02  (S. Masson, G. Madec)  adaptation to NEMO 
     8   !!           3.1  !  2009-07  (J.M. Molines)  adaptation to v3.1 
    99   !!---------------------------------------------------------------------- 
    1010 
     
    2020   IMPLICIT NONE 
    2121   PRIVATE 
    22    INTEGER                      ::   idayqsr                                            ! day when parameters were computed 
    23    REAL(wp), DIMENSION(jpi,jpj) ::   zaaa, zbbb, zccc, zab, ztmd, zdawn, zdusk, zscal   ! parameters to compute the diurnal cycle 
    24    REAL(wp), DIMENSION(jpi,jpj) ::   qsr_daily                                          ! to hold daily mean QSR 
     22   INTEGER                      ::   nday_qsr                    ! day when parameters were computed 
     23   REAL(wp), DIMENSION(jpi,jpj) ::   raa , rbb  , rcc  , rab     ! parameters used to compute the diurnal cycle 
     24   REAL(wp), DIMENSION(jpi,jpj) ::   rtmd, rdawn, rdusk, rscal   !     -       -         -           -      - 
     25   REAL(wp), DIMENSION(jpi,jpj) ::   qsr_daily                   ! to hold daily mean QSR 
    2526   
    26    PUBLIC sbc_dcy       ! routine called by sbc 
    27  
    28    !!---------------------------------------------------------------------- 
    29    !! NEMO/OPA 3.3 , LOCEAN-IPSL (2010)  
     27   PUBLIC   sbc_dcy     ! routine called by sbc 
     28 
     29   !!---------------------------------------------------------------------- 
     30   !! NEMO/OPA 3.3 , NEMO-consortium (2010)  
    3031   !! $Id$  
    3132   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    3233   !!---------------------------------------------------------------------- 
    33  
    3434CONTAINS 
    3535 
     
    4040      !! ** Purpose : introduce a diurnal cycle of qsr from daily values 
    4141      !! 
    42       !! ** Method  : see Appendix A of  
    43       !!              Bernie, DJ, Guilyardi, E, Madec, G, Slingo, JM and Woolnough, SJ 
    44       !!              Impact of resolving the diurnal cycle in an ocean--atmosphere GCM. Part 1: a diurnally forced OGCM 
    45       !!              Climate Dynamics 29:6, 575-590 (2007) 
     42      !! ** Method  : see Appendix A of Bernie et al. 2007. 
    4643      !! 
    4744      !! ** Action  : redistribute daily QSR on each time step following the diurnal cycle 
     45      !! 
     46      !! reference  : Bernie, DJ, E Guilyardi, G Madec, JM Slingo, and SJ Woolnough, 2007 
     47      !!              Impact of resolving the diurnal cycle in an ocean--atmosphere GCM.  
     48      !!              Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 
    4849      !!---------------------------------------------------------------------- 
    49       INTEGER,                      INTENT( in    ) ::   kt     ! ocean time-step index 
    50       REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) ::   pqsr   ! QSR flux with diurnal cycle 
    51       !! 
    52       INTEGER  ::   ji, jj                                      ! dummy loop indices 
    53       REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc       !  
     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 
    5454      REAL(wp) ::   ztwopi, zinvtwopi, zconvrad  
    5555      REAL(wp) ::   zlo, zup, zlousd, zupusd 
    5656      REAL(wp) ::   zdsws, zdecrad, ztx 
    5757      REAL(wp) ::   ztmp, ztmp1, ztmp2, ztest 
    58       !!--------------------------------------------------------------------- 
    59  
    60       !---------------------------------------------------------------------- 
    61       ! statement functions 
    62  
    63       fintegral(pt1, pt2, paaa, pbbb, pccc) =                           & 
     58      !---------------------------statement functions------------------------ 
     59      REAL(wp) ::   fintegral, pt1, pt2, paaa, pbbb, pccc     ! dummy statement function arguments 
     60      fintegral( pt1, pt2, paaa, pbbb, pccc ) =                         & 
    6461         &   paaa * pt2 + zinvtwopi * pbbb * SIN(pccc + ztwopi * pt2)   & 
    6562         & - paaa * pt1 - zinvtwopi * pbbb * SIN(pccc + ztwopi * pt1) 
    66       !---------------------------------------------------------------------- 
     63      !!--------------------------------------------------------------------- 
    6764 
    6865      ! Initialization 
     
    7774 
    7875      !                                           
    79       IF (kt == nit000) THEN                     
    80          ! 
     76      IF( kt == nit000 ) THEN       ! first time step only                
    8177         IF(lwp) THEN 
    8278            WRITE(numout,*) 
     
    8581            WRITE(numout,*) 
    8682         ENDIF 
    87          idayqsr = 0 
    88          ! Compute C needed to compute the time integral of the diurnal cycle 
    89          zccc(:,:) = zconvrad * glamt(:,:) - rpi 
     83         nday_qsr = 0 
     84         ! Compute rcc needed to compute the time integral of the diurnal cycle 
     85         rcc(:,:) = zconvrad * glamt(:,:) - rpi 
    9086         ! time of midday 
    91          ztmd(:,:) = 0.5 - glamt(:,:) / 360. 
    92          ztmd(:,:) = MOD((ztmd(:,:) + 1.), 1.) 
     87         rtmd(:,:) = 0.5 - glamt(:,:) / 360. 
     88         rtmd(:,:) = MOD( (rtmd(:,:) + 1.), 1. ) 
    9389      ENDIF 
    9490 
     
    9995 
    10096      ! nday is the number of days since the beginning of the current month  
    101       IF( idayqsr /= nday ) THEN  
     97      IF( nday_qsr /= nday ) THEN  
    10298         ! save the day of the year and the daily mean of qsr 
    103          idayqsr = nday  
     99         nday_qsr = nday  
    104100         ! number of days since the previous winter solstice (supposed to be always 21 December)          
    105101         zdsws = 11 + nday_year 
     
    113109            DO ji = 1, jpi 
    114110               ztmp = zconvrad * gphit(ji,jj) 
    115                zaaa(ji,jj) = SIN(ztmp) * SIN(zdecrad) 
    116                zbbb(ji,jj) = COS(ztmp) * COS(zdecrad) 
     111               raa(ji,jj) = SIN( ztmp ) * SIN( zdecrad ) 
     112               rbb(ji,jj) = COS( ztmp ) * COS( zdecrad ) 
    117113            END DO   
    118114         END DO   
     
    120116         ! Compute the time of dawn and dusk 
    121117 
    122          ! zab to test if the day time is equal to 0, less than 24h of full day         
    123          zab(:,:) = -zaaa(:,:) / zbbb(:,:) 
     118         ! rab to test if the day time is equal to 0, less than 24h of full day         
     119         rab(:,:) = -raa(:,:) / rbb(:,:) 
    124120         DO jj = 1, jpj 
    125121            DO ji = 1, jpi 
    126                IF ( ABS(zab(ji,jj)) < 1 ) THEN 
    127          ! day duration is less than 24h 
     122               IF ( ABS(rab(ji,jj)) < 1 ) THEN         ! day duration is less than 24h 
    128123         ! When is it night? 
    129                   ztx = zinvtwopi * (ACOS(zab(ji,jj)) - zccc(ji,jj)) 
    130                   ztest = -zbbb(ji,jj) * SIN( zccc(ji,jj) + ztwopi * ztx ) 
     124                  ztx = zinvtwopi * (ACOS(rab(ji,jj)) - rcc(ji,jj)) 
     125                  ztest = -rbb(ji,jj) * SIN( rcc(ji,jj) + ztwopi * ztx ) 
    131126         ! is it dawn or dusk? 
    132127                  IF ( ztest > 0 ) THEN 
    133                      zdawn(ji,jj) = ztx 
    134                      zdusk(ji,jj) = ztmd(ji,jj) + ( ztmd(ji,jj) - zdawn(ji,jj) ) 
     128                     rdawn(ji,jj) = ztx 
     129                     rdusk(ji,jj) = rtmd(ji,jj) + ( rtmd(ji,jj) - rdawn(ji,jj) ) 
    135130                  ELSE 
    136                      zdusk(ji,jj) = ztx 
    137                      zdawn(ji,jj) = ztmd(ji,jj) - ( zdusk(ji,jj) - ztmd(ji,jj) ) 
     131                     rdusk(ji,jj) = ztx 
     132                     rdawn(ji,jj) = rtmd(ji,jj) - ( rdusk(ji,jj) - rtmd(ji,jj) ) 
    138133                  ENDIF 
    139134               ELSE 
    140                   zdawn(ji,jj) = ztmd(ji,jj) + 0.5 
    141                   zdusk(ji,jj) = zdawn(ji,jj) 
     135                  rdawn(ji,jj) = rtmd(ji,jj) + 0.5 
     136                  rdusk(ji,jj) = rdawn(ji,jj) 
    142137               ENDIF 
    143138             END DO   
    144139         END DO   
    145          zdawn(:,:) = MOD((zdawn(:,:) + 1.), 1.) 
    146          zdusk(:,:) = MOD((zdusk(:,:) + 1.), 1.) 
     140         rdawn(:,:) = MOD((rdawn(:,:) + 1.), 1.) 
     141         rdusk(:,:) = MOD((rdusk(:,:) + 1.), 1.) 
    147142 
    148143 
    149144         !     2.2 Compute the scalling function: 
    150145         !         S* = the inverse of the time integral of the diurnal cycle from dawm to dusk 
    151  
    152146         DO jj = 1, jpj 
    153147            DO ji = 1, jpi 
    154                IF ( ABS(zab(ji,jj)) < 1 ) THEN 
    155          ! day duration is less than 24h 
    156                   IF ( zdawn(ji,jj) < zdusk(ji,jj) ) THEN 
    157          ! day time in one part 
    158                      zscal(ji,jj) = fintegral(zdawn(ji,jj), zdusk(ji,jj), zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    159                      zscal(ji,jj) = 1. / zscal(ji,jj) 
    160                   ELSE 
    161          ! day time in two parts 
    162                      zscal(ji,jj) = fintegral(0., zdusk(ji,jj), zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))   & 
    163                         &         + fintegral(zdawn(ji,jj), 1., zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    164                      zscal(ji,jj) = 1. / zscal(ji,jj) 
     148               IF ( ABS(rab(ji,jj)) < 1 ) THEN         ! day duration is less than 24h 
     149                  IF ( rdawn(ji,jj) < rdusk(ji,jj) ) THEN      ! day time in one part 
     150                     rscal(ji,jj) = fintegral(rdawn(ji,jj), rdusk(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     151                     rscal(ji,jj) = 1. / rscal(ji,jj) 
     152                  ELSE                                         ! day time in two parts 
     153                     rscal(ji,jj) = fintegral(0., rdusk(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj))   & 
     154                        &         + fintegral(rdawn(ji,jj), 1., raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     155                     rscal(ji,jj) = 1. / rscal(ji,jj) 
    165156                  ENDIF 
    166157               ELSE 
    167                   IF ( zaaa(ji,jj) > zbbb(ji,jj) ) THEN 
    168          ! 24h day 
    169                      zscal(ji,jj) = fintegral(0., 1., zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    170                      zscal(ji,jj) = 1. / zscal(ji,jj) 
    171                   ELSE 
    172          ! No day 
    173                      zscal(ji,jj) = 0. 
     158                  IF ( raa(ji,jj) > rbb(ji,jj) ) THEN         ! 24h day 
     159                     rscal(ji,jj) = fintegral(0., 1., raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     160                     rscal(ji,jj) = 1. / rscal(ji,jj) 
     161                  ELSE                                          ! No day 
     162                     rscal(ji,jj) = 0.e0 
    174163                  ENDIF 
    175164               ENDIF 
     
    178167         ! 
    179168         ztmp = rday / rdt 
    180          zscal(:,:) = zscal(:,:) * ztmp 
     169         rscal(:,:) = rscal(:,:) * ztmp 
    181170 
    182171      ENDIF  
    183172 
    184          !     3. compute qsr with the diurnal cycle 
    185          !     ----------------------- 
     173         !     3. update qsr with the diurnal cycle 
     174         !     ------------------------------------ 
    186175 
    187176      DO jj = 1, jpj 
    188177         DO ji = 1, jpi 
    189             IF ( ABS(zab(ji,jj)) < 1 ) THEN 
    190          ! day duration is less than 24h 
    191                   IF ( zdawn(ji,jj) < zdusk(ji,jj) ) THEN 
    192          ! day time in one part 
    193                      zlousd = MAX(zlo, zdawn(ji,jj)) 
    194                      zlousd = MIN(zlousd, zup) 
    195                      zupusd = MIN(zup, zdusk(ji,jj)) 
    196                      zupusd = MAX(zupusd, zlo) 
    197                      ztmp = fintegral(zlousd, zupusd, zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    198                      pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * zscal(ji,jj) 
    199                   ELSE 
    200          ! day time in two parts 
    201                      zlousd = MIN(zlo, zdusk(ji,jj)) 
    202                      zupusd = MIN(zup, zdusk(ji,jj)) 
    203                      ztmp1 = fintegral(zlousd, zupusd, zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    204                      zlousd = MAX(zlo, zdawn(ji,jj)) 
    205                      zupusd = MAX(zup, zdawn(ji,jj)) 
    206                      ztmp2 = fintegral(zlousd, zupusd, zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    207                      ztmp = ztmp1 + ztmp2 
    208                      pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * zscal(ji,jj) 
    209                   ENDIF 
    210             ELSE 
    211                   IF ( zaaa(ji,jj) > zbbb(ji,jj) ) THEN 
    212          ! 24h day 
    213                      ztmp = fintegral(zlo, zup, zaaa(ji,jj), zbbb(ji,jj), zccc(ji,jj))  
    214                      pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * zscal(ji,jj) 
    215                   ELSE 
    216          ! No day 
    217                      pqsr(ji,jj) = 0. 
    218                   ENDIF 
     178            IF( ABS(rab(ji,jj)) < 1 ) THEN         ! day duration is less than 24h 
     179               ! 
     180               IF( rdawn(ji,jj) < rdusk(ji,jj) ) THEN       ! day time in one part 
     181                  zlousd = MAX(zlo, rdawn(ji,jj)) 
     182                  zlousd = MIN(zlousd, zup) 
     183                  zupusd = MIN(zup, rdusk(ji,jj)) 
     184                  zupusd = MAX(zupusd, zlo) 
     185                  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) 
     187                  ! 
     188               ELSE                                         ! day time in two parts 
     189                  zlousd = MIN(zlo, rdusk(ji,jj)) 
     190                  zupusd = MIN(zup, rdusk(ji,jj)) 
     191                  ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     192                  zlousd = MAX(zlo, rdawn(ji,jj)) 
     193                  zupusd = MAX(zup, rdawn(ji,jj)) 
     194                  ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj))  
     195                  ztmp = ztmp1 + ztmp2 
     196                  pqsr(ji,jj) = qsr_daily(ji,jj) * ztmp * rscal(ji,jj) 
     197               ENDIF 
     198            ELSE                                   ! 24h light or 24h night 
     199               ! 
     200               IF( raa(ji,jj) > rbb(ji,jj) ) THEN         ! 24h day 
     201                  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) 
     203                  ! 
     204               ELSE                                         ! No day 
     205                  pqsr(ji,jj) = 0.e0 
     206               ENDIF 
    219207            ENDIF 
    220208         END DO   
    221209      END DO   
    222  
     210      ! 
    223211   END SUBROUTINE sbc_dcy 
    224212 
Note: See TracChangeset for help on using the changeset viewer.