- Timestamp:
- 2016-11-21T10:38:43+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r7277 r7278 75 75 76 76 ! !!** Namelist nameos ** 77 INTEGER , PUBLIC :: nn_eos ! = 0/1/2 type of eq. of state and Brunt-Vaisala frequ. 78 LOGICAL , PUBLIC :: ln_useCT ! determine if eos_pt_from_ct is used to compute sst_m 77 LOGICAL , PUBLIC :: ln_TEOS10 ! determine if eos_pt_from_ct is used to compute sst_m 78 LOGICAL , PUBLIC :: ln_EOS80 ! determine if eos_pt_from_ct is used to compute sst_m 79 LOGICAL , PUBLIC :: ln_SEOS ! determine if eos_pt_from_ct is used to compute sst_m 80 81 ! Parameters 82 LOGICAL , PUBLIC :: l_useCT ! =T in ln_TEOS10=T (i.e. use eos_pt_from_ct to compute sst_m), =F otherwise 83 INTEGER , PUBLIC :: neos ! Identifier for equation of state used 84 85 INTEGER , PARAMETER :: np_teos10 = -1 ! parameter for using TEOS10 86 INTEGER , PARAMETER :: np_eos80 = 0 ! parameter for using EOS80 87 INTEGER , PARAMETER :: np_seos = 1 ! parameter for using Simplified Equation of state 79 88 80 89 ! !!! simplified eos coefficients (default value: Vallis 2006) … … 184 193 !! ** Purpose : Compute the in situ density (ratio rho/rau0) from 185 194 !! potential temperature and salinity using an equation of state 186 !! defined through the namelist parameter nn_eos.195 !! selected in the nameos namelist 187 196 !! 188 197 !! ** Method : prd(t,s,z) = ( rho(t,s,z) - rau0 ) / rau0 … … 194 203 !! rau0 reference density kg/m^3 195 204 !! 196 !! nn_eos = -1: polynomial TEOS-10 equation of state is used for rho(t,s,z).205 !! ln_teos10 : polynomial TEOS-10 equation of state is used for rho(t,s,z). 197 206 !! Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celsius, sa=35.5 g/kg 198 207 !! 199 !! nn_eos =0 : polynomial EOS-80 equation of state is used for rho(t,s,z).208 !! ln_eos80 : polynomial EOS-80 equation of state is used for rho(t,s,z). 200 209 !! Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celsius, sp=35.5 psu 201 210 !! 202 !! nn_eos = 1: simplified equation of state211 !! ln_seos : simplified equation of state 203 212 !! prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / rau0 204 213 !! linear case function of T only: rn_alpha<>0, other coefficients = 0 … … 224 233 IF( nn_timing == 1 ) CALL timing_start('eos-insitu') 225 234 ! 226 SELECT CASE( n n_eos )227 ! 228 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!235 SELECT CASE( neos ) 236 ! 237 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 229 238 ! 230 239 DO jk = 1, jpkm1 … … 266 275 END DO 267 276 ! 268 CASE( 1) !== simplified EOS ==!277 CASE( np_seos ) !== simplified EOS ==! 269 278 ! 270 279 DO jk = 1, jpkm1 … … 300 309 !! ** Purpose : Compute the in situ density (ratio rho/rau0) and the 301 310 !! potential volumic mass (Kg/m3) from potential temperature and 302 !! salinity fields using an equation of state defined throughthe303 !! namelist parameter nn_eos.311 !! salinity fields using an equation of state selected in the 312 !! namelist. 304 313 !! 305 314 !! ** Action : - prd , the in situ density (no units) … … 322 331 IF( nn_timing == 1 ) CALL timing_start('eos-pot') 323 332 ! 324 SELECT CASE ( n n_eos )325 ! 326 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!333 SELECT CASE ( neos ) 334 ! 335 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 327 336 ! 328 337 ! Stochastic equation of state … … 430 439 ENDIF 431 440 432 CASE( 1) !== simplified EOS ==!441 CASE( np_seos ) !== simplified EOS ==! 433 442 ! 434 443 DO jk = 1, jpkm1 … … 467 476 !! ** Purpose : Compute the in situ density (ratio rho/rau0) from 468 477 !! potential temperature and salinity using an equation of state 469 !! defined through the namelist parameter nn_eos. * 2D field case478 !! selected in the nameos namelist. * 2D field case 470 479 !! 471 480 !! ** Action : - prd , the in situ density (no units) (unmasked) … … 486 495 prd(:,:) = 0._wp 487 496 ! 488 SELECT CASE( n n_eos )489 ! 490 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!497 SELECT CASE( neos ) 498 ! 499 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 491 500 ! 492 501 DO jj = 1, jpjm1 … … 527 536 CALL lbc_lnk( prd, 'T', 1. ) ! Lateral boundary conditions 528 537 ! 529 CASE( 1) !== simplified EOS ==!538 CASE( np_seos ) !== simplified EOS ==! 530 539 ! 531 540 DO jj = 1, jpjm1 … … 576 585 IF( nn_timing == 1 ) CALL timing_start('rab_3d') 577 586 ! 578 SELECT CASE ( n n_eos )579 ! 580 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!587 SELECT CASE ( neos ) 588 ! 589 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 581 590 ! 582 591 DO jk = 1, jpkm1 … … 635 644 END DO 636 645 ! 637 CASE( 1) !== simplified EOS ==!646 CASE( np_seos ) !== simplified EOS ==! 638 647 ! 639 648 DO jk = 1, jpkm1 … … 657 666 CASE DEFAULT 658 667 IF(lwp) WRITE(numout,cform_err) 659 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos668 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 660 669 nstop = nstop + 1 661 670 ! … … 668 677 ! 669 678 END SUBROUTINE rab_3d 679 670 680 671 681 SUBROUTINE rab_2d( pts, pdep, pab ) … … 690 700 pab(:,:,:) = 0._wp 691 701 ! 692 SELECT CASE ( n n_eos )693 ! 694 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!702 SELECT CASE ( neos ) 703 ! 704 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 695 705 ! 696 706 DO jj = 1, jpjm1 … … 750 760 CALL lbc_lnk( pab(:,:,jp_sal), 'T', 1. ) 751 761 ! 752 CASE( 1) !== simplified EOS ==!762 CASE( np_seos ) !== simplified EOS ==! 753 763 ! 754 764 DO jj = 1, jpjm1 … … 773 783 CASE DEFAULT 774 784 IF(lwp) WRITE(numout,cform_err) 775 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos785 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 776 786 nstop = nstop + 1 777 787 ! … … 806 816 pab(:) = 0._wp 807 817 ! 808 SELECT CASE ( n n_eos )809 ! 810 CASE( -1, 0 )!== polynomial TEOS-10 / EOS-80 ==!818 SELECT CASE ( neos ) 819 ! 820 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 811 821 ! 812 822 ! … … 859 869 ! 860 870 ! 861 CASE( 1) !== simplified EOS ==!871 CASE( np_seos ) !== simplified EOS ==! 862 872 ! 863 873 zt = pts(jp_tem) - 10._wp ! pot. temperature anomaly (t-T0) 864 874 zs = pts(jp_sal) - 35._wp ! abs. salinity anomaly (s-S0) 865 zh = pdep 875 zh = pdep ! depth at the partial step level 866 876 ! 867 877 zn = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs … … 873 883 CASE DEFAULT 874 884 IF(lwp) WRITE(numout,cform_err) 875 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos885 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 876 886 nstop = nstop + 1 877 887 ! … … 1005 1015 REAL(wp), DIMENSION(jpi,jpj), INTENT(out ) :: ptf ! freezing temperature [Celsius] 1006 1016 ! 1007 INTEGER :: ji, jj ! dummy loop indices 1008 REAL(wp) :: zt, zs ! local scalars 1009 !!---------------------------------------------------------------------- 1010 ! 1011 SELECT CASE ( nn_eos ) 1012 ! 1013 CASE ( -1, 1 ) !== CT,SA (TEOS-10 formulation) ==! 1014 ! 1017 INTEGER :: ji, jj ! dummy loop indices 1018 REAL(wp) :: zt, zs, z1_S0 ! local scalars 1019 !!---------------------------------------------------------------------- 1020 ! 1021 SELECT CASE ( neos ) 1022 ! 1023 CASE ( np_teos10, np_seos ) !== CT,SA (TEOS-10 and S-EOS formulations) ==! 1024 ! 1025 z1_S0 = 1._wp / 35.16504_wp 1015 1026 DO jj = 1, jpj 1016 1027 DO ji = 1, jpi 1017 zs= SQRT( ABS( psal(ji,jj) ) * r1_S0 ) ! square root salinity1028 zs= SQRT( ABS( psal(ji,jj) ) * z1_S0 ) ! square root salinity 1018 1029 ptf(ji,jj) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs & 1019 1030 & - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp … … 1024 1035 IF( PRESENT( pdep ) ) ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:) 1025 1036 ! 1026 CASE ( 0 )!== PT,SP (UNESCO formulation) ==!1037 CASE ( np_eos80 ) !== PT,SP (UNESCO formulation) ==! 1027 1038 ! 1028 1039 ptf(:,:) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(:,:) ) & … … 1033 1044 CASE DEFAULT 1034 1045 IF(lwp) WRITE(numout,cform_err) 1035 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1046 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1036 1047 nstop = nstop + 1 1037 1048 ! … … 1039 1050 ! 1040 1051 END SUBROUTINE eos_fzp_2d 1052 1041 1053 1042 1054 SUBROUTINE eos_fzp_0d( psal, ptf, pdep ) … … 1059 1071 !!---------------------------------------------------------------------- 1060 1072 ! 1061 SELECT CASE ( n n_eos )1062 ! 1063 CASE ( -1, 1 ) !== CT,SA (TEOS-10 formulation) ==!1064 ! 1065 zs = SQRT( ABS( psal ) * r1_S0) ! square root salinity1073 SELECT CASE ( neos ) 1074 ! 1075 CASE ( np_teos10, np_seos ) !== CT,SA (TEOS-10 and S-EOS formulations) ==! 1076 ! 1077 zs = SQRT( ABS( psal ) / 35.16504_wp ) ! square root salinity 1066 1078 ptf = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs & 1067 1079 & - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp … … 1070 1082 IF( PRESENT( pdep ) ) ptf = ptf - 7.53e-4 * pdep 1071 1083 ! 1072 CASE ( 0 )!== PT,SP (UNESCO formulation) ==!1084 CASE ( np_eos80 ) !== PT,SP (UNESCO formulation) ==! 1073 1085 ! 1074 1086 ptf = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal ) & … … 1079 1091 CASE DEFAULT 1080 1092 IF(lwp) WRITE(numout,cform_err) 1081 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1093 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1082 1094 nstop = nstop + 1 1083 1095 ! … … 1118 1130 IF( nn_timing == 1 ) CALL timing_start('eos_pen') 1119 1131 ! 1120 SELECT CASE ( n n_eos )1121 ! 1122 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!1132 SELECT CASE ( neos ) 1133 ! 1134 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 1123 1135 ! 1124 1136 DO jk = 1, jpkm1 … … 1183 1195 END DO 1184 1196 ! 1185 CASE( 1) !== Vallis (2006) simplified EOS ==!1197 CASE( np_seos ) !== Vallis (2006) simplified EOS ==! 1186 1198 ! 1187 1199 DO jk = 1, jpkm1 … … 1205 1217 CASE DEFAULT 1206 1218 IF(lwp) WRITE(numout,cform_err) 1207 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1219 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1208 1220 nstop = nstop + 1 1209 1221 ! … … 1224 1236 !!---------------------------------------------------------------------- 1225 1237 INTEGER :: ios ! local integer 1226 !! 1227 NAMELIST/nameos/ nn_eos, ln_useCT, rn_a0, rn_b0, rn_lambda1, rn_mu1, & 1238 INTEGER :: ioptio ! local integer 1239 !! 1240 NAMELIST/nameos/ ln_TEOS10, ln_EOS80, ln_SEOS, rn_a0, rn_b0, rn_lambda1, rn_mu1, & 1228 1241 & rn_lambda2, rn_mu2, rn_nu 1229 1242 !!---------------------------------------------------------------------- … … 1245 1258 WRITE(numout,*) 'eos_init : equation of state' 1246 1259 WRITE(numout,*) '~~~~~~~~' 1247 WRITE(numout,*) ' Namelist nameos : set eos parameters' 1248 WRITE(numout,*) ' flag for eq. of state and N^2 nn_eos = ', nn_eos 1249 IF( ln_useCT ) THEN 1250 WRITE(numout,*) ' model uses Conservative Temperature' 1251 WRITE(numout,*) ' Important: model must be initialized with CT and SA fields' 1252 ELSE 1253 WRITE(numout,*) ' model does not use Conservative Temperature' 1254 ENDIF 1260 WRITE(numout,*) ' Namelist nameos : Chosen the Equation Of Seawater (EOS)' 1261 WRITE(numout,*) ' TEOS-10 : rho=F(Conservative Temperature, Absolute Salinity, depth) ln_TEOS10 = ', ln_TEOS10 1262 WRITE(numout,*) ' EOS-80 : rho=F(Potential Temperature, Practical Salinity, depth) ln_EOS80 = ', ln_EOS80 1263 WRITE(numout,*) ' S-EOS : rho=F(Conservative Temperature, Absolute Salinity, depth) ln_SEOS = ', ln_SEOS 1255 1264 ENDIF 1256 ! 1257 SELECT CASE( nn_eos ) ! check option 1258 ! 1259 CASE( -1 ) !== polynomial TEOS-10 ==! 1265 1266 ! Check options for equation of state & set neos based on logical flags 1267 ioptio = 0 1268 IF( ln_TEOS10 ) THEN ; ioptio = ioptio+1 ; neos = np_teos10 ; ENDIF 1269 IF( ln_EOS80 ) THEN ; ioptio = ioptio+1 ; neos = np_eos80 ; ENDIF 1270 IF( ln_SEOS ) THEN ; ioptio = ioptio+1 ; neos = np_seos ; ENDIF 1271 IF( ioptio /= 1 ) CALL ctl_stop("Exactly one equation of state option must be selected") 1272 ! 1273 SELECT CASE( neos ) ! check option 1274 ! 1275 CASE( np_teos10 ) !== polynomial TEOS-10 ==! 1260 1276 IF(lwp) WRITE(numout,*) 1261 1277 IF(lwp) WRITE(numout,*) ' use of TEOS-10 equation of state (cons. temp. and abs. salinity)' 1278 ! 1279 l_useCT = .TRUE. ! model temperature is Conservative temperature 1262 1280 ! 1263 1281 rdeltaS = 32._wp … … 1446 1464 BPE002 = 1.7269476440e-04_wp 1447 1465 ! 1448 CASE( 0 ) !== polynomial EOS-80 formulation ==!1466 CASE( np_eos80 ) !== polynomial EOS-80 formulation ==! 1449 1467 ! 1450 1468 IF(lwp) WRITE(numout,*) 1451 1469 IF(lwp) WRITE(numout,*) ' use of EOS-80 equation of state (pot. temp. and pract. salinity)' 1452 1470 ! 1471 l_useCT = .FALSE. ! model temperature is Potential temperature 1453 1472 rdeltaS = 20._wp 1454 1473 r1_S0 = 1._wp/40._wp … … 1636 1655 BPE002 = 5.3661089288e-04_wp 1637 1656 ! 1638 CASE( 1) !== Simplified EOS ==!1657 CASE( np_seos ) !== Simplified EOS ==! 1639 1658 IF(lwp) THEN 1640 1659 WRITE(numout,*) … … 1651 1670 WRITE(numout,*) ' Caution: rn_beta0=0 incompatible with ddm parameterization ' 1652 1671 ENDIF 1653 ! 1654 CASE DEFAULT !== ERROR in nn_eos ==! 1655 WRITE(ctmp1,*) ' bad flag value for nn_eos = ', nn_eos 1672 l_useCT = .TRUE. ! Use conservative temperature 1673 ! 1674 CASE DEFAULT !== ERROR in neos ==! 1675 WRITE(ctmp1,*) ' bad flag value for neos = ', neos, '. You should never see this error' 1656 1676 CALL ctl_stop( ctmp1 ) 1657 1677 ! … … 1662 1682 r1_rcp = 1._wp / rcp 1663 1683 r1_rau0_rcp = 1._wp / rau0_rcp 1684 ! 1685 IF(lwp) THEN 1686 IF( l_useCT ) THEN 1687 WRITE(numout,*) ' model uses Conservative Temperature' 1688 WRITE(numout,*) ' Important: model must be initialized with CT and SA fields' 1689 ELSE 1690 WRITE(numout,*) ' model does not use Conservative Temperature' 1691 ENDIF 1692 ENDIF 1664 1693 ! 1665 1694 IF(lwp) WRITE(numout,*)
Note: See TracChangeset
for help on using the changeset viewer.