Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions src/soca/LinearVariableChange/BkgErr/soca_bkgerr_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,32 @@ subroutine soca_bkgerr_setup(self, f_conf, bkg, geom)
integer :: i
type(datetime) :: vdate
character(len=800) :: fname = 'soca_bkgerrsoca.nc'
logical :: stddev, save_bkgerr

self%geom => geom

! Allocate memory for bkgerror
call self%std_bkgerr%copy(bkg)
!call create_copy(self%std_bkgerr, bkg)

! Read variance
! Read variance (default) or standard deviation
! Precomputed from an ensemble of (K^-1 dx)
stddev = .false.
if (f_conf%has("standard deviation")) then
call f_conf%get_or_die("standard deviation", stddev)
end if
call self%std_bkgerr%read(f_conf, vdate)

! Convert to standard deviation
do i=1,size(self%std_bkgerr%fields)
field => self%std_bkgerr%fields(i)
select case(field%name)
case ("tocn", "socn", "ssh")
field%val = sqrt(field%val)
end select
end do
if (.not.stddev) then
do i=1,size(self%std_bkgerr%fields)
field => self%std_bkgerr%fields(i)
select case(field%name)
case ("tocn", "socn", "ssh")
field%val = sqrt(field%val)
end select
end do
end if

! Get bounds from configuration
call self%bounds%read(f_conf)
Expand Down Expand Up @@ -116,7 +123,10 @@ subroutine soca_bkgerr_setup(self, f_conf, bkg, geom)
call self%bounds%apply(self%std_bkgerr)

! Save filtered background error
call self%std_bkgerr%write_file(fname)
if (f_conf%has("save bkgerr")) then
call f_conf%get_or_die("save bkgerr", save_bkgerr)
if (save_bkgerr) call self%std_bkgerr%write_file(fname)
end if

end subroutine soca_bkgerr_setup

Expand Down
5 changes: 5 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ set( soca_test_input
testinput/varchange_bkgerrfilt.yml
testinput/varchange_bkgerrgodas.yml
testinput/varchange_bkgerrsoca.yml
testinput/varchange_bkgerrsoca_stddev.yml
testinput/varchange_horizfilt.yml
testinput/varchange_vertconv.yml
)
Expand Down Expand Up @@ -396,6 +397,10 @@ soca_add_test( NAME varchange_bkgerrsoca
SRC TestVariableChange.cc
TEST_DEPENDS test_soca_gridgen )

soca_add_test( NAME varchange_bkgerrsoca_stddev
SRC TestVariableChange.cc
TEST_DEPENDS test_soca_gridgen )

soca_add_test( NAME varchange_bkgerrgodas
SRC TestVariableChange.cc
TEST_DEPENDS test_soca_gridgen )
Expand Down
42 changes: 42 additions & 0 deletions test/testinput/varchange_bkgerrsoca_stddev.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
geometry:
geom_grid_file: data_generated/gridgen/soca_gridspec.72x35x25.nc
mom6_input_nml: data_static/72x35x25/input.nml
fields metadata: data_static/fields_metadata.yml

background:
read_from_file: 1
date: &date 2018-04-15T00:00:00Z
basename: data_static/72x35x25/restarts/
ocn_filename: MOM.res.nc
ice_filename: cice.res.nc
state variables: &soca_vars [cicen, hicen, socn, tocn, ssh, hocn]

linear variable change tests:
- tolerance inverse: 1e-12
test inverse: 0
linear variable change:
input variables: *soca_vars
output variables: *soca_vars
linear variable changes:
- linear variable change name: BkgErrSOCA
tolerance inverse: 1e-12
test inverse: 1
read_from_file: 3
basename: data_static/72x35x25/
ocn_filename: ocn.bkgerror.nc
ice_filename: ice.bkgerror.nc
date: *date
standard deviation: true
save bkgerr: true
t_min: 0.0
t_max: 2.5
s_min: 0.0
s_max: 0.2
ssh_min: 0.0 # std ssh=0 => ssh balance applied as
ssh_max: 0.0 # strong constraint
cicen_min: 0.1
cicen_max: 0.5
hicen_min: 10.0
hicen_max: 100.0
#fixed_std_sst: 0.005 # OK to create pretty increments
#fixed_std_sss: 0.001 # but that option should not exist!