- Timestamp:
- 2020-01-27T15:31:53+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/SBC/sbcblk_phy.F90
r12182 r12340 100 100 PUBLIC bulk_formula 101 101 102 !! * Substitutions 103 # include "do_loop_substitute.h90" 102 104 !!---------------------------------------------------------------------- 103 105 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 179 181 !!---------------------------------------------------------------------------------- 180 182 ! 181 DO jj = 1, jpj 182 DO ji = 1, jpi 183 ztc = ptak(ji,jj) - rt0 ! air temp, in deg. C 184 ztc2 = ztc*ztc 185 visc_air(ji,jj) = 1.326e-5*(1. + 6.542E-3*ztc + 8.301e-6*ztc2 - 4.84e-9*ztc2*ztc) 186 END DO 187 END DO 183 DO_2D_11_11 184 ztc = ptak(ji,jj) - rt0 ! air temp, in deg. C 185 ztc2 = ztc*ztc 186 visc_air(ji,jj) = 1.326e-5*(1. + 6.542E-3*ztc + 8.301e-6*ztc2 - 4.84e-9*ztc2*ztc) 187 END_2D 188 188 ! 189 189 END FUNCTION visc_air … … 270 270 INTEGER :: ji, jj ! dummy loop indices 271 271 !!---------------------------------------------------------------------------------- 272 DO jj = 1, jpj 273 DO ji = 1, jpi 274 gamma_moist_vctr(ji,jj) = gamma_moist_sclr( ptak(ji,jj), pqa(ji,jj) ) 275 END DO 276 END DO 272 DO_2D_11_11 273 gamma_moist_vctr(ji,jj) = gamma_moist_sclr( ptak(ji,jj), pqa(ji,jj) ) 274 END_2D 277 275 END FUNCTION gamma_moist_vctr 278 276 … … 317 315 !!------------------------------------------------------------------- 318 316 ! 319 DO jj = 1, jpj 320 DO ji = 1, jpi 321 ! 322 zqa = (1._wp + rctv0*pqa(ji,jj)) 323 ! 324 ! The main concern is to know whether, the vertical turbulent flux of virtual temperature, < u' theta_v' > is estimated with: 325 ! a/ -u* [ theta* (1 + 0.61 q) + 0.61 theta q* ] => this is the one that seems correct! chose this one! 326 ! or 327 ! b/ -u* [ theta* + 0.61 theta q* ] 328 ! 329 One_on_L(ji,jj) = grav*vkarmn*( pts(ji,jj)*zqa + rctv0*ptha(ji,jj)*pqs(ji,jj) ) & 330 & / MAX( pus(ji,jj)*pus(ji,jj)*ptha(ji,jj)*zqa , 1.E-9_wp ) 331 ! 332 END DO 333 END DO 317 DO_2D_11_11 318 ! 319 zqa = (1._wp + rctv0*pqa(ji,jj)) 320 ! 321 ! The main concern is to know whether, the vertical turbulent flux of virtual temperature, < u' theta_v' > is estimated with: 322 ! a/ -u* [ theta* (1 + 0.61 q) + 0.61 theta q* ] => this is the one that seems correct! chose this one! 323 ! or 324 ! b/ -u* [ theta* + 0.61 theta q* ] 325 ! 326 One_on_L(ji,jj) = grav*vkarmn*( pts(ji,jj)*zqa + rctv0*ptha(ji,jj)*pqs(ji,jj) ) & 327 & / MAX( pus(ji,jj)*pus(ji,jj)*ptha(ji,jj)*zqa , 1.E-9_wp ) 328 ! 329 END_2D 334 330 ! 335 331 One_on_L = SIGN( MIN(ABS(One_on_L),200._wp), One_on_L ) ! (prevent FPE from stupid values over masked regions...) … … 355 351 !!------------------------------------------------------------------- 356 352 ! 357 DO jj = 1, jpj 358 DO ji = 1, jpi 359 ! 360 zqa = 0.5_wp*(pqa(ji,jj)+pssq(ji,jj)) ! ~ mean q within the layer... 361 zta = 0.5_wp*( psst(ji,jj) + ptha(ji,jj) - gamma_moist(ptha(ji,jj),zqa)*pz ) ! ~ mean absolute temperature of air within the layer 362 zta = 0.5_wp*( psst(ji,jj) + ptha(ji,jj) - gamma_moist(zta, zqa)*pz ) ! ~ mean absolute temperature of air within the layer 363 zgamma = gamma_moist(zta, zqa) ! Adiabatic lapse-rate for moist air within the layer 364 ! 365 zsstv = psst(ji,jj)*(1._wp + rctv0*pssq(ji,jj)) ! absolute==potential virtual SST (absolute==potential because z=0!) 366 ! 367 zdth_v = ptha(ji,jj)*(1._wp + rctv0*pqa(ji,jj)) - zsstv ! air-sea delta of "virtual potential temperature" 368 ! 369 ztv = 0.5_wp*( zsstv + (ptha(ji,jj) - zgamma*pz)*(1._wp + rctv0*pqa(ji,jj)) ) ! ~ mean absolute virtual temp. within the layer 370 ! 371 Ri_bulk(ji,jj) = grav*zdth_v*pz / ( ztv*pub(ji,jj)*pub(ji,jj) ) ! the usual definition of Ri_bulk 372 ! 373 END DO 374 END DO 353 DO_2D_11_11 354 ! 355 zqa = 0.5_wp*(pqa(ji,jj)+pssq(ji,jj)) ! ~ mean q within the layer... 356 zta = 0.5_wp*( psst(ji,jj) + ptha(ji,jj) - gamma_moist(ptha(ji,jj),zqa)*pz ) ! ~ mean absolute temperature of air within the layer 357 zta = 0.5_wp*( psst(ji,jj) + ptha(ji,jj) - gamma_moist(zta, zqa)*pz ) ! ~ mean absolute temperature of air within the layer 358 zgamma = gamma_moist(zta, zqa) ! Adiabatic lapse-rate for moist air within the layer 359 ! 360 zsstv = psst(ji,jj)*(1._wp + rctv0*pssq(ji,jj)) ! absolute==potential virtual SST (absolute==potential because z=0!) 361 ! 362 zdth_v = ptha(ji,jj)*(1._wp + rctv0*pqa(ji,jj)) - zsstv ! air-sea delta of "virtual potential temperature" 363 ! 364 ztv = 0.5_wp*( zsstv + (ptha(ji,jj) - zgamma*pz)*(1._wp + rctv0*pqa(ji,jj)) ) ! ~ mean absolute virtual temp. within the layer 365 ! 366 Ri_bulk(ji,jj) = grav*zdth_v*pz / ( ztv*pub(ji,jj)*pub(ji,jj) ) ! the usual definition of Ri_bulk 367 ! 368 END_2D 375 369 END FUNCTION Ri_bulk 376 370 … … 454 448 !!---------------------------------------------------------------------------------- 455 449 ! 456 DO jj = 1, jpj 457 DO ji = 1, jpi 458 ! 459 ze_sat = e_sat_sclr( ptak(ji,jj) ) 460 ! 461 q_sat(ji,jj) = reps0 * ze_sat/( pslp(ji,jj) - (1._wp - reps0)*ze_sat ) 462 ! 463 END DO 464 END DO 450 DO_2D_11_11 451 ! 452 ze_sat = e_sat_sclr( ptak(ji,jj) ) 453 ! 454 q_sat(ji,jj) = reps0 * ze_sat/( pslp(ji,jj) - (1._wp - reps0)*ze_sat ) 455 ! 456 END_2D 465 457 ! 466 458 END FUNCTION q_sat … … 481 473 !!---------------------------------------------------------------------------------- 482 474 ! 483 DO jj = 1, jpj 484 DO ji = 1, jpi 485 ze = prha(ji,jj)*e_sat_sclr(ptak(ji,jj)) 486 q_air_rh(ji,jj) = ze*reps0/(pslp(ji,jj) - (1. - reps0)*ze) 487 END DO 488 END DO 475 DO_2D_11_11 476 ze = prha(ji,jj)*e_sat_sclr(ptak(ji,jj)) 477 q_air_rh(ji,jj) = ze*reps0/(pslp(ji,jj) - (1. - reps0)*ze) 478 END_2D 489 479 ! 490 480 END FUNCTION q_air_rh … … 521 511 INTEGER :: ji, jj ! dummy loop indices 522 512 !!---------------------------------------------------------------------------------- 523 DO jj = 1, jpj 524 DO ji = 1, jpi 525 526 zdt = pTa(ji,jj) - pTs(ji,jj) ; zdt = SIGN( MAX(ABS(zdt),1.E-6_wp), zdt ) 527 zdq = pqa(ji,jj) - pqs(ji,jj) ; zdq = SIGN( MAX(ABS(zdq),1.E-9_wp), zdq ) 528 zz0 = pust(ji,jj)/pUb(ji,jj) 529 zCd = zz0*zz0 530 zCh = zz0*ptst(ji,jj)/zdt 531 zCe = zz0*pqst(ji,jj)/zdq 532 533 CALL BULK_FORMULA( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), & 534 & zCd, zCh, zCe, & 535 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj), & 536 & pTau(ji,jj), zQsen, zQlat ) 537 538 zTs2 = pTs(ji,jj)*pTs(ji,jj) 539 zQlw = emiss_w*(prlw(ji,jj) - stefan*zTs2*zTs2) ! Net longwave flux 540 541 pQns(ji,jj) = zQlat + zQsen + zQlw 542 543 IF( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 544 END DO 545 END DO 513 DO_2D_11_11 514 515 zdt = pTa(ji,jj) - pTs(ji,jj) ; zdt = SIGN( MAX(ABS(zdt),1.E-6_wp), zdt ) 516 zdq = pqa(ji,jj) - pqs(ji,jj) ; zdq = SIGN( MAX(ABS(zdq),1.E-9_wp), zdq ) 517 zz0 = pust(ji,jj)/pUb(ji,jj) 518 zCd = zz0*zz0 519 zCh = zz0*ptst(ji,jj)/zdt 520 zCe = zz0*pqst(ji,jj)/zdq 521 522 CALL BULK_FORMULA( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), & 523 & zCd, zCh, zCe, & 524 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj), & 525 & pTau(ji,jj), zQsen, zQlat ) 526 527 zTs2 = pTs(ji,jj)*pTs(ji,jj) 528 zQlw = emiss_w*(prlw(ji,jj) - stefan*zTs2*zTs2) ! Net longwave flux 529 530 pQns(ji,jj) = zQlat + zQsen + zQlw 531 532 IF( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 533 END_2D 546 534 END SUBROUTINE UPDATE_QNSOL_TAU 547 535 … … 574 562 INTEGER :: ji, jj, jq ! dummy loop indices 575 563 !!---------------------------------------------------------------------------------- 576 DO jj = 1, jpj 577 DO ji = 1, jpi 578 579 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 580 ztaa = pTa(ji,jj) ! first guess... 581 DO jq = 1, 4 582 zgamma = gamma_moist( 0.5*(ztaa+pTs(ji,jj)) , pqa(ji,jj) ) 583 ztaa = pTa(ji,jj) - zgamma*pzu ! Absolute temp. is slightly colder... 584 END DO 585 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)) 586 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 587 588 zUrho = pUb(ji,jj)*MAX(zrho, 1._wp) ! rho*U10 589 590 pTau(ji,jj) = zUrho * pCd(ji,jj) * pwnd(ji,jj) ! Wind stress module 591 592 zevap = zUrho * pCe(ji,jj) * (pqa(ji,jj) - pqs(ji,jj)) 593 pQsen(ji,jj) = zUrho * pCh(ji,jj) * (pTa(ji,jj) - pTs(ji,jj)) * cp_air(pqa(ji,jj)) 594 pQlat(ji,jj) = L_vap(pTs(ji,jj)) * zevap 595 596 IF( PRESENT(pEvap) ) pEvap(ji,jj) = - zevap 597 IF( PRESENT(prhoa) ) prhoa(ji,jj) = zrho 598 564 DO_2D_11_11 565 566 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 567 ztaa = pTa(ji,jj) ! first guess... 568 DO jq = 1, 4 569 zgamma = gamma_moist( 0.5*(ztaa+pTs(ji,jj)) , pqa(ji,jj) ) 570 ztaa = pTa(ji,jj) - zgamma*pzu ! Absolute temp. is slightly colder... 599 571 END DO 600 END DO 572 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)) 573 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 574 575 zUrho = pUb(ji,jj)*MAX(zrho, 1._wp) ! rho*U10 576 577 pTau(ji,jj) = zUrho * pCd(ji,jj) * pwnd(ji,jj) ! Wind stress module 578 579 zevap = zUrho * pCe(ji,jj) * (pqa(ji,jj) - pqs(ji,jj)) 580 pQsen(ji,jj) = zUrho * pCh(ji,jj) * (pTa(ji,jj) - pTs(ji,jj)) * cp_air(pqa(ji,jj)) 581 pQlat(ji,jj) = L_vap(pTs(ji,jj)) * zevap 582 583 IF( PRESENT(pEvap) ) pEvap(ji,jj) = - zevap 584 IF( PRESENT(prhoa) ) prhoa(ji,jj) = zrho 585 586 END_2D 601 587 END SUBROUTINE BULK_FORMULA_VCTR 602 588
Note: See TracChangeset
for help on using the changeset viewer.