Changeset 14592
- Timestamp:
- 2021-03-05T17:03:57+01:00 (3 years ago)
- Location:
- NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/ABL/ablmod.F90
r14433 r14592 104 104 ! 105 105 REAL(wp), DIMENSION(1:jpi,1:jpj ) :: zwnd_i, zwnd_j 106 REAL(wp), DIMENSION(1:jpi,1:jpj ) :: zsspt 107 REAL(wp), DIMENSION(1:jpi,1:jpj ) :: ztabs, zpre 106 108 REAL(wp), DIMENSION(1:jpi ,2:jpka) :: zCF 107 109 ! … … 142 144 zrough(:,:) = z0_from_Cd( ght_abl(2), pCd_du(:,:) / MAX( pwndm(:,:), 0.5_wp ) ) ! #LB: z0_from_Cd is define in sbc_phy.F90... 143 145 146 ! sea surface potential temperature [K] 147 zsspt(:,:) = theta_exner( psst(:,:)+rt0, pslp_dta(:,:) ) 148 144 149 ! 145 150 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< … … 187 192 DO ji = 1,jpi ! surface boundary condition for temperature 188 193 zztmp1 = psen(ji, jj) 189 zztmp2 = psen(ji, jj) * ( psst(ji, jj) + rt0)194 zztmp2 = psen(ji, jj) * zsspt(ji, jj) 190 195 #if defined key_si3 191 196 zztmp1 = zztmp1 * pfrac_oce(ji,jj) + (1._wp - pfrac_oce(ji,jj)) * psen_ice(ji,jj) … … 495 500 zcff2 = jp_alp3_dyn * zsig**3 + jp_alp2_dyn * zsig**2 & 496 501 & + jp_alp1_dyn * zsig + jp_alp0_dyn 497 zcff = (1._wp-zmsk) + zmsk * zcff2 * rn_Dt ! zcff = 1 for masked points 498 ! rn_Dt = rDt_abl / nn_fsbc 502 zcff = (1._wp-zmsk) + zmsk * zcff2 * rDt_abl ! zcff = 1 for masked points 499 503 zcff = zcff * rest_eq(ji,jj) 500 504 u_abl( ji, jj, jk, nt_a ) = (1._wp - zcff ) * u_abl( ji, jj, jk, nt_a ) & … … 518 522 zcff2 = jp_alp3_tra * zsig**3 + jp_alp2_tra * zsig**2 & 519 523 & + jp_alp1_tra * zsig + jp_alp0_tra 520 zcff = (1._wp-zmsk) + zmsk * zcff2 * rn_Dt ! zcff = 1 for masked points 521 ! rn_Dt = rDt_abl / nn_fsbc 524 zcff = (1._wp-zmsk) + zmsk * zcff2 * rDt_abl ! zcff = 1 for masked points 522 525 tq_abl( ji, jj, jk, nt_a, jp_ta ) = (1._wp - zcff ) * tq_abl( ji, jj, jk, nt_a, jp_ta ) & 523 526 & + zcff * pt_dta( ji, jj, jk ) … … 586 589 ! 587 590 DO_2D( 1, 1, 1, 1 ) 588 ztemp = tq_abl( ji, jj, 2, nt_a, jp_ta ) 589 zhumi = tq_abl( ji, jj, 2, nt_a, jp_qa ) 590 zcff = rho_air( ztemp, zhumi, pslp_dta( ji, jj ) ) 591 psen( ji, jj ) = - cp_air(zhumi) * zcff * psen(ji,jj) * ( psst(ji,jj) + rt0 - ztemp ) !GS: negative sign to respect aerobulk convention 592 pevp( ji, jj ) = rn_efac*MAX( 0._wp, zcff * pevp(ji,jj) * ( pssq(ji,jj) - zhumi ) ) 591 ztemp = tq_abl( ji, jj, 2, nt_a, jp_ta ) 592 zhumi = tq_abl( ji, jj, 2, nt_a, jp_qa ) 593 zpre( ji, jj ) = pres_temp( zhumi, pslp_dta(ji,jj), ght_abl(2), ptpot=ztemp, pta=ztabs( ji, jj ) ) 594 zcff = rho_air( ztabs( ji, jj ), zhumi, zpre( ji, jj ) ) 595 psen( ji, jj ) = - cp_air(zhumi) * zcff * psen(ji,jj) * ( zsspt(ji,jj) - ztemp ) !GS: negative sign to respect aerobulk convention 596 pevp( ji, jj ) = rn_efac*MAX( 0._wp, zcff * pevp(ji,jj) * ( pssq(ji,jj) - zhumi ) ) 593 597 plat( ji, jj ) = - L_vap( psst(ji,jj) ) * pevp( ji, jj ) 594 598 rhoa( ji, jj ) = zcff 595 599 END_2D 600 !!GS: debug only; to be removed 601 CALL iom_put ( "pres_zu", zpre(:,:) ) 602 CALL iom_put ( "tabs_zu", ztabs(:,:) ) 596 603 597 604 DO_2D( 0, 1, 0, 1 ) … … 639 646 ! Wind stress relative to the moving ice ( U10m - U_ice ) ! 640 647 ! ------------------------------------------------------------ ! 641 DO_2D( 0, 0, 0, 0 ) 642 ptaui_ice(ji,jj) = 0.5_wp * ( rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj) + rhoa(ji,jj) * pCd_du_ice(ji,jj) ) & 643 & * ( 0.5_wp * ( u_abl(ji+1,jj,2,nt_a) + u_abl(ji,jj,2,nt_a) ) - pssu_ice(ji,jj) ) 644 ptauj_ice(ji,jj) = 0.5_wp * ( rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1) + rhoa(ji,jj) * pCd_du_ice(ji,jj) ) & 645 & * ( 0.5_wp * ( v_abl(ji,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) ) - pssv_ice(ji,jj) ) 646 END_2D 647 CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice, 'V', -1.0_wp ) 648 ! 649 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=ptaui_ice , clinfo1=' abl_stp: putaui : ' & 650 & , tab2d_2=ptauj_ice , clinfo2=' pvtaui : ' ) 648 !DO_2D( 0, 0, 0, 0 ) 649 ! ptaui_ice(ji,jj) = 0.5_wp * ( rhoa(ji+1,jj) * pCd_du_ice(ji+1,jj) + rhoa(ji,jj) * pCd_du_ice(ji,jj) ) & 650 ! & * ( 0.5_wp * ( u_abl(ji+1,jj,2,nt_a) + u_abl(ji,jj,2,nt_a) ) - pssu_ice(ji,jj) ) 651 ! ptauj_ice(ji,jj) = 0.5_wp * ( rhoa(ji,jj+1) * pCd_du_ice(ji,jj+1) + rhoa(ji,jj) * pCd_du_ice(ji,jj) ) & 652 ! & * ( 0.5_wp * ( v_abl(ji,jj+1,2,nt_a) + v_abl(ji,jj,2,nt_a) ) - pssv_ice(ji,jj) ) 653 !END_2D 654 !CALL lbc_lnk( 'ablmod', ptaui_ice, 'U', -1.0_wp, ptauj_ice, 'V', -1.0_wp ) 655 !! 656 !IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=ptaui_ice , clinfo1=' abl_stp: putaui : ' & 657 ! & , tab2d_2=ptauj_ice , clinfo2=' pvtaui : ' ) 658 651 659 ! ------------------------------------------------------------ ! 652 660 ! Wind stress relative to the moving ice ( U10m - U_ice ) ! -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/ABL/sbcabl.F90
r14239 r14592 218 218 IF(lwp) THEN 219 219 IF(nn_dyn_restore > 0) THEN 220 WRITE(numout,*) ' ABL Minimum value fordynamics restoring = ',zcff221 WRITE(numout,*) ' ABL Maximum value fordynamics restoring = ',zcff1220 WRITE(numout,*) ' Minimum value for ABL dynamics restoring = ',zcff 221 WRITE(numout,*) ' Maximum value for ABL dynamics restoring = ',zcff1 222 222 ! Check that restoring coefficients are between 0 and 1 223 223 IF( zcff1 - nn_fsbc > 0.001_wp .OR. zcff1 < 0._wp ) & … … 236 236 & + jp_alp1_tra * jp_bmax + jp_alp0_tra ) * rDt_abl 237 237 IF(lwp) THEN 238 WRITE(numout,*) ' ABL Minimum value fortracers restoring = ',zcff239 WRITE(numout,*) ' ABL Maximum value fortracers restoring = ',zcff1238 WRITE(numout,*) ' Minimum value for ABL tracers restoring = ',zcff 239 WRITE(numout,*) ' Maximum value for ABL tracers restoring = ',zcff1 240 240 ! Check that restoring coefficients are between 0 and 1 241 241 IF( zcff1 - nn_fsbc > 0.001_wp .OR. zcff1 < 0._wp ) & -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/OCE/SBC/sbc_phy.F90
r14110 r14592 23 23 24 24 IMPLICIT NONE 25 !PRIVATE 26 PUBLIC !! Haleluja that was the solution 25 PUBLIC !! Haleluja that was the solution for AGRIF 27 26 28 27 INTEGER , PARAMETER, PUBLIC :: nb_iter0 = 5 ! Default number of itterations in bulk-param algorithms (can be overriden b.m.o `nb_iter` optional argument) 29 28 30 29 !! (mainly removed from sbcblk.F90) 31 REAL(wp), PARAMETER, PUBLIC :: rCp_dry = 1005.0_wp !: Specic heat of dry air, constant pressure [J/K/kg] 32 REAL(wp), PARAMETER, PUBLIC :: rCp_vap = 1860.0_wp !: Specic heat of water vapor, constant pressure [J/K/kg] 33 REAL(wp), PARAMETER, PUBLIC :: R_dry = 287.05_wp !: Specific gas constant for dry air [J/K/kg] 34 REAL(wp), PARAMETER, PUBLIC :: R_vap = 461.495_wp !: Specific gas constant for water vapor [J/K/kg] 35 REAL(wp), PARAMETER, PUBLIC :: reps0 = R_dry/R_vap !: ratio of gas constant for dry air and water vapor => ~ 0.622 36 REAL(wp), PARAMETER, PUBLIC :: rctv0 = R_vap/R_dry - 1._wp !: for virtual temperature (== (1-eps)/eps) => ~ 0.608 37 REAL(wp), PARAMETER, PUBLIC :: rCp_air = 1000.5_wp !: specific heat of air (only used for ice fluxes now...) 38 REAL(wp), PARAMETER, PUBLIC :: albo = 0.066_wp !: ocean albedo assumed to be constant 30 REAL(wp), PARAMETER, PUBLIC :: rCp_dry = 1005.0_wp !: Specic heat of dry air, constant pressure [J/K/kg] 31 REAL(wp), PARAMETER, PUBLIC :: rCp_vap = 1860.0_wp !: Specic heat of water vapor, constant pressure [J/K/kg] 32 REAL(wp), PARAMETER, PUBLIC :: R_dry = 287.05_wp !: Specific gas constant for dry air [J/K/kg] 33 REAL(wp), PARAMETER, PUBLIC :: R_vap = 461.495_wp !: Specific gas constant for water vapor [J/K/kg] 34 REAL(wp), PARAMETER, PUBLIC :: reps0 = R_dry/R_vap !: ratio of gas constant for dry air and water vapor => ~ 0.622 35 REAL(wp), PARAMETER, PUBLIC :: rctv0 = R_vap/R_dry - 1._wp !: for virtual temperature (== (1-eps)/eps) => ~ 0.608 36 REAL(wp), PARAMETER, PUBLIC :: rCp_air = 1000.5_wp !: specific heat of air (only used for ice fluxes now...) 37 REAL(wp), PARAMETER, PUBLIC :: albo = 0.066_wp !: ocean albedo assumed to be constant 38 REAL(wp), PARAMETER, PUBLIC :: R_gas = 8.314510_wp !: Universal molar gas constant [J/mol/K] 39 REAL(wp), PARAMETER, PUBLIC :: rmm_dryair = 28.9647e-3_wp !: dry air molar mass / molecular weight [kg/mol] 40 REAL(wp), PARAMETER, PUBLIC :: rmm_water = 18.0153e-3_wp !: water molar mass / molecular weight [kg/mol] 41 REAL(wp), PARAMETER, PUBLIC :: rmm_ratio = rmm_water / rmm_dryair 42 REAL(wp), PARAMETER, PUBLIC :: rgamma_dry = R_gas / ( rmm_dryair * rCp_dry ) !: Poisson constant for dry air 43 REAL(wp), PARAMETER, PUBLIC :: rpref = 1.e5_wp !: reference air pressure for exner function [Pa] 39 44 ! 40 45 REAL(wp), PARAMETER, PUBLIC :: rho0_a = 1.2_wp !: Approx. of density of air [kg/m^3] … … 83 88 END INTERFACE virt_temp 84 89 90 INTERFACE pres_temp 91 MODULE PROCEDURE pres_temp_vctr, pres_temp_sclr 92 END INTERFACE pres_temp 93 94 INTERFACE theta_exner 95 MODULE PROCEDURE theta_exner_vctr, theta_exner_sclr 96 END INTERFACE theta_exner 97 85 98 INTERFACE visc_air 86 99 MODULE PROCEDURE visc_air_vctr, visc_air_sclr … … 98 111 MODULE PROCEDURE e_sat_ice_vctr, e_sat_ice_sclr 99 112 END INTERFACE e_sat_ice 113 100 114 INTERFACE de_sat_dt_ice 101 115 MODULE PROCEDURE de_sat_dt_ice_vctr, de_sat_dt_ice_sclr … … 148 162 149 163 PUBLIC virt_temp 164 PUBLIC pres_temp 165 PUBLIC theta_exner 150 166 PUBLIC rho_air 151 167 PUBLIC visc_air … … 158 174 PUBLIC q_air_rh 159 175 PUBLIC dq_sat_dt_ice 160 ! :176 ! 161 177 PUBLIC update_qnsol_tau 162 178 PUBLIC alpha_sw … … 205 221 ! 206 222 END FUNCTION virt_temp_sclr 207 !! 223 208 224 FUNCTION virt_temp_vctr( pta, pqa ) 225 209 226 REAL(wp), DIMENSION(jpi,jpj) :: virt_temp_vctr !: virtual temperature [K] 210 227 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta !: absolute or potential air temperature [K] 211 228 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa !: specific humidity of air [kg/kg] 229 212 230 virt_temp_vctr(:,:) = pta(:,:) * (1._wp + rctv0*pqa(:,:)) 231 213 232 END FUNCTION virt_temp_vctr 214 !=============================================================================================== 233 234 235 FUNCTION pres_temp_sclr( pqspe, pslp, pz, ptpot, pta, l_ice ) 236 237 !!------------------------------------------------------------------------------- 238 !! *** FUNCTION pres_temp *** 239 !! 240 !! ** Purpose : compute air pressure using barometric equation 241 !! from either potential or absolute air temperature 242 !! ** Author: G. Samson, Feb 2021 243 !!------------------------------------------------------------------------------- 244 245 REAL(wp) :: pres_temp_sclr ! air pressure [Pa] 246 REAL(wp), INTENT(in ) :: pqspe ! air specific humidity [kg/kg] 247 REAL(wp), INTENT(in ) :: pslp ! sea-level pressure [Pa] 248 REAL(wp), INTENT(in ) :: pz ! height above surface [m] 249 REAL(wp), INTENT(in ) , OPTIONAL :: ptpot ! air potential temperature [K] 250 REAL(wp), INTENT(inout), OPTIONAL :: pta ! air absolute temperature [K] 251 REAL(wp) :: ztpot, zta, zpa, zxm, zmask, zqsat 252 INTEGER :: it, niter = 3 ! iteration indice and number 253 LOGICAL , INTENT(in) , OPTIONAL :: l_ice ! sea-ice presence 254 LOGICAL :: lice ! sea-ice presence 255 256 IF( PRESENT(ptpot) ) THEN 257 zmask = 1._wp 258 ztpot = ptpot 259 ELSE 260 zmask = 0._wp 261 zta = pta 262 ENDIF 263 264 lice = .FALSE. 265 IF( PRESENT(l_ice) ) lice = l_ice 266 267 zpa = pslp ! air pressure first guess [Pa] 268 DO it = 1, niter 269 zta = ztpot * ( zpa / rpref )**rgamma_dry * zmask + (1._wp - zmask) * zta 270 zqsat = q_sat( zta, zpa, l_ice=lice ) ! saturation specific humidity [kg/kg] 271 zxm = (1._wp - pqspe/zqsat) * rmm_dryair + pqspe/zqsat * rmm_water ! moist air molar mass [kg/mol] 272 zpa = pslp * EXP( -grav * zxm * pz / ( R_gas * zta ) ) 273 END DO 274 275 pres_temp_sclr = zpa 276 IF(( PRESENT(pta) ).AND.( PRESENT(ptpot) )) pta = zta 277 278 END FUNCTION pres_temp_sclr 279 280 281 FUNCTION pres_temp_vctr( pqspe, pslp, pz, ptpot, pta, l_ice ) 282 283 !!------------------------------------------------------------------------------- 284 !! *** FUNCTION pres_temp *** 285 !! 286 !! ** Purpose : compute air pressure using barometric equation 287 !! from either potential or absolute air temperature 288 !! ** Author: G. Samson, Feb 2021 289 !!------------------------------------------------------------------------------- 290 291 REAL(wp), DIMENSION(jpi,jpj) :: pres_temp_vctr ! air pressure [Pa] 292 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pqspe ! air specific humidity [kg/kg] 293 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pslp ! sea-level pressure [Pa] 294 REAL(wp), INTENT(in ) :: pz ! height above surface [m] 295 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) , OPTIONAL :: ptpot ! air potential temperature [K] 296 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout), OPTIONAL :: pta ! air absolute temperature [K] 297 INTEGER :: ji, jj ! loop indices 298 LOGICAL , INTENT(in) , OPTIONAL :: l_ice ! sea-ice presence 299 LOGICAL :: lice ! sea-ice presence 300 301 lice = .FALSE. 302 IF( PRESENT(l_ice) ) lice = l_ice 303 304 IF( PRESENT(ptpot) ) THEN 305 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 306 pres_temp_vctr(ji,jj) = pres_temp_sclr( pqspe(ji,jj), pslp(ji,jj), pz, ptpot=ptpot(ji,jj), pta=pta(ji,jj), l_ice=lice ) 307 END_2D 308 ELSE 309 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 310 pres_temp_vctr(ji,jj) = pres_temp_sclr( pqspe(ji,jj), pslp(ji,jj), pz, pta=pta(ji,jj), l_ice=lice ) 311 END_2D 312 ENDIF 313 314 END FUNCTION pres_temp_vctr 315 316 317 FUNCTION theta_exner_sclr( pta, ppa ) 318 319 !!------------------------------------------------------------------------------- 320 !! *** FUNCTION theta_exner *** 321 !! 322 !! ** Purpose : compute air/surface potential temperature from absolute temperature 323 !! and pressure using Exner function 324 !! ** Author: G. Samson, Feb 2021 325 !!------------------------------------------------------------------------------- 326 327 REAL(wp) :: theta_exner_sclr ! air/surface potential temperature [K] 328 REAL(wp), INTENT(in) :: pta ! air/surface absolute temperature [K] 329 REAL(wp), INTENT(in) :: ppa ! air/surface pressure [Pa] 330 331 theta_exner_sclr = pta * ( rpref / ppa ) ** rgamma_dry 332 333 END FUNCTION theta_exner_sclr 334 335 FUNCTION theta_exner_vctr( pta, ppa ) 336 337 !!------------------------------------------------------------------------------- 338 !! *** FUNCTION theta_exner *** 339 !! 340 !! ** Purpose : compute air/surface potential temperature from absolute temperature 341 !! and pressure using Exner function 342 !! ** Author: G. Samson, Feb 2021 343 !!------------------------------------------------------------------------------- 344 345 REAL(wp), DIMENSION(jpi,jpj) :: theta_exner_vctr ! air/surface potential temperature [K] 346 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta ! air/surface absolute temperature [K] 347 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa ! air/surface pressure [Pa] 348 INTEGER :: ji, jj ! loop indices 349 350 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 351 theta_exner_vctr(ji,jj) = theta_exner_sclr( pta(ji,jj), ppa(ji,jj) ) 352 END_2D 353 354 END FUNCTION theta_exner_vctr 215 355 216 356 … … 228 368 REAL(wp), DIMENSION(jpi,jpj) :: rho_air_vctr ! density of moist air [kg/m^3] 229 369 !!------------------------------------------------------------------------------- 370 230 371 rho_air_vctr = MAX( ppa / (R_dry*ptak * ( 1._wp + rctv0*pqa )) , 0.8_wp ) 372 231 373 END FUNCTION rho_air_vctr 232 374 … … 245 387 !!------------------------------------------------------------------------------- 246 388 rho_air_sclr = MAX( ppa / (R_dry*ptak * ( 1._wp + rctv0*pqa )) , 0.8_wp ) 389 247 390 END FUNCTION rho_air_sclr 248 249 250 391 251 392 … … 269 410 270 411 FUNCTION visc_air_vctr(ptak) 412 271 413 REAL(wp), DIMENSION(jpi,jpj) :: visc_air_vctr ! kinetic viscosity (m^2/s) 272 414 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature in (K) 273 415 INTEGER :: ji, jj ! dummy loop indices 274 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 275 visc_air_vctr(ji,jj) = visc_air_sclr( ptak(ji,jj) ) 276 END_2D 416 417 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 418 visc_air_vctr(ji,jj) = visc_air_sclr( ptak(ji,jj) ) 419 END_2D 420 277 421 END FUNCTION visc_air_vctr 278 422 … … 319 463 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/) 320 464 !!------------------------------------------------------------------------------- 321 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg]465 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg] 322 466 REAL(wp), DIMENSION(jpi,jpj) :: cp_air_vctr ! specific heat of moist air [J/K/kg] 323 467 !!------------------------------------------------------------------------------- 468 324 469 cp_air_vctr = rCp_dry + rCp_vap * pqa 470 325 471 END FUNCTION cp_air_vctr 326 472 … … 336 482 REAL(wp) :: cp_air_sclr ! specific heat of moist air [J/K/kg] 337 483 !!------------------------------------------------------------------------------- 484 338 485 cp_air_sclr = rCp_dry + rCp_vap * pqa 486 339 487 END FUNCTION cp_air_sclr 340 488 341 489 342 343 !===============================================================================================344 490 FUNCTION gamma_moist_sclr( ptak, pqa ) 345 491 !!---------------------------------------------------------------------------------- … … 366 512 !! 367 513 END FUNCTION gamma_moist_sclr 368 !! 514 369 515 FUNCTION gamma_moist_vctr( ptak, pqa ) 516 370 517 REAL(wp), DIMENSION(jpi,jpj) :: gamma_moist_vctr 371 518 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak 372 519 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa 373 520 INTEGER :: ji, jj 374 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 375 gamma_moist_vctr(ji,jj) = gamma_moist_sclr( ptak(ji,jj), pqa(ji,jj) ) 376 END_2D 521 522 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 523 gamma_moist_vctr(ji,jj) = gamma_moist_sclr( ptak(ji,jj), pqa(ji,jj) ) 524 END_2D 525 377 526 END FUNCTION gamma_moist_vctr 378 !===============================================================================================379 527 380 528 … … 399 547 ! 400 548 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 401 ! 402 zqa = (1._wp + rctv0*pqa(ji,jj)) 403 ! 404 ! The main concern is to know whether, the vertical turbulent flux of virtual temperature, < u' theta_v' > is estimated with: 405 ! a/ -u* [ theta* (1 + 0.61 q) + 0.61 theta q* ] => this is the one that seems correct! chose this one! 406 ! or 407 ! b/ -u* [ theta* + 0.61 theta q* ] 408 ! 409 One_on_L(ji,jj) = grav*vkarmn*( pts(ji,jj)*zqa + rctv0*ptha(ji,jj)*pqs(ji,jj) ) & 410 & / MAX( pus(ji,jj)*pus(ji,jj)*ptha(ji,jj)*zqa , 1.E-9_wp ) 411 ! 549 zqa = (1._wp + rctv0*pqa(ji,jj)) 550 ! 551 ! The main concern is to know whether, the vertical turbulent flux of virtual temperature, < u' theta_v' > is estimated with: 552 ! a/ -u* [ theta* (1 + 0.61 q) + 0.61 theta q* ] => this is the one that seems correct! chose this one! 553 ! or 554 ! b/ -u* [ theta* + 0.61 theta q* ] 555 ! 556 One_on_L(ji,jj) = grav*vkarmn*( pts(ji,jj)*zqa + rctv0*ptha(ji,jj)*pqs(ji,jj) ) & 557 & / MAX( pus(ji,jj)*pus(ji,jj)*ptha(ji,jj)*zqa , 1.E-9_wp ) 412 558 END_2D 413 559 ! … … 417 563 418 564 419 !===============================================================================================420 565 FUNCTION Ri_bulk_sclr( pz, psst, ptha, pssq, pqa, pub, pta_layer, pqa_layer ) 421 566 !!---------------------------------------------------------------------------------- … … 428 573 REAL(wp) :: Ri_bulk_sclr 429 574 REAL(wp), INTENT(in) :: pz ! height above the sea (aka "delta z") [m] 430 REAL(wp), INTENT(in) :: psst ! SST[K]575 REAL(wp), INTENT(in) :: psst ! potential SST [K] 431 576 REAL(wp), INTENT(in) :: ptha ! pot. air temp. at height "pz" [K] 432 577 REAL(wp), INTENT(in) :: pssq ! 0.98*q_sat(SST) [kg/kg] … … 438 583 LOGICAL :: l_ptqa_l_prvd = .FALSE. 439 584 REAL(wp) :: zqa, zta, zgamma, zdthv, ztv, zsstv ! local scalars 585 REAL(wp) :: ztptv 440 586 !!------------------------------------------------------------------- 441 587 IF( PRESENT(pta_layer) .AND. PRESENT(pqa_layer) ) l_ptqa_l_prvd=.TRUE. 442 588 ! 443 zsstv = virt_temp_sclr( psst, pssq ) ! virtual SST (absolute==potential because z=0!) 444 ! 445 zdthv = virt_temp_sclr( ptha, pqa ) - zsstv ! air-sea delta of "virtual potential temperature" 446 ! 447 !! ztv: estimate of the ABSOLUTE virtual temp. within the layer 448 IF( l_ptqa_l_prvd ) THEN 449 ztv = virt_temp_sclr( pta_layer, pqa_layer ) 450 ELSE 451 zqa = 0.5_wp*( pqa + pssq ) ! ~ mean q within the layer... 452 zta = 0.5_wp*( psst + ptha - gamma_moist(ptha, zqa)*pz ) ! ~ mean absolute temperature of air within the layer 453 zta = 0.5_wp*( psst + ptha - gamma_moist( zta, zqa)*pz ) ! ~ mean absolute temperature of air within the layer 454 zgamma = gamma_moist(zta, zqa) ! Adiabatic lapse-rate for moist air within the layer 455 ztv = 0.5_wp*( zsstv + virt_temp_sclr( ptha-zgamma*pz, pqa ) ) 456 END IF 457 ! 458 Ri_bulk_sclr = grav*zdthv*pz / ( ztv*pub*pub ) ! the usual definition of Ri_bulk_sclr 589 zsstv = virt_temp_sclr( psst, pssq ) ! virtual potential SST 590 ztptv = virt_temp_sclr( ptha, pqa ) ! virtual potential air temperature 591 zdthv = ztptv - zsstv ! air-sea delta of "virtual potential temperature" 592 ! 593 Ri_bulk_sclr = grav * zdthv * pz / ( ztptv * pub * pub ) ! the usual definition of Ri_bulk_sclr 459 594 ! 460 595 END FUNCTION Ri_bulk_sclr 461 !! 596 462 597 FUNCTION Ri_bulk_vctr( pz, psst, ptha, pssq, pqa, pub, pta_layer, pqa_layer ) 598 463 599 REAL(wp), DIMENSION(jpi,jpj) :: Ri_bulk_vctr 464 600 REAL(wp) , INTENT(in) :: pz ! height above the sea (aka "delta z") [m] … … 473 609 LOGICAL :: l_ptqa_l_prvd = .FALSE. 474 610 INTEGER :: ji, jj 611 475 612 IF( PRESENT(pta_layer) .AND. PRESENT(pqa_layer) ) l_ptqa_l_prvd=.TRUE. 476 613 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 477 IF( l_ptqa_l_prvd ) THEN 478 Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj), & 479 & pta_layer=pta_layer(ji,jj ), pqa_layer=pqa_layer(ji,jj ) ) 480 ELSE 481 Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj) ) 482 END IF 483 END_2D 614 IF( l_ptqa_l_prvd ) THEN !!GS: "IF" inside loop needs to be removed 615 Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj), & 616 & pta_layer=pta_layer(ji,jj ), pqa_layer=pqa_layer(ji,jj ) ) 617 ELSE 618 Ri_bulk_vctr(ji,jj) = Ri_bulk_sclr( pz, psst(ji,jj), ptha(ji,jj), pssq(ji,jj), pqa(ji,jj), pub(ji,jj) ) 619 END IF 620 END_2D 621 484 622 END FUNCTION Ri_bulk_vctr 485 !=============================================================================================== 486 487 !=============================================================================================== 623 624 488 625 FUNCTION e_sat_sclr( ptak ) 489 626 !!---------------------------------------------------------------------------------- … … 510 647 ! 511 648 END FUNCTION e_sat_sclr 512 !! 649 513 650 FUNCTION e_sat_vctr(ptak) 514 651 REAL(wp), DIMENSION(jpi,jpj) :: e_sat_vctr !: vapour pressure at saturation [Pa] … … 519 656 END_2D 520 657 END FUNCTION e_sat_vctr 521 !=============================================================================================== 522 523 !=============================================================================================== 658 659 524 660 FUNCTION e_sat_ice_sclr(ptak) 525 661 !!--------------------------------------------------------------------------------- … … 537 673 !! 538 674 e_sat_ice_sclr = 100._wp * 10._wp**zle 675 539 676 END FUNCTION e_sat_ice_sclr 540 !! 677 541 678 FUNCTION e_sat_ice_vctr(ptak) 542 679 !! Same as "e_sat" but over ice rather than water! … … 546 683 !!---------------------------------------------------------------------------------- 547 684 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 548 e_sat_ice_vctr(ji,jj) = e_sat_ice_sclr( ptak(ji,jj) ) 549 END_2D 685 e_sat_ice_vctr(ji,jj) = e_sat_ice_sclr( ptak(ji,jj) ) 686 END_2D 687 550 688 END FUNCTION e_sat_ice_vctr 551 !! 689 690 552 691 FUNCTION de_sat_dt_ice_sclr(ptak) 553 692 !!--------------------------------------------------------------------------------- … … 567 706 de_sat_dt_ice_sclr = LOG(10._wp) * zde * e_sat_ice_sclr(zta) 568 707 END FUNCTION de_sat_dt_ice_sclr 569 !! 708 570 709 FUNCTION de_sat_dt_ice_vctr(ptak) 571 710 !! Same as "e_sat" but over ice rather than water! … … 575 714 !!---------------------------------------------------------------------------------- 576 715 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 577 de_sat_dt_ice_vctr(ji,jj) = de_sat_dt_ice_sclr( ptak(ji,jj) ) 578 END_2D 716 de_sat_dt_ice_vctr(ji,jj) = de_sat_dt_ice_sclr( ptak(ji,jj) ) 717 END_2D 718 579 719 END FUNCTION de_sat_dt_ice_vctr 580 720 581 721 582 583 !===============================================================================================584 585 !===============================================================================================586 722 FUNCTION q_sat_sclr( pta, ppa, l_ice ) 587 723 !!--------------------------------------------------------------------------------- … … 607 743 END IF 608 744 q_sat_sclr = reps0*ze_s/(ppa - (1._wp - reps0)*ze_s) 745 609 746 END FUNCTION q_sat_sclr 610 !! 747 611 748 FUNCTION q_sat_vctr( pta, ppa, l_ice ) 749 612 750 REAL(wp), DIMENSION(jpi,jpj) :: q_sat_vctr 613 751 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta !: absolute temperature of air [K] … … 620 758 IF( PRESENT(l_ice) ) lice = l_ice 621 759 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 622 q_sat_vctr(ji,jj) = q_sat_sclr( pta(ji,jj) , ppa(ji,jj), l_ice=lice ) 623 END_2D 760 q_sat_vctr(ji,jj) = q_sat_sclr( pta(ji,jj) , ppa(ji,jj), l_ice=lice ) 761 END_2D 762 624 763 END FUNCTION q_sat_vctr 625 !=============================================================================================== 626 627 628 !=============================================================================================== 764 765 629 766 FUNCTION dq_sat_dt_ice_sclr( pta, ppa ) 630 767 !!--------------------------------------------------------------------------------- … … 647 784 ! 648 785 END FUNCTION dq_sat_dt_ice_sclr 649 !! 786 650 787 FUNCTION dq_sat_dt_ice_vctr( pta, ppa ) 788 651 789 REAL(wp), DIMENSION(jpi,jpj) :: dq_sat_dt_ice_vctr 652 790 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pta !: absolute temperature of air [K] … … 655 793 !!---------------------------------------------------------------------------------- 656 794 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 657 dq_sat_dt_ice_vctr(ji,jj) = dq_sat_dt_ice_sclr( pta(ji,jj) , ppa(ji,jj) ) 658 END_2D 795 dq_sat_dt_ice_vctr(ji,jj) = dq_sat_dt_ice_sclr( pta(ji,jj) , ppa(ji,jj) ) 796 END_2D 797 659 798 END FUNCTION dq_sat_dt_ice_vctr 660 !=============================================================================================== 661 662 663 !=============================================================================================== 799 800 664 801 FUNCTION q_air_rh(prha, ptak, ppa) 665 802 !!---------------------------------------------------------------------------------- … … 678 815 ! 679 816 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 680 ze = prha(ji,jj)*e_sat_sclr(ptak(ji,jj))681 q_air_rh(ji,jj) = ze*reps0/(ppa(ji,jj) - (1. - reps0)*ze)817 ze = prha(ji,jj)*e_sat_sclr(ptak(ji,jj)) 818 q_air_rh(ji,jj) = ze*reps0/(ppa(ji,jj) - (1. - reps0)*ze) 682 819 END_2D 683 820 ! … … 685 822 686 823 687 SUBROUTINE UPDATE_QNSOL_TAU( pzu, pTs, pqs, pTa, pqa, pust, ptst, pqst, pwnd, pUb, ppa, prlw, &824 SUBROUTINE UPDATE_QNSOL_TAU( pzu, pTs, pqs, pTa, pqa, pust, ptst, pqst, pwnd, pUb, ppa, prlw, prhoa, & 688 825 & pQns, pTau, & 689 826 & Qlat) … … 705 842 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa ! sea-level atmospheric pressure [Pa] 706 843 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: prlw ! downwelling longwave radiative flux [W/m^2] 844 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: prhoa ! air density [kg/m3] 707 845 ! 708 846 REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQns ! non-solar heat flux to the ocean aka "Qlat + Qsen + Qlw" [W/m^2]] … … 715 853 !!---------------------------------------------------------------------------------- 716 854 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 717 zdt = pTa(ji,jj) - pTs(ji,jj) ; zdt = SIGN( MAX(ABS(zdt),1.E-6_wp), zdt ) 718 zdq = pqa(ji,jj) - pqs(ji,jj) ; zdq = SIGN( MAX(ABS(zdq),1.E-9_wp), zdq ) 719 zz0 = pust(ji,jj)/pUb(ji,jj) 720 zCd = zz0*zz0 721 zCh = zz0*ptst(ji,jj)/zdt 722 zCe = zz0*pqst(ji,jj)/zdq 723 724 CALL BULK_FORMULA( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), zCd, zCh, zCe, & 725 & pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj), & 726 & pTau(ji,jj), zQsen, zQlat ) 727 728 zQlw = qlw_net_sclr( prlw(ji,jj), pTs(ji,jj) ) ! Net longwave flux 729 730 pQns(ji,jj) = zQlat + zQsen + zQlw 731 732 IF( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 733 END_2D 855 856 zdt = pTa(ji,jj) - pTs(ji,jj) ; zdt = SIGN( MAX(ABS(zdt),1.E-6_wp), zdt ) 857 zdq = pqa(ji,jj) - pqs(ji,jj) ; zdq = SIGN( MAX(ABS(zdq),1.E-9_wp), zdq ) 858 zz0 = pust(ji,jj)/pUb(ji,jj) 859 zCd = zz0*zz0 860 zCh = zz0*ptst(ji,jj)/zdt 861 zCe = zz0*pqst(ji,jj)/zdq 862 863 CALL BULK_FORMULA( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), zCd, zCh, zCe, & 864 & pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj), prhoa(ji,jj), & 865 & pTau(ji,jj), zQsen, zQlat ) 866 867 zQlw = qlw_net_sclr( prlw(ji,jj), pTs(ji,jj) ) ! Net longwave flux 868 869 pQns(ji,jj) = zQlat + zQsen + zQlw 870 871 IF( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 872 873 END_2D 874 734 875 END SUBROUTINE UPDATE_QNSOL_TAU 735 876 … … 737 878 SUBROUTINE BULK_FORMULA_SCLR( pzu, pTs, pqs, pTa, pqa, & 738 879 & pCd, pCh, pCe, & 739 & pwnd, pUb, ppa, 880 & pwnd, pUb, ppa, prhoa, & 740 881 & pTau, pQsen, pQlat, & 741 & pEvap, p rhoa, pfact_evap)742 !!---------------------------------------------------------------------------------- 743 REAL(wp), INTENT(in) :: pzu! height above the sea-level where all this takes place (normally 10m)744 REAL(wp), INTENT(in) :: pTs ! water temperature at the air-sea interface [K]745 REAL(wp), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg]746 REAL(wp), INTENT(in) :: pTa ! potential air temperature at z=pzu [K]747 REAL(wp), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg]882 & pEvap, pfact_evap ) 883 !!---------------------------------------------------------------------------------- 884 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 885 REAL(wp), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 886 REAL(wp), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 887 REAL(wp), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 888 REAL(wp), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 748 889 REAL(wp), INTENT(in) :: pCd 749 890 REAL(wp), INTENT(in) :: pCh 750 891 REAL(wp), INTENT(in) :: pCe 751 REAL(wp), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 752 REAL(wp), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 753 REAL(wp), INTENT(in) :: ppa ! sea-level atmospheric pressure [Pa] 892 REAL(wp), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 893 REAL(wp), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 894 REAL(wp), INTENT(in) :: ppa ! sea-level atmospheric pressure [Pa] 895 REAL(wp), INTENT(in) :: prhoa ! Air density at z=pzu [kg/m^3] 754 896 !! 755 897 REAL(wp), INTENT(out) :: pTau ! module of the wind stress [N/m^2] … … 758 900 !! 759 901 REAL(wp), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s] 760 REAL(wp), INTENT(out), OPTIONAL :: prhoa ! Air density at z=pzu [kg/m^3]761 902 REAL(wp), INTENT(in) , OPTIONAL :: pfact_evap ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent) 762 903 !! … … 767 908 IF( PRESENT(pfact_evap) ) zfact_evap = pfact_evap 768 909 769 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 770 ztaa = pTa ! first guess... 771 DO jq = 1, 4 772 zgamma = gamma_moist( 0.5*(ztaa+pTs) , pqa ) !#LB: why not "0.5*(pqs+pqa)" rather then "pqa" ??? 773 ztaa = pTa - zgamma*pzu ! Absolute temp. is slightly colder... 774 END DO 775 zrho = rho_air(ztaa, pqa, ppa) 776 zrho = rho_air(ztaa, pqa, ppa-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 777 778 zUrho = pUb*MAX(zrho, 1._wp) ! rho*U10 910 zUrho = pUb*MAX(prhoa, 1._wp) ! rho*U10 779 911 780 912 pTau = zUrho * pCd * pwnd ! Wind stress module … … 785 917 786 918 IF( PRESENT(pEvap) ) pEvap = - zfact_evap * zevap 787 IF( PRESENT(prhoa) ) prhoa = zrho788 919 789 920 END SUBROUTINE BULK_FORMULA_SCLR 790 !! 921 791 922 SUBROUTINE BULK_FORMULA_VCTR( pzu, pTs, pqs, pTa, pqa, & 792 923 & pCd, pCh, pCe, & 793 & pwnd, pUb, ppa, 924 & pwnd, pUb, ppa, prhoa, & 794 925 & pTau, pQsen, pQlat, & 795 & pEvap, p rhoa, pfact_evap )796 !!---------------------------------------------------------------------------------- 797 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m)798 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTs ! water temperature at the air-sea interface [K]799 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg]800 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTa ! potential air temperature at z=pzu [K]801 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg]926 & pEvap, pfact_evap ) 927 !!---------------------------------------------------------------------------------- 928 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 929 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 930 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 931 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 932 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 802 933 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCd 803 934 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCh 804 935 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCe 805 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 806 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 807 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa ! sea-level atmospheric pressure [Pa] 936 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 937 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 938 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ppa ! sea-level atmospheric pressure [Pa] 939 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: prhoa ! Air density at z=pzu [kg/m^3] 808 940 !! 809 941 REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pTau ! module of the wind stress [N/m^2] … … 812 944 !! 813 945 REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: pEvap ! Evaporation [kg/m^2/s] 814 REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: prhoa ! Air density at z=pzu [kg/m^3]815 946 REAL(wp), INTENT(in) , OPTIONAL :: pfact_evap ! ABOMINATION: corrective factor for evaporation (doing this against my will! /laurent) 816 947 !! … … 823 954 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 824 955 825 CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), &826 & pCd(ji,jj), pCh(ji,jj), pCe(ji,jj), &827 & pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj),&828 & pTau(ji,jj), pQsen(ji,jj), pQlat(ji,jj), &829 & pEvap=zevap, prhoa=zrho, pfact_evap=zfact_evap)830 831 IF( PRESENT(pEvap) ) pEvap(ji,jj) = zevap832 IF( PRESENT(prhoa) ) prhoa(ji,jj) = zrho833 END_2D 956 CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), & 957 & pCd(ji,jj), pCh(ji,jj), pCe(ji,jj), & 958 & pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj), prhoa(ji,jj), & 959 & pTau(ji,jj), pQsen(ji,jj), pQlat(ji,jj), & 960 & pEvap=zevap, pfact_evap=zfact_evap ) 961 962 IF( PRESENT(pEvap) ) pEvap(ji,jj) = zevap 963 END_2D 964 834 965 END SUBROUTINE BULK_FORMULA_VCTR 835 966 … … 847 978 !!---------------------------------------------------------------------------------- 848 979 alpha_sw_vctr = 2.1e-5_wp * MAX(psst(:,:)-rt0 + 3.2_wp, 0._wp)**0.79 980 849 981 END FUNCTION alpha_sw_vctr 850 982 … … 861 993 !!---------------------------------------------------------------------------------- 862 994 alpha_sw_sclr = 2.1e-5_wp * MAX(psst-rt0 + 3.2_wp, 0._wp)**0.79 995 863 996 END FUNCTION alpha_sw_sclr 864 997 865 998 866 !===============================================================================================867 999 FUNCTION qlw_net_sclr( pdwlw, pts, l_ice ) 868 1000 !!--------------------------------------------------------------------------------- … … 887 1019 zt2 = pts*pts 888 1020 qlw_net_sclr = zemiss*( pdwlw - stefan*zt2*zt2) ! zemiss used both as the IR albedo and IR emissivity... 1021 889 1022 END FUNCTION qlw_net_sclr 890 !! 1023 891 1024 FUNCTION qlw_net_vctr( pdwlw, pts, l_ice ) 1025 892 1026 REAL(wp), DIMENSION(jpi,jpj) :: qlw_net_vctr 893 1027 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pdwlw !: downwelling longwave (aka infrared, aka thermal) radiation [W/m^2] … … 900 1034 IF( PRESENT(l_ice) ) lice = l_ice 901 1035 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 902 qlw_net_vctr(ji,jj) = qlw_net_sclr( pdwlw(ji,jj) , pts(ji,jj), l_ice=lice ) 903 END_2D 1036 qlw_net_vctr(ji,jj) = qlw_net_sclr( pdwlw(ji,jj) , pts(ji,jj), l_ice=lice ) 1037 END_2D 1038 904 1039 END FUNCTION qlw_net_vctr 905 !=============================================================================================== 1040 906 1041 907 1042 FUNCTION z0_from_Cd( pzu, pCd, ppsi ) 1043 908 1044 REAL(wp), DIMENSION(jpi,jpj) :: z0_from_Cd !: roughness length [m] 909 1045 REAL(wp) , INTENT(in) :: pzu !: reference height zu [m] … … 921 1057 z0_from_Cd = pzu * EXP( - vkarmn/SQRT(pCd(:,:)) ) !LB: ok, double-checked! 922 1058 END IF 1059 923 1060 END FUNCTION z0_from_Cd 924 1061 1062 925 1063 FUNCTION Cd_from_z0( pzu, pz0, ppsi ) 1064 926 1065 REAL(wp), DIMENSION(jpi,jpj) :: Cd_from_z0 !: (neutral or non-neutral) drag coefficient [] 927 1066 REAL(wp) , INTENT(in) :: pzu !: reference height zu [m] … … 940 1079 END IF 941 1080 Cd_from_z0 = vkarmn2 * Cd_from_z0 * Cd_from_z0 1081 942 1082 END FUNCTION Cd_from_z0 943 1083 … … 965 1105 ! 966 1106 END FUNCTION f_m_louis_sclr 967 !! 1107 968 1108 FUNCTION f_m_louis_vctr( pzu, pRib, pCdn, pz0 ) 1109 969 1110 REAL(wp), DIMENSION(jpi,jpj) :: f_m_louis_vctr 970 1111 REAL(wp), INTENT(in) :: pzu … … 973 1114 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0 974 1115 INTEGER :: ji, jj 975 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 976 f_m_louis_vctr(ji,jj) = f_m_louis_sclr( pzu, pRib(ji,jj), pCdn(ji,jj), pz0(ji,jj) ) 977 END_2D 1116 1117 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1118 f_m_louis_vctr(ji,jj) = f_m_louis_sclr( pzu, pRib(ji,jj), pCdn(ji,jj), pz0(ji,jj) ) 1119 END_2D 1120 978 1121 END FUNCTION f_m_louis_vctr 979 1122 … … 1001 1144 ! 1002 1145 END FUNCTION f_h_louis_sclr 1003 !! 1146 1004 1147 FUNCTION f_h_louis_vctr( pzu, pRib, pChn, pz0 ) 1148 1005 1149 REAL(wp), DIMENSION(jpi,jpj) :: f_h_louis_vctr 1006 1150 REAL(wp), INTENT(in) :: pzu … … 1009 1153 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pz0 1010 1154 INTEGER :: ji, jj 1011 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1012 f_h_louis_vctr(ji,jj) = f_h_louis_sclr( pzu, pRib(ji,jj), pChn(ji,jj), pz0(ji,jj) ) 1013 END_2D 1155 1156 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1157 f_h_louis_vctr(ji,jj) = f_h_louis_sclr( pzu, pRib(ji,jj), pChn(ji,jj), pz0(ji,jj) ) 1158 END_2D 1159 1014 1160 END FUNCTION f_h_louis_vctr 1161 1015 1162 1016 1163 FUNCTION UN10_from_ustar( pzu, pUzu, pus, ppsi ) … … 1123 1270 1124 1271 1125 !!====================================================================== 1272 1126 1273 END MODULE sbc_phy -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/OCE/SBC/sbcblk.F90
r14433 r14592 80 80 INTEGER , PUBLIC, PARAMETER :: jp_wndj = 2 ! index of 10m wind velocity (j-component) (m/s) at T-point 81 81 INTEGER , PUBLIC, PARAMETER :: jp_tair = 3 ! index of 10m air temperature (Kelvin) 82 INTEGER , PUBLIC, PARAMETER :: jp_humi = 4 ! index of specific humidity ( %)82 INTEGER , PUBLIC, PARAMETER :: jp_humi = 4 ! index of specific humidity (kg/kg) 83 83 INTEGER , PUBLIC, PARAMETER :: jp_qsr = 5 ! index of solar heat (W/m2) 84 84 INTEGER , PUBLIC, PARAMETER :: jp_qlw = 6 ! index of Long wave (W/m2) … … 503 503 INTEGER, INTENT(in) :: kt ! ocean time step 504 504 !!---------------------------------------------------------------------- 505 REAL(wp), DIMENSION(jpi,jpj) :: zssq, zcd_du, zsen, zlat, zevp 505 REAL(wp), DIMENSION(jpi,jpj) :: zssq, zcd_du, zsen, zlat, zevp, zpre, ztheta 506 506 REAL(wp) :: ztst 507 507 LOGICAL :: llerr … … 540 540 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 541 541 542 ! Specific humidity of air at z=rn_zqt !542 ! Specific humidity of air at z=rn_zqt 543 543 SELECT CASE( nhumi ) 544 544 CASE( np_humi_sph ) … … 553 553 END SELECT 554 554 555 ! POTENTIAL temperature of air at z=rn_zqt 556 ! based on adiabatic lapse-rate (see Josey, Gulev & Yu, 2013) / doi=10.1016/B978-0-12-391851-2.00005-2 557 ! (most reanalysis products provide absolute temp., not potential temp.) 555 ! Potential temperature of air at z=rn_zqt (most reanalysis products provide absolute temp., not potential temp.) 558 556 IF( ln_tair_pot ) THEN 559 ! temperature read into file is already potential temperature, do nothing... 560 theta_air_zt(:,:) = sf(jp_tair )%fnow(:,:,1) 557 theta_air_zt(:,:) = sf(jp_tair )%fnow(:,:,1) 561 558 ELSE 562 559 ! temperature read into file is ABSOLUTE temperature (that's the case for ECMWF products for example...) 563 560 IF((kt==nit000).AND.lwp) WRITE(numout,*) ' *** sbc_blk() => air temperature converted from ABSOLUTE to POTENTIAL!' 564 theta_air_zt(:,:) = sf(jp_tair )%fnow(:,:,1) + gamma_moist( sf(jp_tair )%fnow(:,:,1), q_air_zt(:,:) ) * rn_zqt 561 zpre(:,:) = pres_temp( q_air_zt(:,:), sf(jp_slp)%fnow(:,:,1), rn_zu, pta=sf(jp_tair)%fnow(:,:,1) ) 562 theta_air_zt(:,:) = theta_exner( sf(jp_tair)%fnow(:,:,1), zpre(:,:) ) 565 563 ENDIF 566 564 ! … … 588 586 tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1) !#LB: should it be POTENTIAL temperature instead ???? 589 587 !tatm_ice(:,:) = theta_air_zt(:,:) !#LB: THIS! ? 590 591 qatm_ice(:,:) = q_air_zt(:,:) !#LB: 592 593 tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac 594 sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac 595 wndi_ice(:,:) = sf(jp_wndi)%fnow(:,:,1) 596 wndj_ice(:,:) = sf(jp_wndj)%fnow(:,:,1) 588 qatm_ice(:,:) = q_air_zt(:,:) 589 tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac 590 sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac 591 wndi_ice(:,:) = sf(jp_wndi)%fnow(:,:,1) 592 wndj_ice(:,:) = sf(jp_wndj)%fnow(:,:,1) 597 593 ENDIF 598 594 #endif … … 652 648 REAL(wp), DIMENSION(jpi,jpj) :: zch_oce ! sensible heat transfert coefficient over ocean 653 649 REAL(wp), DIMENSION(jpi,jpj) :: zce_oce ! latent heat transfert coefficient over ocean 650 REAL(wp), DIMENSION(jpi,jpj) :: zsspt ! potential sea-surface temperature [K] 651 REAL(wp), DIMENSION(jpi,jpj) :: zpre, ztabs 654 652 REAL(wp), DIMENSION(jpi,jpj) :: zztmp1, zztmp2 655 653 !!--------------------------------------------------------------------- … … 658 656 ! ! Temporary conversion from Celcius to Kelvin (and set minimum value far above 0 K) 659 657 ptsk(:,:) = pst(:,:) + rt0 ! by default: skin temperature = "bulk SST" (will remain this way if NCAR algorithm used!) 658 659 ! sea surface potential temperature [K] 660 zsspt(:,:) = theta_exner( ptsk(:,:), pslp(:,:) ) 660 661 661 662 ! --- cloud cover --- ! … … 705 706 IF( ln_skin_cs .OR. ln_skin_wl ) THEN 706 707 !! Backup "bulk SST" and associated spec. hum. 707 zztmp1(:,:) = ptsk(:,:)708 zztmp1(:,:) = zsspt(:,:) 708 709 zztmp2(:,:) = pssq(:,:) 709 710 ENDIF … … 714 715 715 716 CASE( np_NCAR ) 716 CALL turb_ncar ( rn_zqt, rn_zu, ptsk, ptair, pssq, pqair, wndm, &717 CALL turb_ncar ( rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, & 717 718 & zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu , & 718 719 & nb_iter=nn_iter_algo ) 719 720 ! 720 721 CASE( np_COARE_3p0 ) 721 CALL turb_coare3p0( kt, rn_zqt, rn_zu, ptsk, ptair, pssq, pqair, wndm, &722 CALL turb_coare3p0( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, & 722 723 & ln_skin_cs, ln_skin_wl, & 723 724 & zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu, & … … 726 727 ! 727 728 CASE( np_COARE_3p6 ) 728 CALL turb_coare3p6( kt, rn_zqt, rn_zu, ptsk, ptair, pssq, pqair, wndm, &729 CALL turb_coare3p6( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, & 729 730 & ln_skin_cs, ln_skin_wl, & 730 731 & zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu, & … … 733 734 ! 734 735 CASE( np_ECMWF ) 735 CALL turb_ecmwf ( kt, rn_zqt, rn_zu, ptsk, ptair, pssq, pqair, wndm, &736 CALL turb_ecmwf ( kt, rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, & 736 737 & ln_skin_cs, ln_skin_wl, & 737 738 & zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu, & … … 740 741 ! 741 742 CASE( np_ANDREAS ) 742 CALL turb_andreas ( rn_zqt, rn_zu, ptsk, ptair, pssq, pqair, wndm, &743 CALL turb_andreas ( rn_zqt, rn_zu, zsspt, ptair, pssq, pqair, wndm, & 743 744 & zcd_oce, zch_oce, zce_oce, theta_zu, q_zu, zU_zu , & 744 745 & nb_iter=nn_iter_algo ) … … 762 763 IF( ln_skin_cs .OR. ln_skin_wl ) THEN 763 764 !! ptsk and pssq have been updated!!! 765 ptsk(:,:) = ptsk(:,:) + ( zsspt(:,:) - zztmp1(:,:) ) 764 766 !! 765 767 !! In the presence of sea-ice we forget about the cool-skin/warm-layer update of ptsk and pssq: 766 768 WHERE ( fr_i(:,:) > 0.001_wp ) 767 769 ! sea-ice present, we forget about the update, using what we backed up before call to turb_*() 768 ptsk(:,:) = zztmp1(:,:)769 pssq(:,:) = zztmp2(:,:)770 zsspt(:,:) = zztmp1(:,:) 771 pssq(:,:) = zztmp2(:,:) 770 772 END WHERE 771 773 END IF … … 775 777 776 778 IF( ln_abl ) THEN !== ABL formulation ==! multiplication by rho_air and turbulent fluxes computation done in ablstp 779 777 780 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 778 781 zztmp = zU_zu(ji,jj) … … 781 784 psen(ji,jj) = zztmp * zch_oce(ji,jj) 782 785 pevp(ji,jj) = zztmp * zce_oce(ji,jj) 783 rhoa(ji,jj) = rho_air( ptair(ji,jj), pqair(ji,jj), pslp(ji,jj) ) 786 zpre(ji,jj) = pres_temp( pqair(ji,jj), pslp(ji,jj), rn_zu, ptpot=ptair(ji,jj), pta=ztabs(ji,jj) ) 787 rhoa(ji,jj) = rho_air( ztabs(ji,jj), pqair(ji,jj), zpre(ji,jj) ) 784 788 END_2D 789 785 790 ELSE !== BLK formulation ==! turbulent fluxes computation 786 CALL BULK_FORMULA( rn_zu, ptsk(:,:), pssq(:,:), theta_zu(:,:), q_zu(:,:), & 791 792 zpre(:,:) = pres_temp( q_zu(:,:), pslp(:,:), rn_zu, ptpot=theta_zu(:,:), pta=ztabs(:,:) ) 793 rhoa(:,:) = rho_air( ztabs(:,:), q_zu(:,:), zpre(:,:) ) 794 !!GS: for debug, to be removed 795 CALL iom_put( "pres_zu", zpre(:,:)*tmask(:,:,1) ) 796 CALL iom_put( "slp", pslp(:,:)*tmask(:,:,1) ) 797 CALL iom_put( "tabs_zu", (ztabs(:,:)-rt0)*tmask(:,:,1) ) 798 799 CALL BULK_FORMULA( rn_zu, zsspt(:,:), pssq(:,:), theta_zu(:,:), q_zu(:,:), & 787 800 & zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:), & 788 & wndm(:,:), zU_zu(:,:), pslp(:,:), 801 & wndm(:,:), zU_zu(:,:), pslp(:,:), rhoa(:,:), & 789 802 & taum(:,:), psen(:,:), plat(:,:), & 790 & pEvap=pevp(:,:), p rhoa=rhoa(:,:), pfact_evap=rn_efac )803 & pEvap=pevp(:,:), pfact_evap=rn_efac ) 791 804 792 805 psen(:,:) = psen(:,:) * tmask(:,:,1) … … 851 864 ENDIF 852 865 ! 853 ENDIF ! IF( ln_abl )866 ENDIF ! ln_blk / ln_abl 854 867 855 868 ptsk(:,:) = ( ptsk(:,:) - rt0 ) * tmask(:,:,1) ! Back to Celsius 856 869 870 CALL iom_put( "sspt", zsspt(:,:)-rt0 ) 857 871 IF( ln_skin_cs .OR. ln_skin_wl ) THEN 858 872 CALL iom_put( "t_skin" , ptsk ) ! T_skin in Celsius … … 970 984 !! ** Method : compute momentum using bulk formulation 971 985 !! formulea, ice variables and read atmospheric fields. 972 !! NB: ice drag coefficient is assumed to be a constant973 986 !!--------------------------------------------------------------------- 974 987 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pslp ! sea-level pressure [Pa] 975 988 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pwndi ! atmospheric wind at T-point [m/s] 976 989 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pwndj ! atmospheric wind at T-point [m/s] 977 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: ptair ! atmospheric wind at T-point [m/s]978 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pqair ! atmospheric wind at T-point [m/s]990 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: ptair ! atmospheric potential temperature at T-point [K] 991 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pqair ! atmospheric specific humidity at T-point [kg/kg] 979 992 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: puice ! sea-ice velocity on I or C grid [m/s] 980 993 REAL(wp) , INTENT(in ), DIMENSION(:,: ) :: pvice ! " … … 990 1003 REAL(wp) :: zootm_su ! sea-ice surface mean temperature 991 1004 REAL(wp) :: zztmp1, zztmp2 ! temporary scalars 992 REAL(wp), DIMENSION(jpi,jpj) :: ztmp ! temporary array 993 !!--------------------------------------------------------------------- 994 ! 995 ! LB: ptsui is in K !!! 1005 REAL(wp), DIMENSION(jpi,jpj) :: ztmp, zsipt ! temporary array 1006 !!--------------------------------------------------------------------- 996 1007 ! 997 1008 ! ------------------------------------------------------------ ! … … 1000 1011 ! C-grid ice dynamics : U & V-points (same as ocean) 1001 1012 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1002 wndm_ice(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) )1013 wndm_ice(ji,jj) = SQRT( pwndi(ji,jj) * pwndi(ji,jj) + pwndj(ji,jj) * pwndj(ji,jj) ) 1003 1014 END_2D 1004 1015 ! 1005 ! Make ice-atm. drag dependent on ice concentration 1006 1007 1016 ! potential sea-ice surface temperature [K] 1017 zsipt(:,:) = theta_exner( ptsui(:,:), pslp(:,:) ) 1018 1019 ! sea-ice <-> atmosphere bulk transfer coefficients 1008 1020 SELECT CASE( nblk_ice ) 1009 1021 … … 1019 1031 CASE( np_ice_an05 ) ! calculate new drag from Lupkes(2015) equations 1020 1032 ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ 1021 CALL turb_ice_an05( rn_zqt, rn_zu, ptsui, ptair, ztmp, pqair, wndm_ice, &1033 CALL turb_ice_an05( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, & 1022 1034 & Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i ) 1023 1035 !! 1024 1036 CASE( np_ice_lu12 ) 1025 1037 ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ 1026 CALL turb_ice_lu12( rn_zqt, rn_zu, ptsui, ptair, ztmp, pqair, wndm_ice, fr_i, &1038 CALL turb_ice_lu12( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i, & 1027 1039 & Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i ) 1028 1040 !! 1029 1041 CASE( np_ice_lg15 ) ! calculate new drag from Lupkes(2015) equations 1030 1042 ztmp(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ! temporary array for SSQ 1031 CALL turb_ice_lg15( rn_zqt, rn_zu, ptsui, ptair, ztmp, pqair, wndm_ice, fr_i, &1043 CALL turb_ice_lg15( rn_zqt, rn_zu, zsipt, ptair, ztmp, pqair, wndm_ice, fr_i, & 1032 1044 & Cd_ice, Ch_ice, Ce_ice, theta_zu_i, q_zu_i ) 1033 1045 !! 1034 1046 END SELECT 1035 1047 1036 IF( iom_use('Cd_ice').OR.iom_use('Ce_ice').OR.iom_use('Ch_ice').OR.iom_use('taum_ice').OR.iom_use('utau_ice').OR.iom_use('vtau_ice') ) & 1037 & ztmp(:,:) = ( 1._wp - MAX(0._wp, SIGN( 1._wp, 1.E-6_wp - fr_i )) )*tmask(:,:,1) ! mask for presence of ice ! 1038 1048 ztmp(:,:) = ( 1._wp - MAX(0._wp, SIGN( 1._wp, 1.E-6_wp - fr_i )) )*tmask(:,:,1) ! mask for presence of ice ! 1049 IF( iom_use('spt_ice')) CALL iom_put("spt_ice", (zsipt-rt0)*ztmp) 1039 1050 IF( iom_use('Cd_ice') ) CALL iom_put("Cd_ice", Cd_ice*ztmp) 1040 1051 IF( iom_use('Ce_ice') ) CALL iom_put("Ce_ice", Ce_ice*ztmp) … … 1049 1060 DO_2D( 0, 1, 0, 1 ) ! at T point 1050 1061 zztmp1 = rhoa(ji,jj) * Cd_ice(ji,jj) * wndm_ice(ji,jj) 1051 putaui(ji,jj) = 1052 pvtaui(ji,jj) = 1062 putaui(ji,jj) = zztmp1 * pwndi(ji,jj) 1063 pvtaui(ji,jj) = zztmp1 * pwndj(ji,jj) 1053 1064 END_2D 1054 1065 … … 1073 1084 & , tab2d_2=pvtaui , clinfo2=' pvtaui : ' ) 1074 1085 ELSE ! ln_abl 1086 1075 1087 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1076 pcd_dui(ji,jj) = wndm_ice(ji,jj) * Cd_ice(ji,jj)1077 pseni (ji,jj) = wndm_ice(ji,jj) * Ch_ice(ji,jj)1078 pevpi (ji,jj) = wndm_ice(ji,jj) * Ce_ice(ji,jj)1088 pcd_dui(ji,jj) = wndm_ice(ji,jj) * Cd_ice(ji,jj) 1089 pseni (ji,jj) = wndm_ice(ji,jj) * Ch_ice(ji,jj) 1090 pevpi (ji,jj) = wndm_ice(ji,jj) * Ce_ice(ji,jj) 1079 1091 END_2D 1080 !#LB:1081 1092 pssqi(:,:) = q_sat( ptsui(:,:), pslp(:,:), l_ice=.TRUE. ) ; ! more accurate way to obtain ssq ! 1082 !#LB. 1083 ENDIF ! IF( ln_blk )1093 1094 ENDIF ! ln_blk / ln_abl 1084 1095 ! 1085 1096 IF(sn_cfctl%l_prtctl) CALL prt_ctl(tab2d_1=wndm_ice , clinfo1=' blk_ice: wndm_ice : ') … … 1112 1123 !! 1113 1124 INTEGER :: ji, jj, jl ! dummy loop indices 1114 REAL(wp) :: zst, zst3, zsq 1125 REAL(wp) :: zst, zst3, zsq, zsipt ! local variable 1115 1126 REAL(wp) :: zcoef_dqlw, zcoef_dqla ! - - 1116 1127 REAL(wp) :: zztmp, zzblk, zztmp1, z1_rLsub ! - - … … 1126 1137 zcoef_dqlw = 4._wp * emiss_i * stefan ! local scalars 1127 1138 ! 1128 1129 1139 zztmp = 1. / ( 1. - albo ) 1130 1140 dqla_ice(:,:,:) = 0._wp 1131 1132 1141 ! ! ========================== ! 1133 1142 DO jl = 1, jpl ! Loop over ice categories ! … … 1135 1144 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 1136 1145 1137 zst = ptsu(ji,jj,jl) ! surface temperature of sea-ice [K] 1138 zsq = q_sat( zst, pslp(ji,jj), l_ice=.TRUE. ) ! surface saturation specific humidity when ice present 1139 1140 ! ----------------------------! 1141 ! I Radiative FLUXES ! 1142 ! ----------------------------! 1143 ! Short Wave (sw) 1144 qsr_ice(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 1145 1146 ! Long Wave (lw) 1147 zst3 = zst * zst * zst 1148 z_qlw(ji,jj,jl) = emiss_i * ( pdqlw(ji,jj) - stefan * zst * zst3 ) * tmask(ji,jj,1) 1149 ! lw sensitivity 1150 z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3 1151 1152 ! ----------------------------! 1153 ! II Turbulent FLUXES ! 1154 ! ----------------------------! 1155 1156 ! ... turbulent heat fluxes with Ch_ice recalculated in blk_ice_1 1157 1158 ! Common term in bulk F. equations... 1159 zzblk = rhoa(ji,jj) * wndm_ice(ji,jj) 1160 1161 ! Sensible Heat 1162 zztmp1 = zzblk * rCp_air * Ch_ice(ji,jj) 1163 z_qsb (ji,jj,jl) = zztmp1 * (zst - theta_zu_i(ji,jj)) 1164 z_dqsb(ji,jj,jl) = zztmp1 ! ==> Qsens sensitivity (Dqsb_ice/Dtn_ice) 1165 1166 ! Latent Heat 1167 zztmp1 = zzblk * rLsub * Ce_ice(ji,jj) 1168 qla_ice(ji,jj,jl) = MAX( zztmp1 * (zsq - q_zu_i(ji,jj)) , 0._wp ) ! #LB: only sublimation (and not condensation) ??? 1169 IF(qla_ice(ji,jj,jl)>0._wp) dqla_ice(ji,jj,jl) = zztmp1*dq_sat_dt_ice(zst, pslp(ji,jj)) ! ==> Qlat sensitivity (dQlat/dT) 1170 ! !#LB: dq_sat_dt_ice() in "sbc_phy.F90" 1171 !#LB: without this unjustified "condensation sensure": 1172 !qla_ice( ji,jj,jl) = zztmp1 * (zsq - q_zu_i(ji,jj)) 1173 !dqla_ice(ji,jj,jl) = zztmp1 * dq_sat_dt_ice(zst, pslp(ji,jj)) ! ==> Qlat sensitivity (dQlat/dT) 1174 1175 1176 ! ----------------------------! 1177 ! III Total FLUXES ! 1178 ! ----------------------------! 1179 ! Downward Non Solar flux 1180 qns_ice (ji,jj,jl) = z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - qla_ice (ji,jj,jl) 1181 ! Total non solar heat flux sensitivity for ice 1182 dqns_ice(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + dqla_ice(ji,jj,jl) ) !#LB: correct signs ???? 1146 zst = ptsu(ji,jj,jl) ! surface temperature of sea-ice [K] 1147 zsq = q_sat( zst, pslp(ji,jj), l_ice=.TRUE. ) ! surface saturation specific humidity when ice present 1148 zsipt = theta_exner( zst, pslp(ji,jj) ) ! potential sea-ice surface temperature [K] 1149 1150 ! ----------------------------! 1151 ! I Radiative FLUXES ! 1152 ! ----------------------------! 1153 ! Short Wave (sw) 1154 qsr_ice(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 1155 1156 ! Long Wave (lw) 1157 zst3 = zst * zst * zst 1158 z_qlw(ji,jj,jl) = emiss_i * ( pdqlw(ji,jj) - stefan * zst * zst3 ) * tmask(ji,jj,1) 1159 ! lw sensitivity 1160 z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3 1161 1162 ! ----------------------------! 1163 ! II Turbulent FLUXES ! 1164 ! ----------------------------! 1165 1166 ! ... turbulent heat fluxes with Ch_ice recalculated in blk_ice_1 1167 1168 ! Common term in bulk F. equations... 1169 zzblk = rhoa(ji,jj) * wndm_ice(ji,jj) 1170 1171 ! Sensible Heat 1172 zztmp1 = zzblk * rCp_air * Ch_ice(ji,jj) 1173 z_qsb (ji,jj,jl) = zztmp1 * (zsipt - theta_zu_i(ji,jj)) 1174 z_dqsb(ji,jj,jl) = zztmp1 ! ==> Qsens sensitivity (Dqsb_ice/Dtn_ice) 1175 1176 ! Latent Heat 1177 zztmp1 = zzblk * rLsub * Ce_ice(ji,jj) 1178 qla_ice(ji,jj,jl) = MAX( zztmp1 * (zsq - q_zu_i(ji,jj)) , 0._wp ) ! #LB: only sublimation (and not condensation) ??? 1179 IF(qla_ice(ji,jj,jl)>0._wp) dqla_ice(ji,jj,jl) = zztmp1*dq_sat_dt_ice(zst, pslp(ji,jj)) ! ==> Qlat sensitivity (dQlat/dT) 1180 ! !#LB: dq_sat_dt_ice() in "sbc_phy.F90" 1181 !#LB: without this unjustified "condensation sensure": 1182 !qla_ice( ji,jj,jl) = zztmp1 * (zsq - q_zu_i(ji,jj)) 1183 !dqla_ice(ji,jj,jl) = zztmp1 * dq_sat_dt_ice(zst, pslp(ji,jj)) ! ==> Qlat sensitivity (dQlat/dT) 1184 1185 1186 ! ----------------------------! 1187 ! III Total FLUXES ! 1188 ! ----------------------------! 1189 ! Downward Non Solar flux 1190 qns_ice (ji,jj,jl) = z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - qla_ice (ji,jj,jl) 1191 ! Total non solar heat flux sensitivity for ice 1192 dqns_ice(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + dqla_ice(ji,jj,jl) ) !#LB: correct signs ???? 1183 1193 1184 1194 END_2D -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/OCE/SBC/sbcblk_algo_coare3p0.F90
r14072 r14592 189 189 REAL(wp), DIMENSION(jpi,jpj) :: zeta_u ! stability parameter at height zu 190 190 REAL(wp), DIMENSION(jpi,jpj) :: ztmp0, ztmp1, ztmp2 191 REAL(wp), DIMENSION(jpi,jpj) :: zpre, zrhoa, zta 191 192 ! 192 193 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zeta_t ! stability parameter at height zt … … 321 322 ENDIF 322 323 324 IF(( l_use_cs ).OR.( l_use_wl )) THEN 325 zpre(:,:) = pres_temp( q_zu(:,:), slp(:,:), zu, ptpot=t_zu(:,:), pta=zta(:,:) ) 326 zrhoa(:,:) = rho_air( zta(:,:), q_zu(:,:), zpre(:,:) ) 327 ENDIF 328 323 329 IF( l_use_cs ) THEN 324 330 !! Cool-skin contribution 325 331 326 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, &327 & ztmp1, zeta_u, 332 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 333 & ztmp1, zeta_u, Qlat=ztmp2) ! Qnsol -> ztmp1 / Tau -> zeta_u 328 334 329 335 CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 ) ! ! Qnsol -> ztmp1 / Qlat -> ztmp2 … … 336 342 IF( l_use_wl ) THEN 337 343 !! Warm-layer contribution 338 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, &344 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 339 345 & ztmp1, zeta_u) ! Qnsol -> ztmp1 / Tau -> zeta_u 340 346 !! In WL_COARE or , Tau_ac and Qnt_ac must be updated at the final itteration step => add a flag to do this! -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/OCE/SBC/sbcblk_algo_coare3p6.F90
r14072 r14592 179 179 REAL(wp), DIMENSION(jpi,jpj) :: zeta_u ! stability parameter at height zu 180 180 REAL(wp), DIMENSION(jpi,jpj) :: ztmp0, ztmp1, ztmp2 181 REAL(wp), DIMENSION(jpi,jpj) :: zpre, zrhoa, zta 181 182 ! 182 183 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zeta_t ! stability parameter at height zt … … 311 312 ENDIF 312 313 314 IF(( l_use_cs ).OR.( l_use_wl )) THEN 315 zpre(:,:) = pres_temp( q_zu(:,:), slp(:,:), zu, ptpot=t_zu(:,:), pta=zta(:,:) ) 316 zrhoa(:,:) = rho_air( zta(:,:), q_zu(:,:), zpre(:,:) ) 317 ENDIF 318 313 319 IF( l_use_cs ) THEN 314 320 !! Cool-skin contribution 315 321 316 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, &317 & ztmp1, zeta_u, 322 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 323 & ztmp1, zeta_u, Qlat=ztmp2) ! Qnsol -> ztmp1 / Tau -> zeta_u 318 324 319 325 CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 ) ! ! Qnsol -> ztmp1 / Qlat -> ztmp2 … … 326 332 IF( l_use_wl ) THEN 327 333 !! Warm-layer contribution 328 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, &334 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 329 335 & ztmp1, zeta_u) ! Qnsol -> ztmp1 / Tau -> zeta_u 330 336 !! In WL_COARE or , Tau_ac and Qnt_ac must be updated at the final itteration step => add a flag to do this! -
NEMO/branches/2021/ticket2632_r14588_theta_sbcblk/src/OCE/SBC/sbcblk_algo_ecmwf.F90
r14072 r14592 182 182 REAL(wp), DIMENSION(jpi,jpj) :: Linv !: 1/L (inverse of Monin Obukhov length... 183 183 REAL(wp), DIMENSION(jpi,jpj) :: z0, z0t, z0q 184 REAL(wp), DIMENSION(jpi,jpj) :: zrhoa, zpre, zta 184 185 ! 185 186 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zsst ! to back up the initial bulk SST … … 336 337 func_h = log(zu) - LOG(z0t) - psi_h_ecmwf(ztmp0) + psi_h_ecmwf(z0t*Linv) 337 338 339 IF(( l_use_cs ).OR.( l_use_wl )) THEN 340 zpre(:,:) = pres_temp( q_zu(:,:), slp(:,:), zu, ptpot=t_zu(:,:), pta=zta(:,:) ) 341 zrhoa(:,:) = rho_air( zta(:,:), q_zu(:,:), zpre(:,:) ) 342 ENDIF 338 343 339 344 IF( l_use_cs ) THEN 340 345 !! Cool-skin contribution 341 346 342 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, & 343 & ztmp1, ztmp0, Qlat=ztmp2) ! Qnsol -> ztmp1 / Tau -> ztmp0 347 348 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 349 & ztmp1, ztmp0, Qlat=ztmp2) ! Qnsol -> ztmp1 / Tau -> ztmp0 344 350 345 351 CALL CS_ECMWF( Qsw, ztmp1, u_star, zsst ) ! Qnsol -> ztmp1 … … 353 359 IF( l_use_wl ) THEN 354 360 !! Warm-layer contribution 355 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, &361 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, Ubzu, slp, rad_lw, zrhoa, & 356 362 & ztmp1, ztmp2) ! Qnsol -> ztmp1 / Tau -> ztmp2 357 363 CALL WL_ECMWF( Qsw, ztmp1, u_star, zsst )
Note: See TracChangeset
for help on using the changeset viewer.