- Timestamp:
- 2021-06-17T19:17:25+02:00 (3 years ago)
- Location:
- NEMO/branches/2021/ticket2680_C1D_PAPA
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/ticket2680_C1D_PAPA
- Property svn:externals
-
old new 9 9 10 10 # SETTE 11 ^/utils/CI/sette@14244 sette 11 ^/utils/CI/sette@HEAD sette 12
-
- Property svn:externals
-
NEMO/branches/2021/ticket2680_C1D_PAPA/tests/ISOMIP+/MY_SRC/eosbn2.F90
r14857 r15015 31 31 !! bn2 : compute the Brunt-Vaisala frequency 32 32 !! eos_pt_from_ct: compute the potential temperature from the Conservative Temperature 33 !! eos_rab : generic interface of in situ thermal/haline expansion ratio 33 !! eos_rab : generic interface of in situ thermal/haline expansion ratio 34 34 !! eos_rab_3d : compute in situ thermal/haline expansion ratio 35 35 !! eos_rab_2d : compute in situ thermal/haline expansion ratio for 2d fields … … 46 46 USE in_out_manager ! I/O manager 47 47 USE lib_mpp ! MPP library 48 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 48 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 49 49 USE prtctl ! Print control 50 50 USE lbclnk ! ocean lateral boundary conditions … … 63 63 END INTERFACE 64 64 ! 65 INTERFACE eos_fzp 65 INTERFACE eos_fzp 66 66 MODULE PROCEDURE eos_fzp_2d, eos_fzp_0d 67 67 END INTERFACE … … 91 91 92 92 ! !!! simplified eos coefficients (default value: Vallis 2006) 93 REAL(wp), PUBLIC :: rn_a0 = 1.6550e-1_wp ! thermal expansion coeff. 94 REAL(wp), PUBLIC :: rn_b0 = 7.6554e-1_wp ! saline expansion coeff. 95 REAL(wp) :: rn_lambda1 = 5.9520e-2_wp ! cabbeling coeff. in T^2 96 REAL(wp) :: rn_lambda2 = 5.4914e-4_wp ! cabbeling coeff. in S^2 97 REAL(wp) :: rn_mu1 = 1.4970e-4_wp ! thermobaric coeff. in T 98 REAL(wp) :: rn_mu2 = 1.1090e-5_wp ! thermobaric coeff. in S 99 REAL(wp) :: rn_nu = 2.4341e-3_wp ! cabbeling coeff. in theta*salt 100 93 REAL(wp), PUBLIC :: rn_a0 = 1.6550e-1_wp ! thermal expansion coeff. 94 REAL(wp), PUBLIC :: rn_b0 = 7.6554e-1_wp ! saline expansion coeff. 95 REAL(wp) :: rn_lambda1 = 5.9520e-2_wp ! cabbeling coeff. in T^2 96 REAL(wp) :: rn_lambda2 = 5.4914e-4_wp ! cabbeling coeff. in S^2 97 REAL(wp) :: rn_mu1 = 1.4970e-4_wp ! thermobaric coeff. in T 98 REAL(wp) :: rn_mu2 = 1.1090e-5_wp ! thermobaric coeff. in S 99 REAL(wp) :: rn_nu = 2.4341e-3_wp ! cabbeling coeff. in theta*salt 100 101 101 ! TEOS10/EOS80 parameters 102 102 REAL(wp) :: r1_S0, r1_T0, r1_Z0, rdeltaS 103 103 104 104 ! EOS parameters 105 105 REAL(wp) :: EOS000 , EOS100 , EOS200 , EOS300 , EOS400 , EOS500 , EOS600 … … 119 119 REAL(wp) :: EOS022 120 120 REAL(wp) :: EOS003 , EOS103 121 REAL(wp) :: EOS013 122 121 REAL(wp) :: EOS013 122 123 123 ! ALPHA parameters 124 124 REAL(wp) :: ALP000 , ALP100 , ALP200 , ALP300 , ALP400 , ALP500 … … 135 135 REAL(wp) :: ALP012 136 136 REAL(wp) :: ALP003 137 137 138 138 ! BETA parameters 139 139 REAL(wp) :: BET000 , BET100 , BET200 , BET300 , BET400 , BET500 … … 162 162 REAL(wp) :: PEN002 , PEN102 163 163 REAL(wp) :: PEN012 164 164 165 165 ! ALPHA_PEN parameters 166 166 REAL(wp) :: APE000 , APE100 , APE200 , APE300 … … 241 241 INTEGER , INTENT(in ) :: ktts, ktrd, ktdep 242 242 REAL(wp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 243 ! ! 2 : salinity [psu]243 ! ! 2 : salinity [psu] 244 244 REAL(wp), DIMENSION(A2D_T(ktrd) ,JPK ), INTENT( out) :: prd ! in situ density [-] 245 245 REAL(wp), DIMENSION(A2D_T(ktdep),JPK ), INTENT(in ) :: pdep ! depth [m] … … 301 301 & + rn_b0 * ( 1._wp - 0.5_wp*rn_lambda2*zs - rn_mu2*zh ) * zs & 302 302 & - rn_nu * zt * zs 303 ! 303 ! 304 304 prd(ji,jj,jk) = zn * r1_rho0 * ztm ! density anomaly (masked) 305 305 END_3D … … 354 354 INTEGER , INTENT(in ) :: ktts, ktrd, ktrhop, ktdep 355 355 REAL(wp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 356 ! ! 2 : salinity [psu]356 ! ! 2 : salinity [psu] 357 357 REAL(wp), DIMENSION(A2D_T(ktrd) ,JPK ), INTENT( out) :: prd ! in situ density [-] 358 358 REAL(wp), DIMENSION(A2D_T(ktrhop),JPK ), INTENT( out) :: prhop ! potential density (surface referenced) … … 467 467 END_3D 468 468 ENDIF 469 469 470 470 CASE( np_seos ) !== simplified EOS ==! 471 471 ! … … 503 503 END SELECT 504 504 ! 505 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', tab3d_2=prhop, clinfo2=' pot : ', kdim=jpk ) 505 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', & 506 & tab3d_2=prhop, clinfo2=' pot : ', kdim=jpk ) 506 507 ! 507 508 IF( ln_timing ) CALL timing_stop('eos-pot') … … 534 535 INTEGER , INTENT(in ) :: ktts, ktdep, ktrd 535 536 REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 536 ! ! 2 : salinity [psu]537 ! ! 2 : salinity [psu] 537 538 REAL(wp), DIMENSION(A2D_T(ktdep) ), INTENT(in ) :: pdep ! depth [m] 538 539 REAL(wp), DIMENSION(A2D_T(ktrd) ), INTENT( out) :: prd ! in situ density … … 666 667 ! 667 668 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 669 ! 670 zt = pts (ji,jj,jp_tem) * r1_T0 ! temperature 671 zs = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 ) ! square root salinity 672 ztm = tmask(ji,jj,1) ! tmask 673 ! 674 zn0 = (((((EOS060*zt & 675 & + EOS150*zs+EOS050)*zt & 676 & + (EOS240*zs+EOS140)*zs+EOS040)*zt & 677 & + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt & 678 & + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt & 679 & + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt & 680 & + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000 681 ! 682 ! 683 prhop(ji,jj) = zn0 * ztm ! potential density referenced at the surface 684 ! 685 END_2D 685 686 686 687 CASE( np_seos ) !== simplified EOS ==! … … 713 714 ! 714 715 END SELECT 716 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=prhop, clinfo1=' pot: ', kdim=1 ) 715 717 ! 716 718 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=prhop, clinfo1=' eos-pot: ' ) … … 741 743 !! ** Action : - pab : thermal/haline expansion ratio at T-points 742 744 !!---------------------------------------------------------------------- 743 INTEGER , INTENT(in ) :: Kmm ! time level index745 INTEGER , INTENT(in ) :: Kmm ! time level index 744 746 INTEGER , INTENT(in ) :: ktts, ktab 745 747 REAL(wp), DIMENSION(A2D_T(ktts),JPK,JPTS), INTENT(in ) :: pts ! pot. temperature & salinity … … 873 875 !! ** Action : - pab : thermal/haline expansion ratio at T-points 874 876 !!---------------------------------------------------------------------- 875 INTEGER 877 INTEGER , INTENT(in ) :: Kmm ! time level index 876 878 INTEGER , INTENT(in ) :: ktts, ktdep, ktab 877 879 REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in ) :: pts ! pot. temperature & salinity … … 1113 1115 !! *** ROUTINE bn2 *** 1114 1116 !! 1115 !! ** Purpose : Compute the local Brunt-Vaisala frequency at the 1117 !! ** Purpose : Compute the local Brunt-Vaisala frequency at the 1116 1118 !! time-step of the input arguments 1117 1119 !! … … 1120 1122 !! N.B. N^2 is set one for all to zero at jk=1 in istate module. 1121 1123 !! 1122 !! ** Action : pn2 : square of the brunt-vaisala frequency at w-point 1123 !! 1124 !!---------------------------------------------------------------------- 1125 INTEGER , INTENT(in ) ::Kmm ! time level index1124 !! ** Action : pn2 : square of the brunt-vaisala frequency at w-point 1125 !! 1126 !!---------------------------------------------------------------------- 1127 INTEGER , INTENT(in ) :: Kmm ! time level index 1126 1128 INTEGER , INTENT(in ) :: ktab, ktn2 1127 REAL(wp), DIMENSION(jpi,jpj, jpk,jpts), INTENT(in ) :: pts ! pot. temperature and salinity [Celsius,psu]1129 REAL(wp), DIMENSION(jpi,jpj, jpk,jpts), INTENT(in ) :: pts ! pot. temperature and salinity [Celsius,psu] 1128 1130 REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(in ) :: pab ! thermal/haline expansion coef. [Celsius-1,psu-1] 1129 1131 REAL(wp), DIMENSION(A2D_T(ktn2),JPK ), INTENT( out) :: pn2 ! Brunt-Vaisala frequency squared [1/s^2] … … 1137 1139 DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) ! interior points only (2=< jk =< jpkm1 ); surface and bottom value set to zero one for all in istate.F90 1138 1140 zrw = ( gdepw(ji,jj,jk ,Kmm) - gdept(ji,jj,jk,Kmm) ) & 1139 & / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) ) 1140 ! 1141 zaw = pab(ji,jj,jk,jp_tem) * (1. - zrw) + pab(ji,jj,jk-1,jp_tem) * zrw 1141 & / ( gdept(ji,jj,jk-1,Kmm) - gdept(ji,jj,jk,Kmm) ) 1142 ! 1143 zaw = pab(ji,jj,jk,jp_tem) * (1. - zrw) + pab(ji,jj,jk-1,jp_tem) * zrw 1142 1144 zbw = pab(ji,jj,jk,jp_sal) * (1. - zrw) + pab(ji,jj,jk-1,jp_sal) * zrw 1143 1145 ! … … 1211 1213 1212 1214 1213 SUBROUTINE 1215 SUBROUTINE eos_fzp_2d( psal, ptf, pdep ) 1214 1216 !! 1215 1217 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: psal ! salinity [psu] … … 1234 1236 !!---------------------------------------------------------------------- 1235 1237 INTEGER , INTENT(in ) :: kttf 1236 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ) :: psal ! salinity [psu]1237 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ), OPTIONAL :: pdep ! depth [m]1238 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ) :: psal ! salinity [psu] 1239 REAL(wp), DIMENSION(jpi,jpj) , INTENT(in ), OPTIONAL :: pdep ! depth [m] 1238 1240 REAL(wp), DIMENSION(A2D_T(kttf)), INTENT(out ) :: ptf ! freezing temperature [Celsius] 1239 1241 ! … … 1267 1269 CALL ctl_stop( 'eos_fzp_2d:', ctmp1 ) 1268 1270 ! 1269 END SELECT 1271 END SELECT 1270 1272 ! 1271 1273 END SUBROUTINE eos_fzp_2d_t … … 1324 1326 !! ** Purpose : Calculates nonlinear anomalies of alpha_PE, beta_PE and PE at T-points 1325 1327 !! 1326 !! ** Method : PE is defined analytically as the vertical 1328 !! ** Method : PE is defined analytically as the vertical 1327 1329 !! primitive of EOS times -g integrated between 0 and z>0. 1328 1330 !! pen is the nonlinear bsq-PE anomaly: pen = ( PE - rho0 gz ) / rho0 gz - rd 1329 !! = 1/z * /int_0^z rd dz - rd 1331 !! = 1/z * /int_0^z rd dz - rd 1330 1332 !! where rd is the density anomaly (see eos_rhd function) 1331 1333 !! ab_pe are partial derivatives of PE anomaly with respect to T and S: … … 1391 1393 ! 1392 1394 zn = ( zn2 * zh + zn1 ) * zh + zn0 1393 ! 1395 ! 1394 1396 pab_pe(ji,jj,jk,jp_tem) = zn * zh * r1_rho0 * ztm 1395 1397 ! … … 1406 1408 ! 1407 1409 zn = ( zn2 * zh + zn1 ) * zh + zn0 1408 ! 1410 ! 1409 1411 pab_pe(ji,jj,jk,jp_sal) = zn / zs * zh * r1_rho0 * ztm 1410 1412 ! … … 1504 1506 IF(lwp) WRITE(numout,*) ' ==>>> use of TEOS-10 equation of state (cons. temp. and abs. salinity)' 1505 1507 ! 1506 l_useCT = .TRUE. ! model temperature is Conservative temperature 1508 l_useCT = .TRUE. ! model temperature is Conservative temperature 1507 1509 ! 1508 1510 rdeltaS = 32._wp … … 1885 1887 1886 1888 r1_S0 = 0.875_wp/35.16504_wp ! Used to convert CT in potential temperature when using bulk formulae (eos_pt_from_ct) 1887 1889 1888 1890 IF(lwp) THEN 1889 1891 WRITE(numout,*) … … 1923 1925 END SELECT 1924 1926 ! 1925 rho0_rcp = rho0 * rcp 1927 rho0_rcp = rho0 * rcp 1926 1928 r1_rho0 = 1._wp / rho0 1927 1929 r1_rcp = 1._wp / rcp 1928 r1_rho0_rcp = 1._wp / rho0_rcp 1930 r1_rho0_rcp = 1._wp / rho0_rcp 1929 1931 ! 1930 1932 IF(lwp) THEN
Note: See TracChangeset
for help on using the changeset viewer.