MODULE usrdef_istate !!====================================================================== !! *** MODULE usrdef_istate *** !! !! === GYRE configuration === !! !! User defined : set the initial state of a user configuration !!====================================================================== !! History : 4.0 ! 2016-03 (S. Flavoni) Original code !! ! 2021-10 (D. Bruciaferri) JMMP initial condition for !! HPGE test !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! usr_def_istate : initial state in Temperature and salinity !!---------------------------------------------------------------------- USE par_oce ! ocean space and time domain USE phycst ! physical constants USE splines USE dtatsd ! data temperature and salinity (dta_tsd routine) ! USE in_out_manager ! I/O manager USE lib_mpp ! MPP library IMPLICIT NONE PRIVATE PUBLIC usr_def_istate ! called in istate.F90 !!---------------------------------------------------------------------- !! NEMO/OCE 4.0 , NEMO Consortium (2018) !! $Id: usrdef_istate.F90 10069 2018-08-28 14:12:24Z nicolasmartin $ !! Software governed by the CeCILL license (see ./LICENSE) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv, pssh ) !!---------------------------------------------------------------------- !! *** ROUTINE usr_def_istate *** !! !! ** Purpose : Initialization of the dynamics and tracers !! Here GYRE configuration example : (double gyre with rotated domain) !! !! ** Method : - set temprature field !! - set salinity field !!---------------------------------------------------------------------- REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: pdept ! depth of t-point [m] REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: ptmask ! t-point ocean mask [m] REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT( out) :: pts ! T & S fields [Celsius ; g/kg] REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pu ! i-component of the velocity [m/s] REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pv ! j-component of the velocity [m/s] REAL(wp), DIMENSION(jpi,jpj) , INTENT( out) :: pssh ! sea-surface height ! REAL(wp), DIMENSION(42) :: zdep, zsal, ztem REAL(wp) :: a0, a1, a2, b0, b1, b2 INTEGER :: ji, jj, jk ! dummy loop indices !!---------------------------------------------------------------------- ! IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'usr_def_istate : analytical definition of initial state ' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~ Ocean at rest, with an horizontally uniform T and S profiles' ! pu (:,:,:) = 0._wp ! ocean at rest pv (:,:,:) = 0._wp pssh(:,:) = 0._wp ! zdep(:) = (/ & & 5.02, 15.08, 25.16, 35.28, 45.45, 55.69, & & 66.04, 76.55, 87.27, 98.31, 109.81, 121.95, & & 135.03, 149.43, 165.73, 184.70, 207.43, 235.39, & & 270.53, 315.37, 372.97, 446.80, 540.50, 657.32, & & 799.55, 968.00, 1161.81, 1378.66, 1615.29, 1868.07, & & 2133.52, 2408.58, 2690.78, 2978.17, 3269.28, 3563.04, & & 3858.68, 4155.63, 4453.50, 4752.02, 5050.99, 6300.27 & & /) SELECT CASE(nn_tsd_type) CASE(1) ! T/S July on-shelf ztem(:) = (/ & & 13.8059, 13.1661, 12.0471, 10.7265, 9.5585, 8.7273, & & 8.2527, 7.9696, 7.7605, 7.5965, 7.5038, 7.5018, & & 7.5609, 7.6436, 7.7050, 7.7011, 7.5887, 7.3471, & & 6.9203, 6.1857, 5.2453, 4.1932, 3.4076, 2.8450, & & 2.6111, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, & & 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, & & 2.5000, 2.5000, 2.5000, 2.5000, 2.5000, 2.5000 & & /) zsal(:) = (/ & & 33.7727, 33.9841, 34.2683, 34.5326, 34.7335, 34.9079, & & 35.0119, 35.0726, 35.0902, 35.1034, 35.1101, 35.1223, & & 35.1436, 35.1718, 35.1893, 35.1929, 35.1828, 35.1670, & & 35.1408, 35.0990, 35.0415, 34.9760, 34.9168, 34.8753, & & 34.8558, 34.8502, 34.8504, 34.8506, 34.8508, 34.8510, & & 34.8512, 34.8514, 34.8516, 34.8518, 34.8520, 34.8522, & & 34.8524, 34.8526, 34.8528, 34.8530, 34.8532, 34.8534 & & /) CASE(2) ! T/S July off-shelf ztem(:) = (/ & & 13.0669, 12.8587, 12.4760, 11.9986, 11.5363, 11.1627, & & 10.8898, 10.6753, 10.4927, 10.3334, 10.2182, 10.1457, & & 10.1038, 10.0734, 10.0389, 9.9968, 9.9459, 9.8836, & & 9.8069, 9.6953, 9.5345, 9.2901, 8.9319, 8.4192, & & 7.7006, 6.7895, 5.7774, 4.8576, 4.1510, 3.6716, & & 3.3331, 3.0606, 2.8275, 2.6317, 2.4735, 2.3497, & & 2.2601, 2.1973, 2.1555, 2.1237, 2.1072, 2.1000 & & /) zsal(:) = (/ & & 35.2001, 35.2052, 35.2186, 35.2411, 35.2661, 35.2873, & & 35.3021, 35.3124, 35.3205, 35.3267, 35.3304, 35.3330, & & 35.3355, 35.3393, 35.3422, 35.3438, 35.3436, 35.3428, & & 35.3413, 35.3374, 35.3313, 35.3239, 35.3192, 35.3171, & & 35.3171, 35.3171, 35.3171, 35.3171, 35.3171, 35.3171, & & 35.3171, 35.3171, 35.3171, 35.3171, 35.3171, 35.3171, & & 35.3171, 35.3171, 35.3171, 35.3171, 35.3171, 35.3171 & & /) CASE(3) ! T/S January on-shelf ztem(:) = (/ & & 7.8383, 7.9482, 8.0837, 8.1641, 8.1750, 8.1510, & & 8.1110, 8.0510, 7.9648, 7.8804, 7.8221, 7.8020, & & 7.7959, 7.7919, 7.8288, 7.8825, 7.9012, 7.7028, & & 7.2095, 6.3642, 5.2466, 4.0221, 2.9315, 2.1751, & & 1.7760, 1.6325, 1.6008, 1.6000, 1.6000, 1.6000, & & 1.6000, 1.6000, 1.6000, 1.6000, 1.6000, 1.6000, & & 1.6000, 1.6000, 1.6000, 1.6000, 1.6000, 1.6000 & & /) zsal(:) = (/ & & 34.0842, 34.1682, 34.3100, 34.4740, 34.6210, 34.7275, & & 34.7861, 34.8231, 34.8661, 34.9293, 34.9936, 35.0405, & & 35.0618, 35.0683, 35.0791, 35.0980, 35.1224, 35.1287, & & 35.1140, 35.0773, 35.0315, 34.9838, 34.9431, 34.9159, & & 34.9019, 34.8971, 34.8960, 34.8962, 34.8964, 34.8966, & & 34.8968, 34.8970, 34.8972, 34.8974, 34.8976, 34.8978, & & 34.8980, 34.8982, 34.8984, 34.8986, 34.8988, 34.8990 & & /) CASE(4) ! T/S January off-shelf ztem(:) = (/ & & 9.9555, 9.9499, 9.9411, 9.9311, 9.9211, 9.9111, & & 9.9011, 9.8911, 9.8811, 9.8711, 9.8611, 9.8511, & & 9.8411, 9.8311, 9.8211, 9.8111, 9.8011, 9.7911, & & 9.7840, 9.7487, 9.6420, 9.3992, 9.0030, 8.4382, & & 7.7101, 6.8430, 5.9185, 5.0553, 4.3437, 3.8076, & & 3.4096, 3.0998, 2.8462, 2.6397, 2.4862, 2.3868, & & 2.3374, 2.3159, 2.3059, 2.2959, 2.2870, 2.2815 & & /) zsal(:) = (/ & & 35.2802, 35.2808, 35.2817, 35.2827, 35.2837, 35.2847, & & 35.2857, 35.2867, 35.2877, 35.2887, 35.2897, 35.2907, & & 35.2917, 35.2927, 35.2937, 35.2947, 35.2957, 35.2967, & & 35.2998, 35.3032, 35.3048, 35.2985, 35.2851, 35.2640, & & 35.2340, 35.1899, 35.1320, 35.0692, 35.0150, 34.9784, & & 34.9598, 34.9527, 34.9502, 34.9474, 34.9436, 34.9397, & & 34.9379, 34.9378, 34.9388, 34.9398, 34.9407, 34.9413 & & /) CASE(5) ! Analytic T/S July on-shelf ! a0 = 13.0 ! a1 = 0.00507078656 ! a2 = 2.37539619 ! b0 = -1.1 ! b1 = 0.01 ! b2 = 34.85 CASE(6) ! Analytic T in the tropical Atlantic ocean rn_sal_sf = 35 a0 = 0.2 a1 = 6.0 a2 = 20. b0 = 2500. b1 = 250. END SELECT IF (nn_tsd_type < 5) THEN ! Use spline smoothing ! horizontally uniform T & S profiles DO jj = 1, jpj DO ji = 1, jpi pts(ji,jj,:,jp_tem) = spline3(zdep,ztem,pdept(ji,jj,:)) !* ptmask(ji,jj,:) pts(ji,jj,:,jp_sal) = spline3(zdep,zsal,pdept(ji,jj,:)) !* ptmask(ji,jj,:) END DO END DO ELSE IF (nn_tsd_type == 5) THEN ! Siddorn & Furner 2013 analytical function DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi pts(ji,jj,jk,jp_sal) = rn_sal_sf !* ptmask(ji,jj,jk) pts(ji,jj,jk,jp_tem) = ( rn_c0_sf * ( 1-TANH(((pdept(ji,jj,jk)-rn_mld_sf)/20)*3.1415927/180) ) & + rn_c1_sf * ((rn_maxdep_sf- pdept(ji,jj,jk)) / rn_maxdep_sf) ) !* ptmask(ji,jj,jk) END DO END DO END DO ELSE IF (nn_tsd_type == 6) THEN ! Shchepetkin and McWilliams 2003 analytical function DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi pts(ji,jj,jk,jp_sal) = rn_sal_sf !* ptmask(ji,jj,jk) pts(ji,jj,jk,jp_tem) = a0 + a1*EXP(-pdept(ji,jj,jk)/b0) & + a2*EXP(-pdept(ji,jj,jk)/b1) !* ptmask(ji,jj,jk) END DO END DO END DO END IF END SUBROUTINE usr_def_istate !!====================================================================== END MODULE usrdef_istate