9 use fckit_configuration_module,
only: fckit_configuration
10 use kinds,
only: kind_real
32 real(kind=kind_real),
private :: efold_z
33 real(kind=kind_real),
private :: scale
34 real(kind=kind_real),
private :: ocn_depth_min
39 procedure :: setup => soca_bkgerrfilt_setup
42 procedure :: mult => soca_bkgerrfilt_mult
56 subroutine soca_bkgerrfilt_setup(self, f_conf, bkg, geom)
58 type(fckit_configuration),
intent(in) :: f_conf
60 type(
soca_geom),
target,
intent(in ) :: geom
62 integer :: isc, iec, jsc, jec, i, j, k
63 real(kind=kind_real) :: efold
64 character(len=800) :: fname =
'soca_bkgerrfilt.nc'
65 type(
soca_field),
pointer :: tocn, socn, ssh, hocn, layer_depth
68 call self%filt%copy(bkg)
69 call self%filt%zeros()
72 call f_conf%get_or_die(
"ocean_depth_min", self%ocn_depth_min)
73 call f_conf%get_or_die(
"rescale_bkgerr", self%scale)
74 call f_conf%get_or_die(
"efold_z", self%efold_z)
79 call self%filt%get(
"tocn", tocn)
80 call self%filt%get(
"socn", socn)
81 call self%filt%get(
"ssh", ssh)
82 call bkg%get(
"hocn", hocn)
83 call bkg%get(
"layer_depth", layer_depth)
86 isc=geom%isc ; iec=geom%iec
87 jsc=geom%jsc ; jec=geom%jec
90 if (sum(hocn%val(i,j,:)).gt.self%ocn_depth_min)
then
91 ssh%val(i,j,:) = self%scale
93 if (hocn%val(i,j,k).gt.1e-3_kind_real)
then
95 efold = self%scale*exp(-layer_depth%val(i,j,k)/self%efold_z)
100 tocn%val(i,j,k) = efold
101 socn%val(i,j,k) = efold
105 ssh%val(i,j,:) = 0.0_kind_real
106 tocn%val(i,j,:) = 0.0_kind_real
107 socn%val(i,j,:) = 0.0_kind_real
113 do i=1,
size(self%filt%fields)
114 select case(self%filt%fields(i)%name)
115 case (
'ssh',
'tocn',
'socn')
118 self%filt%fields(i)%val = 1.0_kind_real
123 call self%filt%write_file(fname)
125 end subroutine soca_bkgerrfilt_setup
132 subroutine soca_bkgerrfilt_mult(self, dxa, dxm)
138 type(
soca_field),
pointer :: field_f, field_a, field_m
141 call dxa%check_congruent(dxm)
142 call dxa%check_subset(self%filt)
145 do n=1,
size(dxa%fields)
146 field_a => dxa%fields(n)
147 call self%filt%get(field_a%name, field_f)
148 call dxm%get(field_a%name, field_m)
149 do i = self%geom%isc, self%geom%iec
150 do j = self%geom%jsc, self%geom%jec
151 if (self%geom%mask2d(i,j).eq.1)
then
152 field_m%val(i,j,:) = field_f%val(i,j,:) * field_a%val(i,j,:)
154 field_m%val(i,j,:) = 0.0_kind_real
159 end subroutine soca_bkgerrfilt_mult
variable transform: background error filtering
Handle fields for the model.
Variable transform for background error filtering.
Holds all data and metadata related to a single field variable.
A collection of soca_field types representing a collective state or increment.