source: lmdz_wrf/trunk/WRFV3/phys/module_cam_gffgch.F @ 354

Last change on this file since 354 was 1, checked in by lfita, 10 years ago
  • -- --- Opening of the WRF+LMDZ coupling repository --- -- -

WRF: version v3.3
LMDZ: version v1818

More details in:

File size: 5.2 KB
Line 
1#define WRF_PORT
2
3!------------------------------------------------------------------------
4! Based on gffgch.F90 from CAM
5! Ported to WRF by William.Gustafson@pnl.gov, Nov. 2009
6!------------------------------------------------------------------------
7
8#ifdef WRF_PORT
9module module_cam_gffgch
10
11  implicit none
12
13  private
14  public gffgch
15
16contains
17#endif
18
19subroutine gffgch(t       ,es      ,itype   )
20!-----------------------------------------------------------------------
21!
22! Purpose:
23! Computes saturation vapor pressure over water and/or over ice using
24! Goff & Gratch (1946) relationships.
25! <Say what the routine does>
26!
27! Method:
28! T (temperature), and itype are input parameters, while es (saturation
29! vapor pressure) is an output parameter.  The input parameter itype
30! serves two purposes: a value of zero indicates that saturation vapor
31! pressures over water are to be returned (regardless of temperature),
32! while a value of one indicates that saturation vapor pressures over
33! ice should be returned when t is less than freezing degrees.  If itype
34! is negative, its absolute value is interpreted to define a temperature
35! transition region below freezing in which the returned
36! saturation vapor pressure is a weighted average of the respective ice
37! and water value.  That is, in the temperature range 0 => -itype
38! degrees c, the saturation vapor pressures are assumed to be a weighted
39! average of the vapor pressure over supercooled water and ice (all
40! water at 0 c; all ice at -itype c).  Maximum transition range => 40 c
41!
42! Author: J. Hack
43!
44!-----------------------------------------------------------------------
45   use shr_kind_mod, only: r8 => shr_kind_r8
46   use physconst,    only: tmelt
47#ifdef WRF_PORT
48   use module_cam_support, only: endrun, &
49                                 iulog
50#else
51   use abortutils,   only: endrun
52   use cam_logfile,  only: iulog
53#endif
54   
55   implicit none
56!------------------------------Arguments--------------------------------
57!
58! Input arguments
59!
60   real(r8), intent(in) :: t          ! Temperature
61!
62! Output arguments
63!
64   integer, intent(inout) :: itype   ! Flag for ice phase and associated transition
65
66   real(r8), intent(out) :: es         ! Saturation vapor pressure
67!
68!---------------------------Local variables-----------------------------
69!
70   real(r8) e1         ! Intermediate scratch variable for es over water
71   real(r8) e2         ! Intermediate scratch variable for es over water
72   real(r8) eswtr      ! Saturation vapor pressure over water
73   real(r8) f          ! Intermediate scratch variable for es over water
74   real(r8) f1         ! Intermediate scratch variable for es over water
75   real(r8) f2         ! Intermediate scratch variable for es over water
76   real(r8) f3         ! Intermediate scratch variable for es over water
77   real(r8) f4         ! Intermediate scratch variable for es over water
78   real(r8) f5         ! Intermediate scratch variable for es over water
79   real(r8) ps         ! Reference pressure (mb)
80   real(r8) t0         ! Reference temperature (freezing point of water)
81   real(r8) term1      ! Intermediate scratch variable for es over ice
82   real(r8) term2      ! Intermediate scratch variable for es over ice
83   real(r8) term3      ! Intermediate scratch variable for es over ice
84   real(r8) tr         ! Transition range for es over water to es over ice
85   real(r8) ts         ! Reference temperature (boiling point of water)
86   real(r8) weight     ! Intermediate scratch variable for es transition
87   integer itypo   ! Intermediate scratch variable for holding itype
88!
89!-----------------------------------------------------------------------
90!
91! Check on whether there is to be a transition region for es
92!
93   if (itype < 0) then
94      tr    = abs(real(itype,r8))
95      itypo = itype
96      itype = 1
97   else
98      tr    = 0.0_r8
99      itypo = itype
100   end if
101   if (tr > 40.0_r8) then
102      write(iulog,900) tr
103#ifdef WRF_PORT
104      call wrf_message(iulog)
105#endif
106      call endrun ('GFFGCH')                ! Abnormal termination
107   end if
108!
109   if(t < (tmelt - tr) .and. itype == 1) go to 10
110!
111! Water
112!
113   ps = 1013.246_r8
114   ts = 373.16_r8
115   e1 = 11.344_r8*(1.0_r8 - t/ts)
116   e2 = -3.49149_r8*(ts/t - 1.0_r8)
117   f1 = -7.90298_r8*(ts/t - 1.0_r8)
118   f2 = 5.02808_r8*log10(ts/t)
119   f3 = -1.3816_r8*(10.0_r8**e1 - 1.0_r8)/10000000.0_r8
120   f4 = 8.1328_r8*(10.0_r8**e2 - 1.0_r8)/1000.0_r8
121   f5 = log10(ps)
122   f  = f1 + f2 + f3 + f4 + f5
123   es = (10.0_r8**f)*100.0_r8
124   eswtr = es
125!
126   if(t >= tmelt .or. itype == 0) go to 20
127!
128! Ice
129!
13010 continue
131   t0    = tmelt
132   term1 = 2.01889049_r8/(t0/t)
133   term2 = 3.56654_r8*log(t0/t)
134   term3 = 20.947031_r8*(t0/t)
135   es    = 575.185606e10_r8*exp(-(term1 + term2 + term3))
136!
137   if (t < (tmelt - tr)) go to 20
138!
139! Weighted transition between water and ice
140!
141   weight = min((tmelt - t)/tr,1.0_r8)
142   es = weight*es + (1.0_r8 - weight)*eswtr
143!
14420 continue
145   itype = itypo
146   return
147!
148900 format('GFFGCH: FATAL ERROR ******************************',/, &
149           'TRANSITION RANGE FOR WATER TO ICE SATURATION VAPOR', &
150           ' PRESSURE, TR, EXCEEDS MAXIMUM ALLOWABLE VALUE OF', &
151           ' 40.0 DEGREES C',/, ' TR = ',f7.2)
152!
153end subroutine gffgch
154
155#ifdef WRF_PORT
156end module module_cam_gffgch
157#endif
Note: See TracBrowser for help on using the repository browser.