[Dart-dev] DART/branches Revision: 12358
dart at ucar.edu
dart at ucar.edu
Thu Jan 18 09:52:24 MST 2018
hendric at ucar.edu
2018-01-18 09:52:23 -0700 (Thu, 18 Jan 2018)
153
Adding an oxygen_ion_density ratio forward operator. This
should eventually be folded into other ion density forward
operators that are very similar.
Modified: DART/branches/recam/observations/forward_operators/obs_def_upper_atm_mod.f90
===================================================================
--- DART/branches/recam/observations/forward_operators/obs_def_upper_atm_mod.f90 2018-01-18 16:22:44 UTC (rev 12357)
+++ DART/branches/recam/observations/forward_operators/obs_def_upper_atm_mod.f90 2018-01-18 16:52:23 UTC (rev 12358)
@@ -139,7 +139,8 @@
public :: get_expected_upper_atm_density, &
get_expected_gnd_gps_vtec, &
get_expected_vtec, &
- get_expected_O_N2_ratio
+ get_expected_O_N2_ratio, &
+ get_expected_oxygen_ion_density
! version controlled file description for error handling, do not edit
character(len=256), parameter :: source = &
@@ -265,7 +266,6 @@
if ( .not. module_initialized ) call initialize_module
istatus = 0 ! must be 0 to use track_status()
-obs_val = MISSING_R8
loc_vals = get_location(location)
@@ -388,7 +388,6 @@
if ( .not. module_initialized ) call initialize_module
istatus = 0
-obs_val = MISSING_R8
call error_handler(E_ERR, 'get_expected_O_N2_ratio', 'routine not tested', &
source, revision, revdate, &
@@ -538,7 +537,70 @@
end subroutine get_expected_O_N2_ratio
+!-----------------------------------------------------------------------------
+! This function was implemented for WACCM-X.
+! Check the units for use with other models.
+! Given DART state vector and a location, it computes O+ density [1/cm^3].
+! The istatus variable should be returned as 0 unless there is a problem.
+!
+subroutine get_oxygen_ion_density(state_handle, ens_size, lon, lat, lev, obs_val, istatus)
+type(ensemble_type), intent(in) :: state_handle
+integer, intent(in) :: ens_size
+integer, intent(in) :: lon, lat, lev
+integer, intent(out) :: istatus(ens_size)
+real(r8), intent(out) :: obs_val(ens_size)
+real(r8), dimension(ens_size) :: mmr_o1, mmr_o2, mmr_n2, mmr_h1, mmr_op ! mass mixing ratio
+real(r8), dimension(ens_size) :: mbar, pressure, temperature
+integer, dimension(ens_size) :: vstatus
+
+
+istatus = 0 ! Need to have istatus = 0 for track_status()
+
+call interpolate(state_handle, ens_size, location, QTY_ATOMIC_OXYGEN_MIXING_RATIO, mmr_o1, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+call interpolate(state_handle, ens_size, location, QTY_MOLEC_OXYGEN_MIXING_RATIO, mmr_o2,, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+call interpolate(state_handle, ens_size, location, QTY_ATOMIC_H_MIXING_RATIO, mmr_h1, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+call interpolate(state_handle, ens_size, location, QTY_ION_O_MIXING_RATIO, mmr_op, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+call interpolate(state_handle, ens_size, location, QTY_PRESSURE, pressure, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+call interpolate(state_handle, ens_size, location, QTY_TEMPERATURE, temperature, this_istatus)
+call track_status(ens_size, this_istatus, obs_val, istatus, return_now)
+if (return_now) return
+
+!------------------------------------------------------------------------------------------------------
+! Need to get number density (cgs units) from mass mixing ratio (kg/kg).
+! mbar is g/mole, same as rMass units
+! kg/kg * (g/mole)/(g/mole) * (Pa = N/m^2)/((Joules/K = N*m/K) * (K)) = m-3 * 1E-06 = cm-3
+!------------------------------------------------------------------------------------------------------
+! WACCM-X .i file pressure unit is Pa
+
+mmr_n2 = 1.0_r8 - (mmr_o1 + mmr_o2 + mmr_h1)
+mbar = 1.0_r8/( mmr_o1/O_molar_mass &
+ + mmr_o2/O2_molar_mass &
+ + mmr_h1/H_molar_mass &
+ + mmr_n2/N2_molar_mass)
+
+obs_val = mmr_op * mbar/O_molar_mass * pressure/(kboltz * temperature) * 1.E-06_r8
+
+istatus = 0
+
+
+end subroutine get_oxygen_ion_density
+
end module obs_def_upper_atm_mod
! END DART PREPROCESS MODULE CODE
More information about the Dart-dev
mailing list