Browse Source

Use MOM transfer coefficients for momentum flux

experiments/tc-mom
Sven Karsten 1 year ago
parent
commit
bd6530158f
  1. 11
      src/flux_calculator_calculate.F90
  2. 16
      src/flux_calculator_prepare.F90
  3. 3
      src/flux_lib/flux_library.F90
  4. 33
      src/flux_lib/momentum/flux_momentum.F90

11
src/flux_calculator_calculate.F90

@ -190,6 +190,17 @@ MODULE flux_calculator_calculate
local_field(i,which_grid)%var(idx_UATM)%field(j), &
local_field(i,which_grid)%var(idx_VATM)%field(j))
ENDDO
ELSEIF (trim(method)=='MOM5') THEN
DO j=1,grid_size(which_grid)
CALL flux_momentum_mom5(local_field(i,which_grid)%var(idx_UMOM)%field(j), &
dummy, &
local_field(i,which_grid)%var(idx_CMOM)%field(j), &
local_field(i,which_grid)%var(idx_PSUR)%field(j), &
local_field(i,which_grid)%var(idx_QSUR)%field(j), &
local_field(i,which_grid)%var(idx_TSUR)%field(j), &
local_field(i,which_grid)%var(idx_UATM)%field(j), &
local_field(i,which_grid)%var(idx_VATM)%field(j))
ENDDO
ENDIF
ENDIF
ENDDO

16
src/flux_calculator_prepare.F90

@ -195,6 +195,13 @@ MODULE flux_calculator_prepare
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'
ELSEIF (trim(method)=='MOM5') THEN
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_AMOM)%field )) missing_field=trim(missing_field)//' CMOM'
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'
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. "
@ -225,7 +232,14 @@ MODULE flux_calculator_prepare
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)//' VATM'
ELSE
ELSEIF (trim(method)=='MOM5') THEN
IF (.NOT. ASSOCIATED( local_field(surface_type,which_grid)%var(idx_AMOM)%field )) missing_field=trim(missing_field)//' CMOM'
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)//' 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. "
CALL mpi_finalize(1)

3
src/flux_lib/flux_library.F90

@ -24,7 +24,7 @@ module flux_library
use flux_radiation_blackbody, only: flux_radiation_blackbody_StBo
use distribute_radiation_flux_mod, only: distribute_radiation_flux
! momentum fluxes
use flux_momentum, only: flux_momentum_cclm
use flux_momentum, only: flux_momentum_cclm, flux_momentum_mom5
implicit none ; private
@ -35,6 +35,7 @@ module flux_library
public flux_mass_evap_cclm
public flux_mass_evap_mom5
public flux_momentum_cclm
public flux_momentum_mom5
public flux_radiation_blackbody_StBo
public distribute_radiation_flux
public spec_vapor_surface_cclm

33
src/flux_lib/momentum/flux_momentum.F90

@ -14,6 +14,7 @@ module flux_momentum
! expose all functions
public flux_momentum_cclm
public flux_momentum_mom5
contains
@ -73,4 +74,36 @@ contains
end subroutine flux_momentum_cclm
subroutine flux_momentum_mom5( &
flux_momentum_east, & ! RESULT (N/m2)
flux_momentum_north, & ! RESULT (N/m2)
diffusion_coefficient_momentum, & ! a_{momentum} (1)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_surface, & ! q_{v,s} (kg/kg)
temperature_surface, & ! T_s (K)
u_atmos, & ! u_a (m/s)
v_atmos & ! v_a (m/s)
)
real(prec), intent(out) :: flux_momentum_east ! RESULT (N/m2)
real(prec), intent(out) :: flux_momentum_north ! RESULT (N/m2)
real(prec), intent(in) :: diffusion_coefficient_momentum ! a_{momentum} (1)
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_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_momentum_cclm(flux_momentum_east, & ! RESULT (N/m2)
flux_momentum_north, & ! RESULT (N/m2)
diffusion_coefficient_momentum, & ! a_{momentum} (1)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_surface, & ! q_{v,s} (kg/kg)
temperature_surface, & ! T_s (K)
u_atmos, & ! u_a (m/s)
v_atmos & ! v_a (m/s)
)
end subroutine flux_momentum_mom5
end module flux_momentum
Loading…
Cancel
Save