<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
!
! Ellison Ocean Permittivity module.
!
! Module containing routines to compute the complex permittivities for
! sea water based on
!
! Ellison, W.J. et al. (2003) A comparison of ocean emissivity models
! using the Advanced Microwave Sounding Unit, the Special Sensor
! Microwave Imager, the TRMM Microwave Imager, and airborne radiometer
! observations. Journal of Geophysical Research, v108, D21, Pages ACL 1,1-14
! doi:10.1029/2002JD0032132
!
!
! CREATION HISTORY:
! Written by: Paul van Delst, 11-Apr-2007
! paul.vandelst@noaa.gov
!
<A NAME='ELLISON'><A href='../../html_code/crtm/Ellison.f90.html#ELLISON' TARGET='top_target'><IMG SRC="../../gif/bar_purple.gif" border=0></A>
MODULE Ellison 1,2
! -----------------
! Environment setup
! -----------------
! Module use
USE Type_Kinds
, ONLY: fp
USE Fundamental_Constants
, ONLY: PI, &
E0 => PERMITTIVITY, & ! Permittivity of vacuum (F/m)
K_TO_C => STANDARD_TEMPERATURE ! Temperature units conversion
! Disable implicit typing
IMPLICIT NONE
! ------------
! Visibilities
! ------------
PRIVATE
! ... Datatypes
PUBLIC :: iVar_type
! ... Procedures
PUBLIC :: Ellison_Ocean_Permittivity
PUBLIC :: Ellison_Ocean_Permittivity_TL
PUBLIC :: Ellison_Ocean_Permittivity_AD
! -----------------
! Module parameters
! -----------------
CHARACTER(*), PARAMETER :: MODULE_VERSION_ID = &
'$Id: Ellison.f90 29405 2013-06-20 20:19:52Z paul.vandelst@noaa.gov $'
REAL(fp), PARAMETER :: ZERO = 0.0_fp
REAL(fp), PARAMETER :: POINT5 = 0.5_fp
REAL(fp), PARAMETER :: ONE = 1.0_fp
REAL(fp), PARAMETER :: TWO = 2.0_fp
REAL(fp), PARAMETER :: THREE = 3.0_fp
REAL(fp), PARAMETER :: FOUR = 4.0_fp
REAL(fp), PARAMETER :: FIVE = 5.0_fp
REAL(fp), PARAMETER :: TWOPI = TWO*PI
! Scaling factors (used here for documenting the conversion
! to SI units of the double Debye model denominator)
! ---------------------------------------------------------
REAL(fp), PARAMETER :: PS_TO_S = 1.0e-12_fp ! Picoseconds -> Seconds
REAL(fp), PARAMETER :: GHZ_TO_HZ = 1.0e+09_fp ! Gigahertz -> Hertz
REAL(fp), PARAMETER :: SCALE_FACTOR = PS_TO_S * GHZ_TO_HZ
! Parameters for the Ellison et al (2003) permittivity model
! ----------------------------------------------------------
! The coefficients used to fit the Double Debye model
REAL(fp), PARAMETER :: TAU1_COEFF(0:2) = (/ 17.535_fp, &
-0.61767_fp, &
0.0089481_fp /)
REAL(fp), PARAMETER :: TAU2_COEFF(0:3) = (/ 3.1842_fp, &
0.019189_fp, &
-0.010873_fp, &
0.00025818_fp /)
REAL(fp), PARAMETER :: DELTA1_COEFF(0:3) = (/ 68.396_fp, &
-0.40643_fp, &
0.022832_fp, &
-0.00053061_fp /)
REAL(fp), PARAMETER :: DELTA2_COEFF(0:3) = (/ 4.7629_fp, &
0.1541_fp, &
-0.033717_fp, &
0.00084428_fp /)
REAL(fp), PARAMETER :: EINF_COEFF(0:1) = (/ 5.31250_fp, &
-0.0114770_fp /)
REAL(fp), PARAMETER :: SIGMA_COEFF(0:1) = (/ 2.906_fp, &
0.09437_fp /)
! --------------------------------------
! Structure definition to hold forward
! variables across FWD, TL, and AD calls
! --------------------------------------
TYPE :: iVar_type
PRIVATE
REAL(fp) :: t=ZERO ! Temperature in degC
REAL(fp) :: f=ZERO, f2=ZERO, f0=ZERO ! Frequency terms
REAL(fp) :: tau1=ZERO , tau2=ZERO ! Relaxation frequencies
REAL(fp) :: delta1=ZERO, delta2=ZERO ! Delta terms
REAL(fp) :: d1=ZERO , d2=ZERO ! Denominator terms
END TYPE iVar_type
CONTAINS
!################################################################################
!################################################################################
!## ##
!## ## PUBLIC MODULE ROUTINES ## ##
!## ##
!################################################################################
!################################################################################
!--------------------------------------------------------------------------------
!:sdoc+:
!
! NAME:
! Ellison_Ocean_Permittivity
!
! PURPOSE:
! Subroutine to compute ocean permittivity according to the reference,
! Ellison, W.J. et al. (2003) A comparison of ocean emissivity models
! using the Advanced Microwave Sounding Unit, the Special Sensor
! Microwave Imager, the TRMM Microwave Imager, and airborne radiometer
! observations. Journal of Geophysical Research, v108, D21, ACL 1,1-14
! doi:10.1029/2002JD0032132
!
! CALLING SEQUENCE:
! CALL Ellison_Ocean_Permittivity( Temperature , & ! Input
! Frequency , & ! Input
! Permittivity, & ! Output
! iVar ) ! Internal variable output
!
! INPUTS:
! Temperature: Sea surface temperature
! UNITS: Kelvin (K)
! TYPE: REAL(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN)
!
! Frequency: Frequency
! UNITS: GHz
! TYPE: REAL(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN)
!
! OUTPUTS:
! Permittivity: Ocean permittivity
! UNITS: N/A
! TYPE: COMPLEX(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(OUT)
!
! iVar: Structure containing internal variables required for
! subsequent tangent-linear or adjoint model calls.
! The contents of this structure are NOT accessible
! outside of this module.
! UNITS: N/A
! TYPE: TYPE(iVar_type)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(OUT)
!
! COMMENTS:
! There is currently no salinity dependence.
!:sdoc-:
!--------------------------------------------------------------------------------
<A NAME='ELLISON_OCEAN_PERMITTIVITY'><A href='../../html_code/crtm/Ellison.f90.html#ELLISON_OCEAN_PERMITTIVITY' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>
SUBROUTINE Ellison_Ocean_Permittivity( & 1
Temperature , & ! Input
Frequency , & ! Input
Permittivity, & ! Output
iVar ) ! Internal variable output
! Arguments
REAL(fp), INTENT(IN) :: Temperature
REAL(fp), INTENT(IN) :: Frequency
COMPLEX(fp), INTENT(OUT) :: Permittivity
TYPE(iVar_type), INTENT(IN OUT) :: iVar
! Local variables
REAL(fp) :: einf
REAL(fp) :: re1, re2
REAL(fp) :: ie1, ie2
REAL(fp) :: sigma, iesigma
REAL(fp) :: re, ie
! Compute the various polynomial components of the double Debye model
! -------------------------------------------------------------------
! Compute temperature value for polynomials
iVar%t = Temperature - K_TO_C
! Compute the Debye model relaxation frequencies
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
iVar%tau1 = TAU1_COEFF(0) + iVar%t*(TAU1_COEFF(1) + &
iVar%t*TAU1_COEFF(2))
iVar%tau2 = TAU2_COEFF(0) + iVar%t*(TAU2_COEFF(1) + &
iVar%t*(TAU2_COEFF(2) + &
iVar%t*TAU2_COEFF(3)))
! Compute the delta terms
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
iVar%delta1 = DELTA1_COEFF(0) + iVar%t*(DELTA1_COEFF(1) + &
iVar%t*(DELTA1_COEFF(2) + &
iVar%t*DELTA1_COEFF(3)))
iVar%delta2 = DELTA2_COEFF(0) + iVar%t*(DELTA2_COEFF(1) + &
iVar%t*(DELTA2_COEFF(2) + &
iVar%t*DELTA2_COEFF(3)))
! Compute the "infinite" permittivity term
! (No coeffs provided in ref. Taken from existing code)
einf = EINF_COEFF(0) + iVar%t*EINF_COEFF(1)
! Compute the permittivities using the double Debye model
! (eqn on pg ACL 1-3 of Ellison et al. 2003)
! -------------------------------------------------------
! The common frequency terms
iVar%f = TWOPI * Frequency * SCALE_FACTOR
iVar%f2 = iVar%f**2
iVar%f0 = TWOPI * Frequency * GHZ_TO_HZ * E0
! The denominators of the double Debye model
iVar%d1 = ONE + iVar%f2*iVar%tau1**2
iVar%d2 = ONE + iVar%f2*iVar%tau2**2
! The real parts of the "delta" terms
re1 = iVar%delta1 / iVar%d1
re2 = iVar%delta2 / iVar%d2
! The imaginary parts of the "delta" terms
ie1 = iVar%delta1 * iVar%f * iVar%tau1 / iVar%d1
ie2 = iVar%delta2 * iVar%f * iVar%tau2 / iVar%d2
! The conductivity term
sigma = SIGMA_COEFF(0) + SIGMA_COEFF(1)*iVar%t
iesigma = sigma / iVar%f0
! Construct the complex permittivity, e = e' - j.e"
re = re1 + re2 + einf
ie = ie1 + ie2 + iesigma
Permittivity = CMPLX(re, -ie, fp)
END SUBROUTINE Ellison_Ocean_Permittivity
!--------------------------------------------------------------------------------
!:sdoc+:
!
! NAME:
! Ellison_Ocean_Permittivity_TL
!
! PURPOSE:
! Subroutine to compute the tangent-linear ocean permittivity according
! to the reference,
! Ellison, W.J. et al. (2003) A comparison of ocean emissivity models
! using the Advanced Microwave Sounding Unit, the Special Sensor
! Microwave Imager, the TRMM Microwave Imager, and airborne radiometer
! observations. Journal of Geophysical Research, v108, D21, ACL 1,1-14
! doi:10.1029/2002JD0032132
!
! CALLING SEQUENCE:
! CALL Ellison_Ocean_Permittivity_TL( Temperature_TL , & ! Input
! Permittivity_TL, & ! Output
! iVar ) ! Internal variable input
!
! INPUTS:
! Temperature_TL: Tangent-linear sea surface temperature
! UNITS: Kelvin (K)
! TYPE: REAL(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN)
!
! iVar: Structure containing internal variables required for
! subsequent tangent-linear or adjoint model calls.
! The contents of this structure are NOT accessible
! outside of this module.
! UNITS: N/A
! TYPE: TYPE(iVar_type)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN)
!
! OUTPUTS:
! Permittivity_TL: Tangent-linear ocean permittivity
! UNITS: N/A
! TYPE: COMPLEX(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(OUT)
!
! COMMENTS:
! There is currently no salinity dependence.
!:sdoc-:
!--------------------------------------------------------------------------------
<A NAME='ELLISON_OCEAN_PERMITTIVITY_TL'><A href='../../html_code/crtm/Ellison.f90.html#ELLISON_OCEAN_PERMITTIVITY_TL' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>
SUBROUTINE Ellison_Ocean_Permittivity_TL( & 1
Temperature_TL , & ! Input
Permittivity_TL, & ! Output
iVar ) ! Internal variable input
! Arguments
REAL(fp), INTENT(IN) :: Temperature_TL
COMPLEX(fp), INTENT(OUT) :: Permittivity_TL
TYPE(iVar_type), INTENT(IN) :: iVar
! Local variables
REAL(fp) :: t_TL
REAL(fp) :: tau1_TL, tau2_TL
REAL(fp) :: delta1_TL, delta2_TL, einf_TL
REAL(fp) :: d1_TL, d2_TL
REAL(fp) :: d12, d22
REAL(fp) :: re1_TL, re2_TL
REAL(fp) :: ie1_TL, ie2_TL
REAL(fp) :: sigma_TL, iesigma_TL
REAL(fp) :: re_TL, ie_TL
! Compute the tangent-linear for of the various
! polynomial components of the double Debye model
! -----------------------------------------------
! Compute temperature value for polynomials
t_TL = Temperature_TL
! Compute the tangent-linear Debye model relaxation frequencies
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
tau1_TL = (TAU1_COEFF(1) + iVar%t*TWO*TAU1_COEFF(2)) * t_TL
tau2_TL = (TAU2_COEFF(1) + iVar%t*(TWO*TAU2_COEFF(2) + iVar%t*THREE*TAU2_COEFF(3))) * t_TL
! Compute the tangent-linear delta terms
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
delta1_TL = (DELTA1_COEFF(1) + iVar%t*(TWO*DELTA1_COEFF(2) + iVar%t*THREE*DELTA1_COEFF(3))) * t_TL
delta2_TL = (DELTA2_COEFF(1) + iVar%t*(TWO*DELTA2_COEFF(2) + iVar%t*THREE*DELTA2_COEFF(3))) * t_TL
! Compute the tangent-liner "infinite" permittivity term
! (No coeffs provided in ref. Taken from existing code)
einf_TL = EINF_COEFF(1) * t_TL
! Compute the tangent-linear permittivities
! using the double Debye model
! (eqn on pg ACL 1-3 of Ellison et al. 2003)
! ------------------------------------------
! The tangent-linear denominators of the double Debye model
d1_TL = TWO*iVar%f2*iVar%tau1*tau1_TL
d2_TL = TWO*iVar%f2*iVar%tau2*tau2_TL
! The tangent-linear real parts of the "delta" terms
d12 = iVar%d1**2
d22 = iVar%d2**2
re1_TL = (iVar%d1*delta1_TL - iVar%delta1*d1_TL) / d12
re2_TL = (iVar%d2*delta2_TL - iVar%delta2*d2_TL) / d22
! The tangent-linear imaginary parts of the "delta" terms
ie1_TL = iVar%f * (delta1_TL*iVar%tau1*iVar%d1 + iVar%delta1*tau1_TL*iVar%d1 - iVar%delta1*iVar%tau1*d1_TL) / d12
ie2_TL = iVar%f * (delta2_TL*iVar%tau2*iVar%d2 + iVar%delta2*tau2_TL*iVar%d2 - iVar%delta2*iVar%tau2*d2_TL) / d22
! The conductivity term
sigma_TL = SIGMA_COEFF(1)*t_TL
iesigma_TL = sigma_TL / iVar%f0
! Construct the complex permittivity, de = de' - j.de"
re_TL = re1_TL + re2_TL + einf_TL
ie_TL = ie1_TL + ie2_TL + iesigma_TL
Permittivity_TL = CMPLX(re_TL, -ie_TL, fp)
END SUBROUTINE Ellison_Ocean_Permittivity_TL
!--------------------------------------------------------------------------------
!:sdoc+:
!
! NAME:
! Ellison_Ocean_Permittivity_AD
!
! PURPOSE:
! Subroutine to compute the adjoint ocean permittivity according
! to the reference,
! Ellison, W.J. et al. (2003) A comparison of ocean emissivity models
! using the Advanced Microwave Sounding Unit, the Special Sensor
! Microwave Imager, the TRMM Microwave Imager, and airborne radiometer
! observations. Journal of Geophysical Research, v108, D21, ACL 1,1-14
! doi:10.1029/2002JD0032132
!
! CALLING SEQUENCE:
! CALL Ellison_Ocean_Permittivity_AD( Permittivity_AD, & ! Input
! Temperature_AD , & ! Output
! iVar ) ! Internal variable input
!
! INPUTS:
! Permittivity_AD: Adjoint ocean permittivity
! UNITS: N/A
! TYPE: COMPLEX(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN OUT)
!
! iVar: Structure containing internal variables required for
! subsequent tangent-linear or adjoint model calls.
! The contents of this structure are NOT accessible
! outside of this module.
! UNITS: N/A
! TYPE: TYPE(iVar_type)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN)
!
! OUTPUTS:
! Temperature_AD: Adjoint sea surface temperature, de/dT.
! UNITS: per Kelvin (K^-1)
! TYPE: REAL(fp)
! DIMENSION: Scalar
! ATTRIBUTES: INTENT(IN OUT)
!
! SIDE EFFECTS:
! The input adjoint variable, Permittivity_AD, is set to zero upon
! exiting this routine.
!
! COMMENTS:
! There is currently no salinity dependence.
!
!:sdoc-:
!--------------------------------------------------------------------------------
<A NAME='ELLISON_OCEAN_PERMITTIVITY_AD'><A href='../../html_code/crtm/Ellison.f90.html#ELLISON_OCEAN_PERMITTIVITY_AD' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>
SUBROUTINE Ellison_Ocean_Permittivity_AD( & 1
Permittivity_AD, & ! Input
Temperature_AD , & ! Output
iVar ) ! Internal variable input
! Arguments
COMPLEX(fp), INTENT(IN OUT) :: Permittivity_AD
REAL(fp), INTENT(IN OUT) :: Temperature_AD
TYPE(iVar_type), INTENT(IN) :: iVar
! Local variables
REAL(fp) :: t_AD
REAL(fp) :: tau1_AD, tau2_AD
REAL(fp) :: delta1_AD, delta2_AD, einf_AD
REAL(fp) :: d1_AD, d2_AD
REAL(fp) :: d12, d22
REAL(fp) :: m1 , m2
REAL(fp) :: re1_AD, re2_AD
REAL(fp) :: ie1_AD, ie2_AD
REAL(fp) :: sigma_AD, iesigma_AD
REAL(fp) :: re_AD, ie_AD
! Compute the adjoint of the permittivities
! using the double Debye model
! (eqn on pg ACL 1-3 of Ellison et al. 2003)
! ------------------------------------------
! The complex permittivity
ie_AD = -AIMAG(Permittivity_AD)
re_AD = REAL(Permittivity_AD,fp)
Permittivity_AD = ZERO
! Initialise all the local adjoint variables
iesigma_AD = ie_AD; ie2_AD = ie_AD; ie1_AD = ie_AD
einf_AD = re_AD; re2_AD = re_AD; re1_AD = re_AD
! The adjoint of the conductivity term
sigma_AD = iesigma_AD / iVar%f0
t_AD = SIGMA_COEFF(1)*sigma_AD
! The adjoints of the imaginary parts of the "delta" terms
d22 = iVar%d2**2; m2 = iVar%f / d22
d12 = iVar%d1**2; m1 = iVar%f / d12
d2_AD = -(iVar%delta2 * iVar%tau2 * m2 * ie2_AD )
tau2_AD = iVar%delta2 * iVar%d2 * m2 * ie2_AD
delta2_AD = iVar%tau2 * iVar%d2 * m2 * ie2_AD
d1_AD = -(iVar%delta1 * iVar%tau1 * m1 * ie1_AD )
tau1_AD = iVar%delta1 * iVar%d1 * m1 * ie1_AD
delta1_AD = iVar%tau1 * iVar%d1 * m1 * ie1_AD
! The adjoints of the real parts of the "delta" terms
d2_AD = d2_AD - (re2_AD * iVar%delta2 / d22)
delta2_AD = delta2_AD + (re2_AD / iVar%d2)
d1_AD = d1_AD - (re1_AD * iVar%delta1 / d12)
delta1_AD = delta1_AD + (re1_AD / iVar%d1)
! The adjoints of the denominators of the double Debye model
tau2_AD = tau2_AD + (TWO * iVar%f2 * iVar%tau2 * d2_AD)
tau1_AD = tau1_AD + (TWO * iVar%f2 * iVar%tau1 * d1_AD)
! Compute the adjoints of the various
! polynomial components of the double Debye model
! -----------------------------------------------
! Compute the adjoint of the "infinite" permittivity term
! (No coeffs provided in ref. Taken from existing code)
t_AD = t_AD + EINF_COEFF(1) * einf_AD
! Compute the adjoint of the delta terms
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
t_AD = t_AD + (DELTA2_COEFF(1) + iVar%t*(TWO*DELTA2_COEFF(2) + &
iVar%t*THREE*DELTA2_COEFF(3)) ) * delta2_AD
t_AD = t_AD + (DELTA1_COEFF(1) + iVar%t*(TWO*DELTA1_COEFF(2) + &
iVar%t*THREE*DELTA1_COEFF(3)) ) * delta1_AD
! Compute the adjoint of the Debye model relaxation frequencies
! (eqn on pg ACL 1-4 of Ellison et al. 2003)
t_AD = t_AD + (TAU2_COEFF(1) + iVar%t*(TWO*TAU2_COEFF(2) + &
iVar%t*THREE*TAU2_COEFF(3)) ) * tau2_AD
t_AD = t_AD + (TAU1_COEFF(1) + iVar%t*TWO*TAU1_COEFF(2)) * tau1_AD
! The return value
Temperature_AD = Temperature_AD + t_AD
END SUBROUTINE Ellison_Ocean_Permittivity_AD
END MODULE Ellison