Skip to content

Commit 419085d

Browse files
Hallberg-NOAAmarshallward
authored andcommitted
+Add calculate_density_second_derivs_UNESCO
Added the new public interface calculate_density_second_derivs_UNESCO, which is an overload for both scalar and array versions, to calculate the second derivatives of density with various combinations of temperature, salinity and pressure. Also added a doxygen block at the end of MOM_EOS_UNESCO.F90 to describe this module and the papers it draws upon. Also replaced fatal errors in MOM_EOS with calls to these new routines. All answers are bitwise identical, but there are newly permitted combinations of options that previously failed.
1 parent 52f5678 commit 419085d

File tree

2 files changed

+226
-27
lines changed

2 files changed

+226
-27
lines changed

src/equation_of_state/MOM_EOS.F90

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ module MOM_EOS
2525
use MOM_EOS_Wright_red, only : calculate_density_second_derivs_wright_red
2626
use MOM_EOS_UNESCO, only : calculate_density_unesco, calculate_spec_vol_unesco
2727
use MOM_EOS_UNESCO, only : calculate_density_derivs_unesco, calculate_density_unesco
28+
use MOM_EOS_UNESCO, only : calculate_density_second_derivs_UNESCO
2829
use MOM_EOS_UNESCO, only : calculate_compress_unesco
2930
use MOM_EOS_NEMO, only : calculate_density_nemo
3031
use MOM_EOS_NEMO, only : calculate_density_derivs_nemo, calculate_density_nemo
@@ -265,8 +266,8 @@ subroutine calculate_stanley_density_scalar(T, S, pressure, Tvar, TScov, Svar, r
265266
call calculate_density_second_derivs_wright_red(T_scale*T, S_scale*S, p_scale*pressure, &
266267
d2RdSS, d2RdST, d2RdTT, d2RdSp, d2RdTP)
267268
case (EOS_UNESCO)
268-
call MOM_error(FATAL, "calculate_stanley_density_scalar: "//&
269-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
269+
call calculate_density_second_derivs_UNESCO(T_scale*T, S_scale*S, p_scale*pressure, &
270+
d2RdSS, d2RdST, d2RdTT, d2RdSp, d2RdTP)
270271
case (EOS_NEMO)
271272
call calculate_density_second_derivs_NEMO(T_scale*T, S_scale*S, p_scale*pressure, &
272273
d2RdSS, d2RdST, d2RdTT, d2RdSp, d2RdTP)
@@ -374,8 +375,9 @@ subroutine calculate_stanley_density_array(T, S, pressure, Tvar, TScov, Svar, rh
374375
call calculate_density_second_derivs_wright_red(T, S, pressure, d2RdSS, d2RdST, &
375376
d2RdTT, d2RdSp, d2RdTP, start, npts)
376377
case (EOS_UNESCO)
377-
call MOM_error(FATAL, "calculate_stanley_density_array: "//&
378-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
378+
call calculate_density_UNESCO(T, S, pressure, rho, start, npts, rho_ref)
379+
call calculate_density_second_derivs_UNESCO(T, S, pressure, d2RdSS, d2RdST, &
380+
d2RdTT, d2RdSp, d2RdTP, start, npts)
379381
case (EOS_NEMO)
380382
call calculate_density_NEMO(T, S, pressure, rho, start, npts, rho_ref)
381383
call calculate_density_second_derivs_NEMO(T, S, pressure, d2RdSS, d2RdST, &
@@ -528,8 +530,9 @@ subroutine calculate_stanley_density_1d(T, S, pressure, Tvar, TScov, Svar, rho,
528530
call calculate_density_second_derivs_wright_red(Ta, Sa, pres, d2RdSS, d2RdST, &
529531
d2RdTT, d2RdSp, d2RdTP, is, npts)
530532
case (EOS_UNESCO)
531-
call MOM_error(FATAL, "calculate_stanley_density_1d: "//&
532-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
533+
call calculate_density_UNESCO(Ta, Sa, pres, rho, is, npts, rho_reference)
534+
call calculate_density_second_derivs_UNESCO(Ta, Sa, pres, d2RdSS, d2RdST, &
535+
d2RdTT, d2RdSp, d2RdTP, is, npts)
533536
case (EOS_NEMO)
534537
call calculate_density_NEMO(Ta, Sa, pres, rho, is, npts, rho_reference)
535538
call calculate_density_second_derivs_NEMO(Ta, Sa, pres, d2RdSS, d2RdST, &
@@ -1052,8 +1055,8 @@ subroutine calculate_density_second_derivs_1d(T, S, pressure, drho_dS_dS, drho_d
10521055
call calculate_density_second_derivs_wright_red(T, S, pressure, drho_dS_dS, drho_dS_dT, &
10531056
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
10541057
case (EOS_UNESCO)
1055-
call MOM_error(FATAL, "calculate_density_second_derivs: "//&
1056-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
1058+
call calculate_density_second_derivs_UNESCO(T, S, pressure, drho_dS_dS, drho_dS_dT, &
1059+
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
10571060
case (EOS_NEMO)
10581061
call calculate_density_second_derivs_NEMO(T, S, pressure, drho_dS_dS, drho_dS_dT, &
10591062
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
@@ -1083,8 +1086,8 @@ subroutine calculate_density_second_derivs_1d(T, S, pressure, drho_dS_dS, drho_d
10831086
call calculate_density_second_derivs_wright_red(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
10841087
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
10851088
case (EOS_UNESCO)
1086-
call MOM_error(FATAL, "calculate_density_second_derivs: "//&
1087-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
1089+
call calculate_density_second_derivs_UNESCO(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
1090+
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
10881091
case (EOS_NEMO)
10891092
call calculate_density_second_derivs_NEMO(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
10901093
drho_dT_dT, drho_dS_dP, drho_dT_dP, is, npts)
@@ -1168,8 +1171,8 @@ subroutine calculate_density_second_derivs_scalar(T, S, pressure, drho_dS_dS, dr
11681171
call calculate_density_second_derivs_wright_red(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
11691172
drho_dT_dT, drho_dS_dP, drho_dT_dP)
11701173
case (EOS_UNESCO)
1171-
call MOM_error(FATAL, "calculate_density_second_derivs: "//&
1172-
"EOS_UNESCO is not set up to calculate second derivatives yet.")
1174+
call calculate_density_second_derivs_UNESCO(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
1175+
drho_dT_dT, drho_dS_dP, drho_dT_dP)
11731176
case (EOS_NEMO)
11741177
call calculate_density_second_derivs_NEMO(Ta, Sa, pres, drho_dS_dS, drho_dS_dT, &
11751178
drho_dT_dT, drho_dS_dP, drho_dT_dP)
@@ -1985,7 +1988,7 @@ logical function EOS_unit_tests(verbose)
19851988
EOS_unit_tests = .false. ! Normally return false
19861989

19871990
call EOS_manual_init(EOS_tmp, form_of_EOS=EOS_UNESCO)
1988-
fail = test_EOS_consistency(25.0, 35.0, 1.0e7, EOS_tmp, verbose, "UNESCO", skip_2nd=.true., &
1991+
fail = test_EOS_consistency(25.0, 35.0, 1.0e7, EOS_tmp, verbose, "UNESCO", &
19891992
rho_check=1027.5434579611974*EOS_tmp%kg_m3_to_R)
19901993
if (verbose .and. fail) call MOM_error(WARNING, "UNESCO EOS has failed some self-consistency tests.")
19911994
EOS_unit_tests = EOS_unit_tests .or. fail

0 commit comments

Comments
 (0)