LCOV - code coverage report
Current view: top level - chemistry/mozart - set_cp.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 8 0.0 %
Date: 2024-12-17 22:39:59 Functions: 0 1 0.0 %

          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

Generated by: LCOV version 1.14