Browse Source

Use MOM transfer coefficients for sensible heat

experiments/tc-mom
Sven Karsten 1 year ago
parent
commit
efed16a017
  1. 12
      src/flux_calculator_calculate.F90
  2. 9
      src/flux_calculator_prepare.F90
  3. 3
      src/flux_lib/flux_library.F90
  4. 37
      src/flux_lib/heat/flux_heat_sensible.F90

12
src/flux_calculator_calculate.F90

@ -153,6 +153,18 @@ MODULE flux_calculator_calculate
local_field(i,1)%var(idx_UATM)%field(j), &
local_field(i,1)%var(idx_VATM)%field(j))
ENDDO
ELSEIF (trim(method)=='MOM5') THEN
DO j=1,grid_size(1)
CALL flux_heat_sensible_mom5(local_field(i,1)%var(idx_HSEN)%field(j), &
local_field(i,1)%var(idx_CHEA)%field(j), &
local_field(i,1)%var(idx_PATM)%field(j), &
local_field(i,1)%var(idx_PSUR)%field(j), &
local_field(i,1)%var(idx_QATM)%field(j), &
local_field(i,1)%var(idx_TATM)%field(j), &
local_field(i,1)%var(idx_TSUR)%field(j), &
local_field(i,1)%var(idx_UATM)%field(j), &
local_field(i,1)%var(idx_VATM)%field(j))
ENDDO
ENDIF
ENDIF
ENDDO

9
src/flux_calculator_prepare.F90

@ -163,6 +163,15 @@ MODULE flux_calculator_prepare
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_TATM)%field )) missing_field=trim(missing_field)//' TSUR'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_UATM)%field )) missing_field=trim(missing_field)//' UATM'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_VATM)%field )) missing_field=trim(missing_field)//' VATM'
ELSEIF (trim(method)=='MOM5') THEN
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_AMOI)%field )) missing_field=trim(missing_field)//' CHEA'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_PATM)%field )) missing_field=trim(missing_field)//' PATM'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_PSUR)%field )) missing_field=trim(missing_field)//' PSUR'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_QSUR)%field )) missing_field=trim(missing_field)//' QSUR'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_TATM)%field )) missing_field=trim(missing_field)//' TATM'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_TATM)%field )) missing_field=trim(missing_field)//' TSUR'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_UATM)%field )) missing_field=trim(missing_field)//' UATM'
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_VATM)%field )) missing_field=trim(missing_field)//' VATM'
ELSE
WRITE (w_unit,*) "Error calculating ",myvarname," for surface_type ",surface_type," on the grid ",grid_name(which_grid),":"
WRITE (w_unit,*) " Method ",method," is not known. "

3
src/flux_lib/flux_library.F90

@ -19,7 +19,7 @@ module flux_library
use flux_mass_evap, only: flux_mass_evap_cclm, flux_mass_evap_mom5
! heat fluxes
use flux_heat_latent, only: flux_heat_latent_ice, flux_heat_latent_water
use flux_heat_sensible, only: flux_heat_sensible_cclm
use flux_heat_sensible, only: flux_heat_sensible_cclm, flux_heat_sensible_mom5
! radiation fluxes
use flux_radiation_blackbody, only: flux_radiation_blackbody_StBo
use distribute_radiation_flux_mod, only: distribute_radiation_flux
@ -32,6 +32,7 @@ module flux_library
public flux_heat_latent_ice
public flux_heat_latent_water
public flux_heat_sensible_cclm
public flux_heat_sensible_mom5
public flux_mass_evap_cclm
public flux_mass_evap_mom5
public flux_momentum_cclm

37
src/flux_lib/heat/flux_heat_sensible.F90

@ -16,6 +16,7 @@ module flux_heat_sensible
! expose all functions
public flux_heat_sensible_cclm
public flux_heat_sensible_mom5
contains
@ -95,6 +96,42 @@ contains
flux_heat_sensible = flux_air * heat_capacity_air * & ! sensible heat flux (W/m2)
(temperature_surface - temperature_atmos * EF)
end subroutine flux_heat_sensible_cclm
subroutine flux_heat_sensible_mom5( &
flux_heat_sensible, & ! RESULT (W/m2)
diffusion_coefficient_moisture, & ! a_{moisture} (1)
pressure_atmos, & ! p_a (Pa)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_surface, & ! q_{v,s} (kg/kg)
temperature_atmos, & ! T_a (K)
temperature_surface, & ! T_s (K)
u_atmos, & ! u_a (m/s)
v_atmos & ! v_a (m/s)
)
real(prec), intent(out) :: flux_heat_sensible ! RESULT (W/m2)
real(prec), intent(in) :: diffusion_coefficient_moisture ! a_{moisture} (1)
real(prec), intent(in) :: pressure_atmos ! p_a (Pa)
real(prec), intent(in) :: pressure_surface ! p_s (Pa)
real(prec), intent(in) :: specific_vapor_content_surface ! q_{v,s} (kg/kg)
real(prec), intent(in) :: temperature_atmos ! T_a (K)
real(prec), intent(in) :: temperature_surface ! T_s (K)
real(prec), intent(in) :: u_atmos ! u_a (m/s)
real(prec), intent(in) :: v_atmos ! v_a (m/s)
call flux_heat_sensible_cclm(flux_heat_sensible, & ! RESULT (W/m2)
diffusion_coefficient_moisture, & ! a_{moisture} (1)
pressure_atmos, & ! p_a (Pa)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_surface, & ! q_{v,s} (kg/kg)
temperature_atmos, & ! T_a (K)
temperature_surface, & ! T_s (K)
u_atmos, & ! u_a (m/s)
v_atmos & ! v_a (m/s)
)
end subroutine flux_heat_sensible_mom5
end module flux_heat_sensible

Loading…
Cancel
Save