SUBROUTINE ICAOHEIGHT(MAXWP, & !input MAXWICAOZ) ! output ! SUBPROGRAM: ICAOHEIGHT ! PRGRMMR: CHUANG ORG: W/NP2 DATE: 09-05-08 ! ! ABSTRACT: ! THIS ROUTINE CONVERT PRESSURE FIELDS TO ICAO HEIGHT ! ! Description: ! Convert pressure (Pa) to height (m) using ICAO standard atmosphere ! adpt code from uk ! Method: ! ! ! Code Description: ! Language: Fortran 90 ! Software Standards: UMDP3 v6 use ctlblk_mod, only: jsta, jend, spval, im, jm use physcons, only: con_g, con_rd IMPLICIT None ! Subroutine Arguments: !REAL, INTENT(IN) :: SPVAL REAL, INTENT(IN) :: MAXWP(IM,JM) !P field for conversion REAL, INTENT(INOUT) :: MAXWICAOZ(IM,JM) !ICAO height in m !INTEGER, INTENT(INOUT) :: ErrorStatus ! Local Constants: REAL, PARAMETER :: G_over_R = con_G / con_Rd REAL, PARAMETER :: Lapse_RateL = 6.5E-03 ! For levels below 11,000 gpm REAL, PARAMETER :: Lapse_RateU = -1.0E-03 ! For levels above 11,000 gpm REAL, PARAMETER :: Press_Bot = 101325. ! ICAO std: surface pressure REAL, PARAMETER :: Press_Mid = 22632. ! pressure @ 11,000 gpm REAL, PARAMETER :: Press_Top = 5474.87 ! pressure @ 20,000 gpm REAL, PARAMETER :: Temp_Bot = 288.15 ! Surface temperature REAL, PARAMETER :: Temp_Top = 216.65 ! Temperature of isotherm REAL, PARAMETER :: Gpm1 = 11000.0 ! Ht limit (gpm) for std lower ! lapse rate REAL, PARAMETER :: Gpm2 = 20000.0 ! Ht (gpm) of top of isothermal layer REAL, PARAMETER :: ZP1 = Lapse_RateL/G_over_R ! Exponents used for REAL, PARAMETER :: ZP2 = Lapse_RateU/G_over_R ! calculation ! Local Variables: INTEGER :: i,j ! loop counters REAL :: Pressure ! Local pressure ! End of header -------------------------------------------------------- !IF ( ErrorStatus /= StatusOK ) THEN ! Previous error - do not proceed ! GO TO 9999 !END IF !IF ( ASSOCIATED( IHField % RData ) ) THEN ! DEALLOCATE( IHField % RData ) !END IF DO J=JSTA,JEND DO I=1,IM pressure = MAXWP(i,j) IF ( (pressure <= 1000.) .AND. (pressure >= 0.) ) THEN pressure = 1000. print*,'lower ICAO pressure to 10 mb' END IF IF ( pressure > Press_Bot .and. pressure Press_Mid) THEN ! Hts up to 11,000 GPM pressure = pressure/Press_Bot pressure = 1.0 - pressure**ZP1 MAXWICAOZ(i,j) = pressure*Temp_Bot/Lapse_RateL ELSE IF (pressure > Press_Top) THEN ! Hts between 11,000 ! and 20,000 GPM pressure = pressure/Press_Mid pressure = -ALOG(pressure) MAXWICAOZ(i,j) = Gpm1 + pressure*Temp_Top/G_over_R ELSE ! Hts above 20,000 GPM pressure = pressure/Press_Top pressure = 1.0 - pressure**ZP2 MAXWICAOZ(i,j) = Gpm2 + pressure*Temp_Top/Lapse_RateU END IF ENDDO ENDDO !9999 CONTINUE END SUBROUTINE ICAOHeight