Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
VERIFY
CIF
Commits
faf58bac
Commit
faf58bac
authored
Feb 27, 2020
by
Espen Sollum
Browse files
Added missing file
parent
72f67d46
Changes
1
Hide whitespace changes
Inline
Side-by-side
pycif/plugins/obsvects/standard/init_background.py
0 → 100644
View file @
faf58bac
from
builtins
import
str
import
pandas
as
pd
import
sys
import
os
import
shutil
import
numpy
as
np
from
datetime
import
timedelta
from
pycif.utils.datastores.dump
import
dump_datastore
,
read_datastore
from
pycif.plugins.obsvects.standard.utils.tstep
import
tstep
from
pycif.plugins.obsvects.standard.utils.crop_monitor
import
crop_monitor
from
pycif.utils.check
import
verbose
from
pycif.utils
import
path
from
pycif.utils.check.errclass
import
PluginError
def
init_background
(
obsvect
,
**
kwargs
):
"""Initializes the background
Reads and regrids concentration fields
Reads sensitivity to initial conditions fields
Calculates contribution to observations from initial concentrations
Args:
obsvect (Plugin): the observation vector with all its attributes
Returns:
obsvect, datastore updated with contribution to observations from initial
concentrations
"""
background
=
obsvect
.
background
model
=
obsvect
.
model
# Read global concentration fields. Regrid to model grid and
# filter by start and end date of simulation
conc_ini
=
background
.
read_conc
(
model
,
background
.
dir_initconc
,
background
.
file_initconc
,
**
kwargs
)
n_x
=
model
.
domain
.
nlon_glob
n_y
=
model
.
domain
.
nlat_glob
n_z
=
len
(
model
.
domain
.
heights
)
# cini is dimension number of observations x zones to optimize
# Stored in monitor as cini_1, cini_2 etc.
obsvect
.
n_cini
=
len
(
background
.
cini_lat
)
obsvect
.
cini_names
=
[
"cini_{}"
.
format
(
i
)
for
i
in
range
(
obsvect
.
n_cini
)]
cini
=
np
.
empty
((
len
(
obsvect
.
datastore
),
obsvect
.
n_cini
),
order
=
'C'
);
cini
[:,:]
=
np
.
nan
# Read FLEXPART header to access trajdays
fp_header
=
None
# Loop over all observations and calculate background contribution
for
obs_i
,
row
in
enumerate
(
obsvect
.
datastore
.
itertuples
()):
# Subdirectory for FLEXPART grid_initial files
subdir
=
row
.
Index
.
strftime
(
"%Y%m"
)
station
=
row
.
station
runsubdir_glob
=
os
.
path
.
join
(
model
.
run_dir_glob
,
station
.
upper
(),
subdir
)
file_date
=
row
.
Index
.
strftime
(
'%Y%m%d%H%M%S'
)
file_name
=
'grid_initial_'
+
file_date
+
'_001'
if
not
os
.
path
.
isfile
(
os
.
path
.
join
(
runsubdir_glob
,
file_name
)):
continue
# Read grid_initial file
gridini
=
model
.
utils
.
read
.
read_init
(
runsubdir_glob
,
file_name
,
n_x
,
n_y
,
n_z
)
# Assume all trajdays are the same so read header once only
if
fp_header
is
None
:
fp_header
=
model
.
utils
.
flexpart_header
.
Flexpartheader
()
fp_header
.
read_header
(
os
.
path
.
join
(
runsubdir_glob
,
'header'
))
trajdays
=
fp_header
.
trajdays
# Interpolate background concentrations to observation date minus trajdays
time_interpolate
=
row
.
Index
-
timedelta
(
days
=
trajdays
)
conc
=
np
.
array
(
conc_ini
.
interp
(
coords
=
{
'time'
:
time_interpolate
}))
for
iz
in
range
(
len
(
model
.
domain
.
heights
)):
print
(
"background, iz:"
,
iz
)
for
iy
in
range
(
model
.
domain
.
nlat_glob
):
n
=
np
.
min
(
np
.
where
(
model
.
domain
.
lat_glob
[
iy
]
<
background
.
cini_lat
))
for
ix
in
range
(
model
.
domain
.
nlon_glob
):
cini
[
obs_i
,
n
]
+=
gridini
[
ix
,
iy
,
iz
]
*
conc
[
ix
,
iy
,
iz
]
# Add initial concentrations to datastore
for
i
,
name
in
enumerate
(
obsvect
.
cini_names
):
obsvect
.
datastore
[
name
]
=
cini
[:,
i
]
return
obsvect
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment