diff --git a/cam_diagnostics/tropopause_diagnostics.F90 b/cam_diagnostics/tropopause_diagnostics.F90 index 5c750e6c..39a428b7 100644 --- a/cam_diagnostics/tropopause_diagnostics.F90 +++ b/cam_diagnostics/tropopause_diagnostics.F90 @@ -28,38 +28,43 @@ subroutine tropopause_diagnostics_init(errmsg, errflg) errflg = 0 ! Define the output fields. + + ! Primary (Lapse rate) + backup (climatology) method call history_add_field('TROP_P', 'tropopause_air_pressure', horiz_only, 'avg', 'Pa') call history_add_field('TROP_T', 'tropopause_air_temperature', horiz_only, 'avg', 'K' ) - call history_add_field('TROP_Z', 'tropopause_altitude', horiz_only, 'avg', 'm' ) - call history_add_field('TROP_DZ', 'tropopause_altitude_relative', 'lev', 'avg', 'm') - call history_add_field('TROP_PD', 'probability_distribution_of_model_level_number_at_tropopause', 'lev', 'avg', 'probability') + call history_add_field('TROP_Z', 'tropopause_geopotential_height_wrt_surface', horiz_only, 'avg', 'm' ) + call history_add_field('TROP_DZ', 'geopotential_height_difference_between_atmosphere_layer_and_tropopause', 'lev', 'avg', 'm') + call history_add_field('TROP_PD', 'probability_distribution_of_tropopause_vertical_layer_index', 'lev', 'avg', 'probability') call history_add_field('TROP_FD', 'tropopause_found', horiz_only, 'avg', 'probability') - call history_add_field('TROPP_P', 'tropopause_air_pressure_assuming_lapse_rate', horiz_only, 'avg', 'Pa') - call history_add_field('TROPP_T', 'tropopause_air_temperature_assuming_lapse_rate', horiz_only, 'avg', 'K' ) - call history_add_field('TROPP_Z', 'tropopause_altitude_assuming_lapse_rate', horiz_only, 'avg', 'm' ) - call history_add_field('TROPP_DZ', 'tropopause_altitude_relative_assuming_lapse_rate', 'lev', 'avg', 'm') - call history_add_field('TROPP_PD', 'probability_distribution_of_model_level_number_at_tropopause_assuming_lapse_rate', 'lev', 'avg', 'probability') - call history_add_field('TROPP_FD', 'tropopause_found_assuming_lapse_rate', horiz_only, 'avg', 'probability') - - call history_add_field('TROPF_P', 'tropopause_air_pressure_assuming_cold_point', horiz_only, 'avg', 'Pa') - call history_add_field('TROPF_T', 'tropopause_air_temperature_assuming_cold_point', horiz_only, 'avg', 'K' ) - call history_add_field('TROPF_Z', 'tropopause_altitude_assuming_cold_point', horiz_only, 'avg', 'm' ) - call history_add_field('TROPF_DZ', 'tropopause_altitude_relative_assuming_cold_point', 'lev', 'avg', 'm') - call history_add_field('TROPF_PD', 'probability_distribution_of_model_level_number_at_tropopause_assuming_cold_point', 'lev', 'avg', 'probability') - call history_add_field('TROPF_FD', 'tropopause_found_assuming_cold_point', horiz_only, 'avg', 'probability') - - call history_add_field('TROPC_P', 'tropopause_air_pressure_assuming_climatology', horiz_only, 'avg', 'Pa') - call history_add_field('TROPC_T', 'tropopause_air_temperature_assuming_climatology', horiz_only, 'avg', 'K' ) - call history_add_field('TROPC_Z', 'tropopause_altitude_assuming_climatology', horiz_only, 'avg', 'm' ) - call history_add_field('TROPC_DZ', 'tropopause_altitude_relative_assuming_climatology', 'lev', 'avg', 'm') - call history_add_field('TROPC_PD', 'probability_distribution_of_model_level_number_at_tropopause_assuming_climatology', 'lev', 'avg', 'probability') - call history_add_field('TROPC_FD', 'tropopause_found_assuming_cold_point', horiz_only, 'avg', 'probability') + ! Primary (Lapse rate) only + call history_add_field('TROPP_P', 'tropopause_air_pressure_from_lapse_rate_method', horiz_only, 'avg', 'Pa') + call history_add_field('TROPP_T', 'tropopause_air_temperature_from_lapse_rate_method', horiz_only, 'avg', 'K' ) + call history_add_field('TROPP_Z', 'tropopause_geopotential_height_wrt_surface_from_lapse_rate_method', horiz_only, 'avg', 'm' ) + call history_add_field('TROPP_DZ', 'geopotential_height_difference_between_atmosphere_layer_and_tropopause_from_lapse_rate_method', 'lev', 'avg', 'm') + call history_add_field('TROPP_PD', 'probability_distribution_of_tropopause_vertical_layer_index_from_lapse_rate_method', 'lev', 'avg', 'probability') + call history_add_field('TROPP_FD', 'tropopause_found_from_lapse_rate_method', horiz_only, 'avg', 'probability') + + ! Cold point (CPP) only + call history_add_field('TROPF_P', 'tropopause_air_pressure_from_cold_point_method', horiz_only, 'avg', 'Pa') + call history_add_field('TROPF_T', 'tropopause_air_temperature_from_cold_point_method', horiz_only, 'avg', 'K' ) + call history_add_field('TROPF_Z', 'tropopause_geopotential_height_wrt_surface_from_cold_point_method', horiz_only, 'avg', 'm' ) + call history_add_field('TROPF_DZ', 'geopotential_height_difference_between_atmosphere_layer_and_tropopause_from_cold_point_method', 'lev', 'avg', 'm') + call history_add_field('TROPF_PD', 'probability_distribution_of_tropopause_vertical_layer_index_from_cold_point_method', 'lev', 'avg', 'probability') + call history_add_field('TROPF_FD', 'tropopause_found_from_cold_point_method', horiz_only, 'avg', 'probability') + + ! Climatology only - will never fail + call history_add_field('TROPC_P', 'tropopause_air_pressure_from_climatological_method', horiz_only, 'avg', 'Pa') + call history_add_field('TROPC_T', 'tropopause_air_temperature_from_climatological_method', horiz_only, 'avg', 'K' ) + call history_add_field('TROPC_Z', 'tropopause_geopotential_height_wrt_surface_from_climatological_method', horiz_only, 'avg', 'm' ) + call history_add_field('TROPC_DZ', 'geopotential_height_difference_between_atmosphere_layer_and_tropopause_from_climatological_method', 'lev', 'avg', 'm') + call history_add_field('TROPC_PD', 'probability_distribution_of_tropopause_vertical_layer_index_from_climatological_method', 'lev', 'avg', 'probability') + call history_add_field('TROPC_FD', 'tropopause_found_from_climatological_method', horiz_only, 'avg', 'probability') ! Hybridstobie output fields - call history_add_field('hstobie_trop', 'lower_bound_of_model_level_number_for_stratospheric_chemistry', 'lev', 'inst', 'fraction of model time') - call history_add_field('hstobie_linoz', 'lower_bound_of_model_level_number_for_linoz_chemistry', 'lev', 'inst', 'fraction of model time') - call history_add_field('hstobie_tropop', 'model_level_number_at_tropopause_for_chemistry', 'lev', 'inst', 'fraction of model time') + call history_add_field('hstobie_trop', 'vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_stratospheric_chemistry', 'lev', 'inst', 'fraction of model time') + call history_add_field('hstobie_linoz', 'vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_linearized_ozone_chemistry', 'lev', 'inst', 'fraction of model time') + call history_add_field('hstobie_tropop', 'tropopause_vertical_layer_index_from_hybrid_stobie_linoz_with_climatological_backup_method_for_chemistry', 'lev', 'inst', 'fraction of model time') end subroutine tropopause_diagnostics_init diff --git a/cam_diagnostics/tropopause_diagnostics.meta b/cam_diagnostics/tropopause_diagnostics.meta index a400f51c..1472bcca 100644 --- a/cam_diagnostics/tropopause_diagnostics.meta +++ b/cam_diagnostics/tropopause_diagnostics.meta @@ -40,8 +40,8 @@ dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = in [ tropLev ] - standard_name = model_level_number_at_tropopause - units = 1 + standard_name = tropopause_vertical_layer_index + units = index type = integer dimensions = (horizontal_loop_extent) intent = in @@ -58,122 +58,122 @@ dimensions = (horizontal_loop_extent) intent = in [ tropZ ] - standard_name = tropopause_altitude + standard_name = tropopause_geopotential_height_wrt_surface units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropLev_twmo ] - standard_name = model_level_number_at_tropopause_assuming_lapse_rate - units = 1 + standard_name = tropopause_vertical_layer_index_from_lapse_rate_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = in [ tropP_twmo ] - standard_name = tropopause_air_pressure_assuming_lapse_rate + standard_name = tropopause_air_pressure_from_lapse_rate_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropT_twmo ] - standard_name = tropopause_air_temperature_assuming_lapse_rate + standard_name = tropopause_air_temperature_from_lapse_rate_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropZ_twmo ] - standard_name = tropopause_altitude_assuming_lapse_rate + standard_name = tropopause_geopotential_height_wrt_surface_from_lapse_rate_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropLev_clim ] - standard_name = model_level_number_at_tropopause_assuming_climatology - units = 1 + standard_name = tropopause_vertical_layer_index_from_climatological_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = in [ tropP_clim ] - standard_name = tropopause_air_pressure_assuming_climatology + standard_name = tropopause_air_pressure_from_climatological_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropT_clim ] - standard_name = tropopause_air_temperature_assuming_climatology + standard_name = tropopause_air_temperature_from_climatological_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropZ_clim ] - standard_name = tropopause_altitude_assuming_climatology + standard_name = tropopause_geopotential_height_wrt_surface_from_climatological_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropLev_hybstob ] - standard_name = model_level_number_at_tropopause_assuming_hybridstobie_and_climatology - units = 1 + standard_name = tropopause_vertical_layer_index_from_hybrid_stobie_linoz_with_climatological_backup_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = in [ tropP_hybstob ] - standard_name = tropopause_air_pressure_assuming_hybridstobie_and_climatology + standard_name = tropopause_air_pressure_from_hybrid_stobie_linoz_with_climatological_backup_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropT_hybstob ] - standard_name = tropopause_air_temperature_assuming_hybridstobie_and_climatology + standard_name = tropopause_air_temperature_from_hybrid_stobie_linoz_with_climatological_backup_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropZ_hybstob ] - standard_name = tropopause_altitude_assuming_hybridstobie_and_climatology + standard_name = tropopause_geopotential_height_wrt_surface_from_hybrid_stobie_linoz_with_climatological_backup_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropLev_cpp ] - standard_name = model_level_number_at_tropopause_assuming_cold_point - units = 1 + standard_name = tropopause_vertical_layer_index_from_cold_point_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = in [ tropP_cpp ] - standard_name = tropopause_air_pressure_assuming_cold_point + standard_name = tropopause_air_pressure_from_cold_point_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropT_cpp ] - standard_name = tropopause_air_temperature_assuming_cold_point + standard_name = tropopause_air_temperature_from_cold_point_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ tropZ_cpp ] - standard_name = tropopause_altitude_assuming_cold_point + standard_name = tropopause_geopotential_height_wrt_surface_from_cold_point_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = in [ hstobie_trop ] - standard_name = lower_bound_of_model_level_number_for_stratospheric_chemistry - units = 1 + standard_name = vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_stratospheric_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = in [ hstobie_linoz ] - standard_name = lower_bound_of_model_level_number_for_linoz_chemistry - units = 1 + standard_name = vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_linearized_ozone_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = in [ hstobie_tropop ] - standard_name = model_level_number_at_tropopause_for_chemistry - units = 1 + standard_name = tropopause_vertical_layer_index_from_hybrid_stobie_linoz_with_climatological_backup_method_for_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = in diff --git a/doc/ChangeLog b/doc/ChangeLog index 5ad154a9..b5219f3f 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -4,7 +4,7 @@ Tag name: Originator(s): jimmielin Date: August 22, 2024 One-line Summary: tropopause_find CCPP-ization -Github PR URL: +Github PR URL: https://github.com/ESCOMP/atmospheric_physics/pull/112 This PR fixes the following NCAR/atmospheric_physics Github issues: - Creates the CCPP interface for the tropopause_find routine @@ -37,8 +37,7 @@ M doc/NamesNotInDictionary.txt List and Describe any test failures: N/A -Summarize any changes to answers: -Difference in +Summarize any changes to answers: none =============================================================== diff --git a/suite_cam7.xml b/suite_cam7.xml index 1cb64eb3..5fea991f 100644 --- a/suite_cam7.xml +++ b/suite_cam7.xml @@ -9,4 +9,11 @@ qneg geopotential_temp + + + + + tropopause_find + tropopause_diagnostics + diff --git a/tropopause_find/tropopause_find.F90 b/tropopause_find/tropopause_find.F90 index 3a7189f7..aa0a32da 100644 --- a/tropopause_find/tropopause_find.F90 +++ b/tropopause_find/tropopause_find.F90 @@ -5,12 +5,6 @@ ! when the original algorithm fails. The tropopause temperature and ! pressure are determined and can be output to the history file. ! -! These routines are based upon code in the WACCM chemistry module -! including mo_tropoause.F90 and llnl_set_chem_trop.F90. The code -! for the Reichler et al. [2003] algorithm is from: -! -! http://www.gfdl.noaa.gov/~tjr/TROPO/tropocode.htm -! ! Author: Charles Bardeen ! Created: April, 2009 ! @@ -42,10 +36,10 @@ module tropopause_find save - ! These parameters define and enumeration to be used to define the primary + ! These parameters define an enumeration to be used to define the primary ! and backup algorithms to be used with the tropopause_find() method. The ! backup algorithm is meant to provide a solution when the primary algorithm - ! fail. The algorithms that can't fail are: TROP_ALG_ANALYTIC, TROP_ALG_CLIMATE + ! fails. The algorithms that can't fail are: TROP_ALG_ANALYTIC, TROP_ALG_CLIMATE ! and TROP_ALG_STOBIE. integer, parameter :: TROP_ALG_NONE = 1 ! Don't evaluate integer, parameter :: TROP_ALG_ANALYTIC = 2 ! Analytic Expression @@ -91,10 +85,6 @@ module tropopause_find contains !================================================================================================ - ! This routine is called during intialization and must be called before the - ! other methods in this module can be used. Its main tasks are to read in the - ! climatology from a file and to define the output fields. Much of this code - ! is taken from mo_tropopause. !> \section arg_table_tropopause_find_init Argument Table !! \htmlinclude tropopause_find_init.html subroutine tropopause_find_init(cappa, rair, gravit, pi, errmsg, errflg) @@ -131,7 +121,7 @@ subroutine tropopause_find_run(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & tropLev, tropP, tropT, tropZ, & ! Default primary+backup (twmo+climate) tropLev_twmo, tropP_twmo, tropT_twmo, tropZ_twmo, & ! Primary only (twmo) tropLev_clim, tropP_clim, tropT_clim, tropZ_clim, & ! Climate-only - tropLev_hybstob, tropP_hybstob, tropT_hybstob, tropZ_hybstob, & ! Hybridstobie + climate backup + tropLev_hybstob, tropP_hybstob, tropT_hybstob, tropZ_hybstob, & ! Hybridstobie + climate backup tropLev_cpp, tropP_cpp, tropT_cpp, tropZ_cpp, & ! Cold point only tropLev_chem, tropP_chem, tropT_chem, tropZ_chem, & ! Chemical tropopause only hstobie_trop, hstobie_linoz, hstobie_tropop, & ! Hybridstobie only for chemistry diagnostics @@ -140,14 +130,14 @@ subroutine tropopause_find_run(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) - real(kind_phys), intent(in) :: calday ! Day of year including fraction from get_curr_calday + real(kind_phys), intent(in) :: calday ! Day of year including fraction of day ! Climatological tropopause pressures (Pa), (pcols,ntimes=12). ! Remark: Not chunkized, subsetted to chunk for backwards compatibility with CAM @@ -362,14 +352,14 @@ subroutine tropopause_findWithBackup(ncol, pver, lat, pint, pmid, t, zi, zm, phi integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) - real(kind_phys), intent(in) :: calday ! Day of year including fraction from get_curr_calday + real(kind_phys), intent(in) :: calday ! Day of year including fraction of day ! Climatological tropopause pressures (Pa), (pcols,ntimes=12). ! Remark: Not chunkized, subsetted to chunk for backwards compatibility with CAM @@ -420,7 +410,6 @@ subroutine tropopause_findWithBackup(ncol, pver, lat, pint, pmid, t, zi, zm, phi errmsg=errmsg, errflg=errflg) end if - return end subroutine tropopause_findWithBackup ! Call the appropriate tropopause detection routine based upon the algorithm @@ -437,14 +426,14 @@ subroutine tropopause_findUsing(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) - real(kind_phys), intent(in) :: calday ! Day of year including fraction from get_curr_calday + real(kind_phys), intent(in) :: calday ! Day of year including fraction of day ! Climatological tropopause pressures (Pa), (pcols,ntimes=12). ! Remark: Not chunkized, subsetted to chunk for backwards compatibility with CAM @@ -512,7 +501,6 @@ subroutine tropopause_findUsing(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & write(errmsg,*) 'tropopause: Invalid detection algorithm (', algorithm, ') specified.' end select - return end subroutine tropopause_findUsing ! This analytic expression closely matches the mean tropopause determined @@ -523,11 +511,11 @@ subroutine tropopause_analytic(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(inout) :: tropLev(:) ! tropopause level index real(kind_phys), optional, intent(inout) :: tropP(:) ! tropopause pressure (Pa) @@ -568,13 +556,11 @@ subroutine tropopause_analytic(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end if end if end do + end subroutine tropopause_analytic ! Read the tropopause pressure in from a file containging a climatology. The ! data is interpolated to the current dat of year and latitude. - ! - ! NOTE: The data is read in during tropopause_init and stored in the module - ! variable trop subroutine tropopause_climate(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & calday, tropp_p_loc, tropp_days, tropLev, tropP, tropT, tropZ) @@ -584,11 +570,11 @@ subroutine tropopause_climate(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) - real(kind_phys), intent(in) :: calday ! Day of year including fraction from get_curr_calday + real(kind_phys), intent(in) :: calday ! Day of year including fraction of day ! Climatological tropopause pressures (Pa), (pcols,ntimes=12). ! Remark: Not chunkized, subsetted to chunk for backwards compatibility with CAM @@ -674,7 +660,6 @@ subroutine tropopause_climate(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end do end if - return end subroutine tropopause_climate !----------------------------------------------------------------------- @@ -682,7 +667,6 @@ end subroutine tropopause_climate subroutine tropopause_hybridstobie(ncol, pver, pmid, t, zm, & tropLev, tropP, tropT, tropZ, & hstobie_trop, hstobie_linoz, hstobie_tropop) - !use cam_history, only : outfld !----------------------------------------------------------------------- ! Originally written by Philip Cameron-Smith, LLNL @@ -700,7 +684,7 @@ subroutine tropopause_hybridstobie(ncol, pver, pmid, t, zm, & integer, intent(in) :: pver ! Number of vertical levelserp real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) integer, intent(inout) :: tropLev(:) ! tropopause level index real(kind_phys), optional, intent(inout) :: tropP(:) ! tropopause pressure (Pa) @@ -787,10 +771,6 @@ subroutine tropopause_hybridstobie(ncol, pver, pmid, t, zm, & hstobie_tropop(:,:) = trop_trop_output(:,:) endif - !call outfld( 'hstobie_trop', trop_output(:ncol,:), ncol, pstate%lchnk ) - !call outfld( 'hstobie_linoz', trop_linoz_output(:ncol,:), ncol, pstate%lchnk ) - !call outfld( 'hstobie_tropop', trop_trop_output(:ncol,:), ncol, pstate%lchnk ) - end subroutine tropopause_hybridstobie ! This routine originates with Stobie at NASA Goddard, but does not have a @@ -802,11 +782,11 @@ subroutine tropopause_stobie(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(inout) :: tropLev(:) ! tropopause level index @@ -867,8 +847,7 @@ subroutine tropopause_stobie(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end if end if end do - - return + end subroutine tropopause_stobie @@ -892,7 +871,9 @@ end subroutine tropopause_stobie ! ! determination of tropopause height from gridded temperature data ! - ! reference: Reichler, T., M. Dameris, and R. Sausen (2003) + ! Reichler, T., M. Dameris, and R. Sausen (2003), + ! Determining the tropopause height from gridded data, + ! Geophys. Res. Lett., 30, 2042, doi:10.1029/2003GL018240, 20. ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine twmo(t, p, plimu, pliml, gam, trp) @@ -999,11 +980,11 @@ subroutine tropopause_twmo(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(inout) :: tropLev(:) ! tropopause level index real(kind_phys), optional, intent(inout) :: tropP(:) ! tropopause pressure (Pa) @@ -1053,28 +1034,27 @@ subroutine tropopause_twmo(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end if end do - return end subroutine tropopause_twmo ! This routine implements the WMO definition of the tropopause (WMO, 1957; Seidel and Randel, 2006). + ! Seidel, D. J., and W. J. Randel (2006), + ! Variability and trends in the global tropopause estimated from radiosonde data, + ! J. Geophys. Res., 111, D21101, doi:10.1029/2006JD007363. + ! ! This requires that the lapse rate be less than 2 K/km for an altitude range ! of 2 km. The search starts at the surface and stops the first time this ! criteria is met. - ! - ! NOTE: This code was modeled after the code in mo_tropopause; however, the - ! requirement that dt be greater than 0 was removed and the check to make - ! sure that the lapse rate is maintained for 2 km was added. subroutine tropopause_wmo(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & tropLev, tropP, tropT, tropZ) integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(inout) :: tropLev(:) ! tropopause level index @@ -1152,7 +1132,6 @@ subroutine tropopause_wmo(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end if end do - return end subroutine tropopause_wmo @@ -1165,11 +1144,11 @@ subroutine tropopause_cpp(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(inout) :: tropLev(:) ! tropopause level index real(kind_phys), optional, intent(inout) :: tropP(:) ! tropopause pressure (Pa) @@ -1275,7 +1254,6 @@ subroutine tropopause_cpp(ncol, pver, lat, pint, pmid, t, zi, zm, phis, & end if end do - return end subroutine tropopause_cpp ! Searches all the columns in the chunk and attempts to identify the "chemical" @@ -1297,17 +1275,16 @@ subroutine tropopause_findChemTrop(ncol, pver, lat, pint, pmid, t, zi, zm, phis, integer, intent(in) :: ncol ! Number of atmospheric columns integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: lat(:) ! Latitudes (radians) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) real(kind_phys), intent(in) :: t(:,:) ! Temperature (K) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) - real(kind_phys), intent(in) :: calday ! Day of year including fraction from get_curr_calday + real(kind_phys), intent(in) :: calday ! Day of year including fraction of day ! Climatological tropopause pressures (Pa), (pcols,ntimes=12). - ! Remark: Not chunkized, subsetted to chunk for backwards compatibility with CAM real(kind_phys), intent(in) :: tropp_p_loc(:,:) real(kind_phys), intent(in) :: tropp_days(:) ! Day-of-year for climo data, 12 @@ -1355,7 +1332,6 @@ subroutine tropopause_findChemTrop(ncol, pver, lat, pint, pmid, t, zi, zm, phis, errmsg=errmsg, errflg=errflg) end if - return end subroutine tropopause_findChemTrop ! This routine interpolates the pressures in the physics state to @@ -1366,7 +1342,7 @@ function tropopause_interpolateP(pver, pmid, zm, icol, tropLev, tropZ) integer, intent(in) :: pver ! Number of vertical levels real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) integer, intent(in) :: icol ! column being processed integer, intent(in) :: tropLev ! tropopause level index real(kind_phys), optional, intent(in) :: tropZ ! tropopause pressure (m) @@ -1454,10 +1430,10 @@ end function tropopause_interpolateT ! find the geopotential height at the specified tropopause pressure. function tropopause_interpolateZ(pint, pmid, zi, zm, phis, icol, tropLev, tropP) - real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa), pverp + real(kind_phys), intent(in) :: pint(:,:) ! Interface pressures (Pa) real(kind_phys), intent(in) :: pmid(:,:) ! Midpoint pressures (Pa) - real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m), pverp - real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m), pver + real(kind_phys), intent(in) :: zi(:,:) ! Geopotential height above surface at interfaces (m) + real(kind_phys), intent(in) :: zm(:,:) ! Geopotential height above surface at midpoints (m) real(kind_phys), intent(in) :: phis(:) ! Surface geopotential (m2 s-2) integer, intent(in) :: icol ! column being processed integer, intent(in) :: tropLev ! tropopause level index diff --git a/tropopause_find/tropopause_find.meta b/tropopause_find/tropopause_find.meta index 09342c86..91fb2dea 100644 --- a/tropopause_find/tropopause_find.meta +++ b/tropopause_find/tropopause_find.meta @@ -118,8 +118,8 @@ dimensions = (number_of_months_in_year) intent = in [ tropLev ] - standard_name = model_level_number_at_tropopause - units = 1 + standard_name = tropopause_vertical_layer_index + units = index type = integer dimensions = (horizontal_loop_extent) intent = out @@ -136,146 +136,146 @@ dimensions = (horizontal_loop_extent) intent = out [ tropZ ] - standard_name = tropopause_altitude + standard_name = tropopause_geopotential_height_wrt_surface units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropLev_twmo ] - standard_name = model_level_number_at_tropopause_assuming_lapse_rate - units = 1 + standard_name = tropopause_vertical_layer_index_from_lapse_rate_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = out [ tropP_twmo ] - standard_name = tropopause_air_pressure_assuming_lapse_rate + standard_name = tropopause_air_pressure_from_lapse_rate_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropT_twmo ] - standard_name = tropopause_air_temperature_assuming_lapse_rate + standard_name = tropopause_air_temperature_from_lapse_rate_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropZ_twmo ] - standard_name = tropopause_altitude_assuming_lapse_rate + standard_name = tropopause_geopotential_height_wrt_surface_from_lapse_rate_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropLev_clim ] - standard_name = model_level_number_at_tropopause_assuming_climatology - units = 1 + standard_name = tropopause_vertical_layer_index_from_climatological_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = out [ tropP_clim ] - standard_name = tropopause_air_pressure_assuming_climatology + standard_name = tropopause_air_pressure_from_climatological_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropT_clim ] - standard_name = tropopause_air_temperature_assuming_climatology + standard_name = tropopause_air_temperature_from_climatological_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropZ_clim ] - standard_name = tropopause_altitude_assuming_climatology + standard_name = tropopause_geopotential_height_wrt_surface_from_climatological_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropLev_hybstob ] - standard_name = model_level_number_at_tropopause_assuming_hybridstobie_and_climatology - units = 1 + standard_name = tropopause_vertical_layer_index_from_hybrid_stobie_linoz_with_climatological_backup_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = out [ tropP_hybstob ] - standard_name = tropopause_air_pressure_assuming_hybridstobie_and_climatology + standard_name = tropopause_air_pressure_from_hybrid_stobie_linoz_with_climatological_backup_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropT_hybstob ] - standard_name = tropopause_air_temperature_assuming_hybridstobie_and_climatology + standard_name = tropopause_air_temperature_from_hybrid_stobie_linoz_with_climatological_backup_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropZ_hybstob ] - standard_name = tropopause_altitude_assuming_hybridstobie_and_climatology + standard_name = tropopause_geopotential_height_wrt_surface_from_hybrid_stobie_linoz_with_climatological_backup_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropLev_cpp ] - standard_name = model_level_number_at_tropopause_assuming_cold_point - units = 1 + standard_name = tropopause_vertical_layer_index_from_cold_point_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = out [ tropP_cpp ] - standard_name = tropopause_air_pressure_assuming_cold_point + standard_name = tropopause_air_pressure_from_cold_point_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropT_cpp ] - standard_name = tropopause_air_temperature_assuming_cold_point + standard_name = tropopause_air_temperature_from_cold_point_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropZ_cpp ] - standard_name = tropopause_altitude_assuming_cold_point + standard_name = tropopause_geopotential_height_wrt_surface_from_cold_point_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropLev_chem ] - standard_name = model_level_number_at_tropopause_assuming_chemical - units = 1 + standard_name = tropopause_vertical_layer_index_from_chemical_method + units = index type = integer dimensions = (horizontal_loop_extent) intent = out [ tropP_chem ] - standard_name = tropopause_air_pressure_assuming_chemical + standard_name = tropopause_air_pressure_from_chemical_method units = Pa type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropT_chem ] - standard_name = tropopause_air_temperature_assuming_chemical + standard_name = tropopause_air_temperature_from_chemical_method units = K type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ tropZ_chem ] - standard_name = tropopause_altitude_assuming_chemical + standard_name = tropopause_geopotential_height_wrt_surface_from_chemical_method units = m type = real | kind = kind_phys dimensions = (horizontal_loop_extent) intent = out [ hstobie_trop ] - standard_name = lower_bound_of_model_level_number_for_stratospheric_chemistry - units = 1 + standard_name = vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_stratospheric_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = out [ hstobie_linoz ] - standard_name = lower_bound_of_model_level_number_for_linoz_chemistry - units = 1 + standard_name = vertical_layer_index_lower_bound_from_hybrid_stobie_linoz_with_climatological_backup_method_for_linearized_ozone_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = out [ hstobie_tropop ] - standard_name = model_level_number_at_tropopause_for_chemistry - units = 1 + standard_name = tropopause_vertical_layer_index_from_hybrid_stobie_linoz_with_climatological_backup_method_for_chemistry + units = index type = real | kind = kind_phys dimensions = (horizontal_loop_extent, vertical_layer_dimension) intent = out