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 12928 for NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/TRA/traqsr.F90 – NEMO

Ignore:
Timestamp:
2020-05-14T21:46:00+02:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12925 (ticket #2170)

Location:
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser

    • Property svn:externals
      •  

        old new  
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@HEAD         sette 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/TRA/traqsr.F90

    r12178 r12928  
    6767 
    6868   !! * Substitutions 
    69 #  include "vectopt_loop_substitute.h90" 
     69#  include "do_loop_substitute.h90" 
    7070   !!---------------------------------------------------------------------- 
    7171   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    7575CONTAINS 
    7676 
    77    SUBROUTINE tra_qsr( kt ) 
     77   SUBROUTINE tra_qsr( kt, Kmm, pts, Krhs ) 
    7878      !!---------------------------------------------------------------------- 
    7979      !!                  ***  ROUTINE tra_qsr  *** 
     
    8787      !!         I(k) = Qsr*( rn_abs*EXP(z(k)/rn_si0) + (1.-rn_abs)*EXP(z(k)/rn_si1) ) 
    8888      !!         The temperature trend associated with the solar radiation penetration  
    89       !!         is given by : zta = 1/e3t dk[ I ] / (rau0*Cp) 
     89      !!         is given by : zta = 1/e3t dk[ I ] / (rho0*Cp) 
    9090      !!         At the bottom, boudary condition for the radiation is no flux : 
    9191      !!      all heat which has not been absorbed in the above levels is put 
     
    101101      !!              Morel, A. et Berthon, JF, 1989, Limnol Oceanogr 34(8), 1545-1562 
    102102      !!---------------------------------------------------------------------- 
    103       INTEGER, INTENT(in) ::   kt     ! ocean time-step 
     103      INTEGER,                                   INTENT(in   ) :: kt            ! ocean time-step 
     104      INTEGER,                                   INTENT(in   ) :: Kmm, Krhs     ! time level indices 
     105      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts           ! active tracers and RHS of tracer equation 
    104106      ! 
    105107      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
     
    126128      IF( l_trdtra ) THEN      ! trends diagnostic: save the input temperature trend 
    127129         ALLOCATE( ztrdt(jpi,jpj,jpk) )  
    128          ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
     130         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 
    129131      ENDIF 
    130132      ! 
     
    133135      !                         !-----------------------------------! 
    134136      IF( kt == nit000 ) THEN          !==  1st time step  ==! 
    135 !!gm case neuler  not taken into account.... 
    136          IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0 ) THEN    ! read in restart 
     137         IF( ln_rstart .AND. iom_varid( numror, 'qsr_hc_b', ldstop = .FALSE. ) > 0  .AND. .NOT.l_1st_euler ) THEN    ! read in restart 
    137138            IF(lwp) WRITE(numout,*) '          nit000-1 qsr tracer content forcing field read in the restart file' 
    138139            z1_2 = 0.5_wp 
     
    154155         ! 
    155156         DO jk = 1, nksr 
    156             qsr_hc(:,:,jk) = r1_rau0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 
     157            qsr_hc(:,:,jk) = r1_rho0_rcp * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 
    157158         END DO 
    158159         ! 
     
    167168            DO jk = 1, nksr + 1 
    168169               DO jj = 2, jpjm1                       ! Separation in R-G-B depending of the surface Chl 
    169                   DO ji = fs_2, fs_jpim1 
     170                  DO ji = 2, jpim1 
    170171                     zchl    = MIN( 10. , MAX( 0.03, sf_chl(1)%fnow(ji,jj,1) ) ) 
    171172                     zCtot   = 40.6  * zchl**0.459 
    172173                     zze     = 568.2 * zCtot**(-0.746) 
    173174                     IF( zze > 102. ) zze = 200.0 * zCtot**(-0.293) 
    174                      zpsi    = gdepw_n(ji,jj,jk) / zze 
     175                     zpsi    = gdepw(ji,jj,jk,Kmm) / zze 
    175176                     ! 
    176177                     zlogc   = LOG( zchl ) 
     
    195196         ! 
    196197         zcoef  = ( 1. - rn_abs ) / 3._wp    !* surface equi-partition in R-G-B 
    197          DO jj = 2, jpjm1 
    198             DO ji = fs_2, fs_jpim1 
    199                ze0(ji,jj,1) = rn_abs * qsr(ji,jj) 
    200                ze1(ji,jj,1) = zcoef  * qsr(ji,jj) 
    201                ze2(ji,jj,1) = zcoef  * qsr(ji,jj) 
    202                ze3(ji,jj,1) = zcoef  * qsr(ji,jj) 
    203                zea(ji,jj,1) =          qsr(ji,jj) 
    204             END DO 
     198         DO_2D_00_00 
     199            ze0(ji,jj,1) = rn_abs * qsr(ji,jj) 
     200            ze1(ji,jj,1) = zcoef  * qsr(ji,jj) 
     201            ze2(ji,jj,1) = zcoef  * qsr(ji,jj) 
     202            ze3(ji,jj,1) = zcoef  * qsr(ji,jj) 
     203            zea(ji,jj,1) =          qsr(ji,jj) 
     204         END_2D 
     205         ! 
     206         DO jk = 2, nksr+1                   !* interior equi-partition in R-G-B depending of vertical profile of Chl 
     207            DO_2D_00_00 
     208               zchl = MIN( 10. , MAX( 0.03, zchl3d(ji,jj,jk) ) ) 
     209               irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 ) 
     210               zekb(ji,jj) = rkrgb(1,irgb) 
     211               zekg(ji,jj) = rkrgb(2,irgb) 
     212               zekr(ji,jj) = rkrgb(3,irgb) 
     213            END_2D 
     214 
     215            DO_2D_00_00 
     216               zc0 = ze0(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * xsi0r       ) 
     217               zc1 = ze1(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekb(ji,jj) ) 
     218               zc2 = ze2(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekg(ji,jj) ) 
     219               zc3 = ze3(ji,jj,jk-1) * EXP( - e3t(ji,jj,jk-1,Kmm) * zekr(ji,jj) ) 
     220               ze0(ji,jj,jk) = zc0 
     221               ze1(ji,jj,jk) = zc1 
     222               ze2(ji,jj,jk) = zc2 
     223               ze3(ji,jj,jk) = zc3 
     224               zea(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk) 
     225            END_2D 
    205226         END DO 
    206227         ! 
    207          DO jk = 2, nksr+1                   !* interior equi-partition in R-G-B depending of vertical profile of Chl 
    208             DO jj = 2, jpjm1 
    209                DO ji = fs_2, fs_jpim1 
    210                   zchl = MIN( 10. , MAX( 0.03, zchl3d(ji,jj,jk) ) ) 
    211                   irgb = NINT( 41 + 20.*LOG10(zchl) + 1.e-15 ) 
    212                   zekb(ji,jj) = rkrgb(1,irgb) 
    213                   zekg(ji,jj) = rkrgb(2,irgb) 
    214                   zekr(ji,jj) = rkrgb(3,irgb) 
    215                END DO 
    216             END DO 
    217  
    218             DO jj = 2, jpjm1 
    219                DO ji = fs_2, fs_jpim1 
    220                   zc0 = ze0(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * xsi0r       ) 
    221                   zc1 = ze1(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekb(ji,jj) ) 
    222                   zc2 = ze2(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekg(ji,jj) ) 
    223                   zc3 = ze3(ji,jj,jk-1) * EXP( - e3t_n(ji,jj,jk-1) * zekr(ji,jj) ) 
    224                   ze0(ji,jj,jk) = zc0 
    225                   ze1(ji,jj,jk) = zc1 
    226                   ze2(ji,jj,jk) = zc2 
    227                   ze3(ji,jj,jk) = zc3 
    228                   zea(ji,jj,jk) = ( zc0 + zc1 + zc2 + zc3 ) * wmask(ji,jj,jk) 
    229                END DO 
    230             END DO 
    231          END DO 
    232          ! 
    233          DO jk = 1, nksr                     !* now qsr induced heat content 
    234             DO jj = 2, jpjm1 
    235                DO ji = fs_2, fs_jpim1 
    236                   qsr_hc(ji,jj,jk) = r1_rau0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 
    237                END DO 
    238             END DO 
    239          END DO 
     228         DO_3D_00_00( 1, nksr ) 
     229            qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 
     230         END_3D 
    240231         ! 
    241232         DEALLOCATE( zekb , zekg , zekr , ze0 , ze1 , ze2 , ze3 , zea , zchl3d )  
     
    243234      CASE( np_2BD  )            !==  2-bands fluxes  ==! 
    244235         ! 
    245          zz0 =        rn_abs   * r1_rau0_rcp      ! surface equi-partition in 2-bands 
    246          zz1 = ( 1. - rn_abs ) * r1_rau0_rcp 
    247          DO jk = 1, nksr                          ! solar heat absorbed at T-point in the top 400m  
    248             DO jj = 2, jpjm1 
    249                DO ji = fs_2, fs_jpim1 
    250                   zc0 = zz0 * EXP( -gdepw_n(ji,jj,jk  )*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk  )*xsi1r ) 
    251                   zc1 = zz0 * EXP( -gdepw_n(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -gdepw_n(ji,jj,jk+1)*xsi1r ) 
    252                   qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) )  
    253                END DO 
    254             END DO 
    255          END DO 
     236         zz0 =        rn_abs   * r1_rho0_rcp      ! surface equi-partition in 2-bands 
     237         zz1 = ( 1. - rn_abs ) * r1_rho0_rcp 
     238         DO_3D_00_00( 1, nksr ) 
     239            zc0 = zz0 * EXP( -gdepw(ji,jj,jk  ,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk  ,Kmm)*xsi1r ) 
     240            zc1 = zz0 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi1r ) 
     241            qsr_hc(ji,jj,jk) = qsr(ji,jj) * ( zc0 * wmask(ji,jj,jk) - zc1 * wmask(ji,jj,jk+1) )  
     242         END_3D 
    256243         ! 
    257244      END SELECT 
    258245      ! 
    259246      !                          !-----------------------------! 
    260       DO jk = 1, nksr            !  update to the temp. trend  ! 
    261          DO jj = 2, jpjm1        !-----------------------------! 
    262             DO ji = fs_2, fs_jpim1   ! vector opt. 
    263                tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem)   & 
    264                   &                 + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t_n(ji,jj,jk) 
    265             END DO 
    266          END DO 
    267       END DO 
     247      DO_3D_00_00( 1, nksr ) 
     248         pts(ji,jj,jk,jp_tem,Krhs) = pts(ji,jj,jk,jp_tem,Krhs)   & 
     249            &                      + z1_2 * ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) / e3t(ji,jj,jk,Kmm) 
     250      END_3D 
    268251      ! 
    269252      ! sea-ice: store the 1st ocean level attenuation coefficient 
    270       DO jj = 2, jpjm1  
    271          DO ji = fs_2, fs_jpim1   ! vector opt. 
    272             IF( qsr(ji,jj) /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rau0_rcp * qsr(ji,jj) ) 
    273             ELSE                             ;   fraqsr_1lev(ji,jj) = 1._wp 
    274             ENDIF 
    275          END DO 
    276       END DO 
     253      DO_2D_00_00 
     254         IF( qsr(ji,jj) /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rho0_rcp * qsr(ji,jj) ) 
     255         ELSE                             ;   fraqsr_1lev(ji,jj) = 1._wp 
     256         ENDIF 
     257      END_2D 
    277258      CALL lbc_lnk( 'traqsr', fraqsr_1lev(:,:), 'T', 1._wp ) 
    278259      ! 
     
    281262         zetot(:,:,nksr+1:jpk) = 0._wp     ! below ~400m set to zero 
    282263         DO jk = nksr, 1, -1 
    283             zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rau0_rcp 
     264            zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rho0_rcp 
    284265         END DO          
    285266         CALL iom_put( 'qsr3d', zetot )   ! 3D distribution of shortwave Radiation 
     
    295276      ! 
    296277      IF( l_trdtra ) THEN     ! qsr tracers trends saved for diagnostics 
    297          ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 
    298          CALL trd_tra( kt, 'TRA', jp_tem, jptra_qsr, ztrdt ) 
     278         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 
     279         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_qsr, ztrdt ) 
    299280         DEALLOCATE( ztrdt )  
    300281      ENDIF 
    301282      !                       ! print mean trends (used for debugging) 
    302       IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 
     283      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 
    303284      ! 
    304285      IF( ln_timing )   CALL timing_stop('tra_qsr') 
     
    336317      !!---------------------------------------------------------------------- 
    337318      ! 
    338       REWIND( numnam_ref )              ! Namelist namtra_qsr in reference     namelist 
    339319      READ  ( numnam_ref, namtra_qsr, IOSTAT = ios, ERR = 901) 
    340320901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtra_qsr in reference namelist' ) 
    341321      ! 
    342       REWIND( numnam_cfg )              ! Namelist namtra_qsr in configuration namelist 
    343322      READ  ( numnam_cfg, namtra_qsr, IOSTAT = ios, ERR = 902 ) 
    344323902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtra_qsr in configuration namelist' ) 
Note: See TracChangeset for help on using the changeset viewer.