2High-level StomatalConductance interface for PyHelios.
4This module provides a user-friendly interface to the stomatal conductance modeling
5capabilities with graceful plugin handling and informative error messages.
10from typing
import List, Optional, Union, NamedTuple
11from contextlib
import contextmanager
13from .plugins.registry
import get_plugin_registry
14from .wrappers
import UStomatalConductanceWrapper
as stomatal_wrapper
15from .Context
import Context, check_context_alive
16from .exceptions
import HeliosError
18logger = logging.getLogger(__name__)
22 """Exception raised for StomatalConductance-specific errors."""
28 """Ball-Woodrow-Berry model coefficients."""
34 """Ball-Berry-Leuning model coefficients."""
41 """Medlyn et al. optimality model coefficients."""
47 """Buckley-Mott-Farquhar model coefficients."""
55 """Bailey model coefficients."""
65 High-level interface for stomatal conductance modeling and gas exchange calculations.
67 This class provides a user-friendly wrapper around the native Helios
68 stomatal conductance plugin with automatic plugin availability checking and
69 graceful error handling.
71 The stomatal conductance model implements five different stomatal response models:
72 - BWB: Ball, Woodrow, Berry (1987) - original model
73 - BBL: Ball, Berry, Leuning (1990, 1995) - includes VPD response
74 - MOPT: Medlyn et al. (2011) - optimality-based model
75 - BMF: Buckley, Mott, Farquhar - simplified mechanistic model
76 - BB: Bailey - hydraulic-based model
78 The plugin includes a species library with pre-calibrated coefficients for
79 common plant species (Almond, Apple, Avocado, Grape, Lemon, Olive, Walnut, etc.).
81 Both steady-state and dynamic (time-stepping) calculations are supported,
82 with configurable time constants for stomatal opening and closing dynamics.
85 - Cross-platform support (Windows, Linux, macOS)
87 - No special dependencies
88 - Stomatal conductance plugin compiled into PyHelios
91 >>> with Context() as context:
92 ... # Add leaf geometry
93 ... leaf_uuid = context.addPatch(center=[0, 0, 1], size=[0.1, 0.1])
95 ... with StomatalConductanceModel(context) as stomatal:
96 ... # Set model coefficients using species library
97 ... stomatal.setBMFCoefficientsFromLibrary("Almond")
99 ... # Run steady-state calculation
102 ... # Or run dynamic simulation with timestep
103 ... stomatal.run(dt=60.0) # 60 second timestep
105 ... # Set custom BMF coefficients for specific leaves
106 ... bmf_coeffs = BMFCoefficients(Em=258.25, i0=38.65, k=232916.82, b=609.67)
107 ... stomatal.setBMFCoefficients(bmf_coeffs, uuids=[leaf_uuid])
110 def __init__(self, context: Context):
112 Initialize StomatalConductanceModel with graceful plugin handling.
115 context: Helios Context instance
118 TypeError: If context is not a Context instance
119 StomatalConductanceModelError: If stomatal conductance plugin is not available
122 if not (hasattr(context,
'__class__')
and
123 (isinstance(context, Context)
or
124 context.__class__.__name__ ==
'Context')):
125 raise TypeError(f
"StomatalConductanceModel requires a Context instance, got {type(context).__name__}")
131 registry = get_plugin_registry()
133 if not registry.is_plugin_available(
'stomatalconductance'):
135 plugin_info = registry.get_plugin_capabilities()
136 available_plugins = registry.get_available_plugins()
139 "StomatalConductanceModel requires the 'stomatalconductance' plugin which is not available.\n\n"
140 "The stomatal conductance plugin provides gas exchange calculations using five validated models:\n"
141 "- Ball-Woodrow-Berry (BWB) - classic stomatal response\n"
142 "- Ball-Berry-Leuning (BBL) - includes vapor pressure deficit\n"
143 "- Medlyn et al. optimality (MOPT) - optimal stomatal behavior\n"
144 "- Buckley-Mott-Farquhar (BMF) - mechanistic approach\n"
145 "- Bailey (BB) - hydraulic-based model\n\n"
147 "- Species library with pre-calibrated coefficients\n"
148 "- Dynamic time-stepping with configurable time constants\n"
149 "- No GPU or special dependencies required\n\n"
150 "To enable stomatal conductance modeling:\n"
151 "1. Build PyHelios with stomatal conductance plugin:\n"
152 " build_scripts/build_helios --plugins stomatalconductance\n"
153 "2. Or build with multiple plugins:\n"
154 " build_scripts/build_helios --plugins stomatalconductance,energybalance,photosynthesis\n"
155 f
"\nCurrently available plugins: {available_plugins}"
159 alternatives = registry.suggest_alternatives(
'stomatalconductance')
161 error_msg += f
"\n\nAlternative plugins available: {alternatives}"
162 error_msg +=
"\nConsider using photosynthesis or energybalance for related plant physiology modeling."
168 self.
stomatal_model = stomatal_wrapper.createStomatalConductanceModel(context.getNativePtr())
171 "Failed to create StomatalConductanceModel instance. "
172 "This may indicate a problem with the native library."
174 logger.info(
"StomatalConductanceModel created successfully")
176 except Exception
as e:
180 """Raise if the owning Context has been destroyed (see Context.check_context_alive)."""
181 check_context_alive(getattr(self,
"context",
None),
"StomatalConductanceModel")
184 """Context manager entry."""
187 def __exit__(self, exc_type, exc_value, traceback):
188 """Context manager exit with proper cleanup."""
191 stomatal_wrapper.destroyStomatalConductanceModel(self.
stomatal_model)
192 logger.debug(
"StomatalConductanceModel destroyed successfully")
193 except Exception
as e:
194 logger.warning(f
"Error destroying StomatalConductanceModel: {e}")
199 """Destructor to ensure C++ resources freed even without 'with' statement."""
200 if hasattr(self,
'stomatal_model')
and self.
stomatal_model is not None:
202 stomatal_wrapper.destroyStomatalConductanceModel(self.
stomatal_model)
204 except Exception
as e:
206 warnings.warn(f
"Error in StomatalConductanceModel.__del__: {e}")
209 """Get the native pointer for advanced operations."""
214 Enable console output messages from the stomatal conductance model.
217 StomatalConductanceModelError: If operation fails
222 except Exception
as e:
227 Disable console output messages from the stomatal conductance model.
230 StomatalConductanceModelError: If operation fails
235 except Exception
as e:
238 def run(self, uuids: Optional[List[int]] =
None, dt: Optional[float] =
None) ->
None:
240 Run the stomatal conductance model.
242 This method supports multiple execution modes:
243 - Steady state for all primitives: run()
244 - Dynamic with timestep for all primitives: run(dt=60.0)
245 - Steady state for specific primitives: run(uuids=[1, 2, 3])
246 - Dynamic with timestep for specific primitives: run(uuids=[1, 2, 3], dt=60.0)
249 uuids: Optional list of primitive UUIDs to process. If None, processes all primitives.
250 dt: Optional timestep in seconds for dynamic simulation. If None, runs steady-state.
253 ValueError: If parameters are invalid
254 StomatalConductanceModelError: If calculation fails
257 >>> # Steady state for all primitives
260 >>> # Dynamic simulation with 60-second timestep
261 >>> stomatal.run(dt=60.0)
263 >>> # Steady state for specific leaves
264 >>> stomatal.run(uuids=[leaf1_uuid, leaf2_uuid])
266 >>> # Dynamic simulation for specific leaves
267 >>> stomatal.run(uuids=[leaf1_uuid, leaf2_uuid], dt=30.0)
271 if dt
is not None and uuids
is not None:
273 stomatal_wrapper.runForUUIDsDynamic(self.
stomatal_model, uuids, dt)
277 elif uuids
is not None:
284 except Exception
as e:
290 if uuids
is not None and material_label
is not None:
291 raise ValueError(f
"{method}: pass either uuids or material_label, not both.")
292 if uuids
is not None:
293 if isinstance(uuids, (str, bytes))
or not isinstance(uuids, (list, tuple)):
294 hint =
" (to target a material, pass material_label=...)" if isinstance(uuids, str)
else ""
295 raise ValueError(f
"{method}: uuids must be a list of int UUIDs, got {type(uuids).__name__}{hint}")
296 if not all(isinstance(u, int)
and not isinstance(u, bool)
for u
in uuids):
297 raise ValueError(f
"{method}: uuids must contain only int UUIDs")
298 if material_label
is not None and (
not isinstance(material_label, str)
or not material_label):
299 raise ValueError(f
"{method}: material_label must be a non-empty str, got {type(material_label).__name__}")
304 raise ValueError(
"Em must be positive")
306 raise ValueError(
"i0 must be non-negative")
308 raise ValueError(
"k must be positive")
310 raise ValueError(
"b must be non-negative")
313 def setBWBCoefficients(self, coeffs: BWBCoefficients, uuids: Optional[List[int]] =
None,
314 material_label: Optional[str] =
None) ->
None:
316 Set Ball-Woodrow-Berry model coefficients.
319 coeffs: BWB model coefficients (gs0, a1)
320 uuids: Optional list of primitive UUIDs. If None and ``material_label`` is
321 also None, applies to all primitives.
322 material_label: Optional Context material label. The coefficients are stored on
323 the material and apply to every primitive that references it when run() is
324 called. Mutually exclusive with ``uuids``. See "Coefficient precedence" in
325 the Stomatal Conductance plugin documentation.
328 ValueError: If coefficients are invalid, or both ``uuids`` and ``material_label`` are given
329 StomatalConductanceModelError: If operation fails (e.g. the material does not exist)
332 >>> bwb_coeffs = BWBCoefficients(gs0=0.0733, a1=9.422)
333 >>> stomatal.setBWBCoefficients(bwb_coeffs)
334 >>> stomatal.setBWBCoefficients(bwb_coeffs, material_label="sun_leaf")
336 if not isinstance(coeffs, BWBCoefficients):
337 raise ValueError(f
"coeffs must be a BWBCoefficients instance, got {type(coeffs).__name__}")
340 raise ValueError(
"gs0 must be non-negative")
342 raise ValueError(
"a1 must be non-negative")
346 if material_label
is not None:
347 stomatal_wrapper.setBWBCoefficientsForMaterial(self.
stomatal_model, material_label, coeffs.gs0, coeffs.a1)
348 elif uuids
is not None:
349 stomatal_wrapper.setBWBCoefficientsForUUIDs(self.
stomatal_model, coeffs.gs0, coeffs.a1, uuids)
351 stomatal_wrapper.setBWBCoefficients(self.
stomatal_model, coeffs.gs0, coeffs.a1)
352 except Exception
as e:
356 def setBBLCoefficients(self, coeffs: BBLCoefficients, uuids: Optional[List[int]] =
None,
357 material_label: Optional[str] =
None) ->
None:
359 Set Ball-Berry-Leuning model coefficients.
362 coeffs: BBL model coefficients (gs0, a1, D0)
363 uuids: Optional list of primitive UUIDs. If None and ``material_label`` is
364 also None, applies to all primitives.
365 material_label: Optional Context material label; applies to every primitive that
366 references the material at run() time. Mutually exclusive with ``uuids``.
369 ValueError: If coefficients are invalid, or both ``uuids`` and ``material_label`` are given
370 StomatalConductanceModelError: If operation fails
373 >>> bbl_coeffs = BBLCoefficients(gs0=0.0743, a1=4.265, D0=14570.0)
374 >>> stomatal.setBBLCoefficients(bbl_coeffs)
376 if not isinstance(coeffs, BBLCoefficients):
377 raise ValueError(f
"coeffs must be a BBLCoefficients instance, got {type(coeffs).__name__}")
380 raise ValueError(
"gs0 must be non-negative")
382 raise ValueError(
"a1 must be non-negative")
384 raise ValueError(
"D0 must be positive")
388 if material_label
is not None:
389 stomatal_wrapper.setBBLCoefficientsForMaterial(self.
stomatal_model, material_label, coeffs.gs0, coeffs.a1, coeffs.D0)
390 elif uuids
is not None:
391 stomatal_wrapper.setBBLCoefficientsForUUIDs(self.
stomatal_model, coeffs.gs0, coeffs.a1, coeffs.D0, uuids)
393 stomatal_wrapper.setBBLCoefficients(self.
stomatal_model, coeffs.gs0, coeffs.a1, coeffs.D0)
394 except Exception
as e:
399 material_label: Optional[str] =
None) ->
None:
401 Set Medlyn et al. optimality model coefficients.
404 coeffs: MOPT model coefficients (gs0, g1)
405 uuids: Optional list of primitive UUIDs. If None and ``material_label`` is
406 also None, applies to all primitives.
407 material_label: Optional Context material label; applies to every primitive that
408 references the material at run() time. Mutually exclusive with ``uuids``.
411 ValueError: If coefficients are invalid, or both ``uuids`` and ``material_label`` are given
412 StomatalConductanceModelError: If operation fails
415 >>> mopt_coeffs = MOPTCoefficients(gs0=0.0825, g1=2.637)
416 >>> stomatal.setMOPTCoefficients(mopt_coeffs)
418 if not isinstance(coeffs, MOPTCoefficients):
419 raise ValueError(f
"coeffs must be a MOPTCoefficients instance, got {type(coeffs).__name__}")
422 raise ValueError(
"gs0 must be non-negative")
424 raise ValueError(
"g1 must be positive")
428 if material_label
is not None:
429 stomatal_wrapper.setMOPTCoefficientsForMaterial(self.
stomatal_model, material_label, coeffs.gs0, coeffs.g1)
430 elif uuids
is not None:
431 stomatal_wrapper.setMOPTCoefficientsForUUIDs(self.
stomatal_model, coeffs.gs0, coeffs.g1, uuids)
433 stomatal_wrapper.setMOPTCoefficients(self.
stomatal_model, coeffs.gs0, coeffs.g1)
434 except Exception
as e:
439 uuids: Optional[List[int]] =
None,
440 material_label: Optional[str] =
None) ->
None:
442 Set Buckley-Mott-Farquhar model coefficients.
444 ``coeffs`` may be a single :class:`BMFCoefficients` (applied to all primitives, to
445 ``uuids``, or to ``material_label``), or a list of :class:`BMFCoefficients` with one
446 entry per UUID in ``uuids`` (``coeffs[i]`` is applied to ``uuids[i]``).
449 coeffs: BMF model coefficients (Em, i0, k, b), or a list of them (per-UUID form)
450 uuids: Optional list of primitive UUIDs. Required for the per-UUID list form.
451 If None and ``material_label`` is also None, applies to all primitives.
452 material_label: Optional Context material label; applies to every primitive that
453 references the material at run() time. Mutually exclusive with ``uuids`` and
454 not accepted with the per-UUID list form.
457 ValueError: If coefficients are invalid, list and UUID lengths differ, or both
458 ``uuids`` and ``material_label`` are given
459 StomatalConductanceModelError: If operation fails
462 >>> bmf_coeffs = BMFCoefficients(Em=258.25, i0=38.65, k=232916.82, b=609.67)
463 >>> stomatal.setBMFCoefficients(bmf_coeffs)
464 >>> # One coefficient set per leaf
465 >>> stomatal.setBMFCoefficients([coeffs_a, coeffs_b], uuids=[leaf_a, leaf_b])
468 if isinstance(coeffs, BMFCoefficients):
471 elif isinstance(coeffs, (list, tuple))
and coeffs
and all(isinstance(c, BMFCoefficients)
for c
in coeffs):
472 if material_label
is not None:
473 raise ValueError(
"setBMFCoefficients: a list of coefficient sets cannot be combined with material_label; "
474 "pass a single BMFCoefficients instead.")
476 raise ValueError(
"setBMFCoefficients: a list of coefficient sets requires uuids (one UUID per coefficient set).")
477 if len(coeffs) != len(uuids):
478 raise ValueError(f
"setBMFCoefficients: number of coefficient sets ({len(coeffs)}) does not match "
479 f
"number of UUIDs ({len(uuids)}).")
484 raise ValueError(f
"coeffs must be a BMFCoefficients instance or a non-empty list of BMFCoefficients, "
485 f
"got {type(coeffs).__name__}")
490 stomatal_wrapper.setBMFCoefficientsPerUUID(self.
stomatal_model, [list(c)
for c
in coeffs], list(uuids))
491 elif material_label
is not None:
492 stomatal_wrapper.setBMFCoefficientsForMaterial(self.
stomatal_model, material_label, coeffs.Em, coeffs.i0, coeffs.k, coeffs.b)
493 elif uuids
is not None:
494 stomatal_wrapper.setBMFCoefficientsForUUIDs(self.
stomatal_model, coeffs.Em, coeffs.i0, coeffs.k, coeffs.b, uuids)
496 stomatal_wrapper.setBMFCoefficients(self.
stomatal_model, coeffs.Em, coeffs.i0, coeffs.k, coeffs.b)
497 except Exception
as e:
501 def setBBCoefficients(self, coeffs: BBCoefficients, uuids: Optional[List[int]] =
None,
502 material_label: Optional[str] =
None) ->
None:
504 Set Bailey model coefficients.
507 coeffs: BB model coefficients (pi_0, pi_m, theta, sigma, chi)
508 uuids: Optional list of primitive UUIDs. If None and ``material_label`` is
509 also None, applies to all primitives.
510 material_label: Optional Context material label; applies to every primitive that
511 references the material at run() time. Mutually exclusive with ``uuids``.
514 ValueError: If coefficients are invalid, or both ``uuids`` and ``material_label`` are given
515 StomatalConductanceModelError: If operation fails
518 >>> bb_coeffs = BBCoefficients(pi_0=1.0, pi_m=1.67, theta=211.22, sigma=0.4408, chi=2.076)
519 >>> stomatal.setBBCoefficients(bb_coeffs)
521 if not isinstance(coeffs, BBCoefficients):
522 raise ValueError(f
"coeffs must be a BBCoefficients instance, got {type(coeffs).__name__}")
524 if coeffs.pi_0 <= 0.0:
525 raise ValueError(
"pi_0 must be positive")
526 if coeffs.pi_m <= 0.0:
527 raise ValueError(
"pi_m must be positive")
528 if coeffs.theta <= 0.0:
529 raise ValueError(
"theta must be positive")
530 if coeffs.sigma <= 0.0:
531 raise ValueError(
"sigma must be positive")
532 if coeffs.chi <= 0.0:
533 raise ValueError(
"chi must be positive")
537 if material_label
is not None:
538 stomatal_wrapper.setBBCoefficientsForMaterial(self.
stomatal_model, material_label, coeffs.pi_0, coeffs.pi_m, coeffs.theta, coeffs.sigma, coeffs.chi)
539 elif uuids
is not None:
540 stomatal_wrapper.setBBCoefficientsForUUIDs(self.
stomatal_model, coeffs.pi_0, coeffs.pi_m, coeffs.theta, coeffs.sigma, coeffs.chi, uuids)
542 stomatal_wrapper.setBBCoefficients(self.
stomatal_model, coeffs.pi_0, coeffs.pi_m, coeffs.theta, coeffs.sigma, coeffs.chi)
543 except Exception
as e:
548 material_label: Optional[str] =
None) ->
None:
550 Set BMF model coefficients using the built-in species library.
553 species: Species name from the library (e.g., "Almond", "Apple", "Grape", "Walnut").
554 An unrecognized name raises, and the error message lists the valid names.
555 uuids: Optional list of primitive UUIDs. If None and ``material_label`` is
556 also None, applies to all primitives.
557 material_label: Optional Context material label; applies to every primitive that
558 references the material at run() time. Mutually exclusive with ``uuids``.
561 ValueError: If species name is not a non-empty str, or both ``uuids`` and ``material_label`` are given
562 StomatalConductanceModelError: If the species is not in the library, or the operation fails
565 >>> # Set coefficients for almond tree
566 >>> stomatal.setBMFCoefficientsFromLibrary("Almond")
568 >>> # Set coefficients for specific leaves only
569 >>> stomatal.setBMFCoefficientsFromLibrary("Grape", uuids=[leaf1_uuid, leaf2_uuid])
571 >>> # Set coefficients for every primitive using a material
572 >>> stomatal.setBMFCoefficientsFromLibrary("Walnut", material_label="walnut_leaf")
574 if not isinstance(species, str)
or not species:
575 raise ValueError(
"Species name must be a non-empty str")
576 self.
_validate_target(
"setBMFCoefficientsFromLibrary", uuids, material_label)
580 if material_label
is not None:
581 stomatal_wrapper.setBMFCoefficientsFromLibraryForMaterial(self.
stomatal_model, species, material_label)
582 elif uuids
is not None:
583 stomatal_wrapper.setBMFCoefficientsFromLibraryForUUIDs(self.
stomatal_model, species, uuids)
585 stomatal_wrapper.setBMFCoefficientsFromLibrary(self.
stomatal_model, species)
586 except Exception
as e:
591 Return the library BMF coefficients for a species without applying them.
593 The result can be modified and passed to :meth:`setBMFCoefficients`.
596 species: Species name from the library (e.g., "Almond", "Walnut"). An unrecognized
597 name raises, and the error message lists the valid names.
600 BMFCoefficients for the species
603 ValueError: If species name is empty or not a str
604 StomatalConductanceModelError: If the species is not in the library, or the operation fails
607 >>> almond = stomatal.getBMFCoefficientsFromLibrary("Almond")
608 >>> stomatal.setBMFCoefficients(almond._replace(Em=almond.Em * 0.8), uuids=[leaf])
610 if not isinstance(species, str)
or not species:
611 raise ValueError(
"Species name must be a non-empty str")
614 values = stomatal_wrapper.getBMFCoefficientsFromLibrary(self.
stomatal_model, species)
615 except Exception
as e:
617 return BMFCoefficients(Em=values[0], i0=values[1], k=values[2], b=values[3])
620 def setDynamicTimeConstants(self, tau_open: float, tau_close: float, uuids: Optional[List[int]] =
None) ->
None:
622 Set time constants for dynamic stomatal opening and closing.
625 tau_open: Time constant (seconds) for stomatal opening
626 tau_close: Time constant (seconds) for stomatal closing
627 uuids: Optional list of primitive UUIDs. If None, applies to all primitives.
630 ValueError: If time constants are invalid
631 StomatalConductanceModelError: If operation fails
634 >>> # Set time constants for all leaves
635 >>> stomatal.setDynamicTimeConstants(tau_open=120.0, tau_close=240.0)
637 >>> # Set different time constants for specific leaves
638 >>> stomatal.setDynamicTimeConstants(tau_open=60.0, tau_close=180.0, uuids=[leaf1_uuid])
644 if not math.isfinite(tau_open)
or tau_open <= 0.0:
645 raise ValueError(
"Opening time constant must be finite and positive")
646 if not math.isfinite(tau_close)
or tau_close <= 0.0:
647 raise ValueError(
"Closing time constant must be finite and positive")
651 if uuids
is not None:
652 stomatal_wrapper.setDynamicTimeConstantsForUUIDs(self.
stomatal_model, tau_open, tau_close, uuids)
654 stomatal_wrapper.setDynamicTimeConstants(self.
stomatal_model, tau_open, tau_close)
655 except Exception
as e:
661 Add optional output primitive data to the Context.
664 label: Name of primitive data to output (e.g., "Ci", "gs", "E")
667 ValueError: If label is invalid
668 StomatalConductanceModelError: If operation fails
671 >>> # Output stomatal conductance values
672 >>> stomatal.optionalOutputPrimitiveData("gs")
674 >>> # Output intercellular CO2 concentration
675 >>> stomatal.optionalOutputPrimitiveData("Ci")
678 raise ValueError(
"Label cannot be empty")
682 stomatal_wrapper.optionalOutputPrimitiveData(self.
stomatal_model, label)
683 except Exception
as e:
688 Print a report detailing usage of default input values.
691 uuids: Optional list of primitive UUIDs. If None, reports on all primitives.
694 StomatalConductanceModelError: If operation fails
697 >>> # Print report for all primitives
698 >>> stomatal.printDefaultValueReport()
700 >>> # Print report for specific leaves
701 >>> stomatal.printDefaultValueReport(uuids=[leaf1_uuid, leaf2_uuid])
705 if uuids
is not None:
706 stomatal_wrapper.printDefaultValueReportForUUIDs(self.
stomatal_model, uuids)
709 except Exception
as e:
714 Check if StomatalConductanceModel is available in current build.
717 True if plugin is available, False otherwise
719 registry = get_plugin_registry()
720 return registry.is_plugin_available(
'stomatalconductance')
726 Create StomatalConductanceModel instance with context.
729 context: Helios Context
732 StomatalConductanceModel instance
Bailey model coefficients.
Ball-Berry-Leuning model coefficients.
Buckley-Mott-Farquhar model coefficients.
Ball-Woodrow-Berry model coefficients.
Exception raised for StomatalConductance-specific errors.
High-level interface for stomatal conductance modeling and gas exchange calculations.
bool is_available(self)
Check if StomatalConductanceModel is available in current build.
__del__(self)
Destructor to ensure C++ resources freed even without 'with' statement.
__enter__(self)
Context manager entry.
None setBMFCoefficients(self, Union[BMFCoefficients, List[BMFCoefficients]] coeffs, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set Buckley-Mott-Farquhar model coefficients.
None _validate_bmf("BMFCoefficients" coeffs)
BMFCoefficients getBMFCoefficientsFromLibrary(self, str species)
Return the library BMF coefficients for a species without applying them.
None printDefaultValueReport(self, Optional[List[int]] uuids=None)
Print a report detailing usage of default input values.
None setBMFCoefficientsFromLibrary(self, str species, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set BMF model coefficients using the built-in species library.
None setDynamicTimeConstants(self, float tau_open, float tau_close, Optional[List[int]] uuids=None)
Set time constants for dynamic stomatal opening and closing.
None enableMessages(self)
Enable console output messages from the stomatal conductance model.
None setBWBCoefficients(self, BWBCoefficients coeffs, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set Ball-Woodrow-Berry model coefficients.
None setMOPTCoefficients(self, MOPTCoefficients coeffs, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set Medlyn et al.
None setBBCoefficients(self, BBCoefficients coeffs, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set Bailey model coefficients.
__init__(self, Context context)
Initialize StomatalConductanceModel with graceful plugin handling.
__exit__(self, exc_type, exc_value, traceback)
Context manager exit with proper cleanup.
None setBBLCoefficients(self, BBLCoefficients coeffs, Optional[List[int]] uuids=None, Optional[str] material_label=None)
Set Ball-Berry-Leuning model coefficients.
getNativePtr(self)
Get the native pointer for advanced operations.
_check_context_alive(self)
Raise if the owning Context has been destroyed (see Context.check_context_alive).
None run(self, Optional[List[int]] uuids=None, Optional[float] dt=None)
Run the stomatal conductance model.
None optionalOutputPrimitiveData(self, str label)
Add optional output primitive data to the Context.
None _validate_target(str method, uuids, material_label)
None disableMessages(self)
Disable console output messages from the stomatal conductance model.
Exception classes for PyHelios library.
StomatalConductanceModel create_stomatal_conductance_model(Context context)
Create StomatalConductanceModel instance with context.