Changeset 6489 for trunk/NEMOGCM/NEMO/OPA_SRC
- Timestamp:
- 2016-04-20T14:26:29+02:00 (8 years ago)
- Location:
- trunk/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r6416 r6489 1006 1006 IF( srcv(jpr_toce)%laction ) THEN ! received by sas in case of opa <-> sas coupling 1007 1007 sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1) 1008 IF( srcv(jpr_soce)%laction .AND. l n_useCT ) THEN ! make sure that sst_m is the potential temperature1008 IF( srcv(jpr_soce)%laction .AND. l_useCT ) THEN ! make sure that sst_m is the potential temperature 1009 1009 sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) ) 1010 1010 ENDIF … … 1763 1763 1764 1764 IF ( nn_components == jp_iam_opa ) THEN 1765 ztmp1(:,:) = tsn(:,:,1,jp_tem) ! send temperature as it is (potential or conservative) -> use of l n_useCT on the received part1765 ztmp1(:,:) = tsn(:,:,1,jp_tem) ! send temperature as it is (potential or conservative) -> use of l_useCT on the received part 1766 1766 ELSE 1767 1767 ! we must send the surface potential temperature 1768 IF( l n_useCT ) THEN ; ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) )1768 IF( l_useCT ) THEN ; ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 1769 1769 ELSE ; ztmp1(:,:) = tsn(:,:,1,jp_tem) 1770 1770 ENDIF -
trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90
r6140 r6489 70 70 ssu_m(:,:) = ub(:,:,1) 71 71 ssv_m(:,:) = vb(:,:,1) 72 IF( l n_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )72 IF( l_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 73 73 ELSE ; sst_m(:,:) = zts(:,:,jp_tem) 74 74 ENDIF … … 92 92 ssu_m(:,:) = zcoef * ub(:,:,1) 93 93 ssv_m(:,:) = zcoef * vb(:,:,1) 94 IF( l n_useCT ) THEN ; sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )94 IF( l_useCT ) THEN ; sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 95 95 ELSE ; sst_m(:,:) = zcoef * zts(:,:,jp_tem) 96 96 ENDIF … … 120 120 ssu_m(:,:) = ssu_m(:,:) + ub(:,:,1) 121 121 ssv_m(:,:) = ssv_m(:,:) + vb(:,:,1) 122 IF( l n_useCT ) THEN ; sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) )122 IF( l_useCT ) THEN ; sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 123 123 ELSE ; sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem) 124 124 ENDIF … … 241 241 ssu_m(:,:) = ub(:,:,1) 242 242 ssv_m(:,:) = vb(:,:,1) 243 IF( l n_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) )243 IF( l_useCT ) THEN ; sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 244 244 ELSE ; sst_m(:,:) = tsn(:,:,1,jp_tem) 245 245 ENDIF -
trunk/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r6140 r6489 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 Celcius, 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 Celcius, 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 ! … … 690 699 pab(:,:,:) = 0._wp 691 700 ! 692 SELECT CASE ( n n_eos )693 ! 694 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!701 SELECT CASE ( neos ) 702 ! 703 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 695 704 ! 696 705 DO jj = 1, jpjm1 … … 750 759 CALL lbc_lnk( pab(:,:,jp_sal), 'T', 1. ) 751 760 ! 752 CASE( 1) !== simplified EOS ==!761 CASE( np_seos ) !== simplified EOS ==! 753 762 ! 754 763 DO jj = 1, jpjm1 … … 773 782 CASE DEFAULT 774 783 IF(lwp) WRITE(numout,cform_err) 775 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos784 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 776 785 nstop = nstop + 1 777 786 ! … … 806 815 pab(:) = 0._wp 807 816 ! 808 SELECT CASE ( n n_eos )809 ! 810 CASE( -1, 0 )!== polynomial TEOS-10 / EOS-80 ==!817 SELECT CASE ( neos ) 818 ! 819 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 811 820 ! 812 821 ! … … 859 868 ! 860 869 ! 861 CASE( 1) !== simplified EOS ==!870 CASE( np_seos ) !== simplified EOS ==! 862 871 ! 863 872 zt = pts(jp_tem) - 10._wp ! pot. temperature anomaly (t-T0) 864 873 zs = pts(jp_sal) - 35._wp ! abs. salinity anomaly (s-S0) 865 zh = pdep 874 zh = pdep ! depth at the partial step level 866 875 ! 867 876 zn = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs … … 873 882 CASE DEFAULT 874 883 IF(lwp) WRITE(numout,cform_err) 875 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos884 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 876 885 nstop = nstop + 1 877 886 ! … … 1009 1018 !!---------------------------------------------------------------------- 1010 1019 ! 1011 SELECT CASE ( n n_eos )1012 ! 1013 CASE ( -1, 1) !== CT,SA (TEOS-10 formulation) ==!1020 SELECT CASE ( neos ) 1021 ! 1022 CASE ( np_teos10, np_eos80 ) !== CT,SA (TEOS-10 formulation) ==! 1014 1023 ! 1015 1024 DO jj = 1, jpj … … 1024 1033 IF( PRESENT( pdep ) ) ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:) 1025 1034 ! 1026 CASE ( 0) !== PT,SP (UNESCO formulation) ==!1035 CASE ( np_seos ) !== PT,SP (UNESCO formulation) ==! 1027 1036 ! 1028 1037 ptf(:,:) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(:,:) ) & … … 1033 1042 CASE DEFAULT 1034 1043 IF(lwp) WRITE(numout,cform_err) 1035 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1044 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1036 1045 nstop = nstop + 1 1037 1046 ! … … 1059 1068 !!---------------------------------------------------------------------- 1060 1069 ! 1061 SELECT CASE ( n n_eos )1062 ! 1063 CASE ( -1, 1) !== CT,SA (TEOS-10 formulation) ==!1070 SELECT CASE ( neos ) 1071 ! 1072 CASE ( np_teos10, np_eos80 ) !== CT,SA (TEOS-10 formulation) ==! 1064 1073 ! 1065 1074 zs = SQRT( ABS( psal ) * r1_S0 ) ! square root salinity … … 1070 1079 IF( PRESENT( pdep ) ) ptf = ptf - 7.53e-4 * pdep 1071 1080 ! 1072 CASE ( 0) !== PT,SP (UNESCO formulation) ==!1081 CASE ( np_seos ) !== PT,SP (UNESCO formulation) ==! 1073 1082 ! 1074 1083 ptf = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal ) & … … 1079 1088 CASE DEFAULT 1080 1089 IF(lwp) WRITE(numout,cform_err) 1081 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1090 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1082 1091 nstop = nstop + 1 1083 1092 ! … … 1118 1127 IF( nn_timing == 1 ) CALL timing_start('eos_pen') 1119 1128 ! 1120 SELECT CASE ( n n_eos )1121 ! 1122 CASE( -1,0 ) !== polynomial TEOS-10 / EOS-80 ==!1129 SELECT CASE ( neos ) 1130 ! 1131 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 1123 1132 ! 1124 1133 DO jk = 1, jpkm1 … … 1183 1192 END DO 1184 1193 ! 1185 CASE( 1) !== Vallis (2006) simplified EOS ==!1194 CASE( np_seos ) !== Vallis (2006) simplified EOS ==! 1186 1195 ! 1187 1196 DO jk = 1, jpkm1 … … 1205 1214 CASE DEFAULT 1206 1215 IF(lwp) WRITE(numout,cform_err) 1207 IF(lwp) WRITE(numout,*) ' bad flag value for n n_eos = ', nn_eos1216 IF(lwp) WRITE(numout,*) ' bad flag value for neos = ', neos 1208 1217 nstop = nstop + 1 1209 1218 ! … … 1224 1233 !!---------------------------------------------------------------------- 1225 1234 INTEGER :: ios ! local integer 1226 !! 1227 NAMELIST/nameos/ nn_eos, ln_useCT, rn_a0, rn_b0, rn_lambda1, rn_mu1, & 1235 INTEGER :: ioptio ! local integer 1236 !! 1237 NAMELIST/nameos/ ln_TEOS10, ln_EOS80, ln_SEOS, rn_a0, rn_b0, rn_lambda1, rn_mu1, & 1228 1238 & rn_lambda2, rn_mu2, rn_nu 1229 1239 !!---------------------------------------------------------------------- … … 1245 1255 WRITE(numout,*) 'eos_init : equation of state' 1246 1256 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 1257 WRITE(numout,*) ' Namelist nameos : Chosen the Equation Of Seawater (EOS)' 1258 WRITE(numout,*) ' TEOS-10 : rho=F(Conservative Temperature, Absolute Salinity, depth) ln_TEOS10 = ', ln_TEOS10 1259 WRITE(numout,*) ' EOS-80 : rho=F(Potential Temperature, Practical Salinity, depth) ln_EOS80 = ', ln_EOS80 1260 WRITE(numout,*) ' S-EOS : rho=F(Conservative Temperature, Absolute Salinity, depth) ln_SEOS = ', ln_SEOS 1255 1261 ENDIF 1256 ! 1257 SELECT CASE( nn_eos ) ! check option 1258 ! 1259 CASE( -1 ) !== polynomial TEOS-10 ==! 1262 1263 ! Check options for equation of state & set neos based on logical flags 1264 ioptio = 0 1265 IF( ln_TEOS10 ) THEN ; ioptio = ioptio+1 ; neos = np_teos10 ; ENDIF 1266 IF( ln_EOS80 ) THEN ; ioptio = ioptio+1 ; neos = np_eos80 ; ENDIF 1267 IF( ln_SEOS ) THEN ; ioptio = ioptio+1 ; neos = np_seos ; ENDIF 1268 IF( ioptio /= 1 ) CALL ctl_stop("Exactly one equation of state option must be selected") 1269 ! 1270 SELECT CASE( neos ) ! check option 1271 ! 1272 CASE( np_teos10 ) !== polynomial TEOS-10 ==! 1260 1273 IF(lwp) WRITE(numout,*) 1261 1274 IF(lwp) WRITE(numout,*) ' use of TEOS-10 equation of state (cons. temp. and abs. salinity)' 1275 ! 1276 l_useCT = .TRUE. ! model temperature is Conservative temperature 1262 1277 ! 1263 1278 rdeltaS = 32._wp … … 1446 1461 BPE002 = 1.7269476440e-04_wp 1447 1462 ! 1448 CASE( 0 ) !== polynomial EOS-80 formulation ==!1463 CASE( np_eos80 ) !== polynomial EOS-80 formulation ==! 1449 1464 ! 1450 1465 IF(lwp) WRITE(numout,*) 1451 1466 IF(lwp) WRITE(numout,*) ' use of EOS-80 equation of state (pot. temp. and pract. salinity)' 1452 1467 ! 1468 l_useCT = .FALSE. ! model temperature is Potential temperature 1453 1469 rdeltaS = 20._wp 1454 1470 r1_S0 = 1._wp/40._wp … … 1636 1652 BPE002 = 5.3661089288e-04_wp 1637 1653 ! 1638 CASE( 1) !== Simplified EOS ==!1654 CASE( np_seos ) !== Simplified EOS ==! 1639 1655 IF(lwp) THEN 1640 1656 WRITE(numout,*) … … 1651 1667 WRITE(numout,*) ' Caution: rn_beta0=0 incompatible with ddm parameterization ' 1652 1668 ENDIF 1653 ! 1654 CASE DEFAULT !== ERROR in nn_eos ==! 1655 WRITE(ctmp1,*) ' bad flag value for nn_eos = ', nn_eos 1669 l_useCT = .TRUE. ! Use conservative temperature 1670 ! 1671 CASE DEFAULT !== ERROR in neos ==! 1672 WRITE(ctmp1,*) ' bad flag value for neos = ', neos, '. You should never see this error' 1656 1673 CALL ctl_stop( ctmp1 ) 1657 1674 ! … … 1662 1679 r1_rcp = 1._wp / rcp 1663 1680 r1_rau0_rcp = 1._wp / rau0_rcp 1681 ! 1682 IF(lwp) THEN 1683 IF( l_useCT ) THEN 1684 WRITE(numout,*) ' model uses Conservative Temperature' 1685 WRITE(numout,*) ' Important: model must be initialized with CT and SA fields' 1686 ELSE 1687 WRITE(numout,*) ' model does not use Conservative Temperature' 1688 ENDIF 1689 ENDIF 1664 1690 ! 1665 1691 IF(lwp) WRITE(numout,*) -
trunk/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90
r6140 r6489 31 31 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 32 32 33 USE eosbn2, ONLY : n n_eos33 USE eosbn2, ONLY : neos 34 34 35 35 IMPLICIT NONE … … 175 175 ! Compute Ekman depth from wind stress forcing. 176 176 ! ------------------------------------------------------- 177 zflageos = ( 0.5 + SIGN( 0.5, n n_eos - 1. ) ) * rau0177 zflageos = ( 0.5 + SIGN( 0.5, neos - 1. ) ) * rau0 178 178 DO jj = 2, jpjm1 179 179 DO ji = fs_2, fs_jpim1
Note: See TracChangeset
for help on using the changeset viewer.