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 15603 for branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90 – NEMO

Ignore:
Timestamp:
2021-12-16T10:39:55+01:00 (3 years ago)
Author:
mattmartin
Message:

Updated NEMO branch for coupled NWP at GO6 to include stochastic model perturbations.
For more info see ticket: https://code.metoffice.gov.uk/trac/nwpscience/ticket/1125.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90

    r12555 r15603  
    99   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module 
    1010   !!             -   !  2005-11  (G. Madec) zco, zps, sco coordinate 
    11    !!            3.2  !  2009-04  (G. Madec & NEMO team)  
    12    !!            3.4  !  2012-05  (C. Rousset) store attenuation coef for use in ice model  
     11   !!            3.2  !  2009-04  (G. Madec & NEMO team) 
     12   !!            3.4  !  2012-05  (C. Rousset) store attenuation coef for use in ice model 
    1313   !!            3.6  !  2015-12  (O. Aumont, J. Jouanno, C. Ethe) use vertical profile of chlorophyll 
    1414   !!---------------------------------------------------------------------- 
     
    3333   USE wrk_nemo       ! Memory Allocation 
    3434   USE timing         ! Timing 
     35   USE stopack 
    3536 
    3637   IMPLICIT NONE 
     
    4243   !                                 !!* Namelist namtra_qsr: penetrative solar radiation 
    4344   LOGICAL , PUBLIC ::   ln_traqsr    !: light absorption (qsr) flag 
    44    LOGICAL , PUBLIC ::   ln_qsr_rgb   !: Red-Green-Blue light absorption flag   
     45   LOGICAL , PUBLIC ::   ln_qsr_rgb   !: Red-Green-Blue light absorption flag 
    4546   LOGICAL , PUBLIC ::   ln_qsr_2bd   !: 2 band         light absorption flag 
    4647   LOGICAL , PUBLIC ::   ln_qsr_bio   !: bio-model      light absorption flag 
     
    5051   REAL(wp), PUBLIC ::   rn_si0       !: very near surface depth of extinction      (RGB & 2 bands) 
    5152   REAL(wp), PUBLIC ::   rn_si1       !: deepest depth of extinction (water type I)       (2 bands) 
    52   
     53 
    5354   ! Module variables 
    54    REAL(wp) ::   xsi0r                           !: inverse of rn_si0 
     55   REAL(wp), ALLOCATABLE ::   xsi0r(:,:)         !: inverse of rn_si0 
    5556   REAL(wp) ::   xsi1r                           !: inverse of rn_si1 
    5657   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_chl   ! structure of input Chl (file informations, fields read) 
     
    7980      !!      Considering the 2 wavebands case: 
    8081      !!         I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) ) 
    81       !!         The temperature trend associated with the solar radiation penetration  
     82      !!         The temperature trend associated with the solar radiation penetration 
    8283      !!         is given by : zta = 1/e3t dk[ I ] / (rau0*Cp) 
    8384      !!         At the bottom, boudary condition for the radiation is no flux : 
     
    8586      !!      in the last ocean level. 
    8687      !!         In z-coordinate case, the computation is only done down to the 
    87       !!      level where I(k) < 1.e-15 W/m2. In addition, the coefficients  
     88      !!      level where I(k) < 1.e-15 W/m2. In addition, the coefficients 
    8889      !!      used for the computation are calculated one for once as they 
    8990      !!      depends on k only. 
     
    105106      REAL(wp) ::   zz0, zz1, z1_e3t     !    -         - 
    106107      REAL(wp) ::   zCb, zCmax, zze, zpsi, zpsimax, zdelpsi, zCtot, zCze 
    107       REAL(wp) ::   zlogc, zlogc2, zlogc3  
     108      REAL(wp) ::   zlogc, zlogc2, zlogc3 
    108109      REAL(wp), POINTER, DIMENSION(:,:  ) :: zekb, zekg, zekr 
    109110      REAL(wp), POINTER, DIMENSION(:,:,:) :: ze0, ze1, ze2, ze3, zea, ztrdt, zchl3d 
     
    112113      IF( nn_timing == 1 )  CALL timing_start('tra_qsr') 
    113114      ! 
    114       CALL wrk_alloc( jpi, jpj,      zekb, zekg, zekr        )  
    115       CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d )  
     115      CALL wrk_alloc( jpi, jpj,      zekb, zekg, zekr        ) 
     116      CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 
    116117      ! 
    117118      IF( kt == nit000 ) THEN 
     
    124125 
    125126      IF( l_trdtra ) THEN      ! Save ta and sa trends 
    126          CALL wrk_alloc( jpi, jpj, jpk, ztrdt )  
     127         CALL wrk_alloc( jpi, jpj, jpk, ztrdt ) 
    127128         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
    128129      ENDIF 
     
    153154      !                                        Compute now qsr tracer content field 
    154155      !                                        ************************************ 
    155        
     156 
    156157      !                                           ! ============================================== ! 
    157158      IF( lk_qsr_bio .AND. ln_qsr_bio ) THEN      !  bio-model fluxes  : all vertical coordinates  ! 
     
    162163         !                                        Add to the general trend 
    163164         DO jk = 1, jpkm1 
    164             DO jj = 2, jpjm1  
     165            DO jj = 2, jpjm1 
    165166               DO ji = fs_2, fs_jpim1   ! vector opt. 
    166167                  z1_e3t = zfact / fse3t(ji,jj,jk) 
     
    183184         ENDIF 
    184185         !                                        ! ============================================== ! 
    185       ELSE                                        !  Ocean alone :  
     186      ELSE                                        !  Ocean alone : 
    186187         !                                        ! ============================================== ! 
    187188         ! 
    188          !                                                ! ------------------------- ! 
     189         ! 
     190#if defined key_traldf_c2d || key_traldf_c3d 
     191         IF( ln_stopack .AND. ( nn_spp_qsi0 > 0 ) ) THEN 
     192            xsi0r = rn_si0 
     193            CALL spp_gen(kt, xsi0r, nn_spp_qsi0, rn_qsi0_sd, jk_spp_qsi0 ) 
     194            xsi0r = 1.e0 / xsi0r 
     195         ENDIF 
     196#else 
     197         IF ( ln_stopack .AND. nn_spp_qsi0 > 0 ) & 
     198            & CALL ctl_stop( 'tra_qsr: parameter perturbation will only work with '// & 
     199                             'key_traldf_c2d or key_traldf_c3d') 
     200#endif 
     201 
     202         !                                               ! ------------------------- ! 
    189203         IF( ln_qsr_rgb) THEN                             !  R-G-B  light penetration ! 
    190204            !                                             ! ------------------------- ! 
     
    196210                  CALL fld_read( kt, 1, sf_chl )            ! Read Chl data and provides it at the current time step 
    197211                  DO jk = 1, nksr + 1 
    198                      zchl3d(:,:,jk) = sf_chl(1)%fnow(:,:,1)  
     212                     zchl3d(:,:,jk) = sf_chl(1)%fnow(:,:,1) 
    199213                  ENDDO 
    200214                  ! 
     
    217231                        zpsimax = 0.6   - 0.640 * zlogc + 0.021 * zlogc2 + 0.115 * zlogc3 
    218232                        zdelpsi = 0.710 + 0.159 * zlogc + 0.021 * zlogc2 
    219                         zCze    = 1.12  * (zchl)**0.803  
     233                        zCze    = 1.12  * (zchl)**0.803 
    220234                        DO jk = 1, nksr + 1 
    221235                           zpsi = fsdept(ji,jj,jk) / zze 
     
    228242               ELSE                              !* Variable ocean volume but constant chrlorophyll 
    229243                  DO jk = 1, nksr + 1 
    230                      zchl3d(:,:,jk) = 0.05  
     244                     zchl3d(:,:,jk) = 0.05 
    231245                  ENDDO 
    232246               ENDIF 
     
    253267!CDIR NOVERRCHK 
    254268                  DO jj = 1, jpj 
    255 !CDIR NOVERRCHK    
    256                      DO ji = 1, jpi 
    257                         zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * xsi0r    ) 
     269!CDIR NOVERRCHK 
     270                     DO ji = 1, jpi 
     271                        zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * xsi0r(ji,jj) ) 
    258272                        zc1 = ze1(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * zekb(ji,jj) ) 
    259273                        zc2 = ze2(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * zekg(ji,jj) ) 
     
    286300                     END DO 
    287301                  END DO 
    288                   !  
     302                  ! 
    289303                  DO jj = 1, jpj 
    290304                     DO ji = 1, jpi 
    291                         zc0 = rn_abs * EXP( - fse3t(ji,jj,1) * xsi0r    ) 
     305                        zc0 = rn_abs * EXP( - fse3t(ji,jj,1) * xsi0r(ji,jj) ) 
    292306                        zc1 = zcoef  * EXP( - fse3t(ji,jj,1) * zekb(ji,jj) ) 
    293307                        zc2 = zcoef  * EXP( - fse3t(ji,jj,1) * zekg(ji,jj) ) 
    294308                        zc3 = zcoef  * EXP( - fse3t(ji,jj,1) * zekr(ji,jj) ) 
    295                         fraqsr_1lev(ji,jj) = 1.0 - ( zc0 + zc1 + zc2  + zc3  ) * tmask(ji,jj,2)  
     309                        fraqsr_1lev(ji,jj) = 1.0 - ( zc0 + zc1 + zc2  + zc3  ) * tmask(ji,jj,2) 
    296310                     END DO 
    297311                  END DO 
     
    314328            !                                             ! ------------------------- ! 
    315329            ! 
    316             IF( lk_vvl ) THEN                                  !* variable volume 
     330            IF( lk_vvl .OR. ( ln_stopack .AND. ( nn_spp_qsi0 > 0 ) ) ) THEN        !* variable volume 
     331 
    317332               zz0   =        rn_abs   * r1_rau0_rcp 
    318333               zz1   = ( 1. - rn_abs ) * r1_rau0_rcp 
    319                DO jk = 1, nksr                    ! solar heat absorbed at T-point in the top 400m  
     334               DO jk = 1, nksr                    ! solar heat absorbed at T-point in the top 400m 
    320335                  DO jj = 1, jpj 
    321336                     DO ji = 1, jpi 
    322                         zc0 = zz0 * EXP( -fsdepw(ji,jj,jk  )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk  )*xsi1r ) 
    323                         zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 
    324                         qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0*tmask(ji,jj,jk) - zc1*tmask(ji,jj,jk+1) )  
     337                        zc0 = zz0 * EXP( -fsdepw(ji,jj,jk  )*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk  )*xsi1r ) 
     338                        zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 
     339                        qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0*tmask(ji,jj,jk) - zc1*tmask(ji,jj,jk+1) ) 
    325340                     END DO 
    326341                  END DO 
     
    330345                  DO jj = 1, jpj 
    331346                     DO ji = 1, jpi 
    332                         zc0 = zz0 * EXP( -fsdepw(ji,jj,1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,1)*xsi1r ) 
    333                         zc1 = zz0 * EXP( -fsdepw(ji,jj,2)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,2)*xsi1r ) 
     347                        zc0 = zz0 * EXP( -fsdepw(ji,jj,1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,1)*xsi1r ) 
     348                        zc1 = zz0 * EXP( -fsdepw(ji,jj,2)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,2)*xsi1r ) 
    334349                        fraqsr_1lev(ji,jj) = ( zc0*tmask(ji,jj,1) - zc1*tmask(ji,jj,2) ) / r1_rau0_rcp 
    335350                     END DO 
     
    340355                  DO jj = 2, jpjm1 
    341356                     DO ji = fs_2, fs_jpim1   ! vector opt. 
    342                         ! (ISF) no light penetration below the ice shelves          
     357                        ! (ISF) no light penetration below the ice shelves 
    343358                        qsr_hc(ji,jj,jk) =  etot3(ji,jj,jk) * qsr(ji,jj) * tmask(ji,jj,1) 
    344359                     END DO 
     
    356371         !                                        Add to the general trend 
    357372         DO jk = 1, nksr 
    358             DO jj = 2, jpjm1  
     373            DO jj = 2, jpjm1 
    359374               DO ji = fs_2, fs_jpim1   ! vector opt. 
    360375                  z1_e3t = zfact / fse3t(ji,jj,jk) 
     
    375390            IF(lflush) CALL flush(numout) 
    376391         ENDIF 
    377          IF(nn_timing == 2)  CALL timing_start('iom_rstput')  
     392         IF(nn_timing == 2)  CALL timing_start('iom_rstput') 
    378393         CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b'   , qsr_hc      ) 
    379          CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev )   ! default definition in sbcssm  
     394         CALL iom_rstput( kt, nitrst, numrow, 'fraqsr_1lev', fraqsr_1lev )   ! default definition in sbcssm 
    380395         IF(nn_timing == 2)  CALL timing_stop('iom_rstput') 
    381396         ! 
     
    385400         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 
    386401         CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt ) 
    387          CALL wrk_dealloc( jpi, jpj, jpk, ztrdt )  
     402         CALL wrk_dealloc( jpi, jpj, jpk, ztrdt ) 
    388403      ENDIF 
    389404      !                       ! print mean trends (used for debugging) 
    390405      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 
    391406      ! 
    392       CALL wrk_dealloc( jpi, jpj,      zekb, zekg, zekr        )  
    393       CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d )  
     407      CALL wrk_dealloc( jpi, jpj,      zekb, zekg, zekr        ) 
     408      CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea, zchl3d ) 
    394409      ! 
    395410      IF( nn_timing == 1 )  CALL timing_stop('tra_qsr') 
     
    407422      !!      from two length scale of penetration (rn_si0,rn_si1) and a ratio 
    408423      !!      (rn_abs). These parameters are read in the namtra_qsr namelist. The 
    409       !!      default values correspond to clear water (type I in Jerlov'  
     424      !!      default values correspond to clear water (type I in Jerlov' 
    410425      !!      (1968) classification. 
    411426      !!         called by tra_qsr at the first timestep (nit000) 
     
    434449      IF( nn_timing == 1 )  CALL timing_start('tra_qsr_init') 
    435450      ! 
    436       CALL wrk_alloc( jpi, jpj,      zekb, zekg, zekr        )  
    437       CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea )  
     451      CALL wrk_alloc( jpi, jpj,      zekb, zekg, zekr        ) 
     452      CALL wrk_alloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 
    438453      ! 
    439454 
     
    465480 
    466481      IF( ln_traqsr ) THEN     ! control consistency 
    467          !                       
     482         ! 
    468483         IF( .NOT.lk_qsr_bio .AND. ln_qsr_bio )   THEN 
    469484            CALL ctl_warn( 'No bio model : force ln_qsr_bio = FALSE ' ) 
     
    480495            &              ' 2 bands, 3 RGB bands or bio-model light penetration' ) 
    481496         ! 
    482          IF( ln_qsr_rgb .AND. nn_chldta == 0 )   nqsr =  1  
     497         IF( ln_qsr_rgb .AND. nn_chldta == 0 )   nqsr =  1 
    483498         IF( ln_qsr_rgb .AND. nn_chldta == 1 )   nqsr =  2 
    484499         IF( ln_qsr_rgb .AND. nn_chldta == 2 )   nqsr =  3 
     
    498513      ENDIF 
    499514      !                          ! ===================================== ! 
    500       IF( ln_traqsr  ) THEN      !  Initialisation of Light Penetration  !   
     515      IF( ln_traqsr  ) THEN      !  Initialisation of Light Penetration  ! 
    501516         !                       ! ===================================== ! 
    502517         ! 
     518         ALLOCATE( xsi0r(jpi,jpj) ) 
    503519         xsi0r = 1.e0 / rn_si0 
    504520         xsi1r = 1.e0 / rn_si1 
     
    539555                  zchl = 0.05                                 ! constant chlorophyll 
    540556                  irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 ) 
    541                   zekb(:,:) = rkrgb(1,irgb)                   ! Separation in R-G-B depending of the chlorophyll  
     557                  zekb(:,:) = rkrgb(1,irgb)                   ! Separation in R-G-B depending of the chlorophyll 
    542558                  zekg(:,:) = rkrgb(2,irgb) 
    543559                  zekr(:,:) = rkrgb(3,irgb) 
     
    546562                  ze0(:,:,1) = rn_abs 
    547563                  ze1(:,:,1) = zcoef 
    548                   ze2(:,:,1) = zcoef  
     564                  ze2(:,:,1) = zcoef 
    549565                  ze3(:,:,1) = zcoef 
    550566                  zea(:,:,1) = tmask(:,:,1)                   ! = ( ze0+ze1+z2+ze3 ) * tmask 
    551                 
     567 
    552568                  DO jk = 2, nksr+1 
    553569!CDIR NOVERRCHK 
    554570                     DO jj = 1, jpj 
    555 !CDIR NOVERRCHK    
     571!CDIR NOVERRCHK 
    556572                        DO ji = 1, jpi 
    557                            zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * xsi0r    ) 
     573                           zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * xsi0r(ji,jj) ) 
    558574                           zc1 = ze1(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * zekb(ji,jj) ) 
    559575                           zc2 = ze2(ji,jj,jk-1) * EXP( - e3t_0(ji,jj,jk-1) * zekg(ji,jj) ) 
     
    566582                        END DO 
    567583                     END DO 
    568                   END DO  
     584                  END DO 
    569585                  ! 
    570586                  DO jk = 1, nksr 
     
    600616                  DO jj = 1, jpj                              ! top 400 meters 
    601617                     DO ji = 1, jpi 
    602                         zc0 = zz0 * EXP( -fsdepw(ji,jj,jk  )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk  )*xsi1r ) 
    603                         zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 
    604                         etot3(ji,jj,jk) = (  zc0 * tmask(ji,jj,jk) - zc1 * tmask(ji,jj,jk+1)  ) * tmask(ji,jj,1)  
     618                        zc0 = zz0 * EXP( -fsdepw(ji,jj,jk  )*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk  )*xsi1r ) 
     619                        zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r(ji,jj) ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 
     620                        etot3(ji,jj,jk) = (  zc0 * tmask(ji,jj,jk) - zc1 * tmask(ji,jj,jk+1)  ) * tmask(ji,jj,1) 
    605621                     END DO 
    606622                  END DO 
     
    611627         ENDIF 
    612628         !                       ! ===================================== ! 
    613       ELSE                       !        No light penetration           !                    
     629      ELSE                       !        No light penetration           ! 
    614630         !                       ! ===================================== ! 
    615631         IF(lwp) THEN 
     
    617633            WRITE(numout,*) 'tra_qsr_init : NO solar flux penetration' 
    618634            WRITE(numout,*) '~~~~~~~~~~~~' 
    619             IF(lflush) CALL flush(numout) 
     635            IF(lflush) CALL flush(numout)             
    620636         ENDIF 
    621637      ENDIF 
     
    630646      ENDIF 
    631647      ! 
    632       CALL wrk_dealloc( jpi, jpj,      zekb, zekg, zekr        )  
    633       CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea )  
     648      CALL wrk_dealloc( jpi, jpj,      zekb, zekg, zekr        ) 
     649      CALL wrk_dealloc( jpi, jpj, jpk, ze0, ze1, ze2, ze3, zea ) 
    634650      ! 
    635651      IF( nn_timing == 1 )  CALL timing_stop('tra_qsr_init') 
Note: See TracChangeset for help on using the changeset viewer.