Changeset 15425
- Timestamp:
- 2021-10-21T14:35:55+02:00 (2 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_CO9_package/src/OCE/USR/usrdef_sbc.F90
r14075 r15425 3 3 !! *** MODULE usrdef_sbc *** 4 4 !! 5 !! === GYRE configuration ===5 !! 6 6 !! 7 !! User defined : s urface forcing of a user configuration7 !! User defined : set all surface forcing to 0 8 8 !!====================================================================== 9 9 !! History : 4.0 ! 2016-03 (S. Flavoni, G. Madec) user defined interface … … 11 11 12 12 !!---------------------------------------------------------------------- 13 !! usrdef_sbc : user defined surface bounday conditions in GYRE case13 !! usrdef_sbc : user defined surface bounday conditions 14 14 !!---------------------------------------------------------------------- 15 15 USE oce ! ocean dynamics and tracers … … 43 43 !! *** ROUTINE usrdef_sbc *** 44 44 !! 45 !! ** Purpose : provide at each time-step the GYREsurface boundary45 !! ** Purpose : provide at each time-step the surface boundary 46 46 !! condition, i.e. the momentum, heat and freshwater fluxes. 47 47 !! 48 !! ** Method : analytical seasonal cycle for GYRE configuration. 49 !! CAUTION : never mask the surface stress field ! 50 !! 48 !! ** Method : Set all surface forcing to 0 51 49 !! ** Action : - set the ocean surface boundary condition, i.e. 52 50 !! utau, vtau, taum, wndm, qns, qsr, emp, sfx 53 51 !! 54 !! Reference : Hazeleger, W., and S. Drijfhout, JPO, 30, 677-695, 2000.55 52 !!---------------------------------------------------------------------- 56 53 INTEGER, INTENT(in) :: kt ! ocean time step 57 !!58 INTEGER :: ji, jj ! dummy loop indices59 INTEGER :: zyear0 ! initial year60 INTEGER :: zmonth0 ! initial month61 INTEGER :: zday0 ! initial day62 INTEGER :: zday_year0 ! initial day since january 1st63 REAL(wp) :: ztau , ztau_sais ! wind intensity and of the seasonal cycle64 REAL(wp) :: ztime ! time in hour65 REAL(wp) :: ztimemax , ztimemin ! 21th June, and 21th decem. if date0 = 1st january66 REAL(wp) :: ztimemax1, ztimemin1 ! 21th June, and 21th decem. if date0 = 1st january67 REAL(wp) :: ztimemax2, ztimemin2 ! 21th June, and 21th decem. if date0 = 1st january68 REAL(wp) :: ztaun ! intensity69 REAL(wp) :: zemp_s, zemp_n, zemp_sais, ztstar70 REAL(wp) :: zcos_sais1, zcos_sais2, ztrp, zconv, t_star71 REAL(wp) :: zsumemp, zsurf72 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m373 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient74 REAL(wp) :: ztx, zty, zmod, zcoef ! temporary variables75 REAL(wp) :: zyydd ! number of days in one year76 !!---------------------------------------------------------------------77 zyydd = REAL(nyear_len(1),wp)78 54 79 55 ! ---------------------------- ! 80 56 ! heat and freshwater fluxes ! 81 57 ! ---------------------------- ! 82 !same temperature, E-P as in HAZELEGER 200083 84 zyear0 = ndate0 / 10000 ! initial year85 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 ! initial month86 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 ! initial day betwen 1 and 3087 zday_year0 = ( zmonth0 - 1 ) * 30.+zday0 ! initial day betwen 1 and 36088 89 ! current day (in hours) since january the 1st of the current year90 ztime = REAL( kt ) * rdt / (rmmss * rhhmm) & ! total incrementation (in hours)91 & - (nyear - 1) * rjjhh * zyydd ! minus years since beginning of experiment (in hours)92 93 ztimemax1 = ((5.*30.)+21.)* 24. ! 21th june at 24h in hours94 ztimemin1 = ztimemax1 + rjjhh * zyydd / 2 ! 21th december in hours95 ztimemax2 = ((6.*30.)+21.)* 24. ! 21th july at 24h in hours96 ztimemin2 = ztimemax2 - rjjhh * zyydd / 2 ! 21th january in hours97 ! ! NB: rjjhh * zyydd / 4 = one seasonal cycle in hours98 99 ! amplitudes100 zemp_S = 0.7 ! intensity of COS in the South101 zemp_N = 0.8 ! intensity of COS in the North102 zemp_sais = 0.1103 zTstar = 28.3 ! intemsity from 28.3 a -5 deg104 105 ! 1/2 period between 21th June and 21th December and between 21th July and 21th January106 zcos_sais1 = COS( (ztime - ztimemax1) / (ztimemin1 - ztimemax1) * rpi )107 zcos_sais2 = COS( (ztime - ztimemax2) / (ztimemax2 - ztimemin2) * rpi )108 109 ztrp= - 40.e0 ! retroaction term on heat fluxes (W/m2/K)110 zconv = 3.16e-5 ! convertion factor: 1 m/yr => 3.16e-5 mm/s111 DO jj = 1, jpj112 DO ji = 1, jpi113 ! domain from 15 deg to 50 deg between 27 and 28 degC at 15N, -3114 ! and 13 degC at 50N 53.5 + or - 11 = 1/4 period :115 ! 64.5 in summer, 42.5 in winter116 t_star = zTstar * ( 1. + 1. / 50. * zcos_sais2 ) &117 & * COS( rpi * (gphit(ji,jj) - 5.) &118 & / ( 53.5 * ( 1 + 11 / 53.5 * zcos_sais2 ) * 2.) )119 ! 23.5 deg : tropics120 qsr (ji,jj) = 230 * COS( 3.1415 * ( gphit(ji,jj) - 23.5 * zcos_sais1 ) / ( 0.9 * 180 ) )121 qns (ji,jj) = ztrp * ( tsb(ji,jj,1,jp_tem) - t_star ) - qsr(ji,jj)122 IF( gphit(ji,jj) >= 14.845 .AND. 37.2 >= gphit(ji,jj) ) THEN ! zero at 37.8 deg, max at 24.6 deg123 emp (ji,jj) = zemp_S * zconv &124 & * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (24.6 - 37.2) ) &125 & * ( 1 - zemp_sais / zemp_S * zcos_sais1)126 ELSE127 emp (ji,jj) = - zemp_N * zconv &128 & * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (46.8 - 37.2) ) &129 & * ( 1 - zemp_sais / zemp_N * zcos_sais1 )130 ENDIF131 END DO132 END DO133 134 zsumemp = GLOB_SUM( 'usrdef_sbc', emp (:,:) )135 zsurf = GLOB_SUM( 'usrdef_sbc', tmask(:,:,1) )136 zsumemp = zsumemp / zsurf ! Default GYRE configuration137 58 138 59 ! freshwater (mass flux) and update of qns with heat content of emp 139 emp (:,:) = emp(:,:) - zsumemp * tmask(:,:,1) ! freshwater flux (=0 in domain average) 140 sfx (:,:) = 0.0_wp ! no salt flux 141 qns (:,:) = qns(:,:) - emp(:,:) * sst_m(:,:) * rcp ! evap and precip are at SST 142 60 emp (:,:) = 0.0_wp ! freshwater flux 61 sfx (:,:) = 0.0_wp ! no salt flux 62 qns (:,:) = 0.0_wp ! non solar heat flux 63 qsr (:,:) = 0.0_wp ! solar heat flux 64 143 65 144 66 ! ---------------------------- ! 145 67 ! momentum fluxes ! 146 68 ! ---------------------------- ! 147 ! same wind as in Wico 148 !test date0 : ndate0 = 010203 149 zyear0 = ndate0 / 10000 150 zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 151 zday0 = ndate0 - zyear0 * 10000 - zmonth0 * 100 152 !Calculates nday_year, day since january 1st 153 zday_year0 = (zmonth0-1)*30.+zday0 154 155 !accumulates days of previous months of this year 156 ! day (in hours) since january the 1st 157 ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm) & ! incrementation in hour 158 & - (nyear - 1) * rjjhh * zyydd ! - nber of hours the precedent years 159 ztimemax = ((5.*30.)+21.)* 24. ! 21th june in hours 160 ztimemin = ztimemax + rjjhh * zyydd / 2 ! 21th december in hours 161 ! ! NB: rjjhh * zyydd / 4 = 1 seasonal cycle in hours 162 163 ! mean intensity at 0.105 ; srqt(2) because projected with 45deg angle 164 ztau = 0.105 / SQRT( 2. ) 165 ! seasonal oscillation intensity 166 ztau_sais = 0.015 167 ztaun = ztau - ztau_sais * COS( (ztime - ztimemax) / (ztimemin - ztimemax) * rpi ) 168 DO jj = 1, jpj 169 DO ji = 1, jpi 170 ! domain from 15deg to 50deg and 1/2 period along 14deg 171 ! so 5/4 of half period with seasonal cycle 172 utau(ji,jj) = - ztaun * SIN( rpi * (gphiu(ji,jj) - 15.) / (29.-15.) ) 173 vtau(ji,jj) = ztaun * SIN( rpi * (gphiv(ji,jj) - 15.) / (29.-15.) ) 174 END DO 175 END DO 176 177 ! module of wind stress and wind speed at T-point 178 zcoef = 1. / ( zrhoa * zcdrag ) 179 DO jj = 2, jpjm1 180 DO ji = fs_2, fs_jpim1 ! vect. opt. 181 ztx = utau(ji-1,jj ) + utau(ji,jj) 182 zty = vtau(ji ,jj-1) + vtau(ji,jj) 183 zmod = 0.5 * SQRT( ztx * ztx + zty * zty ) 184 taum(ji,jj) = zmod 185 wndm(ji,jj) = SQRT( zmod * zcoef ) 186 END DO 187 END DO 69 utau(:,:) = 0.0_wp 70 vtau(:,:) = 0.0_wp 71 taum(:,:) = 0.0_wp 72 wndm(:,:) = 0.0_wp 188 73 CALL lbc_lnk_multi( 'usrdef_sbc', taum(:,:), 'T', 1. , wndm(:,:), 'T', 1. ) 189 74 … … 193 78 IF( kt == nit000 .AND. lwp ) THEN 194 79 WRITE(numout,*) 195 WRITE(numout,*)'usrdef_sbc_oce : a nalytical surface fluxes for GYRE configuration'80 WRITE(numout,*)'usrdef_sbc_oce : all surface fluxes set to 0' 196 81 WRITE(numout,*)'~~~~~~~~~~~ ' 197 WRITE(numout,*)' nyear = ', nyear 198 WRITE(numout,*)' nmonth = ', nmonth 199 WRITE(numout,*)' nday = ', nday 200 WRITE(numout,*)' nday_year = ', nday_year 201 WRITE(numout,*)' ztime = ', ztime 202 WRITE(numout,*)' ztimemax = ', ztimemax 203 WRITE(numout,*)' ztimemin = ', ztimemin 204 WRITE(numout,*)' ztimemax1 = ', ztimemax1 205 WRITE(numout,*)' ztimemin1 = ', ztimemin1 206 WRITE(numout,*)' ztimemax2 = ', ztimemax2 207 WRITE(numout,*)' ztimemin2 = ', ztimemin2 208 WRITE(numout,*)' zyear0 = ', zyear0 209 WRITE(numout,*)' zmonth0 = ', zmonth0 210 WRITE(numout,*)' zday0 = ', zday0 211 WRITE(numout,*)' zday_year0 = ', zday_year0 212 WRITE(numout,*)' zyydd = ', zyydd 213 WRITE(numout,*)' zemp_S = ', zemp_S 214 WRITE(numout,*)' zemp_N = ', zemp_N 215 WRITE(numout,*)' zemp_sais = ', zemp_sais 216 WRITE(numout,*)' zTstar = ', zTstar 217 WRITE(numout,*)' zsumemp = ', zsumemp 218 WRITE(numout,*)' zsurf = ', zsurf 219 WRITE(numout,*)' ztrp = ', ztrp 220 WRITE(numout,*)' zconv = ', zconv 221 WRITE(numout,*)' ndastp = ', ndastp 222 WRITE(numout,*)' adatrj = ', adatrj 82 223 83 ENDIF 224 84 !
Note: See TracChangeset
for help on using the changeset viewer.