[Dart-dev] DART/branches Revision: 12096
dart at ucar.edu
dart at ucar.edu
Fri Nov 10 15:20:11 MST 2017
hendric at ucar.edu
2017-11-10 15:20:11 -0700 (Fri, 10 Nov 2017)
71
adding code for interpolating 3d variables that
are not in the state.
Modified: DART/branches/recam/models/cam-fv/model_mod.f90
===================================================================
--- DART/branches/recam/models/cam-fv/model_mod.f90 2017-11-10 22:18:58 UTC (rev 12095)
+++ DART/branches/recam/models/cam-fv/model_mod.f90 2017-11-10 22:20:11 UTC (rev 12096)
@@ -51,14 +51,14 @@
! the arguments - they will be called *from* the dart code.
! routines in this list have code in this module
-public :: static_init_model, &
- get_model_size, &
- get_state_meta_data, &
- model_interpolate, & ! big todo
+public :: static_init_model, &
+ get_model_size, &
+ get_state_meta_data, &
+ model_interpolate, & ! big todo
shortest_time_between_assimilations, &
- nc_write_model_atts, &
- write_model_time, & ! todo
- read_model_time, &
+ nc_write_model_atts, &
+ write_model_time, & ! todo
+ read_model_time, &
end_model
! code for these routines are in other modules
@@ -91,7 +91,9 @@
! state_variables defines the contents of the state vector.
! each line of this input should have the form:
+!
! netcdf_variable_name, dart_quantity, clamp_min, clamp_max, update_variable
+!
! all items must be strings (even if numerical values).
! for no clamping, use the string 'NA'
! to have the assimilation change the variable use 'UPDATE', else 'NO_UPDATE'
@@ -388,7 +390,53 @@
end subroutine get_values_from_varid
+!-----------------------------------------------------------------------
+!> this is just for 3d fields
+subroutine get_values_from_nonstate_fields(ens_handle, ens_size, lon_index, lat_index, lev_index, obs_quantity, vals, my_status)
+type(ensemble_type), intent(in) :: ens_handle
+integer, intent(in) :: ens_size
+integer, intent(in) :: lon_index
+integer, intent(in) :: lat_index
+integer, intent(in) :: lev_index(ens_size)
+integer, intent(in) :: obs_quantity
+real(r8), intent(out) :: vals(ens_size)
+integer, intent(out) :: my_status(ens_size)
+
+integer :: imember
+real(r8) :: vals_array(grid_data%lev%nsize,ens_size)
+
+vals(:) = MISSING_R8
+
+select case (obs_quantity)
+ case (QTY_PRESSURE, QTY_GEOMETRIC_HEIGHT)
+ if (obs_quantity == QTY_PRESSURE) then
+ call cam_pressure_levels(ens_handle, ens_size, &
+ lon_index, lat_index, grid_data%lev%nsize, &
+ vals_array, my_status)
+ else
+ call cam_height_levels(ens_handle, ens_size, &
+ lon_index, lat_index, grid_data%lev%nsize, &
+ vals_array, my_status)
+ endif
+
+ if (any(my_status /= 0)) return
+
+ do imember=1,ens_size
+ vals(imember) = vals_array(lev_index(imember), imember)
+ enddo
+
+ case (QTY_VERTLEVEL)
+ vals(:) = lev_index(:)
+ my_status(:) = 0
+
+ case default
+ print*, 'should not go here'
+
+end select
+
+end subroutine get_values_from_nonstate_fields
+
!-----------------------------------------------------------------------
!>
!> Model interpolate will interpolate any DART state variable
@@ -524,6 +572,13 @@
! need to consider the case for 2d vs 3d variables
numdims = get_dims_from_qty(obs_qty, varid)
+!>@todo FIXME need to be refactored
+! if variable is in the state
+! do 2d and 3d
+
+! if variable is not in the state
+! do 2d and 3d
+
More information about the Dart-dev
mailing list