Skip to content

Commit 7cdf348

Browse files
jjokellaclaude
andcommitted
docs: LST-DA documentation
Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent bb57ce5 commit 7cdf348

4 files changed

Lines changed: 206 additions & 21 deletions

File tree

docs/_toc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ parts:
2828
- file: users_guide/running_tsmp_pdaf/input_cmd
2929
- file: users_guide/running_tsmp_pdaf/input_obs
3030
- file: users_guide/running_tsmp_pdaf/input_enkfpf
31+
- file: users_guide/running_tsmp_pdaf/lst_da
3132

3233
- file: users_guide/debugging_tsmp_pdaf/README
3334
title: Debugging TSMP-PDAF

docs/users_guide/running_tsmp_pdaf/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ COSMO](cos)). Additionally, a control file for the data assimilation
1515
Furthermore, some command line options ([Command line options](cmd))
1616
need to be specified when TSMP-PDAF is executed.
1717

18+
For assimilation of land surface temperature observations into CLM, see
19+
[Land Surface Temperature Data Assimilation](lstda).
20+
1821
See the Virtual Machine download on webpage
1922
<https://datapub.fz-juelich.de/slts/tsmp-vm/index.html>.
2023

docs/users_guide/running_tsmp_pdaf/input_enkfpf.md

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -483,30 +483,37 @@ CLM (standalone only).
483483
manual
484484
<https://escomp.github.io/ctsm-docs/versions/release-clm5.0/html/tech_note/index.html>)
485485

486+
(enkfpf:clm:update_T)=
486487
### CLM:update_T ###
487488

488489
`CLM:update_T`: (integer) Flag for updating temperature variables in
489490
eCLM via LST data assimilation.
490491

491-
The observation operator uses the skin temperature (TSKIN) as the
492-
simulated LST equivalent for all options except `1`.
493-
494492
State vector variables updated for each option:
495493

496494
- 0: No update of temperature variables.
497495

