module water_types !----------------------------------------------------------------------- ! ! Provide core functionality for types of condensed water to be used ! with the water vapor tracers. ! ! This module works in with "water_isotopes" and "water_tracers". ! ! All interface routine are identified by wtype_*, etc. ! ! 5 types of water are available, three phases (vapor, cloud liquid ! and cloud ice) and precipitation (rain and snow). ! ! Author: Chuck Bardeen (2/4/2012) !----------------------------------------------------------------------- use shr_kind_mod, only: r8 => shr_kind_r8 implicit none private save !------------------------ Module Interfaces ----------------------------- ! ! Public interfaces ! public :: wtype_init ! initilize water types public :: wtype_get_itype ! lookup a species index by name public :: wtype_get_alpha ! isotope fractionation !------------------- Module Variable Declarations ----------------------- ! ! Water tracer type identifiers integer, parameter, public :: pwtype = 7 ! number of water types integer, parameter, public :: iwtundef = 0 ! not water type integer, parameter, public :: iwtvap = 1 ! water type is vapour integer, parameter, public :: iwtliq = 2 ! water type is liquid integer, parameter, public :: iwtice = 3 ! water type is ice integer, parameter, public :: iwtstrain = 4 ! water type is stratiform rain integer, parameter, public :: iwtstsnow = 5 ! water type is stratiform snow integer, parameter, public :: iwtcvrain = 6 ! water type is convective rain integer, parameter, public :: iwtcvsnow = 7 ! water type is convective snow ! Water type names character(len=8), dimension(pwtype), parameter, public :: & ! water type names wtype_names = (/ 'VAPOR ', 'LIQUID ', 'ICE ', 'RAINS ', 'SNOWS ', 'RAINC ', 'SNOWC ' /) ! Water type Suffix character(len=2), dimension(pwtype), parameter, public :: & ! suffix names wtype_suffix = (/ '_v', '_l', '_i', '_R', '_S', '_r', '_s' /) ! !----------------------------------------------------------------------- contains !======================================================================= subroutine wtype_init !----------------------------------------------------------------------- ! Purpose: Initialize module internal data arrays !----------------------------------------------------------------------- write(6,*) 'WTYPE_INIT: Initializing water types.' return end subroutine wtype_init !======================================================================= function wtype_get_itype(name) !----------------------------------------------------------------------- ! Purpose: Retrieve type index, based on type name ! Author: Chuck Bardeen !----------------------------------------------------------------------- character(len=*), intent(in) :: name ! water type name integer :: wtype_get_itype ! return species index !----------------------------------------------------------------------- do wtype_get_itype = 1, pwtype if (name == wtype_names(wtype_get_itype)) then return end if end do wtype_get_itype = iwtundef return end function wtype_get_itype !========================================================================= !======================================================================= function wtype_get_alpha(ispec, isrctype, idsttype, tk, rh, do_kinetic) !----------------------------------------------------------------------- ! Purpose: Retrieve the fractionation for a process that goes from ! the source water type to the destination water type. ! ! Author: Chuck Bardeen !----------------------------------------------------------------------- use water_isotopes, only : wiso_alpl, wiso_alpi, wiso_akel, wiso_akci integer, intent(in) :: ispec ! isotope species index integer, intent(in) :: isrctype ! source water type index integer, intent(in) :: idsttype ! destination water type index real(r8), intent(in) :: tk ! temperature (K) real(r8), intent(in) :: rh ! relative humidity (fraction) logical, intent(in) :: do_kinetic ! use kinetic calculation real(r8) :: wtype_get_alpha ! return alpha !----------------------------------------------------------------------- ! If their types are the same, then no fractionation occurs. wtype_get_alpha = 1._r8 if (isrctype /= idsttype) then ! Is the source vapor? if (isrctype == iwtvap) then ! Is the destination a liquid? if ((idsttype == iwtliq) .or. (idsttype == iwtstrain) .or. (idsttype == iwtcvrain)) then wtype_get_alpha = wiso_alpl(ispec,tk) if (do_kinetic) then wtype_get_alpha = wiso_akel(ispec,tk,rh,wtype_get_alpha) end if else wtype_get_alpha = wiso_alpi(ispec,tk) if (do_kinetic) then wtype_get_alpha = wiso_akci(ispec,tk,wtype_get_alpha) end if end if ! Is the destination vapor? else if (idsttype == iwtvap) then ! Is the source a liquid? if ((isrctype == iwtliq) .or. (isrctype == iwtstrain) .or. (isrctype == iwtcvrain)) then wtype_get_alpha = wiso_alpl(ispec,tk) if (do_kinetic) then wtype_get_alpha = wiso_akel(ispec,tk,rh,wtype_get_alpha) end if wtype_get_alpha = 1._r8 / wtype_get_alpha else wtype_get_alpha = 1._r8 !No fractionation occurs during sublimation end if end if end if return end function wtype_get_alpha !========================================================================= end module water_types