Changeset 5551 for LMDZ6/branches/contrails/libf/phylmd/lmdz_aviation.f90
- Timestamp:
- Feb 19, 2025, 5:40:06 PM (3 days ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/contrails/libf/phylmd/lmdz_aviation.f90
r5549 r5551 8 8 9 9 SUBROUTINE aviation_water_emissions( & 10 klon, klev, dtime, p aprs, pplay, temp, qtot, cell_area, &10 klon, klev, dtime, pplay, temp, qtot, & 11 11 flight_h2o, d_q_avi & 12 12 ) 13 13 14 USE lmdz_lscp_ini, ONLY: RD , RG14 USE lmdz_lscp_ini, ONLY: RD 15 15 16 16 IMPLICIT NONE … … 18 18 INTEGER, INTENT(IN) :: klon, klev ! number of horizontal grid points and vertical levels 19 19 REAL, INTENT(IN) :: dtime ! time step [s] 20 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs ! inter-layer pressure [Pa]21 20 REAL, DIMENSION(klon,klev), INTENT(IN) :: pplay ! mid-layer pressure [Pa] 22 21 REAL, DIMENSION(klon,klev), INTENT(IN) :: temp ! temperature (K) 23 22 REAL, DIMENSION(klon,klev), INTENT(IN) :: qtot ! total specific humidity (in vapor phase) [kg/kg] 24 REAL, DIMENSION(klon), INTENT(IN) :: cell_area ! area of each cell [m2] 25 REAL, DIMENSION(klon,klev), INTENT(IN) :: flight_h2o ! aviation H2O emitted within the mesh [kgH2O/s/mesh] 23 REAL, DIMENSION(klon,klev), INTENT(IN) :: flight_h2o ! aviation emitted H2O concentration [kgH2O/s/m3] 26 24 REAL, DIMENSION(klon,klev), INTENT(OUT) :: d_q_avi ! water vapor tendency from aviation [kg/kg] 27 25 ! Local 28 26 INTEGER :: i, k 29 REAL :: rho , rhodz, dz, M_cell27 REAL :: rho 30 28 31 29 DO i=1, klon … … 34 32 rho = pplay(i,k) / temp(i,k) / RD 35 33 !--Dry air mass [kg/m2] 36 rhodz = ( paprs(i,k) - paprs(i,k+1) ) / RG34 !rhodz = ( paprs(i,k) - paprs(i,k+1) ) / RG 37 35 !--Cell thickness [m] 38 dz = rhodz / rho36 !dz = rhodz / rho 39 37 !--Cell dry air mass [kg] 40 M_cell = rhodz * cell_area(i)38 !M_cell = rhodz * cell_area(i) 41 39 42 40 !--q is the specific humidity (kg/kg humid air) hence the complicated equation to update q … … 44 42 ! = ( m_dry_air * qold + dm_h2O * (1-qold) ) / (m_dry_air + dm_H2O * (1-qold) ) 45 43 !--The equation is derived by writing m_humid_air = m_dry_air + m_H2O = m_dry_air / (1-q) 46 !--flight_h2O is in kg H2O / s / m esh44 !--flight_h2O is in kg H2O / s / m3 47 45 48 !d_q_avi(i,k) = ( M_cell * qtot(i,k) + flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 49 ! / ( M_cell + flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 46 !d_q_avi(i,k) = ( M_cell * qtot(i,k) + V_cell * flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 47 ! / ( M_cell + V_cell * flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 48 ! - qtot(i,k) 49 !--NB., M_cell = V_cell * rho 50 !d_q_avi(i,k) = ( rho * qtot(i,k) + flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 51 ! / ( rho + flight_h2o(i,k) * dtime * ( 1. - qtot(i,k) ) ) & 50 52 ! - qtot(i,k) 51 53 !--Same formula, more computationally effective but less readable 52 54 d_q_avi(i,k) = flight_h2o(i,k) * ( 1. - qtot(i,k) ) & 53 / ( M_cell/ dtime / ( 1. - qtot(i,k) ) + flight_h2o(i,k) )55 / ( rho / dtime / ( 1. - qtot(i,k) ) + flight_h2o(i,k) ) 54 56 ENDDO 55 57 ENDDO … … 61 63 SUBROUTINE contrails_formation_evolution( & 62 64 dtime, pplay, temp, qsat, qsatl, gamma_cond, rcont_seri, flight_dist, & 63 cldfra, qvc, dz, V_cell,pdf_loc, pdf_scale, pdf_alpha, &65 cldfra, qvc, dz, pdf_loc, pdf_scale, pdf_alpha, & 64 66 Tcritcont, qcritcont, potcontfraP, potcontfraNP, contfra, & 65 67 dcontfra_cir, dcf_avi, dqvc_avi, dqi_avi & … … 85 87 REAL, INTENT(IN) :: gamma_cond ! condensation threshold w.r.t. qsat [-] 86 88 REAL, INTENT(IN) :: rcont_seri ! ratio of contrails fraction to total cloud fraction [-] 87 REAL, INTENT(IN) :: flight_dist ! aviation distance flown within the mesh [m/s/mesh]89 REAL, INTENT(IN) :: flight_dist ! aviation distance flown concentration [m/s/m3] 88 90 REAL, INTENT(IN) :: cldfra ! cloud fraction [-] 89 91 REAL, INTENT(IN) :: qvc ! gridbox-mean vapor in the cloud [kg/kg] 90 92 REAL, INTENT(IN) :: dz ! cell width [m] 91 REAL, INTENT(IN) :: V_cell ! cell volume [m3]92 93 REAL, INTENT(IN) :: pdf_loc ! location parameter of the clear sky PDF [%] 93 94 REAL, INTENT(IN) :: pdf_scale ! scale parameter of the clear sky PDF [%] … … 197 198 IF ( potcontfraP .GT. eps ) THEN 198 199 contrail_cross_section = CONTRAIL_CROSS_SECTION_ONERA(dz) 199 contfra_new = MIN(1., flight_dist * dtime * contrail_cross_section / V_cell)200 contfra_new = MIN(1., flight_dist * dtime * contrail_cross_section) 200 201 dcf_avi = potcontfraP * contfra_new 201 202 IF ( cldfra .GT. eps ) THEN … … 634 635 635 636 INTEGER, INTENT(IN) :: klon, klev ! number of horizontal grid points and vertical levels 636 REAL, DIMENSION(klon,klev), INTENT(OUT) :: flight_dist ! Aviation distance flown within the mesh [m/s/mesh]637 REAL, DIMENSION(klon,klev), INTENT(OUT) :: flight_h2o ! Aviation H2O emitted within the mesh [kgH2O/s/mesh]637 REAL, DIMENSION(klon,klev), INTENT(OUT) :: flight_dist ! Aviation distance flown concentration [m/s/m3] 638 REAL, DIMENSION(klon,klev), INTENT(OUT) :: flight_h2o ! Aviation emitted H2O [kgH2O/s/m3] 638 639 639 640 !---------------------------------------------------- … … 650 651 IF (is_omp_master) CALL xios_recv_field("KMFLOWN_interp", flight_dist_mpi(:,:,1)) 651 652 652 ! Propagate to other OMP threads: flight_dist_mpi(klon_mpi,klev) to flight_dist(klon,klev)653 ! (klon_mpi,klon) = (200,50) avec 80 MPI, 4 OMP, nbp40654 CALL scatter_omp(flight_dist_mpi(:,:,1), flight_dist)653 ! Propagate to other OMP threads: flight_dist_mpi(klon_mpi,klev) to flight_dist(klon,klev) 654 ! (klon_mpi,klon) = (200,50) avec 80 MPI, 4 OMP, nbp40 655 CALL scatter_omp(flight_dist_mpi(:,:,1), flight_dist) 655 656 656 657 END SUBROUTINE read_aviation_emissions
Note: See TracChangeset
for help on using the changeset viewer.