498496
- 1: Update of ground temperature (`t_grnd`) and vegetation
499497
temperature (`t_veg`) directly. The simulated LST is computed from
500-
`t_grnd` and `t_veg` using a radiometric mixing formula (Kustas
501-
2009, Eq. 7) with LAI.
498+
`t_grnd` and `t_veg` using a radiometric mixing formula
499+
([Kustas & Anderson, 2009](https://doi.org/10.1016/j.agrformet.2009.05.016),
500+
Eq. 7) with LAI.
501+
502+
- 2: Gridcell-mean update of skin temperature (`t_skin`, not
503+
prognostic), soil/snow temperatures (`t_soisno`, all `nlevgrnd`
504+
layers), and vegetation temperature (`t_veg`). Each patch/column is
505+
updated based on gridcell-mean increments and according to selected
506+
[increment type](enkfpf:clm:increment_type). The observation
507+
operator uses the skin temperature (TSKIN) as the simulated LST
508+
equivalent.
509+
510+
- 3: Like `2`, but additionally updates ground temperature
511+
(`t_grnd`). State vector: `t_skin`, `t_soisno` (`nlevgrnd`
512+
layers), `t_veg`, `t_grnd`.
502513

503-
- 2: Gridcell-mean update of skin temperature (`t_skin`), soil/snow
504-
temperatures (`t_soisno`, all `nlevgrnd` layers), and vegetation
505-
temperature (`t_veg`). Updates are applied as gridcell-mean
506-
increment factors to each individual patch/column value.
507514

508-
- 3: Like `2`, but additionally updates ground temperature (`t_grnd`).
509-
State vector: TSKIN, TSOIL (nlevgrnd layers), TVEG, TGRND.
515+
See [Land Surface Temperature Data Assimilation](lstda) for a detailed
516+
description.
510517

511518
### CLM:print_swc ###
512519

@@ -613,23 +620,25 @@ are allowed.
613620
`CLM:swc_mask_snow`: (integer) Switch for masking columns with snow
614621
cover from SWC updates.
615622

616-
Snow covers larger than 1mm are switched off for the update.
623+
Columns with snow depth ≥ 1 mm are excluded from the update.
617624

618625
Only takes effect if `CLM:update_swc``is switched on.
619626

620627
Default setting is `0`: No masking of columns with snow cover.
621628

629+
(enkfpf:clm:T_mask_snow)=
622630
### CLM:T_mask_snow ###
623631

624632
`CLM:T_mask_snow`: (integer) Switch for masking columns with snow
625633
cover from T updates.
626634

627635
Snow covers larger than 1mm are switched off for the update.
628636

629-
Only takes effect if `CLM:update_T``is switched on.
637+
Only takes effect if `CLM:update_T` is switched on.
630638

631639
Default setting is `0`: No masking of columns with snow cover.
632640

641+
(enkfpf:clm:increment_type)=
633642
### CLM:increment_type ###
634643

635644
`CLM:increment_type`: (integer) Switch for changing increment type in
@@ -642,26 +651,30 @@ Only takes effect if `CLM:update_T` is switched on.
642651

643652
Default setting is `0`: Multiplicative increment.
644653

654+
(enkfpf:clm:T_max_increment)=
645655
### CLM:T_max_increment ###
646656

647-
`CLM:T_max_increment`: (double) Maximum T-increment to update
648-
(additively).
657+
`CLM:T_max_increment`: (double) Maximum allowed magnitude of the
658+
additive temperature increment (K).
649659

650660
Only takes effect if `CLM:update_T` is switched on and
651661
`CLM:increment_type` is set to `1`.
652662

653663
Default setting is `5.0`: Updates larger than 5K are not applied.
654664

665+
(enkfpf:clm:T_mask_T)=
655666
### CLM:T_mask_T ###
656667

657-
`CLM:T_mask_T`: (double) Temperature difference to add to freezing
658-
temperature resulting in a threshold temperature for masking out T
659-
updates. Whenever the soil temperature of the surface layer falls
660-
below this threshold temperature, no T is not updated.
668+
`CLM:T_mask_T`: (double) Offset above freezing (K) used as the
669+
lower-temperature masking threshold. The update is suppressed whenever
661670

662-
Only takes effect if `CLM:update_T``is switched on.
671+
```
672+
t_soisno(:,1) < 273.15 K + CLM:T_mask_T.
673+
```
674+
675+
Only takes effect if `CLM:update_T` is switched on.
663676

664-
Default setting is `0.`: Masking updates below freezing temperaturs.
677+
Default setting is `0.`: Masking updates below freezing temperatures.
665678

666679
(enkfpf:cosmo)=
667680
## [COSMO] ##
@@ -965,6 +978,8 @@ Default: 0, output turned off.
965978
| | `t_printensemble` | -2 |
966979
| | `watmin_switch` | 0 |
967980
| | `T_mask_snow` | 0 |
981+
| | `increment_type` | 0 |
982+
| | `T_max_increment` | 5.0 |
968983
| | `T_mask_T` | 0.0 |
969984
| `[COSMO]` | | |
970985
| | `nprocs` | 0 |
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
(lstda)=
2+
# Land Surface Temperature Data Assimilation #
3+
4+
Land Surface Temperature data assimilation (LST-DA) in TSMP-PDAF enables
5+
the assimilation of remotely-sensed land surface temperature (LST)
6+
observations into the eCLM land-surface model. The analysis step updates
7+
one or more temperature variables in the CLM state, and auxiliary masking
8+
and increment-clipping parameters allow the update to be restricted to
9+
physically meaningful regimes.
10+
11+
## Configuration ##
12+
13+
LST-DA is controlled by five parameters in the [`[CLM]` section of
14+
`enkfpf.par`](enkfpf:clm):
15+
16+
- [`CLM:update_T`](enkfpf:clm:update_T): selects which CLM temperature
17+
variables are placed in the state vector and updated after the analysis
18+
step.
19+
- [`CLM:T_mask_snow`](enkfpf:clm:T_mask_snow): optionally masks out
20+
columns with snow cover from the temperature update.
21+
- [`CLM:increment_type`](enkfpf:clm:increment_type): switches between
22+
multiplicative (default) and additive increments.
23+
- [`CLM:T_max_increment`](enkfpf:clm:T_max_increment): clips additive
24+
increments to a maximum magnitude (only relevant when
25+
`CLM:increment_type=1`).
26+
- [`CLM:T_mask_T`](enkfpf:clm:T_mask_T): masks out columns whose
27+
surface-layer soil temperature falls below a threshold close to
28+
freezing.
29+
30+
When LST-DA is active (`CLM:update_T != 0`), the temperature state
31+
variables replace the soil water content (SWC) in the state vector.
32+
Simultaneous assimilation of SWC and LST in the same PDAF update step is
33+
not supported.
34+
35+
## State Vector ##
36+
37+
The state vector content depends on `CLM:update_T`. For options 2 and 3
38+
the state vector is defined at the gridcell level (one value per grid
39+
cell); for option 1 it is defined at the patch level.
40+
41+
| `update_T` | State vector variables |
42+
|:-----------|:-------------------------------------------------------------|
43+
| `1` | `t_grnd` (per patch) + `t_veg` (per patch) |
44+
| `2` | `t_skin` (per gridcell) + `t_soisno` (all `nlevgrnd` layers) |
45+
| | + `t_veg` (per gridcell) |
46+
| `3` | Same as `2`, plus `t_grnd` (per gridcell) |
47+
48+
## Observation Operator ##
49+
50+
The observation operator maps the CLM state to a simulated LST:
51+
52+
- **Option 1**: The simulated LST is computed from `t_grnd` and
53+
`t_veg` using the radiometric mixing formula of [Kustas & Anderson
54+
(2009)](https://doi.org/10.1016/j.agrformet.2009.05.016) (Eq. 7),
55+
weighted by leaf area index (LAI).
56+
- **Options 2 and 3**: The skin temperature `t_skin` is used directly as
57+
the simulated LST. Observations are indexed at the gridcell level
58+
(one observation per grid cell).
59+
60+
## Increment Application ##
61+
62+
After the PDAF analysis step, the updated state vector values are written
63+
back to the CLM temperature arrays. Two increment modes are available,
64+
selected via [`CLM:increment_type`](enkfpf:clm:increment_type):
65+
66+
**Multiplicative increment** (`CLM:increment_type=0`, default):
67+
Each temperature variable is scaled by the ratio of the posterior to the
68+
prior gridcell-mean skin temperature:
69+
70+
```
71+
t_update = t_prior × (TSKIN_out / TSKIN_in)
72+
```
73+
74+
**Additive increment** (`CLM:increment_type=1`):
75+
The difference between posterior and prior gridcell-mean TSKIN is added
76+
directly to each temperature variable:
77+
78+
```
79+
t_update = t_prior + (TSKIN_out - TSKIN_in)
80+
```
81+
82+
When `CLM:increment_type=1`, the increment is clipped to
83+
`±CLM:T_max_increment` (default 5 K). Increments that exceed this
84+
threshold are replaced by the clipped value and a warning counter is
85+
incremented; the total number of clipped increments is printed after each
86+
analysis step.
87+
88+
## Masking ##
89+
90+
Two independent masking conditions can suppress the update for individual
91+
columns or grid cells:
92+
93+
**Snow masking** (`CLM:T_mask_snow`): When set to `1`, columns with a
94+
snow depth ≥ 1 mm are excluded from the temperature update. This avoids
95+
applying a bare-soil LST increment to snow-covered grid cells.
96+
97+
**Freeze masking** (`CLM:T_mask_T`): The update is suppressed whenever
98+
the soil/snow temperature of the surface layer (`t_soisno(:,1)`) falls
99+
below `T_freeze + CLM:T_mask_T`. With the default value of `0`, this
100+
masks all grid cells at or below the freezing point (273.15 K).
101+
102+
Both masks are evaluated independently for each patch or column.
103+
104+
## Safety Checks ##
105+
106+
- NaN checks are applied to all updated temperature variables; a warning
107+
is printed to stdout if a NaN value is detected.
108+
- Clipped additive increments are counted per analysis step and the total
109+
is printed for `t_skin`, `t_soisno`, `t_veg`, and `t_grnd` separately.
110+
- The update is skipped entirely for a given patch/column if the
111+
gridcell-mean TSKIN change falls below `1e-7 K` (numerical tolerance).
112+
113+
## Configuration Examples ##
114+
115+
### Assimilate LST into ground and vegetation temperature (option 1) ###
116+
117+
```text
118+
[CLM]
119+
update_T = 1
120+
increment_type = 0
121+
```
122+
123+
The simulated LST is computed from `t_grnd` and `t_veg` via the
124+
[Kustas & Anderson (2009)](https://doi.org/10.1016/j.agrformet.2009.05.016)
125+
radiometric mixing formula. Both variables are updated with a
126+
multiplicative increment.
127+
128+
### Assimilate LST into skin and soil temperature (option 2) ###
129+
130+
```text
131+
[CLM]
132+
update_T = 2
133+
increment_type = 0
134+
T_mask_snow = 1
135+
T_mask_T = 0.0
136+
```
137+
138+
TSKIN is used as the simulated LST. After analysis, `t_skin`, all
139+
`t_soisno` layers, and `t_veg` are scaled by the TSKIN increment factor.
140+
Snow-covered columns are excluded from the update.
141+
142+
### Assimilate LST with additive increment and clipping (option 2) ###
143+
144+
```text
145+
[CLM]
146+
update_T = 2
147+
increment_type = 1
148+
T_max_increment = 3.0
149+
T_mask_T = 2.0
150+
```
151+
152+
The TSKIN increment is applied additively and clipped to ±3 K. Grid cells
153+
whose surface-layer temperature falls below 275.15 K (freezing + 2 K) are
154+
excluded.
155+
156+
### Assimilate LST including ground temperature (option 3) ###
157+
158+
```text
159+
[CLM]
160+
update_T = 3
161+
increment_type = 0
162+
T_mask_snow = 1
163+
```
164+
165+
Like option 2, but `t_grnd` is additionally included in the state vector
166+
and updated. Snow-covered columns are masked out.

0 commit comments

Comments
 (0)