-
Notifications
You must be signed in to change notification settings - Fork 18
Add analytic LandEM LAI/canopy Jacobians + land-surface TL/AD/K unit tests #282
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Add analytic LandEM LAI/canopy Jacobians + land-surface TL/AD/K unit tests #282
Conversation
StegmannJCSDA
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The branch builds on Discover and all relevant ctests pass.
I have a few questions/comments on the build:
- Is the TL and AD code coming from tapenade?
- I don't understand the reasoning behind the effective
LAI = LAI + Canopy_Water_Content
LAI and canopy water content have different units, so I wouldn't add them.
Personally I would use the canopy water content for the computation of the dielectric constant in the subroutine Canopy_Diel instead. The subroutine implements Eq. (10) from the attached paper (the reference is not given in the code documentation).
Microwave_Dielectric_Spectrum_of_Vegetation_-_Part_II_Dual-Dispersion_Model.pdf
|
You raise a valid point about the dimensional inconsistency. Let me explain the reasoning behind the current implementation. Why the optical depth pathway rather than dielectric? The alternative approach (routing canopy water content through
Deriving and implementing
This is substantially more complex than the optical depth pathway, where the relationship is linear and real-valued. Physical basis for the current approach: Both LAI and canopy water content affect the canopy's microwave opacity, more vegetation mass (whether leaf area or water content) means more attenuation. The optical depth in Canopy_Optic is linear in LAI: Treating canopy water as an additional contribution to this opacity is a reasonable first-order approximation for enabling Jacobian calculations. The dimensional inconsistency is a fair criticism. We could address this by adding an explicit conversion coefficient: This makes the unit conversion explicit and auditable, and the coefficient could be refined based on empirical calibration or made vegetation-type dependent. Would this address your concern, or do you feel the dielectric pathway is essential for physical correctness? |
|
Hello @BenjaminTJohnson. Thank you for the comprehensive explanation. REAL(fp), PARAMETER :: CWC_TO_LAI_COEFF = 1.0_fp ! [m²/m² per g/cm³]
lai_eff = Surface%Lai + Surface%Canopy_Water_Content * CWC_TO_LAI_COEFFThe complexity of the dielectric pathway might introduce new problems on top of everything. |
Motivation
LandEMcomponent of CRTM only exposes LAI as a vegetation state input; there is no explicit canopy‑water parameter in the forward API.LAI, i.e. effectiveLAI = LAI + Canopy_Water_Content. This keeps the forward model unchanged whileenabling canopy‑water influence through the same vegetation optics pathway.
Decision process: analytic TL/AD/K_Matrix
LandEMforward model had no TL/AD hooks, so the framework had nothing to call for LAI/canopy sensitivities.LAIderivative by following the same canopy optics + pathway used in the forward model, then propagate that derivative through TL/AD/K_Matrix.What changed (relative to develop)
Core model
NESDIS_LandEM_LAI_Derivativethat computes ∂(emissivity)/∂(LAI) through canopy optics and the two‑stream solution.Canopy_Opticnow optionally returns internal transmittance terms(tv, th)needed to computed(tau)/d(LAI).LAIand canopy water viaLAI + Canopy_Water_Content.dE/dLAI * (LAI_TL + Canopy_Water_TL)Surface_AD%LaiandSurface_AD%Canopy_Water_ContentUnit tests
LAItests:test_TL_lai.f90test_k_matrix_lai.f90test_AD_lai_canopy_water.f90validates TL/AD consistency for the combined LAI + canopy water perturbation.ctests) and set a stable LAI baseline for consistent sensitivities.CMake test structure
Files touched
Notes / behavior
Tests
ctest -R test_Unit_TL_Canopy_Water_
ctest -R test_Unit_TL_LAI_
ctest -R test_Unit_K_Matrix_Canopy_Water_
ctest -R test_Unit_K_Matrix_LAI_
ctest -R test_Unit_AD_LAI_Canopy_Water_
feel free to add other sensors to the
test/CMakeLists.txtresolves #279 (at least mechanically).