Line data Source code
1 :
2 : module set_cp
3 :
4 : use shr_kind_mod, only : r8 => shr_kind_r8
5 : use physconst, only : r_universal
6 :
7 : implicit none
8 :
9 : private
10 : public :: calc_cp
11 :
12 : save
13 :
14 : real(r8), parameter :: ur = .5_r8 * r_universal
15 :
16 : contains
17 :
18 0 : subroutine calc_cp( ncol, vmr, cpairz )
19 : !-----------------------------------------------------------------------
20 : ! ... force ion/electron balance
21 : !-----------------------------------------------------------------------
22 :
23 : use ppgrid, only : pver
24 : use physconst, only : cpair
25 : use chem_mods, only : adv_mass
26 : use mo_chem_utls, only : get_spc_ndx, get_inv_ndx
27 :
28 : implicit none
29 :
30 : !-----------------------------------------------------------------------
31 : ! ... dummy arguments
32 : !-----------------------------------------------------------------------
33 : integer, intent(in) :: ncol
34 : real(r8), intent(in) :: vmr(:,:,:) ! species vmrentrations (mol/mol)
35 : real(r8), intent(inout) :: cpairz(:,:)
36 :
37 : !-----------------------------------------------------------------------
38 : ! ... local variables
39 : !-----------------------------------------------------------------------
40 : integer :: k, n
41 : real(r8) :: ro_mw, ro2_mw, rn2_mw ! inverse molecular weights
42 0 : real(r8) :: hvmr(ncol,pver) ! h vmrentration (mol/mol)
43 0 : real(r8) :: n2vmr(ncol,pver) ! n2 vmrentration (mol/mol)
44 0 : real(r8) :: o3vmr(ncol,pver) ! o3 vmrentration (mol/mol)
45 0 : real(r8) :: o2vmr(ncol,pver) ! o2 vmrentration (mol/mol)
46 0 : real(r8) :: ovmr(ncol,pver) ! o vmrentration (mol/mol)
47 :
48 : logical, parameter :: fixed_cp = .true.
49 :
50 : if( fixed_cp ) then
51 : !-----------------------------------------------------------------------
52 : ! ... use same cp as rest of CAM
53 : !-----------------------------------------------------------------------
54 0 : cpairz(:ncol,:pver) = cpair
55 : else
56 : !-----------------------------------------------------------------------
57 : ! ... caculate cp based on ratio of molecules to atoms
58 : !-----------------------------------------------------------------------
59 : n = get_spc_ndx( 'O' )
60 : if( n > 0 ) then
61 : ro_mw = 1._r8/adv_mass(n)
62 : do k = 1,pver
63 : ovmr(:,k) = vmr(:ncol,k,n)
64 : end do
65 : else
66 : ro_mw = 1._r8
67 : do k = 1,pver
68 : ovmr(:,k) = 0._r8
69 : end do
70 : end if
71 : n = get_spc_ndx( 'O2' )
72 : if( n > 0 ) then
73 : ro2_mw = 1._r8/adv_mass(n)
74 : do k = 1,pver
75 : o2vmr(:,k) = vmr(:ncol,k,n)
76 : end do
77 : else
78 : ro2_mw = 1._r8
79 : do k = 1,pver
80 : o2vmr(:,k) = 0._r8
81 : end do
82 : end if
83 : n = get_spc_ndx( 'O3' )
84 : if( n > 0 ) then
85 : do k = 1,pver
86 : o3vmr(:,k) = vmr(:ncol,k,n)
87 : end do
88 : else
89 : do k = 1,pver
90 : o3vmr(:,k) = 0._r8
91 : end do
92 : end if
93 : n = get_spc_ndx( 'H' )
94 : if( n > 0 ) then
95 : do k = 1,pver
96 : hvmr(:,k) = vmr(:ncol,k,n)
97 : end do
98 : else
99 : do k = 1,pver
100 : hvmr(:,k) = 0._r8
101 : end do
102 : end if
103 : !-----------------------------------------------------------------------
104 : ! ... calculate n2 concentration
105 : !-----------------------------------------------------------------------
106 : do k = 1,pver
107 : n2vmr(:,k) = 1._r8 - (ovmr(:,k) + o2vmr(:,k) + hvmr(:,k))
108 : end do
109 : n = get_spc_ndx( 'N' )
110 : if( n > 0 ) then
111 : rn2_mw = .5_r8/adv_mass(n)
112 : else
113 : rn2_mw = 1._r8
114 : end if
115 :
116 : !-----------------------------------------------------------------------
117 : ! ... calculate cp
118 : !-----------------------------------------------------------------------
119 : do k = 1,pver
120 : cpairz(:ncol,k) = &
121 : ur *(7._r8*(o2vmr(:ncol,k)*ro2_mw + n2vmr(:ncol,k)*rn2_mw) &
122 : + 5._r8*(ovmr(:ncol,k) + o3vmr(:ncol,k))*ro_mw)
123 : end do
124 : endif
125 :
126 0 : end subroutine calc_cp
127 :
128 : end module set_cp
|