Changeset 6068 for LMDZ6/trunk/libf
- Timestamp:
- Feb 5, 2026, 4:11:56 PM (2 weeks ago)
- Location:
- LMDZ6/trunk/libf/phylmd
- Files:
-
- 3 edited
-
lmdz_call_gwd.f90 (modified) (3 diffs)
-
lmdz_gwd_tendtotke.f90 (modified) (3 diffs)
-
physiq_mod.F90 (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/lmdz_call_gwd.f90
r6063 r6068 20 20 !=================================================================== 21 21 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, & 23 23 pctsrf, is_sequential, phys_tstep, cell_area, longitude_deg, latitude_deg, pphis, & 24 24 zstd, zpic, zmea, zval, zsig, zgam, zthe, pplay, paprs, presnivs, rain_fall, snow_fall, & … … 61 61 REAL, INTENT(IN) :: JD_ref ! start day of the run 62 62 REAL, INTENT(IN) :: JH_cur ! time of the day in seconds 63 INTEGER, INTENT(IN) :: is_ter, is_lic ! indices for land and landice subsurfaces63 INTEGER, INTENT(IN) :: is_ter, is_lic, is_ave ! indices for land and landice subsurfaces and mesh-averaged 64 64 LOGICAL, INTENT(IN) :: is_sequential ! sequential or parallel model 65 65 REAL, INTENT(IN) :: phys_tstep ! time step [s] … … 488 488 forall (k=1:klev) exner(:, k) = (pplay(:, k)/paprs(:, 1))**rkappa 489 489 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) 491 491 492 492 ! Prevent pbl_tke_w from becoming negative -
LMDZ6/trunk/libf/phylmd/lmdz_gwd_tendtotke.f90
r6063 r6068 3 3 !******************* 4 4 ! 5 ! Subroutine that adds a tendency on the TKE created by the 5 ! Subroutine that adds a tendency on the TKE created by the 6 6 ! 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 8 8 ! of the orographic gravity wave drag 9 ! 9 ! 10 10 ! The basic concept is the following: 11 11 ! the TKE equation writes de/dt = -u'w' du/dz -v'w' dv/dz +g/theta dtheta/dz +...... … … 15 15 ! scheme, for instance: orographic gravity wave drag.... These contributions 16 16 ! 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 18 18 ! tendency from the top of the atmosphere 19 19 ! … … 33 33 !$gpum horizontal klon 34 34 MODULE lmdz_gwd_tendtotke 35 PRIVATE35 PRIVATE 36 36 37 PUBLIC tend_to_tke37 PUBLIC tend_to_tke 38 38 39 CONTAINS39 CONTAINS 40 40 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) 42 42 43 USE lmdz_gwd_ini, ONLY: RG, RCPD43 USE lmdz_gwd_ini, ONLY: RG, RCPD 44 44 45 IMPLICIT NONE 46 45 IMPLICIT NONE 47 46 48 47 ! Declarations 49 48 !============== 50 49 51 52 50 ! Inputs 53 51 !------- 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] 66 65 67 66 ! Inputs/Outputs 68 67 !--------------- 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 71 69 72 70 ! Local 73 71 !------- 74 72 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] 88 82 89 83 ! First calculations: 90 84 !===================== 91 85 92 unsmasse(:, :)=0.93 DO k =1,klev94 masse(:, k)=(plev(:,k)-plev(:,k+1))/RG95 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) 97 91 END DO 98 92 99 tendu(:, :)=0.0100 tendv(:, :)=0.093 tendu(:, :) = 0.0 94 tendv(:, :) = 0.0 101 95 102 96 ! Method 1: Calculation of fluxes using a downward integration 103 97 !============================================================ 104 98 105 106 107 99 ! Flux calculation 108 100 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. 112 104 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 119 110 120 111 ! TKE update: 121 112 122 DO k=2,klev123 tendt(:,k)=-flux_rhotw(:,k)*(exner(:,k)-exner(:,k-1))*unsmasse(:,k)*RCPD124 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 ENDDO127 tendt(:,1)=-flux_rhotw(:,1)*(exner(:,1)-1.)*unsmasse(:,1)*RCPD128 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) 130 121 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 131 132 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 142 142 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 149 144 150 145 END MODULE lmdz_gwd_tendtotke -
LMDZ6/trunk/libf/phylmd/physiq_mod.F90
r6063 r6068 4724 4724 ! 4725 4725 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, & 4727 4727 pctsrf,is_sequential,phys_tstep,cell_area,longitude_deg,latitude_deg,pphis, & 4728 4728 zstd,zpic,zmea,zval,zsig,zgam,zthe,pplay,paprs,presnivs,rain_fall,snow_fall, &
Note: See TracChangeset
for help on using the changeset viewer.
