Changeset 11772 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_phy.F90
- Timestamp:
- 2019-10-23T16:04:12+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_phy.F90
r11638 r11772 45 45 END INTERFACE cp_air 46 46 47 47 INTERFACE alpha_sw 48 48 MODULE PROCEDURE alpha_sw_vctr, alpha_sw_sclr 49 49 END INTERFACE alpha_sw 50 51 INTERFACE turb_fluxes 52 MODULE PROCEDURE turb_fluxes_vctr, turb_fluxes_sclr 53 END INTERFACE turb_fluxes 50 54 51 55 … … 64 68 PUBLIC update_qnsol_tau 65 69 PUBLIC alpha_sw 70 PUBLIC turb_fluxes 66 71 67 72 !!---------------------------------------------------------------------- … … 128 133 rho_air_sclr = MAX( pslp / (R_dry*ptak * ( 1._wp + rctv0*pqa )) , 0.8_wp ) 129 134 END FUNCTION rho_air_sclr 130 135 131 136 132 137 … … 464 469 465 470 466 SUBROUTINE UPDATE_QNSOL_TAU( p Ts, pqs, pTa, pqa, pust, ptst, pqst, pUb, pslp, prlw, &471 SUBROUTINE UPDATE_QNSOL_TAU( pzu, pTs, pqs, pTa, pqa, pust, ptst, pqst, pwnd, pUb, pslp, prlw, & 467 472 & pQns, pTau, & 468 473 & Qlat) … … 472 477 !! ** Author: L. Brodeau, Sept. 2019 / AeroBulk (https://github.com/brodeau/aerobulk/) 473 478 !!---------------------------------------------------------------------------------- 479 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 474 480 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 475 481 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 476 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTa ! air temperature at z=zu [K]477 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity at z= zu [kg/kg]482 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 483 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 478 484 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pust ! u* 479 485 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptst ! t* 480 486 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqst ! q* 481 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb ! bulk wind speed at z=zu [m/s] 487 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 488 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 482 489 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! sea-level atmospheric pressure [Pa] 483 490 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: prlw ! downwelling longwave radiative flux [W/m^2] … … 491 498 & zQlat, zQsen, zQlw 492 499 INTEGER :: ji, jj ! dummy loop indices 493 !!---------------------------------------------------------------------------------- 500 !!---------------------------------------------------------------------------------- 494 501 DO jj = 1, jpj 495 502 DO ji = 1, jpi … … 502 509 zCe = zz0*pqst(ji,jj)/zdq 503 510 504 zUrho = pUb(ji,jj)*MAX(rho_air(pTa(ji,jj), pqa(ji,jj), pslp(ji,jj)), 1._wp) ! rho*U10511 !zUrho = pUb(ji,jj)*MAX(rho_air(pTa(ji,jj), pqa(ji,jj), pslp(ji,jj)), 1._wp) ! rho*U10 505 512 zTs2 = pTs(ji,jj)*pTs(ji,jj) 506 513 514 CALL TURB_FLUXES( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), zCd, zCh, zCe, & 515 & pwnd(ji,jj), pUb(ji,jj), pslp(ji,jj), & 516 & pTau(ji,jj), zQsen, zQlat ) 517 518 507 519 ! Wind stress module: 508 pTau(ji,jj) = zCd*zUrho*pUb(ji,jj) ! lolo?520 !pTau(ji,jj) = zCd*zUrho*pUb(ji,jj) ! lolo? 509 521 510 522 ! Non-Solar heat flux to the ocean: 511 zQlat = MIN ( zUrho*zCe*L_vap( pTs(ji,jj)) * zdq , 0._wp ) ! we do not want a Qlat > 0 !512 zQsen = zUrho*zCh*cp_air(pqa(ji,jj)) * zdt523 !zQlat = MIN ( zUrho*zCe*L_vap( pTs(ji,jj)) * zdq , 0._wp ) ! we do not want a Qlat > 0 ! 524 !zQsen = zUrho*zCh*cp_air(pqa(ji,jj)) * zdt 513 525 zQlw = emiss_w*(prlw(ji,jj) - stefan*zTs2*zTs2) ! Net longwave flux 514 526 515 527 pQns(ji,jj) = zQlat + zQsen + zQlw 516 517 IF ( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 528 529 IF ( PRESENT(Qlat) ) Qlat(ji,jj) = zQlat 518 530 END DO 519 531 END DO 520 532 END SUBROUTINE UPDATE_QNSOL_TAU 533 534 535 536 537 538 SUBROUTINE TURB_FLUXES_VCTR( pzu, pTs, pqs, pTa, pqa, pCd, pCh, pCe, pwnd, pUb, pslp, & 539 & pTau, pQsen, pQlat, pEvap ) 540 !!---------------------------------------------------------------------------------- 541 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 542 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 543 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 544 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 545 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 546 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCd 547 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCh 548 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pCe 549 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 550 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 551 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! sea-level atmospheric pressure [Pa] 552 !! 553 REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pTau ! module of the wind stress [N/m^2] 554 REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQsen ! [W/m^2] 555 REAL(wp), DIMENSION(jpi,jpj), INTENT(out) :: pQlat ! [W/m^2] 556 !! 557 REAL(wp), DIMENSION(jpi,jpj), INTENT(out), OPTIONAL :: pEvap ! [kg/m^2/s] 558 !! 559 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap 560 INTEGER :: ji, jj, jq ! dummy loop indices 561 !!---------------------------------------------------------------------------------- 562 DO jj = 1, jpj 563 DO ji = 1, jpi 564 565 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 566 ztaa = pTa(ji,jj) ! first guess... 567 DO jq = 1, 4 568 zgamma = gamma_moist( 0.5*(ztaa+pTs(ji,jj)) , pqa(ji,jj) ) 569 ztaa = pTa(ji,jj) - zgamma*pzu ! Absolute temp. is slightly colder... 570 END DO 571 zrho = rho_air(ztaa, pqa(ji,jj), pslp(ji,jj)) 572 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! 573 574 zUrho = pUb(ji,jj)*MAX(zrho, 1._wp) ! rho*U10 575 576 pTau(ji,jj) = zUrho * pCd(ji,jj) * pwnd(ji,jj) ! Wind stress module 577 578 zevap = MIN( zUrho * pCe(ji,jj) * (pqa(ji,jj) - pqs(ji,jj)) , 0._wp ) ! we do not want condensation & Qlat > 0 ! 579 pQsen(ji,jj) = zUrho * pCh(ji,jj) * (pTa(ji,jj) - pTs(ji,jj)) * cp_air(pqa(ji,jj)) 580 pQlat(ji,jj) = L_vap(pTs(ji,jj)) * zevap 581 582 IF ( PRESENT(pEvap) ) pEvap(ji,jj) = - zevap 583 584 END DO 585 END DO 586 END SUBROUTINE TURB_FLUXES_VCTR 587 588 589 SUBROUTINE TURB_FLUXES_SCLR( pzu, pTs, pqs, pTa, pqa, pCd, pCh, pCe, pwnd, pUb, pslp, & 590 & pTau, pQsen, pQlat, pEvap ) 591 !!---------------------------------------------------------------------------------- 592 REAL(wp), INTENT(in) :: pzu ! height above the sea-level where all this takes place (normally 10m) 593 REAL(wp), INTENT(in) :: pTs ! water temperature at the air-sea interface [K] 594 REAL(wp), INTENT(in) :: pqs ! satur. spec. hum. at T=pTs [kg/kg] 595 REAL(wp), INTENT(in) :: pTa ! potential air temperature at z=pzu [K] 596 REAL(wp), INTENT(in) :: pqa ! specific humidity at z=pzu [kg/kg] 597 REAL(wp), INTENT(in) :: pCd 598 REAL(wp), INTENT(in) :: pCh 599 REAL(wp), INTENT(in) :: pCe 600 REAL(wp), INTENT(in) :: pwnd ! wind speed module at z=pzu [m/s] 601 REAL(wp), INTENT(in) :: pUb ! bulk wind speed at z=pzu (inc. pot. effect of gustiness etc) [m/s] 602 REAL(wp), INTENT(in) :: pslp ! sea-level atmospheric pressure [Pa] 603 !! 604 REAL(wp), INTENT(out) :: pTau ! module of the wind stress [N/m^2] 605 REAL(wp), INTENT(out) :: pQsen ! [W/m^2] 606 REAL(wp), INTENT(out) :: pQlat ! [W/m^2] 607 !! 608 REAL(wp), INTENT(out), OPTIONAL :: pEvap ! [kg/m^2/s] 609 !! 610 REAL(wp) :: ztaa, zgamma, zrho, zUrho, zevap 611 INTEGER :: jq 612 !!---------------------------------------------------------------------------------- 613 614 !! Need ztaa, absolute temperature at pzu (formula to estimate rho_air needs absolute temperature, not the potential temperature "pTa") 615 ztaa = pTa ! first guess... 616 DO jq = 1, 4 617 zgamma = gamma_moist( 0.5*(ztaa+pTs) , pqa ) 618 ztaa = pTa - zgamma*pzu ! Absolute temp. is slightly colder... 619 END DO 620 zrho = rho_air(ztaa, pqa, pslp) 621 zrho = rho_air(ztaa, pqa, pslp-zrho*grav*pzu) ! taking into account that we are pzu m above the sea level where SLP is given! 622 623 zUrho = pUb*MAX(zrho, 1._wp) ! rho*U10 624 625 pTau = zUrho * pCd * pwnd ! Wind stress module 626 627 zevap = MIN( zUrho * pCe * (pqa - pqs) , 0._wp ) ! we do not want condensation & Qlat > 0 ! 628 pQsen = zUrho * pCh * (pTa - pTs) * cp_air(pqa) 629 pQlat = L_vap(pTs) * zevap 630 631 IF ( PRESENT(pEvap) ) pEvap = - zevap 632 633 END SUBROUTINE TURB_FLUXES_SCLR 634 635 636 521 637 522 638 … … 529 645 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/) 530 646 !!---------------------------------------------------------------------------------- 531 REAL(wp), DIMENSION(jpi,jpj) :: alpha_sw_vctr ! latent heat of vaporization [J/kg]647 REAL(wp), DIMENSION(jpi,jpj) :: alpha_sw_vctr ! thermal expansion coefficient of sea-water [1/K] 532 648 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psst ! water temperature [K] 533 649 !!---------------------------------------------------------------------------------- … … 543 659 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://github.com/brodeau/aerobulk/) 544 660 !!---------------------------------------------------------------------------------- 545 REAL(wp) :: alpha_sw_sclr ! latent heat of vaporization [J/kg]661 REAL(wp) :: alpha_sw_sclr ! thermal expansion coefficient of sea-water [1/K] 546 662 REAL(wp), INTENT(in) :: psst ! sea-water temperature [K] 547 663 !!----------------------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.