Changeset 6068 for LMDZ6/trunk/libf


Ignore:
Timestamp:
Feb 5, 2026, 4:11:56 PM (2 weeks ago)
Author:
evignon
Message:

update of mesh-averaged TKE after tend_to_tke. This only impact the writting of restartphy and ener_conserv

Location:
LMDZ6/trunk/libf/phylmd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/lmdz_call_gwd.f90

    r6063 r6068  
    2020!===================================================================
    2121
    22    SUBROUTINE call_gwd(klon, klev, nbsrf, is_ter, is_lic, abortphy, flag_inhib_tend, itap, JD_cur, JD_ref, JH_cur, &
     22   SUBROUTINE call_gwd(klon, klev, nbsrf, is_ter, is_lic, is_ave, abortphy, flag_inhib_tend, itap, JD_cur, JD_ref, JH_cur, &
    2323                       pctsrf, is_sequential, phys_tstep, cell_area, longitude_deg, latitude_deg, pphis, &
    2424                       zstd, zpic, zmea, zval, zsig, zgam, zthe, pplay, paprs, presnivs, rain_fall, snow_fall, &
     
    6161      REAL, INTENT(IN)     :: JD_ref ! start day of the run
    6262      REAL, INTENT(IN)     :: JH_cur ! time of the day in seconds
    63       INTEGER, INTENT(IN)  :: is_ter, is_lic ! indices for land and landice subsurfaces
     63      INTEGER, INTENT(IN)  :: is_ter, is_lic, is_ave ! indices for land and landice subsurfaces and mesh-averaged
    6464      LOGICAL, INTENT(IN)  :: is_sequential ! sequential or parallel model
    6565      REAL, INTENT(IN)  :: phys_tstep ! time step [s]
     
    488488         forall (k=1:klev) exner(:, k) = (pplay(:, k)/paprs(:, 1))**rkappa
    489489
    490          CALL tend_to_tke(phys_tstep, klon, klev, nbsrf, paprs, exner, t_seri, u_seri, v_seri, dtadd, duadd, dvadd, pctsrf, tke)
     490         CALL tend_to_tke(phys_tstep, klon, klev, nbsrf, is_ave, paprs, exner, t_seri, u_seri, v_seri, dtadd, duadd, dvadd, pctsrf, tke)
    491491
    492492         ! Prevent pbl_tke_w from becoming negative
  • LMDZ6/trunk/libf/phylmd/lmdz_gwd_tendtotke.f90

    r6063 r6068  
    33!*******************
    44!
    5 ! Subroutine that adds a tendency on the TKE created by the 
     5! Subroutine that adds a tendency on the TKE created by the
    66! fluxes of momentum retrieved from the wind speed tendencies
    7 ! of the physics. Currently we only account for the contribution 
     7! of the physics. Currently we only account for the contribution
    88! of the orographic gravity wave drag
    9 ! 
     9!
    1010! The basic concept is the following:
    1111! the TKE equation writes  de/dt = -u'w' du/dz -v'w' dv/dz +g/theta dtheta/dz +......
     
    1515! scheme, for instance: orographic gravity wave drag.... These contributions
    1616! need to be accounted for.
    17 ! we explicitely calculate the fluxes, integrating the wind speed 
     17! we explicitely calculate the fluxes, integrating the wind speed
    1818!                        tendency from the top of the atmosphere
    1919!
     
    3333!$gpum horizontal klon
    3434MODULE lmdz_gwd_tendtotke
    35   PRIVATE
     35   PRIVATE
    3636
    37   PUBLIC tend_to_tke
     37   PUBLIC tend_to_tke
    3838
    39   CONTAINS
     39CONTAINS
    4040
    41  SUBROUTINE tend_to_tke(dt,klon,klev,nbsrf,plev,exner,temp,windu,windv,dt_a,du_a,dv_a,pctsrf,tke)
     41   SUBROUTINE tend_to_tke(dt, klon, klev, nbsrf, is_ave, plev, exner, temp, windu, windv, dt_a, du_a, dv_a, pctsrf, tke)
    4242
    43 USE lmdz_gwd_ini, ONLY: RG, RCPD
     43      USE lmdz_gwd_ini, ONLY: RG, RCPD
    4444
    45 IMPLICIT NONE
    46 
     45      IMPLICIT NONE
    4746
    4847! Declarations
    4948!==============
    5049
    51 
    5250! Inputs
    5351!-------
    54   REAL, INTENT(IN) ::  dt                   ! Time step [s]
    55   INTEGER, INTENT(IN)  :: klon,klev ! horizontal and vertical dimensions
    56   INTEGER, INTENT(IN)  :: nbsrf ! number of subsurfaces
    57   REAL, DIMENSION(klon,klev+1), INTENT(IN) :: plev  ! inter-layer pressure [Pa]
    58   REAL, DIMENSION(klon,klev), INTENT(IN) :: temp      ! temperature [K], grid-cell average or for a one subsurface
    59   REAL, DIMENSION(klon,klev), INTENT(IN) :: windu     ! zonal wind [m/s], grid-cell average or for a one subsurface
    60   REAL, DIMENSION(klon,klev), INTENT(IN) :: windv     ! meridonal wind [m/s], grid-cell average or for a one subsurface
    61   REAL, DIMENSION(klon,klev), INTENT(IN) :: exner     ! Fonction d'Exner = T/theta
    62   REAL, DIMENSION(klon,klev), INTENT(IN) :: dt_a      ! Temperature tendency [K], grid-cell average or for a one subsurface
    63   REAL, DIMENSION(klon,klev), INTENT(IN) :: du_a      ! Zonal wind speed tendency [m/s], grid-cell average or for a one subsurface
    64   REAL, DIMENSION(klon,klev), INTENT(IN) :: dv_a      ! Meridional wind speed tendency [m/s], grid-cell average or for a one subsurface
    65   REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf   ! fraction of each subsurface [0-1]
     52      REAL, INTENT(IN) ::  dt                   ! Time step [s]
     53      INTEGER, INTENT(IN)  :: klon, klev ! horizontal and vertical dimensions
     54      INTEGER, INTENT(IN)  :: nbsrf ! number of subsurfaces
     55      INTEGER, INTENT(IN)  :: is_ave ! index for mesh-averaged  variables
     56      REAL, DIMENSION(klon, klev + 1), INTENT(IN) :: plev  ! inter-layer pressure [Pa]
     57      REAL, DIMENSION(klon, klev), INTENT(IN) :: temp      ! temperature [K], grid-cell average or for a one subsurface
     58      REAL, DIMENSION(klon, klev), INTENT(IN) :: windu     ! zonal wind [m/s], grid-cell average or for a one subsurface
     59      REAL, DIMENSION(klon, klev), INTENT(IN) :: windv     ! meridonal wind [m/s], grid-cell average or for a one subsurface
     60      REAL, DIMENSION(klon, klev), INTENT(IN) :: exner     ! Fonction d'Exner = T/theta
     61      REAL, DIMENSION(klon, klev), INTENT(IN) :: dt_a      ! Temperature tendency [K], grid-cell average or for a one subsurface
     62      REAL, DIMENSION(klon, klev), INTENT(IN) :: du_a      ! Zonal wind speed tendency [m/s], grid-cell average or for a one subsurface
     63      REAL, DIMENSION(klon, klev), INTENT(IN) :: dv_a      ! Meridional wind speed tendency [m/s], grid-cell average or for a one subsurface
     64      REAL, DIMENSION(klon, nbsrf), INTENT(IN) :: pctsrf   ! fraction of each subsurface [0-1]
    6665
    6766! Inputs/Outputs
    6867!---------------
    69   REAL, DIMENSION(klon,klev+1,nbsrf+1), INTENT(INOUT) :: tke       ! Turbulent Kinetic energy [m2/s2], grid-cell average or for a subsurface
    70 
     68      REAL, DIMENSION(klon, klev + 1, nbsrf + 1), INTENT(INOUT) :: tke       ! Turbulent Kinetic energy [m2/s2], grid-cell average or for a subsurface
    7169
    7270! Local
    7371!-------
    7472
    75 
    76   INTEGER i,k,isrf                 ! indices
    77   REAL    masse(klon,klev)          ! mass in the layers [kg/m2]
    78   REAL    unsmasse(klon,klev+1)     ! linear mass in the layers [kg/m2]
    79   REAL    flux_rhotw(klon,klev+1)   ! flux massique de tempe. pot. rho*u'*theta'
    80   REAL    flux_rhouw(klon,klev+1)   ! flux massique de quantit?? de mouvement rho*u'*w' [kg/m/s2]
    81   REAL    flux_rhovw(klon,klev+1)   ! flux massique de quantit?? de mouvement rho*v'*w' [kg/m/s2]
    82   REAL    tendt(klon,klev)        ! new temperature tke tendency [m2/s2/s]
    83   REAL    tendu(klon,klev)        ! new zonal tke tendency [m2/s2/s]
    84   REAL    tendv(klon,klev)        ! new meridonal tke tendency [m2/s2/s]
    85  
    86 
    87 
     73      INTEGER i, k, isrf                 ! indices
     74      REAL masse(klon, klev)          ! mass in the layers [kg/m2]
     75      REAL unsmasse(klon, klev + 1)     ! linear mass in the layers [kg/m2]
     76      REAL flux_rhotw(klon, klev + 1)   ! flux massique de tempe. pot. rho*u'*theta'
     77      REAL flux_rhouw(klon, klev + 1)   ! flux massique de quantit?? de mouvement rho*u'*w' [kg/m/s2]
     78      REAL flux_rhovw(klon, klev + 1)   ! flux massique de quantit?? de mouvement rho*v'*w' [kg/m/s2]
     79      REAL tendt(klon, klev)        ! new temperature tke tendency [m2/s2/s]
     80      REAL tendu(klon, klev)        ! new zonal tke tendency [m2/s2/s]
     81      REAL tendv(klon, klev)        ! new meridonal tke tendency [m2/s2/s]
    8882
    8983! First calculations:
    9084!=====================
    9185
    92       unsmasse(:,:)=0.
    93       DO k=1,klev
    94          masse(:,k)=(plev(:,k)-plev(:,k+1))/RG
    95          unsmasse(:,k)=unsmasse(:,k)+0.5/masse(:,k)
    96          unsmasse(:,k+1)=unsmasse(:,k+1)+0.5/masse(:,k)
     86      unsmasse(:, :) = 0.
     87      DO k = 1, klev
     88         masse(:, k) = (plev(:, k) - plev(:, k + 1))/RG
     89         unsmasse(:, k) = unsmasse(:, k) + 0.5/masse(:, k)
     90         unsmasse(:, k + 1) = unsmasse(:, k + 1) + 0.5/masse(:, k)
    9791      END DO
    9892
    99       tendu(:,:)=0.0
    100       tendv(:,:)=0.0
     93      tendu(:, :) = 0.0
     94      tendv(:, :) = 0.0
    10195
    10296! Method 1: Calculation of fluxes using a downward integration
    10397!============================================================
    10498
    105 
    106  
    10799! Flux calculation
    108100
    109  flux_rhotw(:,klev+1)=0.
    110  flux_rhouw(:,klev+1)=0.
    111  flux_rhovw(:,klev+1)=0.
     101      flux_rhotw(:, klev + 1) = 0.
     102      flux_rhouw(:, klev + 1) = 0.
     103      flux_rhovw(:, klev + 1) = 0.
    112104
    113    DO k=klev,1,-1
    114       flux_rhotw(:,k)=flux_rhotw(:,k+1)+masse(:,k)*dt_a(:,k)/exner(:,k)
    115       flux_rhouw(:,k)=flux_rhouw(:,k+1)+masse(:,k)*du_a(:,k)
    116       flux_rhovw(:,k)=flux_rhovw(:,k+1)+masse(:,k)*dv_a(:,k)
    117    ENDDO
    118 
     105      DO k = klev, 1, -1
     106         flux_rhotw(:, k) = flux_rhotw(:, k + 1) + masse(:, k)*dt_a(:, k)/exner(:, k)
     107         flux_rhouw(:, k) = flux_rhouw(:, k + 1) + masse(:, k)*du_a(:, k)
     108         flux_rhovw(:, k) = flux_rhovw(:, k + 1) + masse(:, k)*dv_a(:, k)
     109      END DO
    119110
    120111! TKE update:
    121112
    122    DO k=2,klev
    123       tendt(:,k)=-flux_rhotw(:,k)*(exner(:,k)-exner(:,k-1))*unsmasse(:,k)*RCPD
    124       tendu(:,k)=-flux_rhouw(:,k)*(windu(:,k)-windu(:,k-1))*unsmasse(:,k)
    125       tendv(:,k)=-flux_rhovw(:,k)*(windv(:,k)-windv(:,k-1))*unsmasse(:,k)
    126    ENDDO
    127    tendt(:,1)=-flux_rhotw(:,1)*(exner(:,1)-1.)*unsmasse(:,1)*RCPD
    128    tendu(:,1)=-1.*flux_rhouw(:,1)*windu(:,1)*unsmasse(:,1)
    129    tendv(:,1)=-1.*flux_rhovw(:,1)*windv(:,1)*unsmasse(:,1)
     113      DO k = 2, klev
     114         tendt(:, k) = -flux_rhotw(:, k)*(exner(:, k) - exner(:, k - 1))*unsmasse(:, k)*RCPD
     115         tendu(:, k) = -flux_rhouw(:, k)*(windu(:, k) - windu(:, k - 1))*unsmasse(:, k)
     116         tendv(:, k) = -flux_rhovw(:, k)*(windv(:, k) - windv(:, k - 1))*unsmasse(:, k)
     117      END DO
     118      tendt(:, 1) = -flux_rhotw(:, 1)*(exner(:, 1) - 1.)*unsmasse(:, 1)*RCPD
     119      tendu(:, 1) = -1.*flux_rhouw(:, 1)*windu(:, 1)*unsmasse(:, 1)
     120      tendv(:, 1) = -1.*flux_rhovw(:, 1)*windv(:, 1)*unsmasse(:, 1)
    130121
     122      DO isrf = 1, nbsrf
     123         DO k = 1, klev
     124            DO i = 1, klon
     125               IF (pctsrf(i, isrf) > 0.) THEN
     126                  tke(i, k, isrf) = tke(i, k, isrf) + tendu(i, k) + tendv(i, k) + tendt(i, k)
     127                  tke(i, k, isrf) = max(tke(i, k, isrf), 1.e-10)
     128               END IF
     129            END DO
     130         END DO
     131      END DO
    131132
    132  DO isrf=1,nbsrf
    133    DO k=1,klev
    134        DO i=1,klon
    135           IF (pctsrf(i,isrf)>0.) THEN
    136             tke(i,k,isrf)= tke(i,k,isrf)+tendu(i,k)+tendv(i,k)+tendt(i,k)
    137             tke(i,k,isrf)= max(tke(i,k,isrf),1.e-10)
    138           ENDIF
    139        ENDDO
    140     ENDDO
    141  ENDDO
     133! Recompute the mesh-averaged TKE
     134      tke(:, :, is_ave) = 0.
     135      DO isrf = 1, nbsrf
     136         DO k = 1, klev
     137            DO i = 1, klon
     138               tke(i, k, is_ave) = tke(i, k, is_ave) + pctsrf(i, isrf)*tke(i, k, isrf)
     139            END DO
     140         END DO
     141      END DO
    142142
    143 ! The tendency on mean TKE (nbsrf+1) must be added as well
    144 ! or mesh-averaged TKE should be updated here
    145 
    146 
    147 
    148  END SUBROUTINE tend_to_tke
     143   END SUBROUTINE tend_to_tke
    149144
    150145END MODULE lmdz_gwd_tendtotke
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r6063 r6068  
    47244724    !
    47254725
    4726     CALL call_gwd(klon,klev,nbsrf,is_ter,is_lic,abortphy,flag_inhib_tend,itap, JD_cur, JD_ref, JH_cur, &
     4726    CALL call_gwd(klon,klev,nbsrf,is_ter,is_lic,is_ave,abortphy,flag_inhib_tend,itap, JD_cur, JD_ref, JH_cur, &
    47274727                   pctsrf,is_sequential,phys_tstep,cell_area,longitude_deg,latitude_deg,pphis, &
    47284728                   zstd,zpic,zmea,zval,zsig,zgam,zthe,pplay,paprs,presnivs,rain_fall,snow_fall, &
Note: See TracChangeset for help on using the changeset viewer.