| 1 | module sens_heat_rain_m |
|---|
| 2 | |
|---|
| 3 | implicit none |
|---|
| 4 | |
|---|
| 5 | contains |
|---|
| 6 | |
|---|
| 7 | #ifdef IN_LMDZ |
|---|
| 8 | real function sens_heat_rain(rain, t, q, rhoa, xlv, t_int, p) |
|---|
| 9 | #else |
|---|
| 10 | elemental real function sens_heat_rain(rain, t, q, rhoa, xlv, t_int, p) |
|---|
| 11 | #endif |
|---|
| 12 | |
|---|
| 13 | ! Computes heat flux due to rainfall, in W m-2, positive |
|---|
| 14 | ! upward. |
|---|
| 15 | |
|---|
| 16 | ! If in LMDZ, do not declare this function as elemental because |
|---|
| 17 | ! YOMCST.h contains an OpenMP directive, and that only works in |
|---|
| 18 | ! OpenMP 5.0. |
|---|
| 19 | |
|---|
| 20 | use const, only: cpa, cpw, rgas |
|---|
| 21 | #ifndef IN_LMDZ |
|---|
| 22 | use const, only: eps_w |
|---|
| 23 | #endif |
|---|
| 24 | use esat_m, only: esat |
|---|
| 25 | |
|---|
| 26 | #ifdef IN_LMDZ |
|---|
| 27 | USE yomcst_mod_h, ONLY: eps_w |
|---|
| 28 | #endif |
|---|
| 29 | |
|---|
| 30 | real, intent(in):: rain ! rain mass flux, in kg m-2 s-1 |
|---|
| 31 | real, intent(in):: t ! air temperature at 10 m, in K |
|---|
| 32 | real, intent(in):: q ! specific humidity at 10 m |
|---|
| 33 | real, intent(in):: rhoa ! density of moist air (kg / m3) |
|---|
| 34 | real, intent(in):: xlv ! latent heat of evaporation (J / kg) |
|---|
| 35 | real, intent(in):: t_int ! interface temperature, in K |
|---|
| 36 | real, intent(in):: p ! surface pressure, in Pa |
|---|
| 37 | |
|---|
| 38 | ! Local: |
|---|
| 39 | |
|---|
| 40 | real es ! saturation pressure of wator vapor, in Pa |
|---|
| 41 | real alfac ! wet bulb factor |
|---|
| 42 | real dwat ! water vapour diffusivity |
|---|
| 43 | real dtmp ! heat diffusivity |
|---|
| 44 | real q_int ! specific (saturation) humidity at ocean interface |
|---|
| 45 | real t_celsius ! air temperature at 10 m, in Celsius degrees |
|---|
| 46 | |
|---|
| 47 | real wetc |
|---|
| 48 | ! derivative of saturated mass fraction of water vapor with |
|---|
| 49 | ! respect to temperature, at constant total pressure |
|---|
| 50 | |
|---|
| 51 | !--------------------------------------------------------------------- |
|---|
| 52 | |
|---|
| 53 | es = esat(t_int, p) * 0.98 ! reduced for salinity, Kraus 1972 page 46 |
|---|
| 54 | q_int = eps_w * (es / (p - (1. - eps_w) * es)) |
|---|
| 55 | wetc = eps_w * xlv * q_int / (rgas * t_int**2) |
|---|
| 56 | dwat = 2.11e-5 * (t / 273.15)**1.94 |
|---|
| 57 | t_celsius = t - 273.15 |
|---|
| 58 | dtmp = (1. + 3.309e-3 * t_celsius - 1.44e-6 * t_celsius**2) * 0.02411 & |
|---|
| 59 | / (rhoa * cpa) |
|---|
| 60 | |
|---|
| 61 | ! Gosnell 1995 k0991, equation (11): |
|---|
| 62 | alfac = 1. / (1. + (wetc * xlv * dwat) / (cpa * dtmp)) |
|---|
| 63 | |
|---|
| 64 | ! Gosnell 1995 k0991, equation (12): |
|---|
| 65 | sens_heat_rain = rain * alfac * cpw * (t_int - t + (q_int - q) * xlv / cpa) |
|---|
| 66 | |
|---|
| 67 | end function sens_heat_rain |
|---|
| 68 | |
|---|
| 69 | end module sens_heat_rain_m |
|---|