New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 7278 for branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90 – NEMO

Ignore:
Timestamp:
2016-11-21T10:38:43+01:00 (8 years ago)
Author:
flavoni
Message:

update branch CNRS-2016 to trunk 6720

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90

    r7277 r7278  
    7575 
    7676   !                               !!** 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 
    7988 
    8089   !                               !!!  simplified eos coefficients (default value: Vallis 2006) 
     
    184193      !! ** Purpose :   Compute the in situ density (ratio rho/rau0) from 
    185194      !!       potential temperature and salinity using an equation of state 
    186       !!       defined through the namelist parameter nn_eos. 
     195      !!       selected in the nameos namelist 
    187196      !! 
    188197      !! ** Method  :   prd(t,s,z) = ( rho(t,s,z) - rau0 ) / rau0 
     
    194203      !!                rau0   reference density            kg/m^3 
    195204      !! 
    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). 
    197206      !!         Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celsius, sa=35.5 g/kg 
    198207      !! 
    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). 
    200209      !!         Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celsius, sp=35.5 psu 
    201210      !! 
    202       !!     nn_eos =  1 : simplified equation of state 
     211      !!     ln_seos : simplified equation of state 
    203212      !!              prd(t,s,z) = ( -a0*(1+lambda/2*(T-T0)+mu*z+nu*(S-S0))*(T-T0) + b0*(S-S0) ) / rau0 
    204213      !!              linear case function of T only: rn_alpha<>0, other coefficients = 0 
     
    224233      IF( nn_timing == 1 )   CALL timing_start('eos-insitu') 
    225234      ! 
    226       SELECT CASE( nn_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 ==! 
    229238         ! 
    230239         DO jk = 1, jpkm1 
     
    266275         END DO 
    267276         ! 
    268       CASE( 1 )                !==  simplified EOS  ==! 
     277      CASE( np_seos )                !==  simplified EOS  ==! 
    269278         ! 
    270279         DO jk = 1, jpkm1 
     
    300309      !! ** Purpose :   Compute the in situ density (ratio rho/rau0) and the 
    301310      !!      potential volumic mass (Kg/m3) from potential temperature and 
    302       !!      salinity fields using an equation of state defined through the 
    303       !!     namelist parameter nn_eos. 
     311      !!      salinity fields using an equation of state selected in the 
     312      !!     namelist. 
    304313      !! 
    305314      !! ** Action  : - prd  , the in situ density (no units) 
     
    322331      IF( nn_timing == 1 )   CALL timing_start('eos-pot') 
    323332      ! 
    324       SELECT CASE ( nn_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 ==! 
    327336         ! 
    328337         ! Stochastic equation of state 
     
    430439         ENDIF 
    431440          
    432       CASE( 1 )                !==  simplified EOS  ==! 
     441      CASE( np_seos )                !==  simplified EOS  ==! 
    433442         ! 
    434443         DO jk = 1, jpkm1 
     
    467476      !! ** Purpose :   Compute the in situ density (ratio rho/rau0) from 
    468477      !!      potential temperature and salinity using an equation of state 
    469       !!      defined through the namelist parameter nn_eos. * 2D field case 
     478      !!      selected in the nameos namelist. * 2D field case 
    470479      !! 
    471480      !! ** Action  : - prd , the in situ density (no units) (unmasked) 
     
    486495      prd(:,:) = 0._wp 
    487496      ! 
    488       SELECT CASE( nn_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 ==! 
    491500         ! 
    492501         DO jj = 1, jpjm1 
     
    527536         CALL lbc_lnk( prd, 'T', 1. )                    ! Lateral boundary conditions 
    528537         ! 
    529       CASE( 1 )                !==  simplified EOS  ==! 
     538      CASE( np_seos )                !==  simplified EOS  ==! 
    530539         ! 
    531540         DO jj = 1, jpjm1 
     
    576585      IF( nn_timing == 1 )   CALL timing_start('rab_3d') 
    577586      ! 
    578       SELECT CASE ( nn_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 ==! 
    581590         ! 
    582591         DO jk = 1, jpkm1 
     
    635644         END DO 
    636645         ! 
    637       CASE( 1 )                  !==  simplified EOS  ==! 
     646      CASE( np_seos )                  !==  simplified EOS  ==! 
    638647         ! 
    639648         DO jk = 1, jpkm1 
     
    657666      CASE DEFAULT 
    658667         IF(lwp) WRITE(numout,cform_err) 
    659          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     668         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    660669         nstop = nstop + 1 
    661670         ! 
     
    668677      ! 
    669678   END SUBROUTINE rab_3d 
     679 
    670680 
    671681   SUBROUTINE rab_2d( pts, pdep, pab ) 
     
    690700      pab(:,:,:) = 0._wp 
    691701      ! 
    692       SELECT CASE ( nn_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 ==! 
    695705         ! 
    696706         DO jj = 1, jpjm1 
     
    750760         CALL lbc_lnk( pab(:,:,jp_sal), 'T', 1. )                     
    751761         ! 
    752       CASE( 1 )                  !==  simplified EOS  ==! 
     762      CASE( np_seos )                  !==  simplified EOS  ==! 
    753763         ! 
    754764         DO jj = 1, jpjm1 
     
    773783      CASE DEFAULT 
    774784         IF(lwp) WRITE(numout,cform_err) 
    775          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     785         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    776786         nstop = nstop + 1 
    777787         ! 
     
    806816      pab(:) = 0._wp 
    807817      ! 
    808       SELECT CASE ( nn_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 ==! 
    811821         ! 
    812822         ! 
     
    859869         ! 
    860870         ! 
    861       CASE( 1 )                  !==  simplified EOS  ==! 
     871      CASE( np_seos )                  !==  simplified EOS  ==! 
    862872         ! 
    863873         zt    = pts(jp_tem) - 10._wp   ! pot. temperature anomaly (t-T0) 
    864874         zs    = pts(jp_sal) - 35._wp   ! abs. salinity anomaly (s-S0) 
    865          zh    = pdep                    ! depth at the partial step level 
     875         zh    = pdep                   ! depth at the partial step level 
    866876         ! 
    867877         zn  = rn_a0 * ( 1._wp + rn_lambda1*zt + rn_mu1*zh ) + rn_nu*zs 
     
    873883      CASE DEFAULT 
    874884         IF(lwp) WRITE(numout,cform_err) 
    875          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     885         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    876886         nstop = nstop + 1 
    877887         ! 
     
    10051015      REAL(wp), DIMENSION(jpi,jpj), INTENT(out  )           ::   ptf    ! freezing temperature [Celsius] 
    10061016      ! 
    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 
    10151026         DO jj = 1, jpj 
    10161027            DO ji = 1, jpi 
    1017                zs= SQRT( ABS( psal(ji,jj) ) * r1_S0 )           ! square root salinity 
     1028               zs= SQRT( ABS( psal(ji,jj) ) * z1_S0 )           ! square root salinity 
    10181029               ptf(ji,jj) = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs & 
    10191030                  &          - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp 
     
    10241035         IF( PRESENT( pdep ) )   ptf(:,:) = ptf(:,:) - 7.53e-4 * pdep(:,:) 
    10251036         ! 
    1026       CASE ( 0 )                     !==  PT,SP (UNESCO formulation)  ==! 
     1037      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==! 
    10271038         ! 
    10281039         ptf(:,:) = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal(:,:) )   & 
     
    10331044      CASE DEFAULT 
    10341045         IF(lwp) WRITE(numout,cform_err) 
    1035          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     1046         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    10361047         nstop = nstop + 1 
    10371048         ! 
     
    10391050      ! 
    10401051  END SUBROUTINE eos_fzp_2d 
     1052 
    10411053 
    10421054  SUBROUTINE eos_fzp_0d( psal, ptf, pdep ) 
     
    10591071      !!---------------------------------------------------------------------- 
    10601072      ! 
    1061       SELECT CASE ( nn_eos ) 
    1062       ! 
    1063       CASE ( -1, 1 )                !==  CT,SA (TEOS-10 formulation) ==! 
    1064          ! 
    1065          zs  = SQRT( ABS( psal ) * r1_S0 )           ! square root salinity 
     1073      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 
    10661078         ptf = ((((1.46873e-03_wp*zs-9.64972e-03_wp)*zs+2.28348e-02_wp)*zs & 
    10671079                  &          - 3.12775e-02_wp)*zs+2.07679e-02_wp)*zs-5.87701e-02_wp 
     
    10701082         IF( PRESENT( pdep ) )   ptf = ptf - 7.53e-4 * pdep 
    10711083         ! 
    1072       CASE ( 0 )                     !==  PT,SP (UNESCO formulation)  ==! 
     1084      CASE ( np_eos80 )                !==  PT,SP (UNESCO formulation)  ==! 
    10731085         ! 
    10741086         ptf = ( - 0.0575_wp + 1.710523e-3_wp * SQRT( psal )   & 
     
    10791091      CASE DEFAULT 
    10801092         IF(lwp) WRITE(numout,cform_err) 
    1081          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     1093         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    10821094         nstop = nstop + 1 
    10831095         ! 
     
    11181130      IF( nn_timing == 1 )   CALL timing_start('eos_pen') 
    11191131      ! 
    1120       SELECT CASE ( nn_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 ==! 
    11231135         ! 
    11241136         DO jk = 1, jpkm1 
     
    11831195         END DO 
    11841196         ! 
    1185       CASE( 1 )                !==  Vallis (2006) simplified EOS  ==! 
     1197      CASE( np_seos )                !==  Vallis (2006) simplified EOS  ==! 
    11861198         ! 
    11871199         DO jk = 1, jpkm1 
     
    12051217      CASE DEFAULT 
    12061218         IF(lwp) WRITE(numout,cform_err) 
    1207          IF(lwp) WRITE(numout,*) '          bad flag value for nn_eos = ', nn_eos 
     1219         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos 
    12081220         nstop = nstop + 1 
    12091221         ! 
     
    12241236      !!---------------------------------------------------------------------- 
    12251237      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,   & 
    12281241         &                                             rn_lambda2, rn_mu2, rn_nu 
    12291242      !!---------------------------------------------------------------------- 
     
    12451258         WRITE(numout,*) 'eos_init : equation of state' 
    12461259         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 
    12551264      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  ==! 
    12601276         IF(lwp) WRITE(numout,*) 
    12611277         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  
    12621280         ! 
    12631281         rdeltaS = 32._wp 
     
    14461464         BPE002 = 1.7269476440e-04_wp 
    14471465         ! 
    1448       CASE( 0 )                        !==  polynomial EOS-80 formulation  ==! 
     1466      CASE( np_eos80 )                        !==  polynomial EOS-80 formulation  ==! 
    14491467         ! 
    14501468         IF(lwp) WRITE(numout,*) 
    14511469         IF(lwp) WRITE(numout,*) '          use of EOS-80 equation of state (pot. temp. and pract. salinity)' 
    14521470         ! 
     1471         l_useCT = .FALSE.                         ! model temperature is Potential temperature 
    14531472         rdeltaS = 20._wp 
    14541473         r1_S0  = 1._wp/40._wp 
     
    16361655         BPE002 = 5.3661089288e-04_wp 
    16371656         ! 
    1638       CASE( 1 )                        !==  Simplified EOS     ==! 
     1657      CASE( np_seos )                        !==  Simplified EOS     ==! 
    16391658         IF(lwp) THEN 
    16401659            WRITE(numout,*) 
     
    16511670            WRITE(numout,*) '               Caution: rn_beta0=0 incompatible with ddm parameterization ' 
    16521671         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' 
    16561676         CALL ctl_stop( ctmp1 ) 
    16571677         ! 
     
    16621682      r1_rcp      = 1._wp / rcp 
    16631683      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 
    16641693      ! 
    16651694      IF(lwp) WRITE(numout,*) 
Note: See TracChangeset for help on using the changeset viewer.