Skip to content

Commit 3dd705d

Browse files
committed
Adding NEMO as an EOS option
- The approximate polynomials for density, alpha and beta were provided by Fabien Roquet in the form of a code snippet. He gave the reference Roquet, F., Madec, G., McDougall, T. J., and Barker, P. M., 2015. Accurate polynomial expressions for the density and specific volume of seawater using the TEOS-10 standard. Ocean Modelling, 90:29-43. - The corresponding approximation for compressibility is lacking and it is calculated via a TEOS10 function call. - The corresponding approximation for specvol deriverties is lacking and these are calculated explicitly using the density derivatives.
1 parent 042a3c1 commit 3dd705d

3 files changed

Lines changed: 467 additions & 26 deletions

File tree

src/equation_of_state/MOM_EOS.F90

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module MOM_EOS
77
use MOM_EOS_Wright
88
use MOM_EOS_UNESCO
99
use MOM_EOS_TEOS10
10+
use MOM_EOS_NEMO
1011
use MOM_TFreeze, only : calculate_TFreeze_linear, calculate_TFreeze_Millero
1112
use MOM_error_handler, only : MOM_error, FATAL, WARNING, MOM_mesg
1213
use MOM_file_parser, only : get_param, log_version, param_file_type
@@ -64,11 +65,13 @@ module MOM_EOS
6465
integer, parameter :: EOS_UNESCO = 2
6566
integer, parameter :: EOS_WRIGHT = 3
6667
integer, parameter :: EOS_TEOS10 = 4
68+
integer, parameter :: EOS_NEMO = 5
6769

6870
character*(10), parameter :: EOS_LINEAR_STRING = "LINEAR"
6971
character*(10), parameter :: EOS_UNESCO_STRING = "UNESCO"
7072
character*(10), parameter :: EOS_WRIGHT_STRING = "WRIGHT"
7173
character*(10), parameter :: EOS_TEOS10_STRING = "TEOS10"
74+
character*(10), parameter :: EOS_NEMO_STRING = "NEMO"
7275
character*(10), parameter :: EOS_DEFAULT = EOS_WRIGHT_STRING
7376

7477
integer, parameter :: TFREEZE_LINEAR = 1
@@ -100,6 +103,8 @@ subroutine calculate_density_scalar(T, S, pressure, rho, EOS)
100103
call calculate_density_scalar_wright(T, S, pressure, rho)
101104
case (EOS_TEOS10)
102105
call calculate_density_scalar_teos10(T, S, pressure, rho)
106+
case (EOS_NEMO)
107+
call calculate_density_scalar_nemo(T, S, pressure, rho)
103108
case default
104109
call MOM_error(FATAL, &
105110
"calculate_density_scalar: EOS is not valid.")
@@ -130,10 +135,13 @@ subroutine calculate_density_array(T, S, pressure, rho, start, npts, EOS)
130135
call calculate_density_array_wright(T, S, pressure, rho, start, npts)
131136
case (EOS_TEOS10)
132137
call calculate_density_array_teos10(T, S, pressure, rho, start, npts)
138+
case (EOS_nemo)
139+
call calculate_density_array_nemo (T, S, pressure, rho, start, npts)
133140
case default
134141
call MOM_error(FATAL, &
135142
"calculate_density_array: EOS%form_of_EOS is not valid.")
136143
end select
144+
137145
end subroutine calculate_density_array
138146

