module_compute_geop.F

References to this file elsewhere.
1 MODULE module_compute_geop
2 
3 CONTAINS
4   SUBROUTINE compute_500mb_height  ( ph, phb, p, pb,                  &
5                                    height,                          &
6                                    ids, ide, jds, jde, kds, kde,    &
7                                    ims, ime, jms, jme, kms, kme,    &
8                                    its, ite, jts, jte, kts, kte    )
9 
10    IMPLICIT NONE
11 
12 
13    !  Input data.
14 
15    INTEGER ,       INTENT(IN   ) :: ids, ide, jds, jde, kds, kde, &
16                                     ims, ime, jms, jme, kms, kme, &
17                                     its, ite, jts, jte, kts, kte
18 
19    REAL , DIMENSION(  ims:ime , kms:kme, jms:jme ) ,                      &
20                                                INTENT(IN   ) ::           &
21                                                                  ph,      &
22                                                                  phb,     &
23                                                                  pb,      &
24                                                                  p
25 
26    REAL , DIMENSION( ims:ime , jms:jme ) ,    INTENT(  OUT) :: height
27 
28 !  local variables
29 
30    integer :: i,j,k
31    real, dimension(kms:kme) :: pressure,geopotential
32    real :: interp_output
33 
34 !  slow version of code, we'll call interp routine for each column
35 
36    do j = jts, min(jde-1,jte)
37    do i = its, min(ide-1,ite)
38 
39       do k=kds,kde
40         pressure(k) = p(i,k,j) + pb(i,k,j)
41         geopotential(k) = 0.5*( ph(i,k  ,j)+phb(i,k  ,j)  &
42                                +ph(i,k+1,j)+phb(i,k+1,j) )
43       enddo
44 
45       call interp_p( geopotential, pressure, 50000., interp_output,  &
46                      kds,kde-1,kms,kme, i,j )
47 
48       height(i,j) = interp_output/9.81  !  500 mb height in meters
49 
50    enddo
51    enddo
52 
53    end subroutine compute_500mb_height
54 
55 !--------
56 
57   subroutine interp_p(a,p,p_loc,a_interp,ks,ke,kms,kme,i,j)
58   implicit none
59 
60   integer, intent(in) :: ks,ke,kms,kme,i,j
61   real, dimension(kms:kme), intent(in) :: a,p
62   real, intent(in)  :: p_loc
63   real, intent(out) :: a_interp
64 
65 !---  local variables
66 
67   integer :: kp, pk, k
68   real    :: wght1, wght2, dp, pressure
69   character*256 mess
70 
71     kp = ks+1
72     pk = p(kp)
73     pressure = p_loc
74     do while( pk .gt. pressure )
75 
76       kp = kp+1
77 
78       if(kp .gt. ke) then
79         write(mess,*) ' interp too high: pressure, p(ke), i, j = ',pressure,p(ke),i,j
80         write(0,*)'p: ',p
81         call wrf_error_fatal( mess )
82       end if
83  
84       pk = p(kp)
85 
86     enddo
87 
88     dp = p(kp-1) - p(kp)
89     wght2 = (p(kp-1)-pressure)/dp
90     wght1 = 1.-wght2
91 
92     a_interp = wght1*a(kp-1) + wght2*a(kp)
93 
94     end subroutine interp_p
95 
96 END MODULE module_compute_geop