@@ -7,6 +7,7 @@ module MOM_EOS
77use MOM_EOS_Wright
88use MOM_EOS_UNESCO
99use MOM_EOS_TEOS10
10+ use MOM_EOS_NEMO
1011use MOM_TFreeze, only : calculate_TFreeze_linear, calculate_TFreeze_Millero
1112use MOM_error_handler, only : MOM_error, FATAL, WARNING, MOM_mesg
1213use MOM_file_parser, only : get_param, log_version, param_file_type
@@ -64,11 +65,13 @@ module MOM_EOS
6465integer , parameter :: EOS_UNESCO = 2
6566integer , parameter :: EOS_WRIGHT = 3
6667integer , parameter :: EOS_TEOS10 = 4
68+ integer , parameter :: EOS_NEMO = 5
6769
6870character * (10 ), parameter :: EOS_LINEAR_STRING = " LINEAR"
6971character * (10 ), parameter :: EOS_UNESCO_STRING = " UNESCO"
7072character * (10 ), parameter :: EOS_WRIGHT_STRING = " WRIGHT"
7173character * (10 ), parameter :: EOS_TEOS10_STRING = " TEOS10"
74+ character * (10 ), parameter :: EOS_NEMO_STRING = " NEMO"
7275character * (10 ), parameter :: EOS_DEFAULT = EOS_WRIGHT_STRING
7376
7477integer , 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+
137145end 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