38 use machine,
only: kind_dyn
40 use physcons,
only : rdgas => con_rd_dyn, &
48 integer sphum, sphump1
49 real(kind_dyn),
allocatable :: vir(:)
50 real(kind_dyn),
allocatable :: vicp(:)
51 real(kind_dyn),
allocatable :: vicv(:)
53 private num_wat, sphum, sphump1
54 public vir, vicp, vicv, ind_gas, num_gas
55 public multi_gases_init
68 subroutine multi_gases_init(ngas, nwat, ri, cpi, is_master)
79 integer,
intent(in):: ngas, nwat
80 real(kind=kind_dyn),
intent(in):: ri(0:ngas)
81 real(kind=kind_dyn),
intent(in):: cpi(0:ngas)
82 logical,
intent(in):: is_master
87 logical :: default_gas=.false.
94 if( ri(n).ne.0.0 .or. cpi(n).ne.0.0 ) num_gas=n
96 if ( num_gas.eq.1 ) default_gas=.true.
97 allocate( vir(0:num_gas) )
98 allocate( vicp(0:num_gas) )
99 allocate( vicv(0:num_gas) )
101 cv_air = cp_air - rdgas
103 cvi(n) = cpi(n) - ri(n)
107 vicp(0) = cpi(0)/cp_air
108 vicv(0) = cvi(0)/cv_air
109 if( default_gas )
then
116 if( ri(n).gt.0.0 ) vir(n) = ri(n)/rdgas - vir(0)
118 if( cpi(n).gt.0.0 ) vicp(n) = cpi(n)/cp_air - vicp(0)
120 if( cvi(n).gt.0.0 ) vicv(n) = cvi(n)/cv_air - vicv(0)
124 write(*,*)
' ccpp multi_gases_init with ind_gas=',ind_gas
125 write(*,*)
' ccpp multi_gases_init with num_gas=',num_gas
126 write(*,*)
' ccpp multi_gases_init with vir =',vir
127 write(*,*)
' ccpp multi_gases_init with vicp=',vicp
128 write(*,*)
' ccpp multi_gases_init with vicv=',vicv
132 end subroutine multi_gases_init
136 subroutine multi_gases_final()
138 if(
allocated(vir ))
deallocate(vir )
139 if(
allocated(vicv))
deallocate(vicp)
140 if(
allocated(vicp))
deallocate(vicv)
143 end subroutine multi_gases_final
147 pure real function virq(q)
152 real(kind=kind_dyn),
intent(in) :: q(num_gas)
156 virq = vir(sphum)*q(sphum)
158 virq = virq+vir(n)*q(sphum+n-1)
160 virq = vir(0)+virq/(1.0-sum(q(sphump1:sphum+num_wat-1)))
167 pure real function virq_nodq(q)
172 real(kind=kind_dyn),
intent(in) :: q(num_gas)
176 virq_nodq = vir(0)+vir(sphum)*q(sphum)
178 virq_nodq = virq_nodq+vir(n)*q(sphum+n-1)
186 pure real function virq_max(q, qmin)
191 real(kind=kind_dyn),
intent(in) :: q(num_gas)
192 real(kind=kind_dyn),
intent(in) :: qmin
196 virq_max = vir(sphum)*max(qmin,q(sphum))
198 virq_max = virq_max+vir(n)*q(sphum+n-1)
200 virq_max = vir(0)+virq_max/(1.0-sum(q(sphump1:sphum+num_wat-1)))
208 pure real function virq_qpz(q, qpz)
213 real(kind=kind_dyn),
intent(in) :: q(num_gas)
214 real(kind=kind_dyn),
intent(in) :: qpz
218 virq_qpz = vir(sphum)*q(sphum)
220 virq_qpz = virq_qpz+vir(n)*q(sphum+n-1)
222 virq_qpz = vir(0)+virq_qpz/(1.0-qpz)
230 pure real function virqd(q)
235 real(kind=kind_dyn),
intent(in) :: q(num_gas)
241 virqd = virqd+vir(n)*q(sphum+n-1)
243 virqd = vir(0)+virqd/(1.0-sum(q(sphum:sphum+num_wat-1)))
250 pure real function vicpqd(q)
255 real(kind=kind_dyn),
intent(in) :: q(num_gas)
261 vicpqd = vicpqd+vicp(n)*q(sphum+n-1)
263 vicpqd = vicp(0)+vicpqd/(1.0-sum(q(sphum:sphum+num_wat-1)))
270 pure real function vicpqd_qpz(q, qpz)
275 real(kind=kind_dyn),
intent(in) :: q(num_gas)
276 real(kind=kind_dyn),
intent(in) :: qpz
282 vicpqd_qpz = vicpqd_qpz+vicp(n)*q(sphum+n-1)
284 vicpqd_qpz = vicp(0)+vicpqd_qpz/(1.0-qpz)
291 pure real function vicvqd(q)
296 real(kind=kind_dyn),
intent(in) :: q(num_gas)
302 vicvqd = vicvqd+vicv(n)*q(sphum+n-1)
304 vicvqd = vicv(0)+vicvqd/(1.0-sum(q(sphum:sphum+num_wat-1)))
311 pure real function vicvqd_qpz(q,qpz)
316 real(kind=kind_dyn),
intent(in) :: q(num_gas)
317 real(kind=kind_dyn),
intent(in) :: qpz
323 vicvqd_qpz = vicvqd_qpz+vicv(n)*q(sphum+n-1)
325 vicvqd_qpz = vicv(0)+vicvqd_qpz/(1.0-qpz)
The module 'multi_gases' peforms multi constitutents computations.