139147
!> Calls the appropriate subroutine to calculate the freezing point for scalar inputs.
@@ -194,7 +202,23 @@ subroutine calculate_density_derivs(T, S, pressure, drho_dT, drho_dS, start, npt
194202
integer, intent(in) :: start !< Starting index within the array
195203
integer, intent(in) :: npts !< The number of values to calculate
196204
type(EOS_type), pointer :: EOS !< Equation of state structure
197-
205+
!!
206+
!!Testing section
207+
!!NEMO Check value: rho = 1027.45140 kg/m^3 for p=1000 dbar, ct=10 Celcius, sa=30 g/kg
208+
!real :: T0(1),S0(1),pressure0(1)
209+
!T0(1) = 10.
210+
!S0(1) = 30.
211+
!pressure0(1) = 1000. * 1e4 !pa
212+
!call calculate_density_derivs_nemo(T0, S0, pressure0, drho_dT, drho_dS, 1,1)
213+
!print*, 'NEMO drho: ', drho_dT(1), drho_dS(1)
214+
!call calculate_density_derivs_teos10(T0, S0, pressure0, drho_dT, drho_dS, 1,1)
215+
!print*, 'TEOS10 drho: ', drho_dT(1), drho_dS(1)
216+
!call calculate_density_derivs_wright(T0, S0, pressure0, drho_dT, drho_dS, 1,1)
217+
!print*, 'WRIGHT drho: ', drho_dT(1), drho_dS(1)
218+
!call calculate_density_derivs_unesco(T0, S0, pressure0, drho_dT, drho_dS, 1,1)
219+
!print*, 'UNESCO drho: ', drho_dT(1), drho_dS(1)
220+
!stop
221+
!!
198222
if (.not.associated(EOS)) call MOM_error(FATAL, &
199223
"calculate_density_derivs called with an unassociated EOS_type EOS.")
200224

@@ -208,6 +232,8 @@ subroutine calculate_density_derivs(T, S, pressure, drho_dT, drho_dS, start, npt
208232
call calculate_density_derivs_wright(T, S, pressure, drho_dT, drho_dS, start, npts)
209233
case (EOS_TEOS10)
210234
call calculate_density_derivs_teos10(T, S, pressure, drho_dT, drho_dS, start, npts)
235+
case (EOS_NEMO)
236+
call calculate_density_derivs_nemo(T, S, pressure, drho_dT, drho_dS, start, npts)
211237
case default
212238
call MOM_error(FATAL, &
213239
"calculate_density_derivs: EOS%form_of_EOS is not valid.")
@@ -247,6 +273,13 @@ subroutine calculate_specific_vol_derivs(T, S, pressure, dSV_dT, dSV_dS, start,
247273
call calculate_specvol_derivs_wright(T, S, pressure, dSV_dT, dSV_dS, start, npts)
248274
case (EOS_TEOS10)
249275
call calculate_specvol_derivs_teos10(T, S, pressure, dSV_dT, dSV_dS, start, npts)
276+
case (EOS_NEMO)
277+
call calculate_density_nemo(T, S, pressure, rho, start, npts)
278+
call calculate_density_derivs_nemo(T, S, pressure, drho_dT, drho_dS, start, npts)
279+
do j=start,start+npts-1
280+
dSV_dT(j) = -dRho_DT(j)/(rho(j)**2)
281+
dSV_dS(j) = -dRho_DS(j)/(rho(j)**2)
282+
enddo
250283
case default
251284
call MOM_error(FATAL, &
252285
"calculate_density_derivs: EOS%form_of_EOS is not valid.")
@@ -279,6 +312,8 @@ subroutine calculate_compress(T, S, pressure, rho, drho_dp, start, npts, EOS)
279312
call calculate_compress_wright(T, S, pressure, rho, drho_dp, start, npts)
280313
case (EOS_TEOS10)
281314
call calculate_compress_teos10(T, S, pressure, rho, drho_dp, start, npts)
315+
case (EOS_NEMO)
316+
call calculate_compress_nemo(T, S, pressure, rho, drho_dp, start, npts)
282317
case default
283318
call MOM_error(FATAL, &
284319
"calculate_compress: EOS%form_of_EOS is not valid.")
@@ -311,6 +346,8 @@ subroutine calculate_2_densities( T, S, pressure1, pressure2, rho1, rho2, start,
311346
call calculate_2_densities_wright(T, S, pressure1, pressure2, rho1, rho2, start, npts)
312347
case (EOS_TEOS10)
313348
call calculate_2_densities_teos10(T, S, pressure1, pressure2, rho1, rho2, start, npts)
349+
case (EOS_NEMO)
350+
call calculate_2_densities_nemo(T, S, pressure1, pressure2, rho1, rho2, start, npts)
314351
case default
315352
call MOM_error(FATAL, &
316353
"calculate_2_densities: EOS%form_of_EOS is not valid.")
@@ -467,7 +504,7 @@ subroutine EOS_init(param_file, EOS)
467504
call get_param(param_file, mod, "EQN_OF_STATE", tmpstr, &
468505
"EQN_OF_STATE determines which ocean equation of state \n"//&
469506
"should be used. Currently, the valid choices are \n"//&
470-
'"LINEAR", "UNESCO", "WRIGHT" and "TEOS10". \n'//&
507+
'"LINEAR", "UNESCO", "WRIGHT", "NEMO" and "TEOS10". \n'//&
471508
"This is only used if USE_EOS is true.", default=EOS_DEFAULT)
472509
select case (uppercase(tmpstr))
473510
case (EOS_LINEAR_STRING)
@@ -478,6 +515,8 @@ subroutine EOS_init(param_file, EOS)
478515
EOS%form_of_EOS = EOS_WRIGHT
479516
case (EOS_TEOS10_STRING)
480517
EOS%form_of_EOS = EOS_TEOS10
518+
case (EOS_NEMO_STRING)
519+
EOS%form_of_EOS = EOS_NEMO
481520
case default
482521
call MOM_error(FATAL, "interpret_eos_selection: EQN_OF_STATE "//&
483522
trim(tmpstr) // "in input file is invalid.")

0 commit comments

Comments
 (0)