Browse Source

First attempt to use MOM transfer coefficients

experiments/tc-mom
Sven Karsten 1 year ago
parent
commit
7b124f329f
  1. 9
      src/flux_calculator_basic.F90
  2. 11
      src/flux_calculator_calculate.F90
  3. 8
      src/flux_calculator_prepare.F90
  4. 3
      src/flux_lib/flux_library.F90
  5. 34
      src/flux_lib/mass/flux_mass_evap.F90

9
src/flux_calculator_basic.F90

@ -39,10 +39,11 @@ MODULE flux_calculator_basic
! (3) declare idx_varname !
! (4) add a line in init_varname_idx !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
INTEGER, PARAMETER :: MAX_VARNAMES = 32
INTEGER, PARAMETER :: MAX_VARNAMES = 35
CHARACTER(len=4), PARAMETER, DIMENSION(MAX_VARNAMES) :: varnames = [ &
'ALBE', 'ALBA', 'AMOI', 'AMOM', 'FARE', 'FICE', 'PATM', 'PSUR', &
'QATM', 'TATM', 'TSUR', 'UATM', 'VATM', 'U10M', 'V10M', & ! variables read in
'CMOM', 'CMOI', 'CHEA', & ! transfer coefficients from ocean model
'QSUR', & ! auxiliary variables calculated
'HLAT', 'HSEN', & ! heat fluxes
'MEVA', 'MPRE', 'MRAI', 'MSNO', & ! mass fluxes
@ -51,6 +52,7 @@ MODULE flux_calculator_basic
INTEGER :: idx_ALBE, idx_ALBA, idx_AMOI, idx_AMOM, idx_FARE, idx_FICE, idx_PATM, idx_PSUR
INTEGER :: idx_QATM, idx_TATM, idx_TSUR, idx_UATM, idx_VATM, idx_U10M, idx_V10M
INTEGER :: idx_CMOM, idx_CMOI, idx_CHEA
INTEGER :: idx_QSUR
INTEGER :: idx_HLAT, idx_HSEN
INTEGER :: idx_MEVA, idx_MPRE, idx_MRAI, idx_MSNO
@ -146,7 +148,7 @@ MODULE flux_calculator_basic
input_field(num_input_fields)%which_grid = which_grid
input_field(num_input_fields)%field => local_field%var(i)%field
input_field(num_input_fields)%early=.FALSE.
IF ((myname=="FARE") .OR. (myname=="TSUR") .OR. (myname=="ALBE")) THEN
IF ((myname=="FARE") .OR. (myname=="TSUR") .OR. (myname=="ALBE") .OR. (myname=="CMOM") .OR. (myname=="CMOI") .OR. (myname=="CHEA")) THEN
input_field(num_input_fields)%early=.TRUE.
ENDIF
input_field(num_input_fields)%surface_type = surface_type
@ -537,6 +539,9 @@ MODULE flux_calculator_basic
IF (varnames(i) == 'VATM') idx_VATM = i ! Northward velocity in lowest atmospheric grid cell (m/s)
IF (varnames(i) == 'U10M') idx_U10M = i ! Eastward velocity 10m above the surface (m/s)
IF (varnames(i) == 'V10M') idx_V10M = i ! Northward velocity 10m above the surface (m/s)
IF (varnames(i) == 'CMOM') idx_CMOM = i ! Momentum transfer coefficient fom ocean model (1)
IF (varnames(i) == 'CMOI') idx_CMOI = i ! Moisture transfer coefficient fom ocean model (1)
IF (varnames(i) == 'CHEA') idx_CHEA = i ! Heat transfer coefficient fom ocean model (1)
! AUXILIARY VARIABLES:
IF (varnames(i) == 'QSUR') idx_QSUR = i ! Moisture content directly above the surface (kg/kg)
! FLUXES: (all are positive upward, such that e.g. precipitation is always negative)

11
src/flux_calculator_calculate.F90

@ -74,6 +74,17 @@ 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_mass_evap_mom5(local_field(i,1)%var(idx_MEVA)%field(j), &
local_field(i,1)%var(idx_CMOI)%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_QSUR)%field(j), &
local_field(i,1)%var(idx_TATM)%field(j), &
local_field(i,1)%var(idx_UATM)%field(j), &
local_field(i,1)%var(idx_VATM)%field(j))
ENDDO
ENDIF
ENDIF
ENDDO

8
src/flux_calculator_prepare.F90

@ -94,6 +94,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_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)//' CMOI'
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_QATM)%field )) missing_field=trim(missing_field)//' QATM'
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_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

@ -16,7 +16,7 @@ module flux_library
! import flux calculation functions from different modules:
! mass fluxes
use flux_mass_evap, only: flux_mass_evap_cclm
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
@ -33,6 +33,7 @@ module flux_library
public flux_heat_latent_water
public flux_heat_sensible_cclm
public flux_mass_evap_cclm
public flux_mass_evap_mom5
public flux_momentum_cclm
public flux_radiation_blackbody_StBo
public distribute_radiation_flux

34
src/flux_lib/mass/flux_mass_evap.F90

@ -14,6 +14,7 @@ module flux_mass_evap
! expose all functions
public flux_mass_evap_cclm
public flux_mass_evap_mom5
contains
@ -82,4 +83,37 @@ contains
end subroutine flux_mass_evap_cclm
subroutine flux_mass_evap_mom5( &
flux_mass_evap, & ! RESULT (kg/m2/s)
diffusion_coefficient_moisture, & ! a_{moisture} (1)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_atmos, & ! q_{v,a} (kg/kg)
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_mass_evap ! RESULT (kg/m2/s)
real(prec), intent(in) :: diffusion_coefficient_moisture ! a_{moisture} (1)
real(prec), intent(in) :: pressure_surface ! p_s (Pa)
real(prec), intent(in) :: specific_vapor_content_atmos ! q_{v,a} (kg/kg)
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_mass_evap_cclm(flux_mass_evap, & ! RESULT (kg/m2/s)
diffusion_coefficient_moisture, & ! a_{moisture} (1)
pressure_surface, & ! p_s (Pa)
specific_vapor_content_atmos, & ! q_{v,a} (kg/kg)
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_mass_evap_mom5
end module flux_mass_evap
Loading…
Cancel
Save